Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • sibmip/gateway
1 result
Show changes
Commits on Source (15)
Showing
with 492 additions and 64 deletions
# [1.4.0-rc.1](https://gitlab.com/sibmip/gateway/compare/1.3.0...1.4.0-rc.1) (2023-02-06)
### Bug Fixes
* categories bins ([bf750eb](https://gitlab.com/sibmip/gateway/commit/bf750eba2ade5aba2178c67817f9628e9c8f1c7a))
* cleanup ([edecf44](https://gitlab.com/sibmip/gateway/commit/edecf440a51fcb832f29dd77583a4fae87da989f))
* enabled LR Cross-Validation, Cast numbers -> strings ([bac2951](https://gitlab.com/sibmip/gateway/commit/bac2951f608076e6863a418d62f1d9ab0b27964f))
* **exareme2:** Categorical bins ([bb472ec](https://gitlab.com/sibmip/gateway/commit/bb472ec03aefa788c52d062a8362f3fe80b57a84))
* **exareme2:** debug for histograms ([622d2d7](https://gitlab.com/sibmip/gateway/commit/622d2d7f1bc1d676a423ff6f44e132f6241fc8a4))
* **exareme2:** lint ([8f5bc14](https://gitlab.com/sibmip/gateway/commit/8f5bc1497ef2b13ed490b9defe1db95d468f47f6))
* **exareme2:** test for descriptive stats ([a16b9cd](https://gitlab.com/sibmip/gateway/commit/a16b9cd469262c7137cdb11e7192f06f7746c20d))
### Features
* Histograms handler ([de0c7c2](https://gitlab.com/sibmip/gateway/commit/de0c7c2fbc6379c2f751192a2e41a5377d92f430))
* Logistic Regression handler ([e6eb047](https://gitlab.com/sibmip/gateway/commit/e6eb0474491315adf3e91b3a94a0e1f4d196c20d))
# [1.4.0-beta.2](https://gitlab.com/sibmip/gateway/compare/1.4.0-beta.1...1.4.0-beta.2) (2023-01-17)
### Bug Fixes
* enabled LR Cross-Validation, Cast numbers -> strings ([bac2951](https://gitlab.com/sibmip/gateway/commit/bac2951f608076e6863a418d62f1d9ab0b27964f))
# [1.4.0-beta.1](https://gitlab.com/sibmip/gateway/compare/1.3.0...1.4.0-beta.1) (2023-01-17)
### Bug Fixes
* **exareme2:** test for descriptive stats ([a16b9cd](https://gitlab.com/sibmip/gateway/commit/a16b9cd469262c7137cdb11e7192f06f7746c20d))
### Features
* Logistic Regression handler ([e6eb047](https://gitlab.com/sibmip/gateway/commit/e6eb0474491315adf3e91b3a94a0e1f4d196c20d))
# [1.3.0](https://gitlab.com/sibmip/gateway/compare/1.2.3...1.3.0) (2022-11-22)
......
{
"name": "gateway",
"version": "1.3.0",
"version": "1.4.0-rc.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "gateway",
"version": "1.3.0",
"version": "1.4.0-rc.1",
"license": "Apache-2.0",
"dependencies": {
"@nestjs/apollo": "^10.0.22",
......@@ -45,9 +45,9 @@
"@nestjs/cli": "^9.1.1",
"@nestjs/schematics": "^9.0.1",
"@nestjs/testing": "^9.0.11",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/changelog": "^6.0.2",
"@semantic-release/git": "^10.0.1",
"@semantic-release/gitlab": "^9.5.0",
"@semantic-release/gitlab": "^9.5.1",
"@types/cache-manager": "^4.0.0",
"@types/cookie-parser": "^1.4.2",
"@types/express": "^4.17.13",
......@@ -2517,14 +2517,14 @@
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@semantic-release/changelog": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.1.tgz",
"integrity": "sha512-FT+tAGdWHr0RCM3EpWegWnvXJ05LQtBkQUaQRIExONoXjVjLuOILNm4DEKNaV+GAQyJjbLRVs57ti//GypH6PA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.2.tgz",
"integrity": "sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==",
"dev": true,
"dependencies": {
"@semantic-release/error": "^3.0.0",
"aggregate-error": "^3.0.0",
"fs-extra": "^9.0.0",
"fs-extra": "^11.0.0",
"lodash": "^4.17.4"
},
"engines": {
......@@ -2535,18 +2535,17 @@
}
},
"node_modules/@semantic-release/changelog/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
"integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dev": true,
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
"node": ">=14.14"
}
},
"node_modules/@semantic-release/commit-analyzer": {
......@@ -2666,9 +2665,9 @@
}
},
"node_modules/@semantic-release/gitlab": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.5.0.tgz",
"integrity": "sha512-VmItAoh7vTfl30ekuTLvMmIgxVJMgE2tTucGeWIUrxu0HuiL5EIjLN72gqmRS1IfN1NwcQlaA+d6J1EgpsgVjA==",
"version": "9.5.1",
"resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.5.1.tgz",
"integrity": "sha512-QQvIgB/uOUi/cGi0bUndaOki+E1n4XWdRK4WtYIYsPE6AM9r9L7kb5jHzxihHwMvfVA38xSWal4IgLnBX9V7AQ==",
"dev": true,
"dependencies": {
"@semantic-release/error": "^3.0.0",
......@@ -2677,7 +2676,7 @@
"dir-glob": "^3.0.0",
"escape-string-regexp": "^3.0.0",
"form-data": "^4.0.0",
"fs-extra": "^10.0.0",
"fs-extra": "^11.0.0",
"globby": "^11.0.0",
"got": "^11.0.0",
"hpagent": "^1.0.0",
......@@ -2692,6 +2691,20 @@
"semantic-release": ">=18.0.0"
}
},
"node_modules/@semantic-release/gitlab/node_modules/fs-extra": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
"integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/@semantic-release/npm": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.1.tgz",
......@@ -4004,15 +4017,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/axios": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
......@@ -18027,24 +18031,23 @@
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"@semantic-release/changelog": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.1.tgz",
"integrity": "sha512-FT+tAGdWHr0RCM3EpWegWnvXJ05LQtBkQUaQRIExONoXjVjLuOILNm4DEKNaV+GAQyJjbLRVs57ti//GypH6PA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.2.tgz",
"integrity": "sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==",
"dev": true,
"requires": {
"@semantic-release/error": "^3.0.0",
"aggregate-error": "^3.0.0",
"fs-extra": "^9.0.0",
"fs-extra": "^11.0.0",
"lodash": "^4.17.4"
},
"dependencies": {
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
"integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
......@@ -18144,9 +18147,9 @@
}
},
"@semantic-release/gitlab": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.5.0.tgz",
"integrity": "sha512-VmItAoh7vTfl30ekuTLvMmIgxVJMgE2tTucGeWIUrxu0HuiL5EIjLN72gqmRS1IfN1NwcQlaA+d6J1EgpsgVjA==",
"version": "9.5.1",
"resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.5.1.tgz",
"integrity": "sha512-QQvIgB/uOUi/cGi0bUndaOki+E1n4XWdRK4WtYIYsPE6AM9r9L7kb5jHzxihHwMvfVA38xSWal4IgLnBX9V7AQ==",
"dev": true,
"requires": {
"@semantic-release/error": "^3.0.0",
......@@ -18155,13 +18158,26 @@
"dir-glob": "^3.0.0",
"escape-string-regexp": "^3.0.0",
"form-data": "^4.0.0",
"fs-extra": "^10.0.0",
"fs-extra": "^11.0.0",
"globby": "^11.0.0",
"got": "^11.0.0",
"hpagent": "^1.0.0",
"lodash": "^4.17.11",
"parse-url": "^8.0.0",
"url-join": "^4.0.0"
},
"dependencies": {
"fs-extra": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
"integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
}
}
},
"@semantic-release/npm": {
......@@ -19260,12 +19276,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"axios": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
......
{
"name": "gateway",
"version": "1.3.0",
"version": "1.4.0-rc.1",
"description": "",
"author": "",
"private": true,
......@@ -62,9 +62,9 @@
"@nestjs/cli": "^9.1.1",
"@nestjs/schematics": "^9.0.1",
"@nestjs/testing": "^9.0.11",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/changelog": "^6.0.2",
"@semantic-release/git": "^10.0.1",
"@semantic-release/gitlab": "^9.5.0",
"@semantic-release/gitlab": "^9.5.1",
"@types/cache-manager": "^4.0.0",
"@types/cookie-parser": "^1.4.2",
"@types/express": "^4.17.13",
......
......@@ -93,15 +93,19 @@ export default class ExaremeConnector implements Connector {
const domains = await this.engineService.getDomains(request);
const form = experimentInputToData(data);
const path =
this.options.baseurl + `experiments${isTransient ? '/transient' : ''}`;
const resultAPI = await firstValueFrom(
this.post<ExperimentData>(request, path, form),
);
const results = dataToExperiment(
resultAPI.data,
ExaremeConnector.logger,
domains,
);
return dataToExperiment(resultAPI.data, ExaremeConnector.logger, domains);
return results;
}
async listExperiments(
......@@ -311,7 +315,7 @@ export default class ExaremeConnector implements Connector {
config: AxiosRequestConfig = {},
) {
const conf = this.mergeHeaders(request, config);
return this.httpService.get<T>(path, conf);
return this.httpService.get<T>(path, conf as any);
}
private post<T = any>(
......@@ -321,7 +325,7 @@ export default class ExaremeConnector implements Connector {
config: AxiosRequestConfig = {},
) {
const conf = this.mergeHeaders(request, config);
return this.httpService.post<T>(path, data, conf);
return this.httpService.post<T>(path, data, conf as any);
}
private patch<T = any>(
......@@ -331,7 +335,7 @@ export default class ExaremeConnector implements Connector {
config: AxiosRequestConfig = {},
) {
const conf = this.mergeHeaders(request, config);
return this.httpService.patch<T>(path, data, conf);
return this.httpService.patch<T>(path, data, conf as any);
}
private delete<T = any>(
......@@ -340,6 +344,6 @@ export default class ExaremeConnector implements Connector {
config: AxiosRequestConfig = {},
) {
const conf = this.mergeHeaders(request, config);
return this.httpService.delete<T>(path, conf);
return this.httpService.delete<T>(path, conf as any);
}
}
import { Domain } from '../../../../models/domain.model';
import handlers from '..';
import { Experiment } from '../../../../models/experiment/experiment.model';
import DescriptiveHandler from './descriptive.handler';
import { TableResult } from '../../../../models/result/table-result.model';
import { GroupsResult } from 'src/engine/models/result/groups-result.model';
const data = [
{
variable_based: [
{
variable: 'rightcerebralwhitematter',
dataset: 'edsd',
data: {
num_dtps: 437,
num_na: 37,
num_total: 474,
mean: 214.37923592677345,
std: 31.759412531119786,
min: 61.8725,
q1: 197.2012,
q2: 212.8049,
q3: 233.7051,
max: 334.9526,
},
},
{
variable: 'ppmicategory',
dataset: 'edsd',
data: null,
},
{
variable: 'rightcerebralwhitematter',
dataset: 'desd-synthdata',
data: {
num_dtps: 920,
num_na: 80,
num_total: 1000,
mean: 213.74694663043476,
std: 34.566788117025006,
min: 61.8725,
q1: 195.6455,
q2: 212.53735,
q3: 234.605825,
max: 334.9526,
},
},
{
variable: 'ppmicategory',
dataset: 'desd-synthdata',
data: null,
},
{
variable: 'rightcerebralwhitematter',
dataset: 'ppmi',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
mean: 233.83928417366948,
std: 28.18026921524509,
min: 165.1467,
q1: 214.367725,
q2: 232.42445,
q3: 252.255,
max: 339.0075,
},
},
{
variable: 'ppmicategory',
dataset: 'ppmi',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
counts: {
PD: 405,
HC: 183,
GENPD: 81,
PRODROMA: 45,
},
},
},
{
variable: 'rightcerebralwhitematter',
dataset: 'all datasets',
data: {
num_dtps: 2071,
num_na: 117,
num_total: 2188,
mean: 220.80741955577017,
std: 33.25531321945584,
min: 61.8725,
q1: null,
q2: null,
q3: null,
max: 339.0075,
},
},
{
variable: 'ppmicategory',
dataset: 'all datasets',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
counts: {
PD: 405,
HC: 183,
GENPD: 81,
PRODROMA: 45,
},
},
},
],
model_based: [
{
variable: 'rightcerebralwhitematter',
dataset: 'edsd',
data: null,
},
{
variable: 'ppmicategory',
dataset: 'edsd',
data: null,
},
{
variable: 'rightcerebralwhitematter',
dataset: 'desd-synthdata',
data: null,
},
{
variable: 'ppmicategory',
dataset: 'desd-synthdata',
data: null,
},
{
variable: 'rightcerebralwhitematter',
dataset: 'ppmi',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
mean: 233.83928417366948,
std: 28.18026921524509,
min: 165.1467,
q1: 214.367725,
q2: 232.42445,
q3: 252.255,
max: 339.0075,
},
},
{
variable: 'ppmicategory',
dataset: 'ppmi',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
counts: {
PD: 405,
HC: 183,
GENPD: 81,
PRODROMA: 45,
},
},
},
{
variable: 'rightcerebralwhitematter',
dataset: 'all datasets',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
mean: 233.83928417366948,
std: 28.18026921524509,
min: 165.1467,
q1: null,
q2: null,
q3: null,
max: 339.0075,
},
},
{
variable: 'ppmicategory',
dataset: 'all datasets',
data: {
num_dtps: 714,
num_na: 0,
num_total: 714,
counts: {
PD: 405,
HC: 183,
GENPD: 81,
PRODROMA: 45,
},
},
},
],
},
];
const createExperiment = (): Experiment => ({
id: 'dummy-id',
name: 'Testing purpose',
algorithm: {
name: DescriptiveHandler.ALGO_NAME,
},
datasets: ['desd-synthdata'],
domain: 'dementia',
variables: ['rightcerebralwhitematter'],
coVariables: ['ppmicategory'],
results: [],
});
const domain: Domain = {
id: 'dummy-id',
groups: [],
rootGroup: {
id: 'dummy-id',
},
datasets: [{ id: 'desd-synthdata', label: 'Dead Synthdata' }],
variables: [
{ id: 'rightcerebralwhitematter', label: 'Example label' },
{ id: 'ppmicategory', label: 'Example label 2' },
],
};
describe('Descriptive Stats result handler', () => {
const descriptiveHandler = new DescriptiveHandler();
const exp = createExperiment();
it('Test Descriptive Handler', () => {
handlers(exp, data, domain);
const result = exp.results[0] as GroupsResult;
expect(exp.results.length).toEqual(1);
expect(result.groups[0].name).toBe('Variables');
expect(result.groups[1].name).toBe('Model');
const tableData1 = result.groups[0].results[0] as TableResult;
expect(tableData1.data[0][1]).toEqual(474);
const tableData2 = result.groups[1].results[0] as TableResult;
expect(tableData2.data[0][1]).toBe('No Enough Data');
});
});
......@@ -16,6 +16,8 @@ interface Stat {
}
export default class DescriptiveHandler extends BaseHandler {
public static readonly ALGO_NAME = 'DESCRIPTIVE_STATS';
private static readonly headerDescriptive = `
$fnum := function($x) { $type($x) = 'number' ? $round($number($x),3) : $x };
......@@ -199,7 +201,6 @@ $fn := function($o, $prefix) {
return super.handle(exp, data, domain);
const inputs = data as ResultExperiment[];
console.log(JSON.stringify(inputs, null, 2));
if (inputs && Array.isArray(inputs)) {
const exareme1 = inputs.filter(
......
import { Domain } from '../../../../models/domain.model';
import { Experiment } from '../../../../models/experiment/experiment.model';
import BaseHandler from '../base.handler';
import {
BarChartResult,
BarEnumValues,
} from '../../../../models/result/bar-chart-result.model';
const ALGO_NAME = 'multiple_histograms';
const round = (n: number) => Math.round((n + Number.EPSILON) * 100) / 100;
export default class HistogramHandler extends BaseHandler {
private getBarChartResult(data: any): BarChartResult {
const categories =
typeof data.bins[0] === 'string'
? data.bins
: data.bins
.filter((_, i) => i < data.bins.length - 1) // upper limit counts for 1 extra
.map((b, i) => `${round(b)}-${round(data.bins[i + 1])}`);
const barChart: BarChartResult = {
name: data.var,
barValues: data.counts.map((c) => c ?? 0),
xAxis: {
label: 'bins',
categories,
},
hasConnectedBars: false,
yAxis: {
label: 'Count',
},
};
return barChart;
}
private getGroupedBarChartResult(
groupingVar: string,
defaultChart: BarChartResult,
data: any[],
): BarChartResult {
const groupingVarData = data.filter((d) => d.grouping_var === groupingVar);
const barEnumValues: BarEnumValues[] = groupingVarData.map((d) => ({
label: d.grouping_enum,
values: d.counts.map((c) => (c === null ? 0 : c)),
}));
const barChart: BarChartResult = {
name: `${defaultChart.name} grouped by ${groupingVar}`,
xAxis: defaultChart.xAxis,
barValues: null,
yAxis: defaultChart.yAxis,
barEnumValues: barEnumValues,
};
return barChart;
}
canHandle(exp: Experiment, data: any): boolean {
return (
exp.algorithm.name.toLowerCase() === ALGO_NAME &&
data &&
data[0] &&
data[0].histogram
);
}
handle(experiment: Experiment, data: unknown, domain: Domain): void {
if (!this.canHandle(experiment, data))
return super.handle(experiment, data, domain);
const extractedData = data[0].histogram;
const defaultChartData = extractedData.find(
(d) => d.var && !d.grouping_var,
);
const defaultChart = this.getBarChartResult(defaultChartData);
experiment.results.push(defaultChart);
const groupingVars: string[] = Array.from(
new Set(
extractedData
.filter((d) => d.grouping_var !== null)
.map((d) => d.grouping_var),
),
);
const groupingCharts = groupingVars.map((groupingVar) =>
this.getGroupedBarChartResult(groupingVar, defaultChart, extractedData),
);
if (groupingCharts) groupingCharts.map((gc) => experiment.results.push(gc));
this.next?.handle(experiment, data, domain);
}
}
......@@ -61,10 +61,10 @@ export default class LogisticRegressionCVHandler extends BaseHandler {
name: lookupDict[key],
type: 'string',
})),
data: data.summary['row_names'].map((key: any, i: number) => {
// could be optimized
return [key, ...keys.map((k) => data['summary'][k][i])];
}),
data: data.summary['row_names'].map((key: any, i: number) => [
key,
...keys.map((k) => `${data['summary'][k][i]}`),
]),
};
}
......@@ -131,6 +131,10 @@ export default class LogisticRegressionCVHandler extends BaseHandler {
this.getROC(improvedData),
];
results.filter((r) => !!r).forEach((r) => experiment.results.push(r));
results
.filter((r) => !!r)
.forEach((r) => {
experiment.results.push(r);
});
}
}
......@@ -2,8 +2,10 @@ import { Domain } from '../../../../engine/models/domain.model';
import { Experiment } from '../../../../engine/models/experiment/experiment.model';
import AnovaOneWayHandler from './algorithms/anova-one-way.handler';
import DescriptiveHandler from './algorithms/descriptive.handler';
import HistogramHandler from './algorithms/histogram.handler';
import LinearRegressionCVHandler from './algorithms/linear-regression-cv.handler';
import LinearRegressionHandler from './algorithms/linear-regression.handler';
import LogisticRegressionCVHandler from './algorithms/logistic-regression-cv.handler';
import LogisticRegressionHandler from './algorithms/logistic-regression.handler';
import PCAHandler from './algorithms/PCA.handler';
import PearsonHandler from './algorithms/pearson.handler';
......@@ -15,12 +17,14 @@ import TTestPairedHandler from './algorithms/ttest-paired.handler';
const start = new PearsonHandler();
start
.setNext(new HistogramHandler())
.setNext(new DescriptiveHandler())
.setNext(new AnovaOneWayHandler())
.setNext(new PCAHandler())
.setNext(new LinearRegressionHandler())
.setNext(new LinearRegressionCVHandler())
.setNext(new LogisticRegressionHandler())
.setNext(new LogisticRegressionCVHandler())
.setNext(new TTestPairedHandler())
.setNext(new TtestOnesampleHandler())
.setNext(new TtestIndependentHandler())
......@@ -28,5 +32,6 @@ start
export default (exp: Experiment, data: unknown, domain: Domain): Experiment => {
start.handle(exp, data, domain);
return exp;
};
......@@ -9,7 +9,7 @@ const transformToAlgorithms = jsonata(`
$checkVal:= function($val) { $val ? $val : undefined};
$excludedParams:= ['centers', 'formula'];
$includes:= ['ANOVA_ONEWAY','ANOVA','LINEAR_REGRESSION',
'LOGISTIC_REGRESSION','TTEST_INDEPENDENT','TTEST_PAIRED',
'LOGISTIC_REGRESSION', 'LOGISTIC_REGRESSION_CV','TTEST_INDEPENDENT','TTEST_PAIRED',
'PEARSON','ID3','KMEANS','NAIVE_BAYES',
'TTEST_ONESAMPLE','PCA','CALIBRATION_BELT','CART',
'KAPLAN_MEIER','THREE_C', 'ONE_WAY_ANOVA', 'PEARSON_CORRELATION', 'LINEAR_REGRESSION_CV', 'TTEST_ONESAMPLE', 'PAIRED_TTEST'];
......
......@@ -2,6 +2,15 @@ import { Field, ObjectType } from '@nestjs/graphql';
import { ChartAxis } from './common/chart-axis.model';
import { Result } from './common/result.model';
@ObjectType()
export class BarEnumValues {
@Field()
label: string;
@Field(() => [Number])
values: number[];
}
@ObjectType()
export class BarChartResult extends Result {
@Field()
......@@ -13,8 +22,14 @@ export class BarChartResult extends Result {
@Field(() => ChartAxis, { nullable: true })
yAxis?: ChartAxis;
@Field(() => [Number], { description: "List of bar's value" })
barValues: number[];
@Field(() => [Number], { nullable: true, description: "List of bar's value" })
barValues?: number[];
@Field(() => [BarEnumValues], {
nullable: true,
description: "List of group's value",
})
barEnumValues?: BarEnumValues[];
@Field({ defaultValue: false, nullable: true })
hasConnectedBars?: boolean;
......
......@@ -37,7 +37,7 @@ export const ResultUnion = createUnionType({
return LineChartResult;
}
if (value.barValues) {
if (value.barValues || value.barEnumValues) {
return BarChartResult;
}
......
......@@ -29,6 +29,11 @@ type ChartAxis {
categories: [String!]
}
type BarEnumValues {
label: String!
values: [Float!]!
}
type GroupResult {
name: String!
description: String
......@@ -90,7 +95,10 @@ type BarChartResult {
yAxis: ChartAxis
"""List of bar's value"""
barValues: [Float!]!
barValues: [Float!]
"""List of group's value"""
barEnumValues: [BarEnumValues!]
hasConnectedBars: Boolean
}
......