From 092b447fc37337b46e07df43846630b7b48bbb38 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 14 May 2022 22:00:45 +0200 Subject: Dodat izbor veličine skupa za validaciju na front. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/_elements/form-model/form-model.component.html | 18 +++++++++++------- .../app/_elements/form-model/form-model.component.ts | 5 ++++- 2 files changed, 15 insertions(+), 8 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 09e44a99..1db6195b 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -97,16 +97,20 @@
-
- +
{{testSetDistribution}}% : {{100-testSetDistribution}}%
-
Trening - +
Trening + Test
- +
+
+ Nasumični redosled podataka
-
- Nasumični redosled podataka +
+
+ {{validationSize}} % + +
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 e01c2339..c8822992 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.ts +++ b/frontend/src/app/_elements/form-model/form-model.component.ts @@ -18,6 +18,7 @@ export class FormModelComponent implements AfterViewInit { @Input() hideProblemType:boolean; @Input() forProblemType:ProblemType; testSetDistribution: number = 70; + validationSize:number=15; constructor() { this.hideProblemType=false; this.forProblemType=ProblemType.BinaryClassification; @@ -148,4 +149,6 @@ export class FormModelComponent implements AfterViewInit { getInputColumns() { return this.forExperiment.inputColumns.filter(x => x != this.forExperiment.outputColumn); } -} +updateValidation(event: MatSliderChange) { + this.validationSize = event.value!; +}} -- cgit v1.2.3 From 11d83e1ea6c25a851b3eb7559ee85061d77337c9 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sun, 15 May 2022 23:45:29 +0200 Subject: Dodati dugmici za napred i nazad. Napravljen api upit. --- .../src/app/_elements/form-dataset/form-dataset.component.html | 7 +++++-- frontend/src/app/_elements/form-dataset/form-dataset.component.ts | 6 +++++- frontend/src/app/_services/datasets.service.ts | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index b96276bd..7e836192 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -1,6 +1,5 @@
- - +
@@ -43,10 +42,14 @@
file_upload +
+ + +
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 94ef9905..11d7faed 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -24,6 +24,8 @@ export class FormDatasetComponent { files: File[] = []; rowsNumber: number = 0; colsNumber: number = 0; + begin:number=-1; + end:number=11; @Input() dataset: Dataset; //dodaj ! potencijalno @@ -40,7 +42,9 @@ export class FormDatasetComponent { } //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? - + test(){ + console.log("radi"); + } clear(){ this.tableData.hasInput = false; } diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 2211996f..6d0e06db 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -27,6 +27,9 @@ export class DatasetsService { getDatasetFile(fileId: any): any { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/11`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetFilePaging(fileId:any,begin:any,end:any){ + return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${begin}/${end}`, { headers: this.authService.authHeader(), responseType: 'text' }); + } getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From db4b8cead1c45dfc55d65942769f3ee33d6c369d Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sun, 15 May 2022 23:53:43 +0200 Subject: Omoguceni paging na tabeli. --- .../_elements/form-dataset/form-dataset.component.html | 7 ++++--- .../app/_elements/form-dataset/form-dataset.component.ts | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 7e836192..bce8f857 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -47,9 +47,10 @@
- - - +
+ + +
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 11d7faed..fd3637f9 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -42,8 +42,17 @@ export class FormDatasetComponent { } //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? - test(){ - console.log("radi"); + goBack(){ + if(this.begin-10<=0) + this.begin=-1; + else + this.begin-=10; + this.loadExisting(); + + } + goForward(){ + this.begin+=10; + this.loadExisting(); } clear(){ this.tableData.hasInput = false; @@ -100,7 +109,7 @@ export class FormDatasetComponent { this.tableData.hasInput = true; this.tableData.loaded = false; - this.datasetsService.getDatasetFile(this.dataset.fileId).subscribe((file: string | undefined) => { + this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.end).subscribe((file: string | undefined) => { if (file) { this.tableData.loaded = true; this.tableData.numRows = this.dataset.rowCount; -- cgit v1.2.3 From bbe3675f4909b9e8bdac7787348b0d17af8ac662 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sun, 15 May 2022 23:59:06 +0200 Subject: Dodat broj stranice. --- frontend/src/app/_elements/form-dataset/form-dataset.component.html | 1 + 1 file changed, 1 insertion(+) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index bce8f857..d685458a 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -49,6 +49,7 @@
+ {{((this.begin+1)/10)+1}}
-- cgit v1.2.3 From c69f7ee7d2acbe17766f5b0f0f3cc764354cd151 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 00:13:08 +0200 Subject: Element se samo prikazuje kada se izabere postojeci dataset. --- frontend/src/app/_elements/folder/folder.component.ts | 4 +++- .../src/app/_elements/form-dataset/form-dataset.component.html | 8 ++++---- frontend/src/app/_elements/form-dataset/form-dataset.component.ts | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 665659a8..e426e2a0 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -65,8 +65,10 @@ export class FolderComponent implements AfterViewInit { } displayFile() { - if (this.type == FolderType.Dataset) + if (this.type == FolderType.Dataset){ this.formDataset.dataset = this.fileToDisplay; + this.formDataset.existingFlag=false; + } else if (this.type == FolderType.Model) this.formModel.newModel = this.fileToDisplay; } diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index d685458a..8965d451 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -47,10 +47,10 @@
-
- - {{((this.begin+1)/10)+1}} - +
+ +
{{((this.begin+1)/10)+1}}
+
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 fd3637f9..03564939 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -26,6 +26,7 @@ export class FormDatasetComponent { colsNumber: number = 0; begin:number=-1; end:number=11; + existingFlag:boolean=false; @Input() dataset: Dataset; //dodaj ! potencijalno @@ -69,6 +70,7 @@ export class FormDatasetComponent { this.filename = this.files[0].name; this.tableData.loaded = false; + this.existingFlag=false; this.update(); } @@ -77,7 +79,6 @@ export class FormDatasetComponent { update() { this.firstInput = true - if (this.files.length < 1) return; @@ -104,6 +105,7 @@ export class FormDatasetComponent { } loadExisting(){ + this.existingFlag=true; this.firstInput = false; this.tableData.hasInput = true; -- cgit v1.2.3 From 717ed39075bc89aa00741cfdb6a48c27bf34c992 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 00:20:07 +0200 Subject: Pozicionirano na sredinu u arhivi. Sredjen bug kada ostane zapamcena strana na kojoj se nalazimo ako promenimo dataset. --- frontend/src/app/_elements/folder/folder.component.ts | 4 +++- frontend/src/app/_elements/form-dataset/form-dataset.component.html | 2 +- frontend/src/app/_elements/form-dataset/form-dataset.component.ts | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index e426e2a0..654d5510 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -95,11 +95,13 @@ export class FolderComponent implements AfterViewInit { this.newFileSelected = true; this.listView = false; this.displayFile(); - if (this.type == FolderType.Dataset) + if (this.type == FolderType.Dataset){ this.formDataset.clear(); + } } selectFile(file?: FolderFile) { + this.formDataset.resetPagging(); this.selectedFile = file; this.fileToDisplay = file; if (this.type == FolderType.Experiment && file) { diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 8965d451..1f91405b 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -47,7 +47,7 @@
-
+
{{((this.begin+1)/10)+1}}
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 03564939..99583437 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -43,6 +43,9 @@ export class FormDatasetComponent { } //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? + resetPagging(){ + this.begin=-1; + } goBack(){ if(this.begin-10<=0) this.begin=-1; -- cgit v1.2.3 From 49d213824ee6dda9eaf9ba75041bb059075a30e5 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 00:30:15 +0200 Subject: Napravljen zahtev koji trazi header Dataseta od api-ja. Dodato da se prikazuje header na stranama posle prve. --- .../app/_elements/form-dataset/form-dataset.component.html | 2 +- .../app/_elements/form-dataset/form-dataset.component.ts | 14 ++++++++------ frontend/src/app/_services/datasets.service.ts | 3 +++ 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 1f91405b..e7084c6d 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -49,7 +49,7 @@
-
{{((this.begin+1)/10)+1}}
+
{{(this.begin/10)+1}}
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 99583437..aa3745d0 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -24,8 +24,8 @@ export class FormDatasetComponent { files: File[] = []; rowsNumber: number = 0; colsNumber: number = 0; - begin:number=-1; - end:number=11; + begin:number=0; + end:number=10; existingFlag:boolean=false; @Input() dataset: Dataset; //dodaj ! potencijalno @@ -44,11 +44,11 @@ export class FormDatasetComponent { //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? resetPagging(){ - this.begin=-1; + this.begin=0; } goBack(){ if(this.begin-10<=0) - this.begin=-1; + this.begin=0; else this.begin-=10; this.loadExisting(); @@ -113,16 +113,18 @@ export class FormDatasetComponent { this.tableData.hasInput = true; this.tableData.loaded = false; - + this.datasetsService.getDatasetHeader(this.dataset.fileId).subscribe((header: string | undefined)=>{ + this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.end).subscribe((file: string | undefined) => { if (file) { this.tableData.loaded = true; this.tableData.numRows = this.dataset.rowCount; this.tableData.numCols = this.dataset.columnInfo.length; - this.tableData.data = this.csv.csvToArray(file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); + this.tableData.data = this.csv.csvToArray(header+'\n'+file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); } }); + }); } diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 6d0e06db..f5677097 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -30,6 +30,9 @@ export class DatasetsService { getDatasetFilePaging(fileId:any,begin:any,end:any){ return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${begin}/${end}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetHeader(fileId:any){ + return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/1`, { headers: this.authService.authHeader(), responseType: 'text' }); + } getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From a2989dc4534837f24f23ac33e5b30515ee6cfae7 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 00:43:29 +0200 Subject: Ukoliko korisnik pokusa da ide na sledecu stranicu, a na toj stranici nema podataka korisnik ce ostati na stranici na kojoj se nalazio. --- frontend/src/app/_elements/form-dataset/form-dataset.component.ts | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'frontend/src/app/_elements') 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 aa3745d0..79fbe2c9 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -123,6 +123,10 @@ export class FormDatasetComponent { this.tableData.data = this.csv.csvToArray(header+'\n'+file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); } + else{ + this.begin-=10; + this.loadExisting(); + } }); }); -- cgit v1.2.3 From 22911bdc9c5ff39ff86d8298179b147c4580f82c Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 16 May 2022 00:49:30 +0200 Subject: Uvoz javnih datasetova i modela --- backend/api/api/Services/FillAnEmptyDb.cs | 2 ++ .../src/app/_elements/folder/folder.component.css | 2 +- .../src/app/_elements/folder/folder.component.html | 7 +++++- .../src/app/_elements/folder/folder.component.ts | 26 ++++++++++++++++++++++ .../form-dataset/form-dataset.component.css | 4 ++++ .../form-dataset/form-dataset.component.html | 2 +- 6 files changed, 40 insertions(+), 3 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs index 32ce5c2e..fc169853 100644 --- a/backend/api/api/Services/FillAnEmptyDb.cs +++ b/backend/api/api/Services/FillAnEmptyDb.cs @@ -83,6 +83,8 @@ namespace api.Services dataset.nullCols = 3; dataset.nullRows = 708; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] {1f,-0.005006660707294941f, -0.03514399379491806f,-0.03855886310338974f,0.04293888062238693f,0.03684719651937485f}; _datasetService.Create(dataset); diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css index ada2dba0..3ecba343 100644 --- a/frontend/src/app/_elements/folder/folder.component.css +++ b/frontend/src/app/_elements/folder/folder.component.css @@ -177,7 +177,7 @@ .file-content { width: 100%; - height: 100%; + height: 95%; position: relative; } diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index 8896e7e5..db4f28f0 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -78,7 +78,12 @@
+ +
+
+
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 665659a8..e62c59f9 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -292,6 +292,32 @@ export class FolderComponent implements AfterViewInit { } } + addFile(file: FolderFile, event: Event) { + event.stopPropagation(); + switch (this.type) { + case FolderType.Dataset: + (file)._id=""; + + (file).isPublic=false; + this.datasetsService.addDataset(file).subscribe((response) => { + this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); + this.refreshFiles(null); + }); + break; + case FolderType.Model: + this.modelsService.addModel(file).subscribe((response) => { + this.refreshFiles(null); + }); + break; + case FolderType.Experiment: + // this.experimentsService.addExperiment(file).subscribe((response) => { + // console.log(response); + // }); + //todo delete za predictor + break; + } + } + folders: { [tab: number]: FolderFile[] } = {}; tabTitles: { [tab: number]: string } = { diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.css b/frontend/src/app/_elements/form-dataset/form-dataset.component.css index 079711d0..99ed5d40 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.css +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.css @@ -63,4 +63,8 @@ .file-container input{ border-radius: 5px; left: 0%; +} + +.naslov{ + font-size: 30px; } \ No newline at end of file diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index b96276bd..07a3ee1a 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -35,7 +35,7 @@
- +
-- cgit v1.2.3 From dac8e0f3a723a43013d6412def50ca04e7976b1f Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 16 May 2022 00:54:23 +0200 Subject: Promenjen font i naziv arhive. --- .../src/app/_elements/_charts/line-chart/line-chart.component.css | 1 + frontend/src/app/_elements/navbar/navbar.component.html | 2 +- frontend/src/app/_pages/experiment/experiment.component.html | 4 ++-- frontend/src/styles/font.css | 5 ++--- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css index a190693a..35c7c8d5 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css @@ -6,4 +6,5 @@ canvas{ background-color: var(--ns-bg-dark-100); border-radius: 5px; margin: 10px; + font-size: 10px !important; } \ No newline at end of file diff --git a/frontend/src/app/_elements/navbar/navbar.component.html b/frontend/src/app/_elements/navbar/navbar.component.html index 105151aa..8cc742eb 100644 --- a/frontend/src/app/_elements/navbar/navbar.component.html +++ b/frontend/src/app/_elements/navbar/navbar.component.html @@ -9,7 +9,7 @@ diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html index a2ede838..4c9d0222 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.html +++ b/frontend/src/app/_pages/experiment/experiment.component.html @@ -38,8 +38,8 @@

Odaberite parametre i trenirajte model

- Pregled rezultata treniranja -

Pregledajte tok treniranja i grafički prikaz rezultata

+ Pregled rezultata
treniranja
+

Pregledajte tok treniranja i
grafički prikaz rezultata

diff --git a/frontend/src/styles/font.css b/frontend/src/styles/font.css index a4d876f5..d5841a63 100644 --- a/frontend/src/styles/font.css +++ b/frontend/src/styles/font.css @@ -1,6 +1,5 @@ -/*p, -a { +div{ font-family: Helvetica, sans-serif; letter-spacing: 2px; font-weight: 100; -}*/ \ No newline at end of file +} \ No newline at end of file -- cgit v1.2.3 From cebddfe818f0519b3f57ef65c619d7d1d81783f7 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Mon, 16 May 2022 17:14:00 +0200 Subject: Registracija: resen problem da jedan popup zakloni drugi (obavestenje ispod polja). Izmene u column-table. --- .../column-table/column-table.component.html | 2 +- .../column-table/column-table.component.ts | 12 ++++++++++-- .../missingvalues-dialog.component.html | 4 ++-- .../register-modal/register-modal.component.html | 2 ++ .../register-modal/register-modal.component.ts | 21 +++++++++++++++------ 5 files changed, 30 insertions(+), 11 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index d07d50b2..9aebf114 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -194,7 +194,7 @@
- Nema nedostajućih vrednosti. + Nema null vrednosti.
diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index 217eda30..e9154cb3 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -235,13 +235,21 @@ export class ColumnTableComponent implements AfterViewInit { this.experiment.nullValues = NullValueOptions.DeleteColumns; this.experiment.nullValuesReplacers = []; for (let i = 0; i < this.experiment.inputColumns.length; i++) { - this.experiment.nullValuesReplacers.push({ + this.experiment.nullValuesReplacers.push({ //ovo zakomentarisano column: this.experiment.inputColumns[i], option: NullValueOptions.DeleteColumns, value: "" }); this.nullValOption[i] = "Obriši kolonu"; } + //obrisi kolone koje sadrze nedostajuce vrednosti iz input kolona + /*for (let i = 0; i < this.dataset.columnInfo.length; i++) { + if (this.dataset.columnInfo[i].numNulls > 0) { + this.experiment.inputColumns = this.experiment.inputColumns.filter(x => x != this.dataset!.columnInfo[i].columnName); + this.columnsChecked[i] = false; + console.log(this.dataset!.columnInfo[i].columnName); + } + }*/ } else if (selectedMissingValuesOption == NullValueOptions.DeleteRows) { this.experiment.nullValues = NullValueOptions.DeleteRows; @@ -261,7 +269,7 @@ export class ColumnTableComponent implements AfterViewInit { } openMissingValuesDialog() { const dialogRef = this.dialog.open(MissingvaluesDialogComponent, { - width: '400px' + width: '500px' }); dialogRef.afterClosed().subscribe(selectedMissingValuesOption => { if (selectedMissingValuesOption != undefined) diff --git a/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.html b/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.html index 7ab92d02..3332ef41 100644 --- a/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.html +++ b/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.html @@ -2,8 +2,8 @@
- Obriši sve kolone koje sadrže nedostajuće vrednosti - Obriši sve redove koji sadrže nedostajuće vrednosti + Isključi sve kolone koje sadrže nedostajuće vrednosti + Obriši sve redove koji sadrže nedostajuće vrednosti
diff --git a/frontend/src/app/_modals/register-modal/register-modal.component.html b/frontend/src/app/_modals/register-modal/register-modal.component.html index 0c791a61..5182198c 100644 --- a/frontend/src/app/_modals/register-modal/register-modal.component.html +++ b/frontend/src/app/_modals/register-modal/register-modal.component.html @@ -33,6 +33,7 @@

Unesite ispravno korisničko ime.

+

Uneto korisničko ime je zauzeto.

@@ -42,6 +43,7 @@

Unesite ispravno e-mail adresu.

+

Uneta e-mail adresa je zauzeta.

diff --git a/frontend/src/app/_modals/register-modal/register-modal.component.ts b/frontend/src/app/_modals/register-modal/register-modal.component.ts index a5c6ddc6..b1129668 100644 --- a/frontend/src/app/_modals/register-modal/register-modal.component.ts +++ b/frontend/src/app/_modals/register-modal/register-modal.component.ts @@ -25,9 +25,11 @@ export class RegisterModalComponent implements OnInit { wrongEmailBool: boolean = false; wrongPass1Bool: boolean = false; wrongPass2Bool: boolean = false; + usernameAlreadyExistsBool: boolean = false; + emailAlreadyExistsBool: boolean = false; pattName: RegExp = /^[a-zA-ZšŠđĐčČćĆžŽ]+([ \-][a-zA-ZšŠđĐčČćĆžŽ]+)*$/; - pattUsername: RegExp = /^[a-zA-Z0-9]{6,18}$/; + pattUsername: RegExp = /^[a-zA-Z0-9]{4,18}$/; pattTwoSpaces: RegExp = / /; pattEmail: RegExp = /^[a-zA-Z0-9]+([\.\-\+][a-zA-Z0-9]+)*\@([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}$/; pattPassword: RegExp = /.{6,30}$/; @@ -59,7 +61,7 @@ export class RegisterModalComponent implements OnInit { } resetData() { this.firstName = this.lastName = this.username = this.email = this.pass1 = this.pass2 = ''; - this.wrongFirstNameBool = this.wrongLastNameBool = this.wrongUsernameBool = this.wrongEmailBool = this.wrongPass1Bool = this.wrongPass2Bool = false; + this.wrongFirstNameBool = this.wrongLastNameBool = this.wrongUsernameBool = this.wrongEmailBool = this.wrongPass1Bool = this.wrongPass2Bool = this.usernameAlreadyExistsBool = this.emailAlreadyExistsBool = false; this.password1Shown = false; this.password2Shown = false; } @@ -160,10 +162,13 @@ export class RegisterModalComponent implements OnInit { dateCreated:new Date() } + this.authService.register(user) .subscribe( (response) => { if (response == 'User added') { + this.usernameAlreadyExistsBool = false; + this.emailAlreadyExistsBool = false; //nakon sto je registrovan, nek bude ulogovan this.authService.login(this.username, this.pass1).subscribe((response) => { @@ -174,12 +179,16 @@ export class RegisterModalComponent implements OnInit { }, (error) => console.warn(error)); } else if (response == 'Email Already Exists') { - shared.openDialog("Greška!", "Nalog sa unetim email-om već postoji!"); - (document.getElementById('email')).focus(); + /*shared.openDialog("Greška!", "Nalog sa unetim email-om već postoji!"); + (document.getElementById('email')).focus();*/ + this.usernameAlreadyExistsBool = false; + this.emailAlreadyExistsBool = true; } else if (response == 'Username Already Exists') { - shared.openDialog("Greška!", "Nalog sa unetim korisničkim imenom već postoji!"); - (document.getElementById('username-register')).focus(); + /*shared.openDialog("Greška!", "Nalog sa unetim korisničkim imenom već postoji!"); + (document.getElementById('username-register')).focus();*/ + this.emailAlreadyExistsBool = false; + this.usernameAlreadyExistsBool = true; } } ); -- cgit v1.2.3 From 743646bb658911b0d89fa08815fbc3872e4223a0 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Mon, 16 May 2022 17:57:01 +0200 Subject: Form-model: stopa ucenja postavljena na 0.01 difoltno. Home-page: izmenjeni neki fontovi i velicina, tekst vise ne izgleda kao link. --- frontend/src/app/_data/Model.ts | 2 +- .../_elements/form-model/form-model.component.html | 6 +- .../_pages/experiment/experiment.component.html | 82 +++++++++++----------- frontend/src/app/_pages/home/home.component.css | 10 +++ frontend/src/app/_pages/home/home.component.html | 8 +-- 5 files changed, 59 insertions(+), 49 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index 05d17e01..8fc36a31 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -21,7 +21,7 @@ export default class Model extends FolderFile { public metrics: string[] = [], // TODO add to add-model form public epochs: number = 5, // TODO add to add-model form public inputColNum: number = 5, - public learningRate: LearningRate = LearningRate.LR1, + public learningRate: LearningRate = LearningRate.LR3, public layers: Layer[] = [new Layer()], // Test set settings diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 1db6195b..97e38cf1 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -11,12 +11,12 @@
Tip problema - + {{ optionName }} - + {{ optionName }} @@ -102,7 +102,7 @@
Trening Test
-
+
Nasumični redosled podataka
diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html index 4c9d0222..20ff33d1 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.html +++ b/frontend/src/app/_pages/experiment/experiment.component.html @@ -1,47 +1,47 @@
-
-
- Novi Eksperiment -
-
- {{experiment.name}} -
+
+
+ Novi Eksperiment +
+
+ {{experiment.name}} +
-
- - - - - Izvor podataka - {{dataset.name}} - - -

Izaberite vas izvor podataka

-
-
- - - Predvideti:{{experiment.outputColumn}} - Odabir kolona - - -

Pripremite podatke i izaberite izlazne kolone

-
-
- - - {{modelToTrain.name}} - Treniranje - -

Odaberite parametre i trenirajte model

-
- - Pregled rezultata
treniranja
-

Pregledajte tok treniranja i
grafički prikaz rezultata

-
-
+
+ + + + + Izvor podataka + {{dataset.name}} + + +

Izaberite izvor podataka

+
+
+ + + Predvideti:{{experiment.outputColumn}} + Odabir kolona + + +

Pripremite podatke i izaberite izlazne kolone

+
+
+ + + {{modelToTrain.name}} + Treniranje + +

Odaberite parametre i trenirajte model

+
+ + Pregled rezultata
treniranja
+

Pregledajte tok treniranja i
grafički prikaz rezultata

+
+
@@ -66,4 +66,4 @@
-
+
\ No newline at end of file diff --git a/frontend/src/app/_pages/home/home.component.css b/frontend/src/app/_pages/home/home.component.css index 906f5728..51f22320 100644 --- a/frontend/src/app/_pages/home/home.component.css +++ b/frontend/src/app/_pages/home/home.component.css @@ -11,10 +11,20 @@ h1 { font-weight: 900 !important; margin-top: 1rem; margin-bottom: 2.5rem; + font-family: /*'Garamond',*/ + 'Courier New', Courier, monospace; } .card { margin: 2.5rem !important; padding: 1.5rem; width: 26rem !important; +} + +a { + text-decoration: none; +} + +.subtitle-class { + letter-spacing: 0.2rem; } \ No newline at end of file diff --git a/frontend/src/app/_pages/home/home.component.html b/frontend/src/app/_pages/home/home.component.html index 2825b3bf..9b559bc9 100644 --- a/frontend/src/app/_pages/home/home.component.html +++ b/frontend/src/app/_pages/home/home.component.html @@ -11,9 +11,9 @@
model_training -

Experimentiši

+

Eksperimentiši

- U tri koraka napravite novu neuronsku mrežu. Koristite postojeće izvore podataka, modele, itd. + U tri koraka napravite novu neuronsku mrežu. Koristite postojeće izvore podataka, modele, itd.

@@ -21,9 +21,9 @@
storage -

Arhiva

+

Arhiva

- Upravljajte izvorima podataka, eksperimentima, modelima, i rezultatima treniranja. Pogledajte podatke koje su podelili drugi korisnici. + Upravljajte izvorima podataka, eksperimentima, modelima i rezultatima treniranja. Pogledajte podatke koje su podelili drugi korisnici.

-- cgit v1.2.3 From 00915357e9af2e6d3c1e312cdd46efd502cf106c Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 16 May 2022 21:25:36 +0200 Subject: Rrrrressii dodavanje public datasetova u svoje --- backend/api/api/Controllers/DatasetController.cs | 68 ++++++++++++++++++++++ backend/api/api/Interfaces/IFileService.cs | 2 + backend/api/api/Services/FileService.cs | 6 ++ backend/api/api/Services/FillAnEmptyDb.cs | 20 ++++--- frontend/src/app/_data/Dataset.ts | 1 + .../src/app/_elements/folder/folder.component.ts | 4 +- frontend/src/app/_services/datasets.service.ts | 4 ++ 7 files changed, 96 insertions(+), 9 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index a6ebe8ac..7602a621 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -148,7 +148,75 @@ namespace api.Controllers return Ok(); } } + // POST api//stealDs + [HttpPost("stealDs")] + [Authorize(Roles = "User,Guest")] + public async Task> StealDs([FromBody] Dataset dataset) + { + string uploaderId = getUserId(); + + dataset.uploaderId = uploaderId; + + //da li ce preko tokena da se ubaci username ili front salje + //dataset.username = usernameToken; + //username = "" ako je GUEST DODAO + var existingDataset = _datasetService.GetOneDatasetN(dataset.uploaderId, dataset.name); + + if (existingDataset != null) + return NotFound($"Dataset with this name already exists"); + else + { + dataset.dateCreated = DateTime.Now; + dataset.lastUpdated = DateTime.Now; + dataset.isPublic = false; + + FileModel fileModel = _fileService.getFile(dataset.fileId); + string folderName = "UploadedFiles"; + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName, uploaderId); + + string ext = ".csv"; + + //nesto + + //Check Directory + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + //Index file if same filename + var fullPath = Path.Combine(folderPath, dataset.name + ext); + int i = 0; + + while (System.IO.File.Exists(fullPath)) + { + i++; + fullPath = Path.Combine(folderPath, dataset.name + i.ToString() + ext); + } + + dataset.fileId = ""; + + _fileService.CopyFile(fileModel.path, fullPath); + + + FileModel fileModel1 = new FileModel(); + fileModel1.type = ext; + fileModel1.path = fullPath; + fileModel1.uploaderId = uploaderId; + fileModel1.date = DateTime.Now.ToUniversalTime(); + fileModel1 = _fileService.Create(fileModel1); + + dataset.fileId = fileModel1._id; + + //nesto + + + dataset.isPreProcess = false; + _datasetService.Create(dataset); + _mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); + return Ok(); + } + } // PUT api//{name} [HttpPut("{id}")] diff --git a/backend/api/api/Interfaces/IFileService.cs b/backend/api/api/Interfaces/IFileService.cs index e061dfdb..00dc0002 100644 --- a/backend/api/api/Interfaces/IFileService.cs +++ b/backend/api/api/Interfaces/IFileService.cs @@ -9,5 +9,7 @@ namespace api.Services public FileModel getFile(string id); bool CheckDb(); string GetFileId(string fullPath); + bool CopyFile(string sourceFile, string destinacionFile); + } } \ No newline at end of file diff --git a/backend/api/api/Services/FileService.cs b/backend/api/api/Services/FileService.cs index ea3fe56e..6ef74ca1 100644 --- a/backend/api/api/Services/FileService.cs +++ b/backend/api/api/Services/FileService.cs @@ -59,5 +59,11 @@ namespace api.Services return file._id; } + + public bool CopyFile(string sourceFile, string destinacionFile) + { + File.Copy(sourceFile, destinacionFile, true); + return true; + } } } diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs index fc169853..28f293ce 100644 --- a/backend/api/api/Services/FillAnEmptyDb.cs +++ b/backend/api/api/Services/FillAnEmptyDb.cs @@ -53,7 +53,7 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; - dataset.name = "Titanik dataset"; + dataset.name = "Titanik dataset(public)"; dataset.description = "Titanik dataset"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; @@ -61,7 +61,7 @@ namespace api.Services dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new ColumnInfo[] { }; dataset.columnInfo = new[] { @@ -84,7 +84,7 @@ namespace api.Services dataset.nullRows = 708; dataset.isPreProcess = true; dataset.cMatrix = new float[11][]; - dataset.cMatrix[0] = new float[] {1f,-0.005006660707294941f, -0.03514399379491806f,-0.03855886310338974f,0.04293888062238693f,0.03684719651937485f}; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; _datasetService.Create(dataset); @@ -173,14 +173,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Diamonds dataset"; - dataset.description = "Diamonds dataset"; + dataset.description = "Diamonds dataset(public)"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "Unnamed: 0", true, 0, 26969.5f, 0, 53939, 26969.5f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), @@ -199,6 +199,9 @@ namespace api.Services dataset.nullCols = 0; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); @@ -295,14 +298,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Iris dataset"; - dataset.description = "Iris dataset"; + dataset.description = "Iris dataset(public) "; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "sepal_length", true, 0, 5.8433332443237305f, 4.300000190734863f, 7.900000095367432f, 5.800000190734863f, new string[]{ }, new int[] {}, new float[] {}, 0.01f, 0.1f ), @@ -314,6 +317,9 @@ namespace api.Services dataset.nullCols = 150; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index a962fe6b..73b77bd0 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -17,6 +17,7 @@ export default class Dataset extends FolderFile { public rowCount: number = 0, public nullRows: number = 0, public nullCols: number = 0, + public isPreProcess : Boolean = false, public cMatrix: number[][] = [] ) { super(name, dateCreated, lastUpdated); diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index fff5a25d..d26ac999 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -301,9 +301,9 @@ export class FolderComponent implements AfterViewInit { switch (this.type) { case FolderType.Dataset: (file)._id=""; - + (file).isPreProcess = true; (file).isPublic=false; - this.datasetsService.addDataset(file).subscribe((response) => { + this.datasetsService.stealDataset(file).subscribe((response) => { this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); this.refreshFiles(null); }); diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index f5677097..1b961442 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -24,6 +24,10 @@ export class DatasetsService { return this.http.post(`${Configuration.settings.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() }); } + stealDataset(dataset: Dataset): Observable { + return this.http.post(`${Configuration.settings.apiURL}/dataset/stealDs`, dataset, { headers: this.authService.authHeader() }); + } + getDatasetFile(fileId: any): any { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/11`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From 61f21c866a2d6d95e65d5b61d0df8be865963262 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 16 May 2022 22:39:03 +0200 Subject: Omogucen praging na tabeli koja se nalazi na stranici gde se kreira eksperiment. --- .../column-table/column-table.component.html | 6 ++++ .../column-table/column-table.component.ts | 36 +++++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index 9aebf114..3256ffee 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -44,6 +44,12 @@ +
+ +
{{(this.begin/10)+1}}
+ + +
diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index e9154cb3..b160ab30 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -42,9 +42,30 @@ export class ColumnTableComponent implements AfterViewInit { loaded: boolean = false; + begin:number=0; + end:number=10; + + + constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { //ovo mi nece trebati jer primam dataset iz druge komponente } + resetPagging(){ + this.begin=0; + } + goBack(){ + if(this.begin-10<=0) + this.begin=0; + else + this.begin-=10; + this.loadData(); + + } + goForward(){ + this.begin+=10; + this.loadData(); + } + updateCharts() { //min: number, max: number, q1: number, q3: number, median: number @@ -90,16 +111,21 @@ export class ColumnTableComponent implements AfterViewInit { this.dataset.columnInfo.forEach(colInfo => { this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); }); + this.resetPagging(); + this.loadData(); + this.loaded = true; + + this.updateCharts(); + this.updatePieChart(); + } - this.datasetService.getDatasetFilePartial(this.dataset.fileId, 0, 10).subscribe((response: string | undefined) => { + loadData(){ + if(this.dataset!=undefined) + this.datasetService.getDatasetFilePartial(this.dataset.fileId, this.begin, this.end).subscribe((response: string | undefined) => { if (response && this.dataset != undefined) { this.tableData = this.csvParseService.csvToArray(response, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); } }); - this.loaded = true; - - this.updateCharts(); - this.updatePieChart(); } ngAfterViewInit(): void { -- cgit v1.2.3 From f36899620a84cd1629b0d31a930f8bf8eb797d8b Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Tue, 17 May 2022 15:38:16 +0200 Subject: Promenjen naziv promenjive tako da ima vise smisla. --- frontend/src/app/_elements/column-table/column-table.component.ts | 4 ++-- frontend/src/app/_elements/form-dataset/form-dataset.component.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index b160ab30..a3469d90 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -43,7 +43,7 @@ export class ColumnTableComponent implements AfterViewInit { begin:number=0; - end:number=10; + step:number=10; @@ -121,7 +121,7 @@ export class ColumnTableComponent implements AfterViewInit { loadData(){ if(this.dataset!=undefined) - this.datasetService.getDatasetFilePartial(this.dataset.fileId, this.begin, this.end).subscribe((response: string | undefined) => { + this.datasetService.getDatasetFilePartial(this.dataset.fileId, this.begin, this.step).subscribe((response: string | undefined) => { if (response && this.dataset != undefined) { this.tableData = this.csvParseService.csvToArray(response, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); } 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 79fbe2c9..d801b5fb 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -25,7 +25,7 @@ export class FormDatasetComponent { rowsNumber: number = 0; colsNumber: number = 0; begin:number=0; - end:number=10; + step:number=10; existingFlag:boolean=false; @Input() dataset: Dataset; //dodaj ! potencijalno @@ -115,7 +115,7 @@ export class FormDatasetComponent { this.tableData.loaded = false; this.datasetsService.getDatasetHeader(this.dataset.fileId).subscribe((header: string | undefined)=>{ - this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.end).subscribe((file: string | undefined) => { + this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.step).subscribe((file: string | undefined) => { if (file) { this.tableData.loaded = true; this.tableData.numRows = this.dataset.rowCount; -- cgit v1.2.3 From b6bade63bf3b9ec356a53862d8a3d4727281f6f8 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Tue, 17 May 2022 21:24:55 +0200 Subject: Omogućena responzivnost grafika toka obuke, promenjen font.. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_charts/line-chart/line-chart.component.css | 5 ++-- .../_charts/line-chart/line-chart.component.html | 6 ++--- .../_charts/line-chart/line-chart.component.ts | 28 ++++++++++++++++++---- frontend/src/styles/font.css | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css index 35c7c8d5..2eea561e 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.css @@ -6,5 +6,6 @@ canvas{ background-color: var(--ns-bg-dark-100); border-radius: 5px; margin: 10px; - font-size: 10px !important; - } \ No newline at end of file + font-size: 11 !important; + } + \ No newline at end of file diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html index 5bb7aae6..d48212cd 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html @@ -1,4 +1,4 @@ - - +
+ - \ No newline at end of file +
\ No newline at end of file diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts index e873618c..89a76a44 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts @@ -1,4 +1,4 @@ -import { Component, AfterViewInit, ViewChild } from '@angular/core'; +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; import { Chart } from 'chart.js'; @Component({ @@ -19,11 +19,27 @@ export class LineChartComponent implements AfterViewInit { dataValLoss:number[]=[]; dataEpoch: number[] = []; + @ViewChild('wrapper') + wrapper!: ElementRef; + @ViewChild('canvas') + canvas!: ElementRef; + constructor() { + } - + width = 700; + height = 400; + myChart!: Chart; - + resize() { + this.width = this.wrapper.nativeElement.offsetWidth; + this.height = this.wrapper.nativeElement.offsetHeight; + + if (this.canvas) { + this.canvas.nativeElement.width = this.width; + this.canvas.nativeElement.height = this.height; + } + } update(myEpochs: number[], myAcc: number[], myLoss: number[], myMae: number[], myMse: number[], myValAcc:number[],myValLoss:number[],myValMae:number[],myValMse:number[]) { this.dataAcc.length = 0; this.dataAcc.push(...myAcc); @@ -56,6 +72,9 @@ export class LineChartComponent implements AfterViewInit { } ngAfterViewInit(): void { + + window.addEventListener('resize', () => { this.resize() }); + this.resize(); this.myChart = new Chart("myChart", { type: 'line', @@ -69,7 +88,7 @@ export class LineChartComponent implements AfterViewInit { }, { - label: 'VAl_Accuracy', + label: 'Val_Accuracy', data: this.dataMSE, borderWidth: 1 }, @@ -150,3 +169,4 @@ export class LineChartComponent implements AfterViewInit { ); } } + diff --git a/frontend/src/styles/font.css b/frontend/src/styles/font.css index d5841a63..79e71ca6 100644 --- a/frontend/src/styles/font.css +++ b/frontend/src/styles/font.css @@ -1,5 +1,5 @@ div{ font-family: Helvetica, sans-serif; - letter-spacing: 2px; + letter-spacing: 1px; font-weight: 100; } \ No newline at end of file -- cgit v1.2.3 From 0a5d881355a1011568f1ed3cb9b3b87f4e8dee14 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Tue, 17 May 2022 21:41:42 +0200 Subject: Dodat broj stranica. Api poziv se odvija samo ako se prelazi na validnu stranu. --- .../_elements/column-table/column-table.component.html | 2 +- .../_elements/column-table/column-table.component.ts | 18 +++++++++++++++--- .../_elements/form-dataset/form-dataset.component.html | 2 +- .../_elements/form-dataset/form-dataset.component.ts | 14 +++++++++++--- 4 files changed, 28 insertions(+), 8 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index 3256ffee..8a4164f1 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -46,7 +46,7 @@
-
{{(this.begin/10)+1}}
+
{{(this.begin/10)+1}}...{{getPage()}}
diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index a3469d90..ed2f0380 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -54,16 +54,28 @@ export class ColumnTableComponent implements AfterViewInit { this.begin=0; } goBack(){ - if(this.begin-10<=0) + if(this.begin-10<0) this.begin=0; else + { this.begin-=10; - this.loadData(); + this.loadData(); + } } goForward(){ + if(this.dataset!=undefined){ this.begin+=10; - this.loadData(); + if(this.dataset.rowCount
-
{{(this.begin/10)+1}}
+
{{(this.begin/10)+1}}...{{getPage()}}
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 d801b5fb..19c0083c 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -47,20 +47,28 @@ export class FormDatasetComponent { this.begin=0; } goBack(){ - if(this.begin-10<=0) + if(this.begin-10<0) this.begin=0; else + { this.begin-=10; - this.loadExisting(); + this.loadExisting(); + } } goForward(){ this.begin+=10; - this.loadExisting(); + if(this.dataset.rowCount Date: Wed, 18 May 2022 02:51:55 +0200 Subject: Sredjivanje baze i forme dataseta --- backend/api/api/Controllers/DatasetController.cs | 7 +- backend/api/api/Models/Model.cs | 11 +++ backend/api/api/Models/NullValues.cs | 7 ++ backend/api/api/Services/FillAnEmptyDb.cs | 106 +++++++++++++++------ backend/api/api/Services/MlConnectionService.cs | 14 +++ backend/microservice/api/newmlservice.py | 2 +- .../form-dataset/form-dataset.component.html | 9 +- 7 files changed, 115 insertions(+), 41 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index 7602a621..c7e05343 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -128,6 +128,7 @@ namespace api.Controllers [Authorize(Roles = "User,Guest")] public async Task> Post([FromBody] Dataset dataset) { + Console.WriteLine("PROBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); string uploaderId = getUserId(); dataset.uploaderId = uploaderId; @@ -145,6 +146,8 @@ namespace api.Controllers dataset.isPreProcess = false; _datasetService.Create(dataset); _mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); + + return Ok(); } } @@ -211,9 +214,9 @@ namespace api.Controllers //nesto - dataset.isPreProcess = false; + dataset.isPreProcess = true; _datasetService.Create(dataset); - _mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); + //_mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); return Ok(); } } diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs index f09940d0..a807316f 100644 --- a/backend/api/api/Models/Model.cs +++ b/backend/api/api/Models/Model.cs @@ -48,6 +48,17 @@ namespace api.Models public class Layer { + + + public Layer(int layerNumber, string activationFunction, int neurons, string regularisation, float regularisationRate) + { + this.layerNumber = layerNumber; + this.activationFunction = activationFunction; + this.neurons = neurons; + this.regularisation = regularisation; + this.regularisationRate = regularisationRate; + } + public int layerNumber { get; set; } public string activationFunction { get; set; } public int neurons { get; set; } diff --git a/backend/api/api/Models/NullValues.cs b/backend/api/api/Models/NullValues.cs index a8ce4f36..8e3415e7 100644 --- a/backend/api/api/Models/NullValues.cs +++ b/backend/api/api/Models/NullValues.cs @@ -2,6 +2,13 @@ { public class NullValues { + public NullValues(string column, string option, string value) + { + this.column = column; + this.option = option; + this.value = value; + } + public string column { get; set; } public string option { get; set; } public string value { get; set; } diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs index 28f293ce..404d937a 100644 --- a/backend/api/api/Services/FillAnEmptyDb.cs +++ b/backend/api/api/Services/FillAnEmptyDb.cs @@ -1,6 +1,5 @@ using api.Interfaces; using api.Models; -using Microsoft.AspNetCore.SignalR; using MongoDB.Driver; namespace api.Services @@ -31,6 +30,7 @@ namespace api.Services public Task StartAsync(CancellationToken cancellationToken) { + if (_fileService.CheckDb()) { @@ -49,6 +49,7 @@ namespace api.Services _fileService.Create(file); + Dataset dataset = new Dataset(); dataset._id = ""; @@ -59,32 +60,42 @@ namespace api.Services dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; - dataset.dateCreated = DateTime.Now; - dataset.lastUpdated = DateTime.Now; + dataset.dateCreated = DateTime.UtcNow; + dataset.lastUpdated = DateTime.UtcNow; dataset.delimiter = ","; - dataset.columnInfo = new ColumnInfo[] { }; dataset.columnInfo = new[] { - new ColumnInfo( "PassengerId", true, 0, 446, 1, 891, 446, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Survived", true, 0, 0.38383838534355164f, 0, 1, 0, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Pclass", true, 0, 2.3086419105529785f, 1, 3, 3, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Name", false, 0, 0, 0, 0, 0, new string[]{"Braund, Mr. Owen Harris", "Boulos, Mr. Hanna", "Frolicher-Stehli, Mr. Maxmillian", "Gilinski, Mr. Eliezer", "Murdlin, Mr. Joseph", "Rintamaki, Mr. Matti", "Stephenson, Mrs. Walter Bertram (Martha Eustis)", "Elsbury, Mr. William James", "Bourke, Miss. Mary", "Chapman, Mr. John Henry"}, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Sex", false, 0, 0, 0, 0, 0, new string[]{ "male", "female" }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Age", true, 177, 29.69911766052246f, 0.41999998688697815f, 80, 28, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "SibSp", true, 0, 0.523007869720459f, 0, 8, 0, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Parch", true, 0, 0.3815937042236328f, 0, 6, 0, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Ticket", false, 0, 0, 0, 0, 0, new string[]{ "347082", "CA. 2343", "1601", "3101295", "CA 2144", "347088", "S.O.C. 14879", "382652", "LINE", "PC 17757" }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Fare", true, 0, 32.20420837402344f, 0, 512.3292236328125f, 14.45419979095459f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Cabin", false, 687, 0, 0, 0, 0, new string[]{ "B96 B98", "G6", "C23 C25 C27", "C22 C26", "F33", "F2", "E101", "D", "C78", "C93" }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "Embarked", false, 2, 0.3815937042236328f, 0, 6, 0, new string[]{ "S", "C", "Q" }, new int[] {}, new float[] {}, 0.01f,0.1f ), + new ColumnInfo( "PassengerId", true, 0, 446, 1, 891, 446, new string[]{ "1","599","588", "589", "590", "591" }, new int[] { 1, 1, 1, 1, 1, 1}, new float[] { 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f }, 223.5f, 668.5f ), + new ColumnInfo( "Survived", true, 0, 0.38383838534355164f, 0, 1, 0, new string[]{ "0", "1" }, new int[] { 549, 342}, new float[] { 0.6161616444587708f, 0.38383838534355164f}, 0f, 1f ), + new ColumnInfo( "Pclass", true, 0, 2.3086419105529785f, 1, 3, 3, new string[]{ "3", "1", "2" }, new int[] {491, 216, 184}, new float[] {0.5510662198066711f, 0.24242424964904785f, 0.2065095454454422f }, 2f, 3f ), + new ColumnInfo( "Name", false, 0, 0, 0, 0, 0, new string[]{"Braund, Mr. Owen Harris", "Boulos, Mr. Hanna", "Frolicher-Stehli, Mr. Maxmillian", "Gilinski, Mr. Eliezer", "Murdlin, Mr. Joseph", "Rintamaki, Mr. Matti"}, new int[] {1,1,1,1,1,1}, new float[] {0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f, 0.0011223345063626766f }, 0f, 0f ), + new ColumnInfo( "Sex", false, 0, 0, 0, 0, 0, new string[]{ "male", "female" }, new int[] {577,314}, new float[] {0.6475870013237f, 0.35241302847862244f}, 0f,0f ), + new ColumnInfo( "Age", true, 177, 29.69911766052246f, 0.41999998688697815f, 80, 28, new string[]{ "nan", "24.0", "22.0", "18.0", "28.0", "30.0" }, new int[] {177,30,27,26,25,25}, new float[] {0.1986531913280487f,0.033670034259557724f,0.03030303120613098f,0.029180696234107018f,0.028058361262083054f,0.028058361262083054f}, 20.125f,38f ), + new ColumnInfo( "SibSp", true, 0, 0.523007869720459f, 0, 8, 0, new string[]{ "0", "1", "2", "3", "4", "3", "8" }, new int[] {608, 209, 28, 18, 16, 7}, new float[] {0.6823793649673462f, 0.23456789553165436f, 0.031425364315509796f, 0.020202020183205605f, 0.017957352101802826f, 0.007856341078877449f }, 0f, 1f ), + new ColumnInfo( "Parch", true, 0, 0.3815937042236328f, 0, 6, 0, new string[]{ "0", "1", "2", "5", "3", "4" }, new int[] { 678, 118, 80, 5, 5, 4}, new float[] {0.7609427571296692f, 0.13243547081947327f, 0.08978675305843353f, 0.005611672066152096f, 0.005611672066152096f, 0.0044893380254507065f }, 0f,0f ), + new ColumnInfo( "Ticket", false, 0, 0, 0, 0, 0, new string[]{ "347082", "CA. 2343", "1601", "3101295", "CA 2144", "347088" }, new int[] {7, 7, 7, 6, 6, 6}, new float[] {0.007856341078877449f, 0.007856341078877449f, 0.007856341078877449f, 0.006734006572514772f, 0.006734006572514772f, 0.006734006572514772f}, 0f,0f ), + new ColumnInfo( "Fare", true, 0, 32.20420837402344f, 0, 512.3292236328125f, 14.45419979095459f, new string[]{ "8.05", "13.0", "7.8958", "7.75", "26.0", "10.5"}, new int[] {43, 42, 38, 34, 31, 24}, new float[] {0.04826038330793381f, 0.047138046473264694f, 0.04264871031045914f, 0.03815937042236328f, 0.03479236736893654f, 0.02693602629005909f }, 7.910399913787842f,31f ), + new ColumnInfo( "Cabin", false, 687, 0, 0, 0, 0, new string[]{ "B96 B98", "G6", "C23 C25 C27", "C22 C26", "F33", "F2" }, new int[] {4, 4, 4, 3, 3, 3}, new float[] {0.0044893380254507065f, 0.0044893380254507065f, 0.0044893380254507065f, 0.003367003286257386f, 0.003367003286257386f, 0.003367003286257386f }, 0f,0f ), + new ColumnInfo( "Embarked", false, 2, 0, 0, 0, 0, new string[]{ "S", "C", "Q" }, new int[] {644, 168, 77}, new float[] {0.7227833867073059f, 0.18855218589305878f, 0.08641975373029709f}, 0f,0f ), }; dataset.rowCount = 891; dataset.nullCols = 3; - dataset.nullRows = 708; + dataset.nullRows = 689; dataset.isPreProcess = true; - dataset.cMatrix = new float[11][]; - dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + dataset.cMatrix = new float[12][]; + dataset.cMatrix[0] = new float[] { 1, -0.005007f, -0.035144f, -0.038559f, 0.042939f, 0.036847f, -0.057527f, -0.001652f, -0.056554f, 0.012658f, -0.035077f, 0.013083f }; + dataset.cMatrix[1] = new float[] { -0.0050066607f, 1f, -0.33848104f, -0.057343315f, -0.54335135f, -0.077221096f, -0.0353225f, 0.08162941f, -0.16454913f, 0.25730652f, -0.25488788f, -0.16351666f }; + dataset.cMatrix[2] = new float[] { -0.035143994f, -0.33848104f, 1f, 0.052830875f, 0.13190049f, -0.369226f, 0.083081365f, 0.018442672f, 0.31986925f, -0.54949963f, 0.6841206f, 0.15711245f }; + dataset.cMatrix[3] = new float[] { -0.038558863f, -0.057343315f, 0.052830875f, 1f, 0.020313991f, 0.06258293f, -0.017230336f, -0.04910539f, 0.047348045f, -0.049172707f, 0.061959103f, -0.0045570857f }; + dataset.cMatrix[4] = new float[] { 0.04293888f, -0.54335135f, 0.13190049f, 0.020313991f, 1f, 0.093253575f, -0.11463081f, -0.24548896f, 0.059371985f, -0.18233283f, 0.09668117f, 0.104057096f }; + dataset.cMatrix[5] = new float[] { 0.036847197f, -0.077221096f, -0.369226f, 0.06258293f, 0.093253575f, 1f, -0.30824676f, -0.18911926f, -0.07593447f, 0.09606669f, -0.2523314f, -0.02525195f }; + dataset.cMatrix[6] = new float[] { -0.057526834f, -0.0353225f, 0.083081365f, -0.017230336f, -0.11463081f, -0.30824676f, 1f, 0.4148377f, 0.079461284f, 0.15965104f, 0.043592583f, 0.06665404f }; + dataset.cMatrix[7] = new float[] { -0.0016520123f, 0.08162941f, 0.018442672f, -0.04910539f, -0.24548896f, -0.18911926f, 0.4148377f, 1f, 0.020003473f, 0.21622494f, -0.02832425f, 0.038322248f }; + dataset.cMatrix[8] = new float[] { -0.056553647f, -0.16454913f, 0.31986925f, 0.047348045f, 0.059371985f, -0.07593447f, 0.079461284f, 0.020003473f, 1f, -0.013885464f, 0.24369627f, -0.0060414947f }; + dataset.cMatrix[9] = new float[] { 0.012658219f, 0.25730652f, -0.54949963f, -0.049172707f, -0.18233283f, 0.09606669f, 0.15965104f, 0.21622494f, -0.013885464f, 1f, -0.5033555f, -0.22122625f }; + dataset.cMatrix[10] = new float[] { -0.035077456f, -0.25488788f, 0.6841206f, 0.061959103f, 0.09668117f, -0.2523314f, 0.043592583f, -0.02832425f, 0.24369627f, -0.5033555f, 1f, 0.19320504f }; + dataset.cMatrix[11] = new float[] { 0.013083069f, -0.16351666f, 0.15711245f, -0.0045570857f, 0.104057096f, -0.02525195f, 0.06665404f, 0.038322248f, -0.0060414947f, -0.22122625f, 0.19320504f, 1f }; _datasetService.Create(dataset); @@ -93,19 +104,30 @@ namespace api.Services model._id = ""; model.uploaderId = "000000000000000000000000"; - model.name = "Model Titanik"; + model.name = "Titanik model"; model.description = "Model Titanik"; model.dateCreated = DateTime.Now; model.lastUpdated = DateTime.Now; model.type = "binarni-klasifikacioni"; model.optimizer = "Adam"; - model.lossFunction = "mean_squared_error"; - model.hiddenLayers = 5; - model.batchSize = "8"; + model.lossFunction = "binary_crossentropy"; + model.hiddenLayers = 4; + model.batchSize = "64"; + model.learningRate = "1"; model.outputNeurons = 0; + model.layers = new[] + { + new Layer ( 0,"sigmoid", 3,"l1", 1f ), + new Layer ( 1,"sigmoid", 3,"l1", 1f ), + new Layer ( 2,"sigmoid", 3,"l1", 1f ), + new Layer ( 3,"sigmoid", 3,"l1", 1f ), + }; model.outputLayerActivationFunction = "sigmoid"; model.metrics = new string[] { }; - model.epochs = 5; + model.epochs = 50; + model.randomOrder = true; + model.randomTestSet = true; + model.randomTestSetDistribution = 0.1f; model.isPublic = true; model.accessibleByLink = true; model.validationSize = 0.1f;//proveri @@ -116,23 +138,45 @@ namespace api.Services Experiment experiment = new Experiment(); experiment._id = ""; - experiment.name = "Eksperiment Titanik"; + experiment.name = "Titanik eksperiment (binarno-klasifikacioni)"; experiment.description = "Binarno klasifikacioni, label"; + experiment.type = "binarni-klasifikacioni"; experiment.ModelIds = new string[] { }.ToList(); experiment.datasetId = _datasetService.GetDatasetId(dataset.fileId); experiment.uploaderId = "000000000000000000000000"; - experiment.inputColumns = new string[] { "Embarked", "Survived" }; + experiment.inputColumns = new string[] { "Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Ticket", "Fare", "Embarked" }; experiment.outputColumn = "Survived"; + experiment.nullValues = "delete_rows"; experiment.dateCreated = DateTime.Now; experiment.lastUpdated = DateTime.Now; - experiment.nullValues = "delete_rows"; - experiment.nullValuesReplacers = new NullValues[] { }; + experiment.nullValuesReplacers = new[] + { + new NullValues ("Survived", "delete_rows", ""), + new NullValues ("Pclass", "delete_rows", ""), + new NullValues ("Sex", "delete_rows", ""), + new NullValues ("Age", "delete_rows", ""), + new NullValues ("SibSp", "delete_rows", ""), + new NullValues ("Parch", "delete_rows", ""), + new NullValues ("Ticket", "delete_rows", ""), + new NullValues ("Fare", "delete_rows", ""), + new NullValues ("Embarked", "delete_rows", "") + }; experiment.encodings = new[] { + new ColumnEncoding( "PassengerId", "label" ), new ColumnEncoding( "Survived", "label" ), + new ColumnEncoding( "Pclass", "label" ), + new ColumnEncoding( "Name", "label" ), + new ColumnEncoding( "Sex", "label" ), + new ColumnEncoding( "Age", "label" ), + new ColumnEncoding( "SibSp", "label" ), + new ColumnEncoding( "Parch", "label" ), + new ColumnEncoding( "Ticket", "label" ), + new ColumnEncoding( "Fare", "label" ), + new ColumnEncoding( "Cabin", "label" ), new ColumnEncoding("Embarked", "label" ) }; - experiment.columnTypes = new string[] {"categorical"}; + experiment.columnTypes = new string[] { "numerical", "categorical", "categorical", "categorical", "categorical", "numerical", "categorical", "numerical", "categorical", "numerical", "categorical", "categorical" }; _experimentService.Create(experiment); @@ -183,8 +227,8 @@ namespace api.Services dataset.delimiter = ","; dataset.columnInfo = new[] { - new ColumnInfo( "Unnamed: 0", true, 0, 26969.5f, 0, 53939, 26969.5f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), - new ColumnInfo( "carat", true, 0, 0.7979397773742676f, 0.20000000298023224f, 5.010000228881836f, 0.699999988079071f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), + new ColumnInfo( "Unnamed: 0", true, 0, 26969.5f, 0, 53939, 26969.5f, new string[]{ "0", "35977", "35953", "35954", "35955", "35956" }, new int[] {1,1,1,1,1,1}, new float[] {0.000018539118173066527f, 0.000018539118173066527f, 0.000018539118173066527f, 0.000018539118173066527f, 0.000018539118173066527f, 0.000018539118173066527f}, 13484.75f,40454.25f ), + new ColumnInfo( "carat", true, 0, 0.7979397773742676f, 0.20000000298023224f, 5.010000228881836f, 0.699999988079071f, new string[]{ "0.3", "0.31", "1.01", "0.7", "0.32", "1.0" }, new int[] {2604, 2249, 2242, 1981, 1840, 1558}, new float[] {0.04827586188912392f, 0.04169447720050812f, 0.0415647029876709f, 0.03672599047422409f, 0.034111976623535156f, 0.02888394519686699f}, 0.4000000059604645f,1.0399999618530273f ), new ColumnInfo( "cut", false, 0, 0, 0, 0, 0, new string[]{ "Ideal", "Premium", "Very Good", "Good", "Fair" }, new int[] {}, new float[] {}, 0.01f,0.1f ), new ColumnInfo( "color", false, 0, 0, 0, 0, 0, new string[]{"G", "E", "F", "H", "D", "I", "I", "J"}, new int[] {}, new float[] {}, 0.01f,0.1f ), new ColumnInfo( "clarity", false, 0, 0, 0, 0, 0, new string[]{ "SI1", "VS2","SI2", "VS1", "VVS2", "VVS1", "IF", "I1" }, new int[] {}, new float[] {}, 0.01f,0.1f ), diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs index b6d422ad..0ecdb1af 100644 --- a/backend/api/api/Services/MlConnectionService.cs +++ b/backend/api/api/Services/MlConnectionService.cs @@ -62,6 +62,20 @@ namespace api.Services if (ChatHub.CheckUser(id)) foreach (var connection in ChatHub.getAllConnectionsOfUser(id)) await _ichat.Clients.Client(connection).SendAsync("NotifyDataset",newDataset.name,newDataset._id); + + + string proba = ""; + + for (int i = 0; i < newDataset.cMatrix.Length; i++) + { + proba = i +" "; + for (int j = 0; j < newDataset.cMatrix[i].Length; j++) + proba += newDataset.cMatrix[i][j] + "f, "; + + Console.WriteLine(proba); + proba = ""; + } + return; } diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index afcbcdd7..fd21f8ce 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -510,7 +510,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): classifier.add(tf.keras.layers.Dense(units=1)) - classifier.compile(loss =paramsModel["lossFunction"] , optimizer = opt , metrics = ['mae','mse','rmse']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer = opt , metrics = ['mae','mse']) history=classifier.fit( x=x_train, y=y_train, epochs = paramsModel['epochs'],batch_size=int(paramsModel['batchSize']),callbacks=callback(x_test, y_test,paramsModel['_id']),validation_data=(x_val, y_val)) hist=history.history diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 6736367e..7be838f1 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -3,8 +3,7 @@
- - +
@@ -32,11 +31,7 @@
- -
- - -
+
-- cgit v1.2.3 From 9233e6f193f68a0477e2900ac7a82928ab7f4adc Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 13:52:29 +0200 Subject: Ispravljen bag: kad se izmeni dataset, refreshuje se 2. korak na eksperiment strani. Dodata ruta kako bi se eksperiment iz kolekcije otvorio na eksperiment strani. Sredjivanje otvaranja - pocetak --- .../api/api/Controllers/ExperimentController.cs | 2 +- .../column-table/column-table.component.html | 4 +- .../column-table/column-table.component.ts | 3 +- .../src/app/_elements/folder/folder.component.html | 6 +-- .../src/app/_elements/folder/folder.component.ts | 8 +++- .../app/_pages/experiment/experiment.component.ts | 44 +++++++++++++++++++--- frontend/src/app/_services/datasets.service.ts | 3 ++ frontend/src/app/_services/experiments.service.ts | 4 ++ frontend/src/app/app-routing.module.ts | 2 +- 9 files changed, 61 insertions(+), 15 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/backend/api/api/Controllers/ExperimentController.cs b/backend/api/api/Controllers/ExperimentController.cs index 08354615..b599ca4e 100644 --- a/backend/api/api/Controllers/ExperimentController.cs +++ b/backend/api/api/Controllers/ExperimentController.cs @@ -61,7 +61,7 @@ namespace api.Controllers return Ok(experiment); } - [HttpGet("get")] + [HttpGet("get/{id}")] [Authorize(Roles = "User,Guest")] public async Task> Get(string id) { diff --git a/frontend/src/app/_elements/column-table/column-table.component.html b/frontend/src/app/_elements/column-table/column-table.component.html index 3256ffee..8af56c43 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.html +++ b/frontend/src/app/_elements/column-table/column-table.component.html @@ -45,10 +45,10 @@
- +
{{(this.begin/10)+1}}
- +
diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index a3469d90..7c2f8cef 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -41,14 +41,12 @@ export class ColumnTableComponent implements AfterViewInit { columnsChecked: boolean[] = []; //niz svih kolona loaded: boolean = false; - begin:number=0; step:number=10; constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { - //ovo mi nece trebati jer primam dataset iz druge komponente } resetPagging(){ this.begin=0; @@ -98,6 +96,7 @@ export class ColumnTableComponent implements AfterViewInit { this.dataset = dataset; this.setColumnTypeInitial(); + this.columnsChecked = []; this.dataset.columnInfo.forEach(column => { this.columnsChecked.push(true); }); diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index db4f28f0..84946697 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -78,12 +78,12 @@
+
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index d26ac999..4e2209a0 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -105,7 +105,7 @@ export class FolderComponent implements AfterViewInit { this.selectedFile = file; this.fileToDisplay = file; if (this.type == FolderType.Experiment && file) { - this.router.navigate(['/experiment'/*, file._id*/]) + this.router.navigate(['/experiment/', file._id]); } this.newFileSelected = false; this.listView = false; @@ -116,6 +116,12 @@ export class FolderComponent implements AfterViewInit { if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } + /* + goToExperimentPage(file: FolderFile) { + console.log(file); + //this.router.navigate(['/experiment/', this.experiment._id]); + } + */ createNewFile() { if (this.type == FolderType.Dataset) { diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index abf4b697..62ef9257 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, ViewChild, ViewChildren, Input, OnInit } from '@angular/core'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; import { MatStepper } from '@angular/material/stepper'; import Shared from 'src/app/Shared'; @@ -12,13 +12,15 @@ import Dataset from 'src/app/_data/Dataset'; import { ColumnTableComponent } from 'src/app/_elements/column-table/column-table.component'; import { SignalRService } from 'src/app/_services/signal-r.service'; import { MetricViewComponent } from 'src/app/_elements/metric-view/metric-view.component'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DatasetsService } from 'src/app/_services/datasets.service'; @Component({ selector: 'app-experiment', templateUrl: './experiment.component.html', styleUrls: ['./experiment.component.css'] }) -export class ExperimentComponent implements AfterViewInit { +export class ExperimentComponent implements AfterViewInit, OnInit { @ViewChild(MatStepper) stepper!: MatStepper; @ViewChild('stepsContainer') stepsContainer!: ElementRef; @@ -32,9 +34,36 @@ export class ExperimentComponent implements AfterViewInit { @ViewChild("folderModel") folderModel!: FolderComponent; @ViewChild("metricView") metricView!: MetricViewComponent; - constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private signalRService: SignalRService) { + constructor(private experimentsService: ExperimentsService, private modelsService: ModelsService, private datasetsService: DatasetsService, private signalRService: SignalRService, private route: ActivatedRoute) { this.experiment = new Experiment("exp1"); } + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + let experimentId = this.route.snapshot.paramMap.get("id"); + console.log("EXPID u exp.comp:", experimentId); + if (experimentId == null) + return; + + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + console.log(this.experiment); //OTKUD MI NAME + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + console.log("EXP u exp.comp:", this.experiment); + console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.fileToDisplay = this.experiment; + this.folderDataset.selectFile(); + this.columnTable.experiment = this.experiment; + this.columnTable.dataset = this.dataset; + //this.columnTable.loadDataset(this.dataset); + + //this.setDataset(); + //this.experimentChangedEvent(); + }); + }); + }); + } /*updateExperiment(){ @@ -151,13 +180,18 @@ export class ExperimentComponent implements AfterViewInit { this.folderModel.updateExperiment(); } - setDataset(dataset: FolderFile) { + setDataset(dataset: FolderFile | null) { + if (dataset == null) { + this.columnTable.loaded = false; + this.dataset = undefined; + this.experiment.datasetId = ''; + return; + } const d = dataset; this.experiment.datasetId = d._id; this.dataset = d; this.columnTable.loadDataset(this.dataset); - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 1b961442..11a6ee5e 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -40,6 +40,9 @@ export class DatasetsService { getDatasetFilePartial(fileId: any, startRow: number, rowNum: number): Observable { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } + getDatasetById(datasetId: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + } editDataset(dataset: Dataset): Observable { return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() }); diff --git a/frontend/src/app/_services/experiments.service.ts b/frontend/src/app/_services/experiments.service.ts index 29569fca..f4473c8c 100644 --- a/frontend/src/app/_services/experiments.service.ts +++ b/frontend/src/app/_services/experiments.service.ts @@ -20,6 +20,10 @@ export class ExperimentsService { return this.http.get(`${Configuration.settings.apiURL}/experiment/getmyexperiments`, { headers: this.authService.authHeader() }); } + getExperimentById(id: string): Observable { + return this.http.get(`${Configuration.settings.apiURL}/experiment/get/${id}`, { headers: this.authService.authHeader() }); + } + updateExperiment(experiment: Experiment): Observable { return this.http.put(`${Configuration.settings.apiURL}/experiment/` + experiment._id, experiment, { headers: this.authService.authHeader() }); } diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index f5f1ccae..9f8c623d 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -12,11 +12,11 @@ import { TestComponent } from './_pages/test/test.component'; const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, + { path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } }, { path: 'profile', component: ProfileComponent, canActivate: [AuthGuardService], data: { title: 'Profil' } }, { path: 'playground', component: PlaygroundComponent, data: { title: 'Zabava' } }, - { path: 'sonja', component: ColumnTableComponent }, { path: 'test', component: TestComponent, data: { title: 'Test' } } ]; -- cgit v1.2.3 From d6b8cd90f225bb4b390ef16603da9f5f0739899f Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Wed, 18 May 2022 17:07:43 +0200 Subject: Promenio dodavanje fajla u folderu da ne menja naslov tab-a. Podesio form-model komponentu da setuje tip problema modela na tip problema eksperimenta i ispravio da se uvak prikazuju korektne funkcije gubitka za taj tip problema. Popravio forme za dodavanje/pregled fajlova u arhivi. --- .../src/app/_elements/folder/folder.component.html | 10 ++-- .../src/app/_elements/folder/folder.component.ts | 19 +++++--- .../_elements/form-model/form-model.component.html | 12 ++--- .../_elements/form-model/form-model.component.ts | 55 +++++++++++----------- 4 files changed, 48 insertions(+), 48 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index db4f28f0..da04b219 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -3,7 +3,7 @@
- +
@@ -78,12 +78,12 @@
+
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index d26ac999..be72ebc5 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -1,7 +1,7 @@ import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; import Dataset from 'src/app/_data/Dataset'; import { FolderFile, FolderType } from 'src/app/_data/FolderFile'; -import Model from 'src/app/_data/Model'; +import Model, { ProblemType } from 'src/app/_data/Model'; import { DatasetsService } from 'src/app/_services/datasets.service'; import Shared from 'src/app/Shared'; import { ModelsService } from 'src/app/_services/models.service'; @@ -65,9 +65,9 @@ export class FolderComponent implements AfterViewInit { } displayFile() { - if (this.type == FolderType.Dataset){ + if (this.type == FolderType.Dataset) { this.formDataset.dataset = this.fileToDisplay; - this.formDataset.existingFlag=false; + this.formDataset.existingFlag = false; } else if (this.type == FolderType.Model) this.formModel.newModel = this.fileToDisplay; @@ -95,7 +95,7 @@ export class FolderComponent implements AfterViewInit { this.newFileSelected = true; this.listView = false; this.displayFile(); - if (this.type == FolderType.Dataset){ + if (this.type == FolderType.Dataset) { this.formDataset.clear(); } } @@ -234,6 +234,7 @@ export class FolderComponent implements AfterViewInit { }); break; case FolderType.Model: + this.formModel.newModel.type = this.formModel.forProblemType; this.modelsService.addModel(this.formModel.newModel).subscribe(model => { this.newFile = undefined; Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju."); @@ -300,9 +301,9 @@ export class FolderComponent implements AfterViewInit { event.stopPropagation(); switch (this.type) { case FolderType.Dataset: - (file)._id=""; + (file)._id = ""; (file).isPreProcess = true; - (file).isPublic=false; + (file).isPublic = false; this.datasetsService.stealDataset(file).subscribe((response) => { this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); this.refreshFiles(null); @@ -335,6 +336,7 @@ export class FolderComponent implements AfterViewInit { }; FolderType = FolderType; + ProblemType = ProblemType; Privacy = Privacy; TabType = TabType; @@ -428,6 +430,11 @@ export class FolderComponent implements AfterViewInit { this.formModel.updateGraph(); } } + + newTabTitles: { [tab: number]: string } = { + [FolderType.Dataset]: 'Novi izvor podataka', + [FolderType.Model]: 'Nova konfiguracija neuronske mreže', + }; } export enum Privacy { diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 97e38cf1..1b4eb834 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -11,12 +11,7 @@
Tip problema - - - {{ optionName }} - - - + {{ optionName }} @@ -41,7 +36,7 @@ Funkcija troška - + {{ optionName }} @@ -118,8 +113,7 @@
- - +
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 c8822992..c9e2fc8e 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.ts +++ b/frontend/src/app/_elements/form-model/form-model.component.ts @@ -15,13 +15,13 @@ export class FormModelComponent implements AfterViewInit { @ViewChild(GraphComponent) graph!: GraphComponent; @Input() forExperiment!: Experiment; @Output() selectedModelChangeEvent = new EventEmitter(); - @Input() hideProblemType:boolean; - @Input() forProblemType:ProblemType; + @Input() hideProblemType: boolean; + @Input() forProblemType: ProblemType; testSetDistribution: number = 70; - validationSize:number=15; - constructor() { - this.hideProblemType=false; - this.forProblemType=ProblemType.BinaryClassification; + validationSize: number = 15; + constructor() { + this.hideProblemType = false; + this.forProblemType = ProblemType.BinaryClassification; } ngAfterViewInit(): void { } @@ -59,10 +59,15 @@ export class FormModelComponent implements AfterViewInit { term: string = ""; selectedMetrics = []; - lossFunction: any = LossFunction; + lossFunctions: { [index: string]: LossFunction[] } = { + [ProblemType.Regression]: LossFunctionRegression, + [ProblemType.BinaryClassification]: LossFunctionBinaryClassification, + [ProblemType.MultiClassification]: LossFunctionMultiClassification + }; loadModel(model: Model) { this.newModel = model; + this.forProblemType = model.type; } updateGraph() { @@ -77,6 +82,7 @@ export class FormModelComponent implements AfterViewInit { this.updateGraph(); } } + addLayer() { if (this.newModel.hiddenLayers < 128) { this.newModel.layers.push(new Layer(this.newModel.layers.length, this.selectedActivation, this.selectedNumberOfNeurons, this.selectedRegularisation, this.selectedRegularisationRate)); @@ -84,8 +90,8 @@ export class FormModelComponent implements AfterViewInit { this.newModel.hiddenLayers += 1; this.updateGraph(); } - } + numSequence(n: number): Array { return Array(n); } @@ -96,12 +102,14 @@ export class FormModelComponent implements AfterViewInit { this.updateGraph(); } } + addNeuron(index: number) { if (this.newModel.layers[index].neurons < 18) { this.newModel.layers[index].neurons += 1; this.updateGraph(); } } + selectedActivation: ActivationFunction = ActivationFunction.Sigmoid; selectedRegularisationRate: RegularisationRate = RegularisationRate.RR1; selectedRegularisation: Regularisation = Regularisation.L1; @@ -131,24 +139,15 @@ export class FormModelComponent implements AfterViewInit { updateTestSet(event: MatSliderChange) { this.testSetDistribution = event.value!; } - filterLossFunction() { - if(this.newModel.type==ProblemType.Regression){ - this.lossFunction = LossFunctionRegression; - this.newModel.lossFunction=LossFunction.MeanSquaredError; - } - else if(this.newModel.type==ProblemType.BinaryClassification){ - this.lossFunction= LossFunctionBinaryClassification; - this.newModel.lossFunction=LossFunction.BinaryCrossEntropy; - } - else if(this.newModel.type==ProblemType.MultiClassification){ - this.lossFunction = LossFunctionMultiClassification; - this.newModel.lossFunction=LossFunction.SparseCategoricalCrossEntropy; - } - -} -getInputColumns() { - return this.forExperiment.inputColumns.filter(x => x != this.forExperiment.outputColumn); + + getInputColumns() { + if (this.forExperiment) + return this.forExperiment.inputColumns.filter(x => x != this.forExperiment.outputColumn); + else + return ['Nisu odabrane ulazne kolone.'] + } + + updateValidation(event: MatSliderChange) { + this.validationSize = event.value!; + } } -updateValidation(event: MatSliderChange) { - this.validationSize = event.value!; -}} -- cgit v1.2.3 From 2834795337f81e895c3b39948b5b04f7bc662071 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 18 May 2022 17:22:09 +0200 Subject: Omogucen pristup glavnoj eksperiment strani odabirom eksperimenta iz kolekcije - automatski popunjeni prvi i drugi korak (forma za dataset i column-table). Korisnik moze da pocne od kreiranja modela (i prethodno izmeni sta zeli). --- .../column-table/column-table.component.ts | 65 +++++++++++++++------- .../src/app/_elements/folder/folder.component.ts | 5 +- .../app/_pages/experiment/experiment.component.ts | 16 +----- frontend/src/app/_services/datasets.service.ts | 2 +- 4 files changed, 52 insertions(+), 36 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index 8824ecf4..9fdb6936 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -14,6 +14,7 @@ import { AlertDialogComponent } from 'src/app/_modals/alert-dialog/alert-dialog. import Shared from 'src/app/Shared'; import { PieChartComponent } from '../_charts/pie-chart/pie-chart.component'; import { BoxPlotComponent } from '../_charts/box-plot/box-plot.component'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-column-table', @@ -46,7 +47,7 @@ export class ColumnTableComponent implements AfterViewInit { - constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog) { + constructor(private datasetService: DatasetsService, private experimentService: ExperimentsService, public csvParseService: CsvParseService, public dialog: MatDialog, private route: ActivatedRoute) { } resetPagging(){ this.begin=0; @@ -105,23 +106,51 @@ export class ColumnTableComponent implements AfterViewInit { loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); - this.dataset = dataset; - this.setColumnTypeInitial(); - this.columnsChecked = []; - this.dataset.columnInfo.forEach(column => { - this.columnsChecked.push(true); - }); - - this.resetInputColumns(); - this.resetOutputColumn(); - this.resetColumnEncodings(Encoding.Label); - this.setDeleteRowsForMissingValTreatment(); - - this.nullValOption = []; - this.dataset.columnInfo.forEach(colInfo => { - this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); - }); + if (this.route.snapshot.paramMap.get("id") == null) { + this.dataset = dataset; + this.setColumnTypeInitial(); + + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + this.columnsChecked.push(true); + }); + + this.resetInputColumns(); + this.resetOutputColumn(); + this.resetColumnEncodings(Encoding.Label); + this.setDeleteRowsForMissingValTreatment(); + + this.nullValOption = []; + this.dataset.columnInfo.forEach(colInfo => { + this.nullValOption.push(`Obriši redove (${colInfo.numNulls})`); + }); + } + else { + this.dataset = dataset; + this.columnsChecked = []; + this.dataset.columnInfo.forEach(column => { + if (this.experiment.inputColumns.find(x => x == column.columnName) != undefined) + this.columnsChecked.push(true); + else + this.columnsChecked.push(false); + }); + this.nullValOption = []; + for (let i = 0; i < this.dataset!.columnInfo.length; i++) { + let nullValRep = this.experiment.nullValuesReplacers.find(x => x.column == this.dataset!.columnInfo[i].columnName); + if (nullValRep != undefined) { + if (nullValRep.option == NullValueOptions.DeleteRows) + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + else if (nullValRep.option == NullValueOptions.DeleteColumns) + this.nullValOption.push(`Obriši kolonu`); + else { + this.nullValOption.push(`Popuni sa ${nullValRep.value}`); + } + } + else + this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + } + } this.resetPagging(); this.loadData(); this.loaded = true; @@ -140,8 +169,6 @@ export class ColumnTableComponent implements AfterViewInit { } ngAfterViewInit(): void { - console.log(this.dataset?.columnInfo); - } setColumnTypeInitial() { diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 4e2209a0..2b6f9aa7 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -11,7 +11,7 @@ import { ExperimentsService } from 'src/app/_services/experiments.service'; import { PredictorsService } from 'src/app/_services/predictors.service'; import { SignalRService } from 'src/app/_services/signal-r.service'; import { FormModelComponent } from '../form-model/form-model.component'; -import { Router } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import Predictor from 'src/app/_data/Predictor'; @Component({ @@ -42,11 +42,12 @@ export class FolderComponent implements AfterViewInit { fileToDisplay?: FolderFile; @Output() selectedFileChanged: EventEmitter = new EventEmitter(); + @Output() fileFromRoute: EventEmitter = new EventEmitter(); @Output() okPressed: EventEmitter = new EventEmitter(); searchTerm: string = ''; - constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router) { + constructor(private datasetsService: DatasetsService, private experimentsService: ExperimentsService, private modelsService: ModelsService, private predictorsService: PredictorsService, private signalRService: SignalRService, private router: Router, private route: ActivatedRoute) { this.tabsToShow.forEach(tab => this.folders[tab] = []); } diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 6345307c..9af2a305 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -46,26 +46,15 @@ export class ExperimentComponent implements AfterViewInit, OnInit { ngOnInit(): void { this.route.queryParams.subscribe(params => { let experimentId = this.route.snapshot.paramMap.get("id"); - console.log("EXPID u exp.comp:", experimentId); if (experimentId == null) return; - this.experimentsService.getExperimentById(experimentId).subscribe((response) => { this.experiment = response; - console.log(this.experiment); //OTKUD MI NAME this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { this.dataset = response; - console.log("EXP u exp.comp:", this.experiment); - console.log("DATASET u exp.comp:", this.dataset); + this.folderDataset.forExperiment = this.experiment; - this.folderDataset.fileToDisplay = this.experiment; - this.folderDataset.selectFile(); - this.columnTable.experiment = this.experiment; - this.columnTable.dataset = this.dataset; - //this.columnTable.loadDataset(this.dataset); - - //this.setDataset(); - //this.experimentChangedEvent(); + this.folderDataset.selectFile(this.dataset); }); }); }); @@ -200,7 +189,6 @@ export class ExperimentComponent implements AfterViewInit, OnInit { this.columnTable.loadDataset(this.dataset); this.step1=true; - } modelToTrain?: Model; diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 11a6ee5e..8d07674d 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -41,7 +41,7 @@ export class DatasetsService { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/${startRow}/${rowNum}`, { headers: this.authService.authHeader(), responseType: 'text' }); } getDatasetById(datasetId: string): Observable { - return this.http.get(`${Configuration.settings.apiURL}/dataset/${datasetId}`, { headers: this.authService.authHeader() }); + return this.http.get(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); } editDataset(dataset: Dataset): Observable { -- cgit v1.2.3 From 7c0c09c94246441bca36d873769fc420feb00937 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Wed, 18 May 2022 20:49:57 +0200 Subject: Podesio korake eksperimenta tako da korisnik ne moze da skroluje do koraka koje nije otkljucao. Promenio slajdere za trening, test, validacione skupove tako da se vide minimumi od 10%. Popravio skrolove koji nisu trebali da se pojavljuju, i dimenzije nekih elemenata. --- .../src/app/_elements/folder/folder.component.css | 9 +++--- .../src/app/_elements/folder/folder.component.ts | 4 ++- .../_elements/form-model/form-model.component.css | 34 +++++++++++++++++--- .../_elements/form-model/form-model.component.html | 37 ++++++++++++++-------- .../src/app/_elements/graph/graph.component.html | 2 +- .../app/_pages/experiment/experiment.component.css | 16 ++++++---- .../_pages/experiment/experiment.component.html | 6 ++-- .../app/_pages/experiment/experiment.component.ts | 25 +++++++++------ 8 files changed, 88 insertions(+), 45 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css index 3ecba343..4a06faa4 100644 --- a/frontend/src/app/_elements/folder/folder.component.css +++ b/frontend/src/app/_elements/folder/folder.component.css @@ -1,7 +1,5 @@ #folder { - /*position: absolute; - left: 50%; - transform: translateX(-50%);*/ + width: 100%; } #tabs { @@ -167,12 +165,13 @@ align-items: center; flex-grow: 1; height: 100%; + padding: 50px; } .folder-inside { width: 100%; - height: 40rem; - overflow-y: auto; + min-height: 40rem; + max-height: 100%; } .file-content { diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index b09cb543..735bfdaa 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -434,7 +434,9 @@ export class FolderComponent implements AfterViewInit { updateExperiment() { if (this.formModel) { - this.formModel.updateGraph(); + setTimeout(() => { + this.formModel.updateGraph(); + }); } } diff --git a/frontend/src/app/_elements/form-model/form-model.component.css b/frontend/src/app/_elements/form-model/form-model.component.css index 95ace1ef..34c1a5c5 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.css +++ b/frontend/src/app/_elements/form-model/form-model.component.css @@ -86,12 +86,12 @@ hr { max-height: 20 rem; } -mat-slider { - width: 50%; -} - .slider { background-color: transparent; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .center-center { @@ -102,3 +102,29 @@ mat-slider { font-size: 20px !important; font-weight: 600; } + +.slider-pad { + min-width: 10%; + background-color: gray; + height: 2px; +} + +.slider-pad:first-child { + margin-right: -8px; +} + +.slider-pad:last-child { + margin-left: -8px; +} + +.slider-extended { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + width: 95%; +} + +.slide { + width: 80%; +} \ No newline at end of file diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 1b4eb834..c7a9d5ca 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -91,24 +91,33 @@
-
-
+
+ +
+
+ Trening {{testSetDistribution}}% : Test i validacija {{100-testSetDistribution}}% +
+
+
+ +
+
+
+ Test {{validationSize}}% : Validacija {{100-validationSize}}% +
+
+
+ +
+
-
-
- {{validationSize}} % - +
+ Nasumični redosled podataka
- -
diff --git a/frontend/src/app/_elements/graph/graph.component.html b/frontend/src/app/_elements/graph/graph.component.html index 35753d40..411e8b53 100644 --- a/frontend/src/app/_elements/graph/graph.component.html +++ b/frontend/src/app/_elements/graph/graph.component.html @@ -1,4 +1,4 @@ -
+
@@ -76,7 +78,7 @@ {{file.lastUpdated | date}}
- + +
- +
- -
+ +
-->
- - -
- - + +
@@ -107,7 +108,7 @@ {{predictor.lastUpdated | date}}
-
@@ -132,14 +133,30 @@
-
- + + +
\ No newline at end of file diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 254298fb..9d19d556 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -14,6 +14,7 @@ import { FormModelComponent } from '../form-model/form-model.component'; import { ActivatedRoute, Router } from '@angular/router'; import Predictor from 'src/app/_data/Predictor'; import FileSaver from 'file-saver'; +import isEqual from 'lodash.isequal'; @Component({ selector: 'app-folder', @@ -105,6 +106,7 @@ export class FolderComponent implements AfterViewInit { selectFile(file?: FolderFile) { this.formDataset.resetPagging(); this.selectedFile = file; + Object.assign(this.lastFileData, this.selectedFile); this.fileToDisplay = file; if (this.type == FolderType.Experiment && file) { this.router.navigate(['/experiment/' + file._id]); @@ -118,7 +120,7 @@ export class FolderComponent implements AfterViewInit { if (this.type == FolderType.Dataset) this.formDataset.loadExisting(); } - + goToExperimentPageWithPredictor(file: FolderFile, predictor: Predictor) { this.router.navigate(['/experiment/' + file._id + "/" + predictor._id]); } @@ -138,7 +140,7 @@ export class FolderComponent implements AfterViewInit { _initialized: boolean = false; refreshFiles(selectedDatasetId: string | null = null, selectedModelId: string | null = null) { - + this.tabsToShow.forEach(tab => { this.folders[tab] = []; }); @@ -221,7 +223,7 @@ export class FolderComponent implements AfterViewInit { this.predictorsForExp[exp._id].forEach(pred => { const model = this.folders[TabType.MyModels].find(model => model._id == pred.modelId); pred.name = model?.name!; - pred.lastUpdated = model?.lastUpdated!; + //pred.lastUpdated = model?.lastUpdated!; }) /* ------------------------------------------------ */ this.searchTermsChanged(); @@ -267,7 +269,12 @@ export class FolderComponent implements AfterViewInit { searchTermsChanged() { this.filteredFiles.length = 0; if (!this.files) return; - this.filteredFiles.push(...this.files.filter((file) => file.name.toLowerCase().includes(this.searchTerm.toLowerCase()))); + this.filteredFiles.push(...this.files.filter((file) => { + return (file.name.toLowerCase().includes(this.searchTerm.toLowerCase()) + && (!this.forExperiment + || this.type != FolderType.Model + || (this.type == FolderType.Model && (file).type == this.forExperiment.type))) + })); /*if (this.selectedFile) { if (!this.filteredFiles.includes(this.selectedFile)) { if (this.hoverTab === TabType.None && this.getFolderType(this.selectedTab) === this.type) { @@ -282,41 +289,102 @@ export class FolderComponent implements AfterViewInit { listView: boolean = true; - deleteFile(file: FolderFile, event: Event) { - event.stopPropagation(); - this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); - this.files.splice(this.files.indexOf(file), 1); + loadingAction = false; + selectedFileHasChanges = false; + lastFileData = {}; + + onFileChange() { + console.log(this.selectedFile, this.lastFileData) + setTimeout(() => { + this.selectedFileHasChanges = !((this.selectedTab == TabType.NewFile) || isEqual(this.selectedFile, this.lastFileData)); + }); + } + + updateFile() { + const file = this.selectedFile; + this.loadingAction = true; switch (this.type) { case FolderType.Dataset: - this.datasetsService.deleteDataset(file).subscribe((response) => { - Shared.openDialog("Obaveštenje", "Uspešno ste obrisali odabrani izvor podataka."); - //this.filteredFiles.splice(this.files.indexOf(file), 1); - //this.refreshFiles(); + this.datasetsService.editDataset(file).subscribe((response) => { + this.fileUpdatedSuccess(); }); break; case FolderType.Model: - this.modelsService.deleteModel(file).subscribe((response) => { - Shared.openDialog("Obaveštenje", "Uspešno ste obrisali odabranu konfiguraciju neuronske mreže."); - //this.refreshFiles(); + this.modelsService.editModel(file).subscribe((response) => { + this.fileUpdatedSuccess(); }); + break; + } + } + + fileUpdatedSuccess() { + this.loadingAction = false; + this.selectedFileHasChanges = false; + Object.assign(this.lastFileData, this.selectedFile); + this.refreshFiles(); + } + + deleteFile(file: FolderFile, event: Event, deletePredictor: boolean = false) { + event.stopPropagation(); + + switch (this.type) { + case FolderType.Dataset: + const dataset = file; + Shared.openYesNoDialog("Obriši izvor podataka", "Eksperimenti i trenirani modeli nad ovim izvorom podataka će takođe biti obrisani, da li ste sigurni da želite da obrišete izvor: " + dataset.name + "?", () => { + this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); + this.files.splice(this.files.indexOf(file), 1); + this.loadingAction = true; + this.datasetsService.deleteDataset(dataset).subscribe((response) => { + this.loadingAction = false; + }); + }) + break; + case FolderType.Model: + const model = file; + Shared.openYesNoDialog("Obriši konfiguraciju neuronske mreže", "Trenirani modeli za ovu konfiguraciju će takođe biti obrisani, da li ste sigurni da želite da obrišete konfiguraciju: " + model.name + "?", () => { + this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); + this.files.splice(this.files.indexOf(file), 1); + this.loadingAction = true; + this.modelsService.deleteModel(file).subscribe((response) => { + this.loadingAction = false; + }); + }) + break; case FolderType.Experiment: - // this.experimentsService.deleteExperiment(file).subscribe((response) => { - // console.log(response); - // }); - //todo delete za predictor + if (deletePredictor) { + const predictor = file; + Shared.openYesNoDialog("Obriši trenirani model", "Da li ste sigurni da želite da obrišete trenirani model: " + predictor.name + "?", () => { + this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); + this.files.splice(this.files.indexOf(file), 1); + this.loadingAction = true; + this.predictorsService.deletePredictor(predictor).subscribe((response) => { + this.loadingAction = false; + }); + }); + } else { + const experiment = file; + Shared.openYesNoDialog("Obriši eksperiment", "Trenirani modeli za ovaj eksperiment će takođe biti obrisani, da li ste sigurni da želite da obrišete eksperiment: " + experiment.name + "?", () => { + this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); + this.files.splice(this.files.indexOf(file), 1); + this.loadingAction = true; + this.experimentsService.deleteExperiment(experiment).subscribe((response) => { + this.loadingAction = false; + }); + }); + } break; } } downloadFile(file: FolderFile, event: Event) { event.stopPropagation(); - if (this.type==FolderType.Dataset) { - const fileId=(file).fileId; - const name=(file).name; - const ext=(file).extension; - if(fileId!=undefined) - this.datasetsService.downloadFile(fileId).subscribe((response)=>{ - FileSaver.saveAs(response,name+ext); + if (this.type == FolderType.Dataset) { + const fileId = (file).fileId; + const name = (file).name; + const ext = (file).extension; + if (fileId != undefined) + this.datasetsService.downloadFile(fileId).subscribe((response) => { + FileSaver.saveAs(response, name + ext); }); @@ -333,7 +401,7 @@ export class FolderComponent implements AfterViewInit { this.datasetsService.stealDataset(file).subscribe((response) => { Shared.openDialog("Obaveštenje", "Uspešno ste dodali javni izvor podataka u vašu kolekciju."); this.refreshFiles(null); - }, (error:any) => { + }, (error: any) => { if (error.error == "Dataset with this name already exists") { Shared.openDialog("Obaveštenje", "Izvor podataka sa ovim imenom postoji u vašoj kolekciji."); } @@ -343,7 +411,7 @@ export class FolderComponent implements AfterViewInit { this.modelsService.stealModel(file).subscribe((response) => { Shared.openDialog("Obaveštenje", "Uspešno ste dodali javnu konfiguraciju neuronske mreže u vašu kolekciju."); this.refreshFiles(null); - }, (error:any) => { + }, (error: any) => { if (error.error == "Model already exisits or validation size is not between 0-1") { Shared.openDialog("Obaveštenje", "Model sa ovim imenom postoji u vašoj kolekciji."); } diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 7be838f1..78bb4bd1 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -1,49 +1,48 @@
- -
-
-
- -
-
+
+
+
+ +
+
-
-
- - Naziv - +
+
+ + Naziv + - - Naziv je obavezan - - -
-
-
- - Delimiter - - - {{ option }} - - - -
+ + Naziv je obavezan + +
+
+
+
+ + Delimiter + + + {{ option }} + + +
- +
+
file_upload - - + +
- +
{{(this.begin/10)+1}}...{{getPage()}}
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 19c0083c..35d68526 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.ts +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.ts @@ -24,11 +24,12 @@ export class FormDatasetComponent { files: File[] = []; rowsNumber: number = 0; colsNumber: number = 0; - begin:number=0; - step:number=10; - existingFlag:boolean=false; + begin: number = 0; + step: number = 10; + existingFlag: boolean = false; @Input() dataset: Dataset; //dodaj ! potencijalno + @Output() editEvent = new EventEmitter(); tableData: TableData = new TableData(); @@ -43,31 +44,30 @@ export class FormDatasetComponent { } //@ViewChild('fileImportInput', { static: false }) fileImportInput: any; cemu je ovo sluzilo? - resetPagging(){ - this.begin=0; + resetPagging() { + this.begin = 0; } - goBack(){ - if(this.begin-10<0) - this.begin=0; - else - { - this.begin-=10; + goBack() { + if (this.begin - 10 < 0) + this.begin = 0; + else { + this.begin -= 10; this.loadExisting(); } } - goForward(){ - this.begin+=10; - if(this.dataset.rowCount{ - - this.datasetsService.getDatasetFilePaging(this.dataset.fileId,this.begin,this.step).subscribe((file: string | undefined) => { - if (file) { - this.tableData.loaded = true; - this.tableData.numRows = this.dataset.rowCount; - this.tableData.numCols = this.dataset.columnInfo.length; - this.tableData.data = this.csv.csvToArray(header+'\n'+file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); - - } - else{ - this.begin-=10; - this.loadExisting(); - } + this.datasetsService.getDatasetHeader(this.dataset.fileId).subscribe((header: string | undefined) => { + + this.datasetsService.getDatasetFilePaging(this.dataset.fileId, this.begin, this.step).subscribe((file: string | undefined) => { + if (file) { + this.tableData.loaded = true; + this.tableData.numRows = this.dataset.rowCount; + this.tableData.numCols = this.dataset.columnInfo.length; + this.tableData.data = this.csv.csvToArray(header + '\n' + file, (this.dataset.delimiter == "razmak") ? " " : (this.dataset.delimiter == "novi red") ? "\t" : this.dataset.delimiter); + + } + else { + this.begin -= 10; + this.loadExisting(); + } + }); }); - }); - + } /*exportAsXLSX():void { diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index c7a9d5ca..bed69998 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -5,13 +5,13 @@
Naziv - +
Tip problema - + {{ optionName }} @@ -24,7 +24,7 @@
Optimizacija - + {{ optionName }} @@ -35,7 +35,7 @@
Funkcija troška - + {{ optionName }} @@ -48,7 +48,7 @@
Funkcija aktivacije izlaznog sloja - + {{ optionName }} @@ -58,7 +58,7 @@
Stopa učenja - + {{ optionName }} @@ -71,14 +71,14 @@
Broj epoha - +
Broj uzoraka po iteraciji - + {{option}} @@ -102,7 +102,7 @@
- +
@@ -110,13 +110,13 @@
- +
- Nasumični redosled podataka + Nasumični redosled podataka
@@ -220,7 +220,7 @@ Regularizacija - + {{ optionName }} @@ -229,7 +229,7 @@ Stopa regularizacije - + {{ optionName }} 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 9e6082c4..196d575b 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.ts +++ b/frontend/src/app/_elements/form-model/form-model.component.ts @@ -24,6 +24,8 @@ export class FormModelComponent implements AfterViewInit { this.forProblemType = ProblemType.BinaryClassification; } + @Output() editEvent = new EventEmitter(); + ngAfterViewInit(): void { } selectFormControl = new FormControl('', Validators.required); @@ -80,6 +82,7 @@ export class FormModelComponent implements AfterViewInit { this.newModel.layers.splice(this.newModel.layers.length - 1, 1); this.newModel.hiddenLayers -= 1; this.updateGraph(); + this.editEvent.emit(); } } @@ -89,6 +92,7 @@ export class FormModelComponent implements AfterViewInit { this.newModel.hiddenLayers += 1; this.updateGraph(); + this.editEvent.emit(); } } @@ -100,6 +104,7 @@ export class FormModelComponent implements AfterViewInit { if (this.newModel.layers[index].neurons > 1) { this.newModel.layers[index].neurons -= 1; this.updateGraph(); + this.editEvent.emit(); } } @@ -107,6 +112,7 @@ export class FormModelComponent implements AfterViewInit { if (this.newModel.layers[index].neurons < 18) { this.newModel.layers[index].neurons += 1; this.updateGraph(); + this.editEvent.emit(); } } @@ -119,22 +125,26 @@ export class FormModelComponent implements AfterViewInit { for (let i = 0; i < this.newModel.layers.length; i++) { this.newModel.layers[i].activationFunction = this.selectedActivation; } + this.editEvent.emit(); } changeAllRegularisation() { for (let i = 0; i < this.newModel.layers.length; i++) { this.newModel.layers[i].regularisation = this.selectedRegularisation; } + this.editEvent.emit(); } changeAllRegularisationRate() { for (let i = 0; i < this.newModel.layers.length; i++) { this.newModel.layers[i].regularisationRate = this.selectedRegularisationRate; } + this.editEvent.emit(); } changeAllNumberOfNeurons() { for (let i = 0; i < this.newModel.layers.length; i++) { this.newModel.layers[i].neurons = this.selectedNumberOfNeurons; - this.updateGraph(); } + this.updateGraph(); + this.editEvent.emit(); } updateTestSet(event: MatSliderChange) { this.testSetDistribution = event.value!; @@ -149,5 +159,6 @@ export class FormModelComponent implements AfterViewInit { updateValidation(event: MatSliderChange) { this.validationSize = event.value!; + this.editEvent.emit(); } } diff --git a/frontend/src/app/_elements/spinner/spinner.component.css b/frontend/src/app/_elements/spinner/spinner.component.css new file mode 100644 index 00000000..78adc872 --- /dev/null +++ b/frontend/src/app/_elements/spinner/spinner.component.css @@ -0,0 +1,78 @@ +.wrap { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.loader { + color: #ffffff; + font-size: 20px; + margin: auto; + width: 1em; + height: 1em; + border-radius: 50%; + text-indent: -9999em; + -webkit-animation: load4 1.3s infinite linear; + animation: load4 1.3s infinite linear; + -webkit-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); +} + +@-webkit-keyframes load4 { + 0%, + 100% { + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + } + 12.5% { + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 25% { + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 37.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 50% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 62.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + } + 75% { + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + } + 87.5% { + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + } +} + +@keyframes load4 { + 0%, + 100% { + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + } + 12.5% { + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 25% { + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + } + 37.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 50% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + } + 62.5% { + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + } + 75% { + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + } + 87.5% { + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + } +} \ No newline at end of file diff --git a/frontend/src/app/_elements/spinner/spinner.component.html b/frontend/src/app/_elements/spinner/spinner.component.html new file mode 100644 index 00000000..c655abf0 --- /dev/null +++ b/frontend/src/app/_elements/spinner/spinner.component.html @@ -0,0 +1,3 @@ +
+
Loading...
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/spinner/spinner.component.spec.ts b/frontend/src/app/_elements/spinner/spinner.component.spec.ts new file mode 100644 index 00000000..061f78d5 --- /dev/null +++ b/frontend/src/app/_elements/spinner/spinner.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SpinnerComponent } from './spinner.component'; + +describe('SpinnerComponent', () => { + let component: SpinnerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SpinnerComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/_elements/spinner/spinner.component.ts b/frontend/src/app/_elements/spinner/spinner.component.ts new file mode 100644 index 00000000..f0080edd --- /dev/null +++ b/frontend/src/app/_elements/spinner/spinner.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-spinner', + templateUrl: './spinner.component.html', + styleUrls: ['./spinner.component.css'] +}) +export class SpinnerComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 22894131..161c619a 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -59,13 +59,13 @@ export class ExperimentComponent implements AfterViewInit, OnInit { this.folderDataset.selectFile(this.dataset); //sad 3. i 4. korak da se ucitaju //this.predictorsService.getPredictor(predictorId!).subscribe((response) => { - let predictor = response; - //this.modelsService.getModelById(predictor.modelId).subscribe((response) => { - this.modelsService.getModelById("62853d70696d62ceeb8db7cd").subscribe((response) => { - //imamo model - this.folderModel.formModel.newModel = response; - //this.metricView.update(predictor.metrics); - }); + let predictor = response; + //this.modelsService.getModelById(predictor.modelId).subscribe((response) => { + this.modelsService.getModelById("62853d70696d62ceeb8db7cd").subscribe((response) => { + //imamo model + this.folderModel.formModel.newModel = response; + //this.metricView.update(predictor.metrics); + }); //}); }); }); @@ -208,6 +208,7 @@ export class ExperimentComponent implements AfterViewInit, OnInit { this.columnTable.loaded = false; this.dataset = undefined; this.experiment.datasetId = ''; + this.step1 = false; return; } const d = dataset; diff --git a/frontend/src/app/_services/experiments.service.ts b/frontend/src/app/_services/experiments.service.ts index f4473c8c..4b209ff0 100644 --- a/frontend/src/app/_services/experiments.service.ts +++ b/frontend/src/app/_services/experiments.service.ts @@ -27,4 +27,8 @@ export class ExperimentsService { updateExperiment(experiment: Experiment): Observable { return this.http.put(`${Configuration.settings.apiURL}/experiment/` + experiment._id, experiment, { headers: this.authService.authHeader() }); } + + deleteExperiment(experiment: Experiment) { + return this.http.delete(`${Configuration.settings.apiURL}/experiment/` + experiment._id, { headers: this.authService.authHeader(), responseType: "text" }); + } } diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts index f5d95ec1..2b8fe8f2 100644 --- a/frontend/src/app/_services/models.service.ts +++ b/frontend/src/app/_services/models.service.ts @@ -51,7 +51,7 @@ export class ModelsService { } editModel(model: Model): Observable { - return this.http.put(`${Configuration.settings.apiURL}/model/`, model, { headers: this.authService.authHeader() }); + return this.http.put(`${Configuration.settings.apiURL}/model/` + model.name, model, { headers: this.authService.authHeader() }); } deleteModel(model: Model) { diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index d44bf6ad..89d53115 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -52,6 +52,7 @@ import { DoughnutChartComponent } from './_elements/_charts/doughnut-chart/dough import { HeatmapComponent } from './_elements/_charts/heatmap/heatmap.component'; import { HeatMapAllModule } from '@syncfusion/ej2-angular-heatmap'; import { MetricViewComponent } from './_elements/metric-view/metric-view.component'; +import { SpinnerComponent } from './_elements/spinner/spinner.component'; export function initializeApp(appConfig: Configuration) { return () => appConfig.load(); @@ -91,7 +92,8 @@ export function initializeApp(appConfig: Configuration) { HeatmapComponent, MetricViewComponent, LineChartComponent, - SaveExperimentDialogComponent + SaveExperimentDialogComponent, + SpinnerComponent ], imports: [ BrowserModule, -- cgit v1.2.3 From 573019527eae41128b0716930dc0cfa0b019d317 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Thu, 19 May 2022 21:50:51 +0200 Subject: Radi prikaz prediktora iz kolekcije na experiment strani (prva 4 koraka sve popunjeno, iscrtan grafik). Ispravljeno crtanje grafika toka obuke - radi. YesNoDialog stil. --- .../_charts/line-chart/line-chart.component.ts | 37 ++++----- .../column-table/column-table.component.ts | 2 +- .../src/app/_elements/folder/folder.component.ts | 2 +- .../yes-no-dialog/yes-no-dialog.component.css | 8 ++ .../yes-no-dialog/yes-no-dialog.component.html | 8 +- .../app/_pages/experiment/experiment.component.ts | 88 ++++++++++++---------- .../app/_pages/my-models/my-models.component.html | 43 ----------- .../app/_pages/my-models/my-models.component.ts | 59 --------------- frontend/src/app/app-routing.module.ts | 2 +- 9 files changed, 81 insertions(+), 168 deletions(-) delete mode 100644 frontend/src/app/_pages/my-models/my-models.component.html delete mode 100644 frontend/src/app/_pages/my-models/my-models.component.ts (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts index 89a76a44..7d21129c 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.ts @@ -41,32 +41,33 @@ export class LineChartComponent implements AfterViewInit { } } update(myEpochs: number[], myAcc: number[], myLoss: number[], myMae: number[], myMse: number[], myValAcc:number[],myValLoss:number[],myValMae:number[],myValMse:number[]) { - this.dataAcc.length = 0; - this.dataAcc.push(...myAcc); - + this.dataEpoch.length = 0; this.dataEpoch.push(...myEpochs); - this.dataMAE.length = 0; - this.dataMAE.push(...myMae); + this.dataAcc.length = 0; + this.dataAcc.push(...myAcc); this.dataLOSS.length = 0; this.dataLOSS.push(...myLoss); - this.dataMSE.length = 0; - this.dataMSE.push(...myValAcc); + this.dataMAE.length = 0; + this.dataMAE.push(...myMae); this.dataMSE.length = 0; - this.dataMSE.push(...myValLoss); + this.dataMSE.push(...myMse); - this.dataMSE.length = 0; - this.dataMSE.push(...myValMae); + this.dataValAcc.length = 0; + this.dataValAcc.push(...myValAcc); - this.dataMSE.length = 0; - this.dataMSE.push(...myValMse); + this.dataValLoss.length = 0; + this.dataValLoss.push(...myValLoss); - this.dataMSE.length = 0; - this.dataMSE.push(...myMse); + this.dataValMAE.length = 0; + this.dataValMAE.push(...myValMae); + + this.dataValMSE.length = 0; + this.dataValMSE.push(...myValMse); this.myChart.update(); } @@ -89,7 +90,7 @@ export class LineChartComponent implements AfterViewInit { }, { label: 'Val_Accuracy', - data: this.dataMSE, + data: this.dataValAcc, borderWidth: 1 }, { @@ -99,7 +100,7 @@ export class LineChartComponent implements AfterViewInit { }, { label: 'Val_Loss', - data: this.dataMSE, + data: this.dataValLoss, borderWidth: 1 }, { @@ -109,7 +110,7 @@ export class LineChartComponent implements AfterViewInit { }, { label: 'Val_MAE', - data: this.dataMSE, + data: this.dataValMAE, borderWidth: 1 }, { @@ -119,7 +120,7 @@ export class LineChartComponent implements AfterViewInit { }, { label: 'Val_MSE', - data: this.dataMSE, + data: this.dataValMSE, borderWidth: 1 } ] diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index 694b1a83..e12065a3 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -110,7 +110,7 @@ export class ColumnTableComponent implements AfterViewInit { loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); - if (this.route.snapshot.paramMap.get("id") == null) { + if (this.route.snapshot.paramMap.get("id") == null && this.route.snapshot.paramMap.get("predictorId") == null) { this.dataset = dataset; this.setColumnTypeInitial(); diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 254298fb..d2175f73 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -120,7 +120,7 @@ export class FolderComponent implements AfterViewInit { } goToExperimentPageWithPredictor(file: FolderFile, predictor: Predictor) { - this.router.navigate(['/experiment/' + file._id + "/" + predictor._id]); + this.router.navigate(['/experiment/p/' + predictor._id]); } createNewFile() { 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 index e69de29b..e99a1e1e 100644 --- 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 @@ -0,0 +1,8 @@ +#btnYes { + background-color: var(--offwhite); + color: var(--ns-bg-dark-100); +} + +#btnNo { + color: gray; +} \ No newline at end of file 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 index 77e7be42..259aec0d 100644 --- 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 @@ -1,10 +1,10 @@ -

{{data.title}}

-
+

{{data.title}}

+
{{data.message}}
- - + +
\ No newline at end of file diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 6c8e96b3..7cb5e7cd 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -21,7 +21,7 @@ import { PredictorsService } from 'src/app/_services/predictors.service'; templateUrl: './experiment.component.html', styleUrls: ['./experiment.component.css'] }) -export class ExperimentComponent implements AfterViewInit, OnInit { +export class ExperimentComponent implements AfterViewInit { @ViewChild(MatStepper) stepper!: MatStepper; @ViewChild('stepsContainer') stepsContainer!: ElementRef; @@ -44,46 +44,6 @@ export class ExperimentComponent implements AfterViewInit, OnInit { this.experiment = new Experiment("exp1"); } - ngOnInit(): void { - this.route.queryParams.subscribe(params => { - - let experimentId = this.route.snapshot.paramMap.get("id"); - let predictorId = this.route.snapshot.paramMap.get("predictorId"); - - if (predictorId != null && experimentId != null) { - this.experimentsService.getExperimentById(experimentId).subscribe((response) => { - this.experiment = response; - this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { - this.dataset = response; - this.folderDataset.forExperiment = this.experiment; - this.folderDataset.selectFile(this.dataset); //sad 3. i 4. korak da se ucitaju - - //this.predictorsService.getPredictor(predictorId!).subscribe((response) => { - let predictor = response; - //this.modelsService.getModelById(predictor.modelId).subscribe((response) => { - this.modelsService.getModelById("62853d70696d62ceeb8db7cd").subscribe((response) => { - //imamo model - this.folderModel.formModel.newModel = response; - //this.metricView.update(predictor.metrics); - }); - //}); - }); - }); - } - else if (predictorId == null && experimentId != null) { - this.experimentsService.getExperimentById(experimentId).subscribe((response) => { - this.experiment = response; - this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { - this.dataset = response; - this.folderDataset.forExperiment = this.experiment; - this.folderDataset.selectFile(this.dataset); - }); - }); - } - - }); - } - /*updateExperiment(){ }*/ @@ -136,6 +96,52 @@ export class ExperimentComponent implements AfterViewInit, OnInit { }); } + + this.route.queryParams.subscribe(params => { + + let experimentId = this.route.snapshot.paramMap.get("id"); + let predictorId = this.route.snapshot.paramMap.get("predictorId"); + console.log("paramexp: ", experimentId, ", parampredictor: ", predictorId); + if (predictorId != null) { + this.predictorsService.getPredictor(predictorId!).subscribe((response) => { + let predictor = response; + //console.log("predictor: ", predictor); + this.experimentsService.getExperimentById(predictor.experimentId).subscribe((response) => { + this.experiment = response; + //console.log("experiment: ", this.experiment); + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + //console.log("dataset: ", this.dataset); + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.selectFile(this.dataset); //sad 3. i 4. korak da se ucitaju + + this.modelsService.getModelById(predictor.modelId).subscribe((response) => { + let model = response; + //console.log("model: ", model); + this.folderModel.formModel.newModel = model; + this.step3 = true; + let numOfEpochsArray = Array.from({length: model.epochs}, (_, i) => i + 1); + //console.log("metric view1:", this.metricView); + setTimeout(() => { + this.metricView.linechartComponent.update(numOfEpochsArray, predictor.metricsAcc, predictor.metricsLoss, predictor.metricsMae, predictor.metricsMse, predictor.metricsValAcc, predictor.metricsValLoss, predictor.metricsValMae, predictor.metricsValMse); + }) + }); + }); + }); + }); + } + else if (experimentId != null) { + this.experimentsService.getExperimentById(experimentId).subscribe((response) => { + this.experiment = response; + this.datasetsService.getDatasetById(this.experiment.datasetId).subscribe((response: Dataset) => { + this.dataset = response; + this.folderDataset.forExperiment = this.experiment; + this.folderDataset.selectFile(this.dataset); + }); + }); + } + + }); } history: any[] = []; diff --git a/frontend/src/app/_pages/my-models/my-models.component.html b/frontend/src/app/_pages/my-models/my-models.component.html deleted file mode 100644 index 9b281239..00000000 --- a/frontend/src/app/_pages/my-models/my-models.component.html +++ /dev/null @@ -1,43 +0,0 @@ - -
-
-
- -
-
- -
-
- - - - - - -
-
-
-

Nema rezultata

-
-
- -
- - - - - -
diff --git a/frontend/src/app/_pages/my-models/my-models.component.ts b/frontend/src/app/_pages/my-models/my-models.component.ts deleted file mode 100644 index d379fa69..00000000 --- a/frontend/src/app/_pages/my-models/my-models.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import shared from 'src/app/Shared'; -import Model from 'src/app/_data/Model'; -import { ModelsService } from 'src/app/_services/models.service'; - -@Component({ - selector: 'app-my-models', - templateUrl: './my-models.component.html', - styleUrls: ['./my-models.component.css'] -}) -export class MyModelsComponent implements OnInit { - myModels: Model[] = []; - //myModel: Model; - - constructor(private modelsS : ModelsService, private router : Router) { - - - - } - - ngOnInit(): void { - this.getAllMyModels(); - - } -/* - editModel(): void{ - this.modelsS.editModel().subscribe(m => { - this.myModel = m; - - }) - } -*/ - -deleteThisModel(model: Model): void{ - shared.openYesNoDialog('Brisanje seta podataka','Da li ste sigurni da želite da obrišete model?',() => { - this.modelsS.deleteModel(model).subscribe((response) => { - this.getAllMyModels(); - }, (error) =>{ - if (error.error == "Model with name = {name} deleted") { - shared.openDialog("Obaveštenje", "Greška prilikom brisanja modela."); - } - }); - }); -} - - -useThisModel(model: Model): void{ - - this.router.navigate(['/training']) - -} - getAllMyModels(): void{ - this.modelsS.getMyModels().subscribe(m => { - this.myModels = m; - }); - } - -} diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 56442842..d5552ce9 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -12,7 +12,7 @@ import { TestComponent } from './_pages/test/test.component'; const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, - { path: 'experiment/:id/:predictorId', component: ExperimentComponent, data: { title: 'Eksperiment' } }, + { path: 'experiment/p/:predictorId', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment/:id', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'experiment', component: ExperimentComponent, data: { title: 'Eksperiment' } }, { path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } }, -- cgit v1.2.3 From f51b5e2de9e29a0a3ab998f335c110131cb40ce7 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 19 May 2022 22:15:28 +0200 Subject: Popravljen box-plot. --- .../_charts/box-plot/box-plot.component.ts | 70 ++++++++++------------ .../column-table/column-table.component.ts | 29 +-------- 2 files changed, 32 insertions(+), 67 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts index 07976da3..b3d25280 100644 --- a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts +++ b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts @@ -16,25 +16,16 @@ Chart.register(BoxPlotController, BoxAndWiskers, LinearScale, CategoryScale); }) export class BoxPlotComponent implements AfterViewInit { - @Input() width?: number; - @Input() height?: number; - @Input() mean?: number; - @Input() median?: number; - @Input() min?: number; - @Input() max?: number; - @Input() q1?: number; - @Input() q3?: number; + @Input() width!: number; + @Input() height!: number; + @Input() mean!: number; + @Input() median!: number; + @Input() min!: number; + @Input() max!: number; + @Input() q1!: number; + @Input() q3!: number; - updateChart(min: number, max: number, q1: number, q3: number, median: number) { - if (this.myChart) { - this.boxplotData.datasets[0].data = [[min, q1, median, q3, max]] - this.myChart?.update(); - } - /*this.boxplotData.datasets = [{ - data: [[min, q1, median, q3, max]], - }]*/ - - }; + /* updatePieChart(uniqueValues: string[], uniqueValuesPercent: number[]){ @@ -55,27 +46,29 @@ export class BoxPlotComponent implements AfterViewInit { //this.updateChart(); } - boxplotData = { - // define label tree - //labels: ['January'/*, 'February', 'March', 'April', 'May', 'June', 'July'*/], - datasets: [{ - label: 'Dataset 1', - backgroundColor: '#0063AB', - borderColor: '#dfd7d7', - borderWidth: 1, - outlierColor: '#999999', - scaleFontColor: '#0063AB', - padding: 10, - itemRadius: 0, - data: [ - randomValues(100, 0, 100), - ] - }] - }; + ngAfterViewInit(): void { - this.myChart = new Chart(this.chartRef.nativeElement, { + const boxplotData = { + // define label tree + //labels: ['January'/*, 'February', 'March', 'April', 'May', 'June', 'July'*/], + labels:[""], + datasets: [{ + label: 'Dataset 1', + backgroundColor: '#0063AB', + borderColor: '#dfd7d7', + borderWidth: 1, + outlierColor: '#999999', + scaleFontColor: '#0063AB', + padding: 10, + itemRadius: 0, + data: [ + {min:this.min,q1:this.q1,q3:this.q3,median:this.median,max:this.max,mean:this.mean} + ] + }] + }; + const myChart = new Chart(this.chartRef.nativeElement, { type: "boxplot", - data: this.boxplotData, + data: boxplotData, options: { plugins: { legend: { @@ -92,8 +85,6 @@ export class BoxPlotComponent implements AfterViewInit { } }, y: { - min: this.min, - max: this.max, ticks: { color: '#dfd7d7' }, @@ -106,5 +97,4 @@ export class BoxPlotComponent implements AfterViewInit { }); } - myChart?: Chart; } diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index 694b1a83..fa418e23 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -78,34 +78,9 @@ export class ColumnTableComponent implements AfterViewInit { } - updateCharts() { - //min: number, max: number, q1: number, q3: number, median: number - let i = 0; - this.boxplotComp.changes.subscribe(() => { - const bps = this.boxplotComp.toArray(); - this.dataset?.columnInfo.forEach((colInfo, index) => { - if (this.experiment.columnTypes[index] == ColumnType.numerical) { - bps[i].updateChart(colInfo!.min, colInfo.max, colInfo.q1, colInfo.q3, colInfo.median); - i++; - } - }); - }); - } + + - updatePieChart() { - //min: number, max: number, q1: number, q3: number, median: number - let i = 0; - const pieChart = this.piechartComp.toArray(); - console.log(pieChart) - this.dataset?.columnInfo.forEach((colInfo, index) => { - console.log(i) - if (this.experiment.columnTypes[index] == ColumnType.categorical) { - console.log("prosao IF") - pieChart[i].updatePieChart(colInfo!.uniqueValues, colInfo.uniqueValuesPercent); - i++; - } - }); - } loadDataset(dataset: Dataset) { console.log("LOADED DATASET"); -- cgit v1.2.3 From 8c7273e0383e2fac27247000d62a3edde704294c Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 19 May 2022 22:57:10 +0200 Subject: Ukoliko korisnik trenira model za vise od 100 epoha. Notifikacije se salju na svakih sqrt(totalEpochs). Time aplikacija vise ne zabada. --- backend/api/api/Controllers/ModelController.cs | 3 +- frontend/package-lock.json | 166 ++++++++------------- .../_elements/metric-view/metric-view.component.ts | 12 +- .../app/_pages/experiment/experiment.component.ts | 2 +- 4 files changed, 72 insertions(+), 111 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index be30ae6f..c574de28 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -81,10 +81,9 @@ namespace api.Controllers [ServiceFilter(typeof(MlApiCheckActionFilter))] public async Task> Epoch([FromBody] Epoch info) { - var model=_modelService.GetOneModel(info.ModelId); var user = _userService.GetUserById(model.uploaderId); - + if((model.epochs>100 && info.EpochNum%Math.Round(Math.Sqrt(model.epochs))==0) || model.epochs<=100 ||model.epochs-1==info.EpochNum) if (ChatHub.CheckUser(user._id)) foreach (var connection in ChatHub.getAllConnectionsOfUser(user._id)) await _ichat.Clients.Client(connection).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5029a126..7a0f7b3a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -437,7 +437,6 @@ }, "node_modules/@angular/compiler-cli": { "version": "13.2.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.17.2", @@ -466,7 +465,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@ampproject/remapping": { "version": "2.1.2", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" @@ -477,7 +475,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { "version": "7.17.5", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -506,7 +503,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -514,7 +510,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { "version": "7.17.3", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.17.0", @@ -527,7 +522,6 @@ }, "node_modules/@angular/compiler-cli/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -750,7 +744,6 @@ }, "node_modules/@babel/core": { "version": "7.16.12", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", @@ -779,7 +772,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -787,7 +779,6 @@ }, "node_modules/@babel/core/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -795,7 +786,6 @@ }, "node_modules/@babel/generator": { "version": "7.16.8", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.16.8", @@ -808,7 +798,6 @@ }, "node_modules/@babel/generator/node_modules/source-map": { "version": "0.5.7", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3271,7 +3260,6 @@ }, "node_modules/anymatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3522,7 +3510,6 @@ }, "node_modules/binary-extensions": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3610,7 +3597,6 @@ }, "node_modules/braces": { "version": "3.0.2", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.0.1" @@ -3788,7 +3774,6 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "dev": true, "funding": [ { "type": "individual", @@ -4731,7 +4716,6 @@ }, "node_modules/dependency-graph": { "version": "0.11.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -4878,7 +4862,6 @@ }, "node_modules/encoding": { "version": "0.1.13", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4887,7 +4870,6 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5363,7 +5345,6 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5612,7 +5593,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6150,7 +6130,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -6200,7 +6179,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6215,7 +6193,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -6239,7 +6216,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -7033,7 +7009,6 @@ }, "node_modules/lru-cache": { "version": "6.0.0", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7044,7 +7019,6 @@ }, "node_modules/magic-string": { "version": "0.25.7", - "dev": true, "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.4" @@ -7587,7 +7561,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8224,7 +8197,6 @@ }, "node_modules/picomatch": { "version": "2.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -8975,7 +8947,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -9250,7 +9221,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/sass": { @@ -9370,7 +9341,6 @@ }, "node_modules/semver": { "version": "7.3.5", - "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -9720,7 +9690,6 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "dev": true, "license": "MIT" }, "node_modules/spdy": { @@ -10099,7 +10068,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -10181,7 +10149,6 @@ }, "node_modules/typescript": { "version": "4.5.5", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10803,7 +10770,6 @@ }, "node_modules/yallist": { "version": "4.0.0", - "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -11089,7 +11055,6 @@ }, "@angular/compiler-cli": { "version": "13.2.5", - "dev": true, "requires": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -11105,14 +11070,12 @@ "dependencies": { "@ampproject/remapping": { "version": "2.1.2", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } }, "@babel/core": { "version": "7.17.5", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -11132,14 +11095,12 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "dev": true + "version": "6.3.0" } } }, "@babel/generator": { "version": "7.17.3", - "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -11147,8 +11108,7 @@ } }, "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, @@ -11259,7 +11219,6 @@ }, "@babel/core": { "version": "7.16.12", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -11279,18 +11238,15 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "dev": true + "version": "6.3.0" }, "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, "@babel/generator": { "version": "7.16.8", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -11298,8 +11254,7 @@ }, "dependencies": { "source-map": { - "version": "0.5.7", - "dev": true + "version": "0.5.7" } } }, @@ -12232,7 +12187,8 @@ }, "dependencies": { "ws": { - "version": "7.5.7" + "version": "7.5.7", + "requires": {} } } }, @@ -12244,7 +12200,8 @@ }, "@ngtools/webpack": { "version": "13.2.5", - "dev": true + "dev": true, + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -12811,7 +12768,8 @@ }, "acorn-import-assertions": { "version": "1.8.0", - "dev": true + "dev": true, + "requires": {} }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -12909,7 +12867,6 @@ }, "anymatch": { "version": "3.1.2", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -13061,8 +13018,7 @@ "dev": true }, "binary-extensions": { - "version": "2.2.0", - "dev": true + "version": "2.2.0" }, "bl": { "version": "4.1.0", @@ -13119,7 +13075,8 @@ "dev": true }, "bootstrap": { - "version": "5.1.3" + "version": "5.1.3", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -13130,7 +13087,6 @@ }, "braces": { "version": "3.0.2", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -13239,7 +13195,6 @@ }, "chokidar": { "version": "3.5.3", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -13261,7 +13216,8 @@ }, "circular-dependency-plugin": { "version": "5.2.2", - "dev": true + "dev": true, + "requires": {} }, "clean-stack": { "version": "2.2.0", @@ -13632,7 +13588,8 @@ }, "css-prefers-color-scheme": { "version": "6.0.3", - "dev": true + "dev": true, + "requires": {} }, "css-select": { "version": "4.2.1", @@ -13832,8 +13789,7 @@ "dev": true }, "dependency-graph": { - "version": "0.11.0", - "dev": true + "version": "0.11.0" }, "destroy": { "version": "1.0.4", @@ -13932,7 +13888,6 @@ }, "encoding": { "version": "0.1.13", - "dev": true, "optional": true, "requires": { "iconv-lite": "^0.6.2" @@ -13940,7 +13895,6 @@ "dependencies": { "iconv-lite": { "version": "0.6.3", - "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -14253,7 +14207,6 @@ }, "fill-range": { "version": "7.0.1", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -14402,7 +14355,6 @@ }, "glob-parent": { "version": "5.1.2", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -14599,7 +14551,8 @@ }, "icss-utils": { "version": "5.1.0", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -14746,7 +14699,6 @@ }, "is-binary-path": { "version": "2.1.0", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -14770,15 +14722,13 @@ "dev": true }, "is-extglob": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" }, "is-fullwidth-code-point": { "version": "3.0.0" }, "is-glob": { "version": "4.0.3", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -14792,8 +14742,7 @@ "dev": true }, "is-number": { - "version": "7.0.0", - "dev": true + "version": "7.0.0" }, "is-path-cwd": { "version": "2.2.0", @@ -15117,7 +15066,8 @@ }, "karma-jasmine-html-reporter": { "version": "1.7.0", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -15290,14 +15240,12 @@ }, "lru-cache": { "version": "6.0.0", - "dev": true, "requires": { "yallist": "^4.0.0" } }, "magic-string": { "version": "0.25.7", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -15632,8 +15580,7 @@ } }, "normalize-path": { - "version": "3.0.0", - "dev": true + "version": "3.0.0" }, "normalize-range": { "version": "0.1.2", @@ -16048,8 +15995,7 @@ "version": "1.0.0" }, "picomatch": { - "version": "2.3.1", - "dev": true + "version": "2.3.1" }, "pify": { "version": "2.3.0", @@ -16139,7 +16085,8 @@ }, "postcss-custom-media": { "version": "8.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-custom-properties": { "version": "12.1.4", @@ -16193,11 +16140,13 @@ }, "postcss-font-variant": { "version": "5.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", - "dev": true + "dev": true, + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -16217,7 +16166,8 @@ }, "postcss-initial": { "version": "4.0.1", - "dev": true + "dev": true, + "requires": {} }, "postcss-lab-function": { "version": "4.1.1", @@ -16238,15 +16188,18 @@ }, "postcss-logical": { "version": "5.0.4", - "dev": true + "dev": true, + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-extract-imports": { "version": "3.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -16280,11 +16233,13 @@ }, "postcss-overflow-shorthand": { "version": "3.0.3", - "dev": true + "dev": true, + "requires": {} }, "postcss-page-break": { "version": "3.0.4", - "dev": true + "dev": true, + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -16341,7 +16296,8 @@ }, "postcss-replace-overflow-wrap": { "version": "4.0.0", - "dev": true + "dev": true, + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -16469,7 +16425,6 @@ }, "readdirp": { "version": "3.6.0", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -16641,7 +16596,7 @@ }, "safer-buffer": { "version": "2.1.2", - "dev": true + "devOptional": true }, "sass": { "version": "1.49.0", @@ -16685,7 +16640,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -16706,7 +16662,6 @@ }, "semver": { "version": "7.3.5", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -16952,8 +16907,7 @@ } }, "sourcemap-codec": { - "version": "1.4.8", - "dev": true + "version": "1.4.8" }, "spdy": { "version": "4.0.2", @@ -17123,7 +17077,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -17177,7 +17132,6 @@ }, "to-regex-range": { "version": "5.0.1", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -17226,8 +17180,7 @@ "dev": true }, "typescript": { - "version": "4.5.5", - "dev": true + "version": "4.5.5" }, "ua-parser-js": { "version": "0.7.31", @@ -17386,7 +17339,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -17580,7 +17534,8 @@ }, "ws": { "version": "8.2.3", - "dev": true + "dev": true, + "requires": {} }, "xlsx": { "version": "0.18.5", @@ -17598,8 +17553,7 @@ "version": "5.0.8" }, "yallist": { - "version": "4.0.0", - "dev": true + "version": "4.0.0" }, "yaml": { "version": "1.10.2", diff --git a/frontend/src/app/_elements/metric-view/metric-view.component.ts b/frontend/src/app/_elements/metric-view/metric-view.component.ts index fbca2edf..65b1ef9b 100644 --- a/frontend/src/app/_elements/metric-view/metric-view.component.ts +++ b/frontend/src/app/_elements/metric-view/metric-view.component.ts @@ -16,7 +16,7 @@ export class MetricViewComponent implements OnInit { history: any[] = []; - update(history: any[]) { + update(history: any[],totalEpochs:number) { const myAcc: number[] = []; const myMae: number[] = []; const myMse: number[] = []; @@ -29,7 +29,15 @@ export class MetricViewComponent implements OnInit { const myEpochs: number[] = []; this.history = history; this.history.forEach((metrics, epoch) => { - myEpochs.push(epoch + 1); + if(totalEpochs>100) + { + let epochEstimate=epoch*Math.round(Math.sqrt(totalEpochs)) + if(epochEstimate>totalEpochs) + epochEstimate=totalEpochs; + myEpochs.push(epochEstimate); + } + else + myEpochs.push(epoch + 1); for (let key in metrics) { let value = metrics[key]; //console.log(key, ':::', value, epoch); diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts index 7cb5e7cd..398321f2 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.ts +++ b/frontend/src/app/_pages/experiment/experiment.component.ts @@ -91,7 +91,7 @@ export class ExperimentComponent implements AfterViewInit { stat = stat.replace(/'/g, '"'); //console.log('JSON', this.trainingResult); this.history.push(JSON.parse(stat)); - this.metricView.update(this.history); + this.metricView.update(this.history,this.modelToTrain.epochs); } }); -- cgit v1.2.3 From 8d41b2ec76f7566bf51598670b51141cad9b66ef Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 19 May 2022 23:21:53 +0200 Subject: Ispravljen zahtev za updajtovanje dataseta. --- frontend/src/app/_elements/form-dataset/form-dataset.component.html | 2 +- frontend/src/app/_services/datasets.service.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 78bb4bd1..024f58e8 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -10,7 +10,7 @@
Naziv - + diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 3fb4e8f2..2775613c 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -44,8 +44,8 @@ export class DatasetsService { return this.http.get(`${Configuration.settings.apiURL}/dataset/get/${datasetId}`, { headers: this.authService.authHeader() }); } - editDataset(dataset: Dataset): Observable { - return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() }); + editDataset(dataset: Dataset){ + return this.http.put(`${Configuration.settings.apiURL}/dataset/` + dataset._id, dataset, { headers: this.authService.authHeader() ,responseType:'text'}); } deleteDataset(dataset: Dataset) { -- cgit v1.2.3 From 4229eae95fb6daab9ccb6ab0ae05e29689588eb2 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Fri, 20 May 2022 00:27:35 +0200 Subject: Dodao funkcionalnost da kada se doda novi dataset/model da se automatski predje na sledeci korak. --- frontend/src/app/_elements/folder/folder.component.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 9d19d556..13ec8937 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -182,6 +182,9 @@ export class FolderComponent implements AfterViewInit { this.folders[TabType.MyModels] = models; if (selectedModelId) { this.selectFile(models.filter(x => x._id == selectedModelId)[0]); + setTimeout(() => { + this.okPressed.emit(); + }); } this.searchTermsChanged(); }); @@ -233,11 +236,14 @@ export class FolderComponent implements AfterViewInit { } saveNewFile() { + this.loadingAction = true; switch (this.type) { case FolderType.Dataset: this.formDataset!.uploadDataset((dataset: Dataset) => { this.newFile = undefined; - Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se obradi."); + this.loadingAction = false; + this.okPressed.emit(); + //Shared.openDialog("Obaveštenje", "Uspešno ste dodali novi izvor podataka u kolekciju. Molimo sačekajte par trenutaka da se obradi."); this.refreshFiles(); }, () => { @@ -248,7 +254,8 @@ export class FolderComponent implements AfterViewInit { this.formModel.newModel.type = this.formModel.forProblemType; this.modelsService.addModel(this.formModel.newModel).subscribe(model => { this.newFile = undefined; - Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju."); + this.loadingAction = false; + //Shared.openDialog("Obaveštenje", "Uspešno ste dodali novu konfiguraciju neuronske mreže u kolekciju."); this.refreshFiles(null, model._id); // 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."); -- cgit v1.2.3 From 05aaef1e6fc0431206994b0fc18d470a84e650c1 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Fri, 20 May 2022 02:25:15 +0200 Subject: Popravio tooltipove chartova tako da nisu odseceni unutar kolona. --- .../_charts/box-plot/box-plot.component.html | 2 +- .../_charts/line-chart/line-chart.component.html | 4 +- .../_charts/pie-chart/pie-chart.component.html | 2 +- .../column-table/column-table.component.css | 4 +- frontend/src/app/app.component.ts | 114 ++++++++++++++++++++- frontend/src/styles/helper.css | 8 ++ 6 files changed, 127 insertions(+), 7 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.html b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.html index 688eafae..3b2bf976 100644 --- a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.html +++ b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.html @@ -1,3 +1,3 @@ -
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html index d48212cd..1c711562 100644 --- a/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html +++ b/frontend/src/app/_elements/_charts/line-chart/line-chart.component.html @@ -1,4 +1,4 @@ -
- +
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.html b/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.html index 7faf3af0..fe3998ff 100644 --- a/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.html +++ b/frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.html @@ -1,3 +1,3 @@ -
+
\ No newline at end of file diff --git a/frontend/src/app/_elements/column-table/column-table.component.css b/frontend/src/app/_elements/column-table/column-table.component.css index 311773f7..40ae3c05 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.css +++ b/frontend/src/app/_elements/column-table/column-table.component.css @@ -13,7 +13,7 @@ table.fixed { } table.fixed td { - overflow: hidden; + /* overflow: hidden; */ max-width: 200px; min-width: 200px; vertical-align: middle; @@ -21,7 +21,7 @@ table.fixed td { } table.fixed th { - overflow: hidden; + /* overflow: hidden; */ max-width: 250px; min-width: 120px; vertical-align: middle; diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index e301b46f..5660f676 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -6,6 +6,7 @@ import { AuthService } from './_services/auth.service'; import { SignalRService } from './_services/signal-r.service'; import { HttpClient } from '@angular/common/http'; import Shared from './Shared'; +import { Chart } from 'chart.js'; @Component({ selector: 'app-root', templateUrl: './app.component.html', @@ -14,6 +15,117 @@ import Shared from './Shared'; export class AppComponent implements OnInit, AfterViewInit { constructor(private router: Router, private titleService: Title, private authService: AuthService, private signalRService: SignalRService, private http: HttpClient) { + const getOrCreateTooltip = (chart: { canvas: { parentNode: { querySelector: (arg0: string) => any; appendChild: (arg0: any) => void; }; }; }) => { + let tooltipEl = chart.canvas.parentNode.querySelector('div'); + + if (!tooltipEl) { + tooltipEl = document.createElement('div'); + tooltipEl.style.background = 'rgba(0, 0, 0, 0.7)'; + tooltipEl.style.borderRadius = '3px'; + tooltipEl.style.color = 'white'; + tooltipEl.style.opacity = 1; + tooltipEl.style.pointerEvents = 'none'; + tooltipEl.style.position = 'absolute'; + tooltipEl.style.transform = 'translate(-50%, 0)'; + tooltipEl.style.transition = 'all .1s ease'; + tooltipEl.style.zIndex = 9000; + + tooltipEl.classList.add("clearfix"); + + const table = document.createElement('table'); + table.style.margin = '0px'; + + tooltipEl.appendChild(table); + chart.canvas.parentNode.appendChild(tooltipEl); + } + + return tooltipEl; + }; + + const externalTooltipHandler = (context: { chart: any; tooltip: any; }) => { + // Tooltip Element + const { chart, tooltip } = context; + const tooltipEl = getOrCreateTooltip(chart); + + // Hide if no tooltip + if (tooltip.opacity === 0) { + tooltipEl.style.opacity = 0; + return; + } + + // Set Text + if (tooltip.body) { + const titleLines = tooltip.title || []; + const bodyLines = tooltip.body.map((b: { lines: any; }) => b.lines); + + const tableHead = document.createElement('thead'); + + titleLines.forEach((title: string) => { + const tr = document.createElement('tr'); + tr.style.borderWidth = '' + 0; + + const th = document.createElement('th'); + th.style.borderWidth = '' + 0; + const text = document.createTextNode(title); + + th.appendChild(text); + tr.appendChild(th); + tableHead.appendChild(tr); + }); + + const tableBody = document.createElement('tbody'); + bodyLines.forEach((body: string, i: string | number) => { + const colors = tooltip.labelColors[i]; + + const span = document.createElement('span'); + span.style.background = colors.backgroundColor; + span.style.borderColor = colors.borderColor; + span.style.borderWidth = '2px'; + span.style.marginRight = '10px'; + span.style.height = '10px'; + span.style.width = '10px'; + span.style.display = 'inline-block'; + + const tr = document.createElement('tr'); + tr.style.backgroundColor = 'inherit'; + tr.style.borderWidth = '' + 0; + + const td = document.createElement('td'); + td.style.borderWidth = '' + 0; + + const text = document.createTextNode(body); + + td.appendChild(span); + td.appendChild(text); + tr.appendChild(td); + tableBody.appendChild(tr); + }); + + const tableRoot = tooltipEl.querySelector('table'); + + // Remove old children + while (tableRoot.firstChild) { + tableRoot.firstChild.remove(); + } + + // Add new children + tableRoot.appendChild(tableHead); + tableRoot.appendChild(tableBody); + } + + const { offsetLeft: positionX, offsetTop: positionY } = chart.canvas; + + // Display, position, and set styles for font + tooltipEl.style.opacity = 1; + tooltipEl.style.left = positionX + tooltip.caretX + 'px'; + tooltipEl.style.top = positionY + tooltip.caretY + 'px'; + tooltipEl.style.font = tooltip.options.bodyFont.string; + tooltipEl.style.padding = tooltip.options.padding + 'px ' + tooltip.options.padding + 'px'; + }; + + Chart.defaults.plugins.tooltip.enabled = false; + Chart.defaults.plugins.tooltip.position = 'nearest'; + Chart.defaults.plugins.tooltip.external = externalTooltipHandler; } ngAfterViewInit(): void { } @@ -40,7 +152,7 @@ export class AppComponent implements OnInit, AfterViewInit { } }); if (!this.authService.isAuthenticated()) { - if(!this.authService.alreadyGuest()) + if (!this.authService.alreadyGuest()) this.authService.addGuestToken(); } this.signalRService.startConnection(); diff --git a/frontend/src/styles/helper.css b/frontend/src/styles/helper.css index 971a2ed6..155fc3e1 100644 --- a/frontend/src/styles/helper.css +++ b/frontend/src/styles/helper.css @@ -142,4 +142,12 @@ select:-webkit-autofill { a { color: var(--ns-accent) !important; +} + +.clearfix:after { + content: "\0020"; + display: block; + height: 0; + clear: both; + visibility: hidden; } \ No newline at end of file -- cgit v1.2.3 From a2d7403e056779133d258c198bedf278080f80f4 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Fri, 20 May 2022 02:35:32 +0200 Subject: Postavljeno da nullValReplacers prati dataset.columnInfo (po indeksima) i iskljucivanje kolona sa nedostajucim vrednostima ako korisnik to odabere. --- .../column-table/column-table.component.ts | 78 ++++++++++++++-------- 1 file changed, 51 insertions(+), 27 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/column-table/column-table.component.ts b/frontend/src/app/_elements/column-table/column-table.component.ts index 9a8cbeee..26228978 100644 --- a/frontend/src/app/_elements/column-table/column-table.component.ts +++ b/frontend/src/app/_elements/column-table/column-table.component.ts @@ -114,20 +114,11 @@ export class ColumnTableComponent implements AfterViewInit { else this.columnsChecked.push(false); }); - this.nullValOption = []; + //this.nullValOption = []; for (let i = 0; i < this.dataset!.columnInfo.length; i++) { - let nullValRep = this.experiment.nullValuesReplacers.find(x => x.column == this.dataset!.columnInfo[i].columnName); - if (nullValRep != undefined) { - if (nullValRep.option == NullValueOptions.DeleteRows) - this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); - else if (nullValRep.option == NullValueOptions.DeleteColumns) - this.nullValOption.push(`Obriši kolonu`); - else { - this.nullValOption.push(`Popuni sa ${nullValRep.value}`); - } - } - else - this.nullValOption.push(`Obriši redove (${this.dataset.columnInfo[i].numNulls})`); + //let nullValRep = this.experiment.nullValuesReplacers.find(x => x.column == this.dataset!.columnInfo[i].columnName); + let nullValRep = this.experiment.nullValuesReplacers[i]; + this.nullValOption[i] = (nullValRep.option == NullValueOptions.DeleteRows) ? `Obriši redove (${this.dataset.columnInfo[i].numNulls})` : ((nullValRep.option == NullValueOptions.DeleteColumns) ? `Isključi kolonu` : `Popuni sa ${nullValRep.value}`); } } this.resetPagging(); @@ -171,10 +162,10 @@ export class ColumnTableComponent implements AfterViewInit { } setDeleteRowsForMissingValTreatment() { - if (this.experiment != undefined) { + if (this.experiment != undefined && this.dataset != undefined) { this.experiment.nullValues = NullValueOptions.DeleteRows; this.experiment.nullValuesReplacers = []; - for (let i = 0; i < this.experiment.inputColumns.length; i++) { + for (let i = 0; i < this.dataset?.columnInfo.length; i++) { this.experiment.nullValuesReplacers.push({ column: this.experiment.inputColumns[i], option: NullValueOptions.DeleteRows, @@ -204,13 +195,17 @@ export class ColumnTableComponent implements AfterViewInit { } if (this.experiment.inputColumns.length == 1) this.experiment.outputColumn = this.experiment.inputColumns[0]; + + let index = this.dataset?.columnInfo.findIndex(x => x.columnName == columnName)!; + this.nullValOption[index] = (this.experiment.nullValuesReplacers[index].option == NullValueOptions.DeleteRows) ? "Obriši redove (" + this.dataset?.columnInfo[index].numNulls + ")" : "Popuni sa " + this.experiment.nullValuesReplacers[index].value; } else { this.experiment.inputColumns = this.experiment.inputColumns.filter(x => x != columnName); //console.log("Input columns: ", this.experiment.inputColumns); //TODO: da se zatamni kolona koja je unchecked //this.experiment.encodings = this.experiment.encodings.filter(x => x.columnName != columnName); samo na kraju iz enkodinga skloni necekirane - this.experiment.nullValuesReplacers = this.experiment.nullValuesReplacers.filter(x => x.column != columnName); + let index = this.dataset?.columnInfo.findIndex(x => x.columnName == columnName)!; + this.nullValOption[index] = "Isključi kolonu"; if (columnName == this.experiment.outputColumn) { if (this.experiment.inputColumns.length > 0) this.experiment.outputColumn = this.experiment.inputColumns[0]; @@ -224,11 +219,12 @@ export class ColumnTableComponent implements AfterViewInit { outputColumnChanged() { let outputColReplacer = this.experiment.nullValuesReplacers.find(x => x.column == this.experiment.outputColumn); - let index = this.experiment.nullValuesReplacers.findIndex(x => x.column == this.experiment.outputColumn); + //let index = this.experiment.nullValuesReplacers.findIndex(x => x.column == this.experiment.outputColumn); if (outputColReplacer != undefined) { outputColReplacer.option = NullValueOptions.DeleteRows; let numOfRowsToDelete = (this.dataset!.columnInfo.filter(x => x.columnName == this.experiment.outputColumn)[0]).numNulls; + let index = this.dataset!.columnInfo.findIndex(x => x.columnName == this.experiment.outputColumn); this.nullValOption[index] = "Obriši redove (" + numOfRowsToDelete + ")"; } @@ -285,7 +281,16 @@ export class ColumnTableComponent implements AfterViewInit { if (this.experiment != undefined && this.dataset != undefined) { if (selectedMissingValuesOption == NullValueOptions.DeleteColumns) { - this.experiment.nullValues = NullValueOptions.DeleteColumns; + for (let i = 0; i < this.dataset.columnInfo.length; i++) { + if (this.dataset.columnInfo[i].numNulls > 0 && this.dataset.columnInfo[i].columnName != this.experiment.outputColumn) { + this.experiment.inputColumns = this.experiment.inputColumns.filter(x => x != this.dataset!.columnInfo[i].columnName); + this.columnsChecked[i] = false; + console.log(this.dataset!.columnInfo[i].columnName); + + this.nullValOption[i] = "Isključi kolonu"; + } + } + /*this.experiment.nullValues = NullValueOptions.DeleteColumns; let outputColReplacer = this.experiment.nullValuesReplacers.find(x => x.column == this.experiment.outputColumn); @@ -297,16 +302,18 @@ export class ColumnTableComponent implements AfterViewInit { option: NullValueOptions.DeleteColumns, value: "" }); - this.nullValOption[i] = "Obriši kolonu"; + let colIndex = this.dataset.columnInfo.findIndex(x => x.columnName == this.experiment.inputColumns[i]); + this.nullValOption[colIndex] = "Isključi kolonu"; } else { if (outputColReplacer != undefined) { this.experiment.nullValuesReplacers.push(outputColReplacer); let numOfRowsToDelete = (this.dataset.columnInfo.filter(x => x.columnName == this.experiment!.inputColumns[i])[0]).numNulls; - this.nullValOption[i] = (outputColReplacer.option == NullValueOptions.DeleteRows) ? "Obriši redove (" + numOfRowsToDelete + ")" : "Popuni sa " + outputColReplacer.value + ""; + let colIndex = this.dataset.columnInfo.findIndex(x => x.columnName == this.experiment.inputColumns[i]); + this.nullValOption[colIndex] = (outputColReplacer.option == NullValueOptions.DeleteRows) ? "Obriši redove (" + numOfRowsToDelete + ")" : "Popuni sa " + outputColReplacer.value + ""; } } - } + }*/ //obrisi kolone koje sadrze nedostajuce vrednosti iz input kolona /*for (let i = 0; i < this.dataset.columnInfo.length; i++) { if (this.dataset.columnInfo[i].numNulls > 0) { @@ -326,7 +333,8 @@ export class ColumnTableComponent implements AfterViewInit { value: "" }); let numOfRowsToDelete = (this.dataset.columnInfo.filter(x => x.columnName == this.experiment!.inputColumns[i])[0]).numNulls; - this.nullValOption[i] = "Obriši redove (" + numOfRowsToDelete + ")"; + let colIndex = this.dataset.columnInfo.findIndex(x => x.columnName == this.experiment.inputColumns[i]); + this.nullValOption[colIndex] = "Obriši redove (" + numOfRowsToDelete + ")"; } } this.columnTableChangeDetected(); @@ -369,7 +377,16 @@ export class ColumnTableComponent implements AfterViewInit { MissValsDeleteClicked(event: Event, replacementType: NullValueOptions, index: number) { if (this.experiment != undefined && this.dataset != undefined) { - let columnName = (event.currentTarget).value; + + this.experiment.nullValuesReplacers[index].option = NullValueOptions.DeleteRows; + this.experiment.nullValuesReplacers[index].value = ""; + + this.nullValOption[index] = "Obriši redove (" + this.dataset.columnInfo[index].numNulls + ")"; + + this.columnTableChangeDetected(); + } + + /*let columnName = (event.currentTarget).value; let arrayElement = this.experiment.nullValuesReplacers.filter(x => x.column == columnName)[0]; if (arrayElement == undefined) { @@ -385,14 +402,21 @@ export class ColumnTableComponent implements AfterViewInit { } let numOfRowsToDelete = (this.dataset.columnInfo.filter(x => x.columnName == this.experiment!.inputColumns[index])[0]).numNulls; - this.nullValOption[index] = (replacementType == NullValueOptions.DeleteColumns) ? "Obriši kolonu" : "Obriši redove (" + numOfRowsToDelete + ")"; + this.nullValOption[index] = (replacementType == NullValueOptions.DeleteColumns) ? "Isključi kolonu" : "Obriši redove (" + numOfRowsToDelete + ")"; this.columnTableChangeDetected(); - } + }*/ } MissValsReplaceClicked(event: Event, columnName: string, index: number) { if (this.experiment != undefined) { - let fillValue = (event.currentTarget).value; + this.experiment.nullValuesReplacers[index].option = NullValueOptions.Replace; + let value = (event.currentTarget).value; + this.experiment.nullValuesReplacers[index].value = value; + this.nullValOption[index] = "Popuni sa " + value; + + this.columnTableChangeDetected(); + + /*let fillValue = (event.currentTarget).value; let arrayElement = this.experiment.nullValuesReplacers.filter(x => x.column == columnName)[0]; if (arrayElement == undefined) { @@ -408,7 +432,7 @@ export class ColumnTableComponent implements AfterViewInit { } this.nullValOption[index] = "Popuni sa: " + fillValue; - this.columnTableChangeDetected(); + this.columnTableChangeDetected();*/ } } getValue(columnName: string): string { -- cgit v1.2.3 From e4222ce4533beb64bd8460a9d7c4ad3688220f56 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Fri, 20 May 2022 02:36:22 +0200 Subject: Popravljen bug kada korisnik prelazi sa otvorenog dataseta da napravi novi pa se vraca na otvoreni dataset. --- frontend/src/app/_elements/folder/folder.component.ts | 1 + 1 file changed, 1 insertion(+) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index beff6012..6e04f963 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -460,6 +460,7 @@ export class FolderComponent implements AfterViewInit { setTimeout(() => { if (tab == TabType.NewFile) { this.selectNewFile(); + this.selectedFile=undefined!; } this.listView = this.getListView(tab); -- cgit v1.2.3 From b46c5702c8e2900907c355fd7569a18076c681c0 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Fri, 20 May 2022 02:49:58 +0200 Subject: Folder fix --- frontend/src/app/_elements/datatable/datatable.component.css | 4 ++++ frontend/src/app/_elements/folder/folder.component.css | 1 + frontend/src/app/_elements/folder/folder.component.html | 7 ++++--- frontend/src/app/_elements/form-dataset/form-dataset.component.css | 2 +- .../src/app/_elements/form-dataset/form-dataset.component.html | 2 +- frontend/src/app/_pages/archive/archive.component.css | 3 +++ frontend/src/app/_pages/archive/archive.component.html | 2 +- 7 files changed, 15 insertions(+), 6 deletions(-) (limited to 'frontend/src/app/_elements') diff --git a/frontend/src/app/_elements/datatable/datatable.component.css b/frontend/src/app/_elements/datatable/datatable.component.css index e69de29b..4e0a3737 100644 --- a/frontend/src/app/_elements/datatable/datatable.component.css +++ b/frontend/src/app/_elements/datatable/datatable.component.css @@ -0,0 +1,4 @@ +.proba { + max-width: 1620px; + +} \ No newline at end of file diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css index 97c13299..682fc645 100644 --- a/frontend/src/app/_elements/folder/folder.component.css +++ b/frontend/src/app/_elements/folder/folder.component.css @@ -1,5 +1,6 @@ #folder { width: 100%; + } #tabs { diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index da182945..66a3ab55 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -116,9 +116,10 @@
-
- - +
+ + +
diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.css b/frontend/src/app/_elements/form-dataset/form-dataset.component.css index 99ed5d40..43accd6d 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.css +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.css @@ -7,7 +7,7 @@ .topBar { display: table; width: 100%; - height: 100px; + height: 80px; margin-left: 1.5%; margin-top: 1.5% ; } diff --git a/frontend/src/app/_elements/form-dataset/form-dataset.component.html b/frontend/src/app/_elements/form-dataset/form-dataset.component.html index 024f58e8..6194a1a8 100644 --- a/frontend/src/app/_elements/form-dataset/form-dataset.component.html +++ b/frontend/src/app/_elements/form-dataset/form-dataset.component.html @@ -40,7 +40,7 @@ -
+
{{(this.begin/10)+1}}...{{getPage()}}
diff --git a/frontend/src/app/_pages/archive/archive.component.css b/frontend/src/app/_pages/archive/archive.component.css index e69de29b..3a8145dc 100644 --- a/frontend/src/app/_pages/archive/archive.component.css +++ b/frontend/src/app/_pages/archive/archive.component.css @@ -0,0 +1,3 @@ +.pro-center{ + width: 80%; +} \ No newline at end of file diff --git a/frontend/src/app/_pages/archive/archive.component.html b/frontend/src/app/_pages/archive/archive.component.html index f9cce56b..0c5fa8aa 100644 --- a/frontend/src/app/_pages/archive/archive.component.html +++ b/frontend/src/app/_pages/archive/archive.component.html @@ -1,5 +1,5 @@
- +