Skip to content
Snippets Groups Projects
Commit 65060903 authored by Steve Reis's avatar Steve Reis
Browse files

refactor(exareme2): Refactoring PCA Algorithm

parent 9fed5bc6
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ import { Experiment } from '../../../../models/experiment/experiment.model'; ...@@ -2,6 +2,7 @@ import { Experiment } from '../../../../models/experiment/experiment.model';
import { HeatMapResult } from '../../../../models/result/heat-map-result.model'; import { HeatMapResult } from '../../../../models/result/heat-map-result.model';
import handlers from '..'; import handlers from '..';
import { BarChartResult } from '../../../../models/result/bar-chart-result.model'; import { BarChartResult } from '../../../../models/result/bar-chart-result.model';
import { Domain } from '../../../../models/domain.model';
const createExperiment = (): Experiment => ({ const createExperiment = (): Experiment => ({
id: 'dummy-id', id: 'dummy-id',
...@@ -24,6 +25,16 @@ const createExperiment = (): Experiment => ({ ...@@ -24,6 +25,16 @@ const createExperiment = (): Experiment => ({
results: [], results: [],
}); });
const domain: Domain = {
id: 'dummy-id',
groups: [],
rootGroup: {
id: 'dummy-id',
},
datasets: [{ id: 'desd-synthdata', label: 'Dead Synthdata' }],
variables: [],
};
const data = [ const data = [
{ {
n_obs: 920, n_obs: 920,
...@@ -80,7 +91,7 @@ const data = [ ...@@ -80,7 +91,7 @@ const data = [
describe('PCA result handler', () => { describe('PCA result handler', () => {
it('Test PCA handler with regular data (no edge cases)', () => { it('Test PCA handler with regular data (no edge cases)', () => {
const exp = createExperiment(); const exp = createExperiment();
handlers(exp, data, null); handlers(exp, data, domain);
expect(exp.results.length).toBeGreaterThanOrEqual(2); expect(exp.results.length).toBeGreaterThanOrEqual(2);
exp.results.forEach((result) => { exp.results.forEach((result) => {
......
import { Variable } from 'src/engine/models/variable.model';
import { Domain } from '../../../../models/domain.model'; import { Domain } from '../../../../models/domain.model';
import { Experiment } from '../../../../models/experiment/experiment.model'; import { Experiment } from '../../../../models/experiment/experiment.model';
import { BarChartResult } from '../../../../models/result/bar-chart-result.model'; import { BarChartResult } from '../../../../models/result/bar-chart-result.model';
...@@ -18,18 +19,13 @@ export default class PCAHandler extends BaseHandler { ...@@ -18,18 +19,13 @@ export default class PCAHandler extends BaseHandler {
); );
} }
handle(exp: Experiment, data: any, domain?: Domain): void { private getBarChartResult(data: any): BarChartResult {
if (!this.canHandle(exp.algorithm.name, data)) const barChart: BarChartResult = {
return this.next?.handle(exp, data, domain);
const extractedData = data[0];
const barChar: BarChartResult = {
name: 'Eigen values', name: 'Eigen values',
barValues: extractedData['eigenvalues'], barValues: data['eigenvalues'],
xAxis: { xAxis: {
label: 'Dimensions', label: 'Dimensions',
categories: exp.variables.map((_, i) => i + 1).map(String), categories: data['eigenvalues'].map((_: unknown, i: number) => i + 1),
}, },
hasConnectedBars: true, hasConnectedBars: true,
yAxis: { yAxis: {
...@@ -37,17 +33,18 @@ export default class PCAHandler extends BaseHandler { ...@@ -37,17 +33,18 @@ export default class PCAHandler extends BaseHandler {
}, },
}; };
if (barChar.barValues && barChar.barValues.length > 0) return barChart;
exp.results.push(barChar); }
const matrix = extractedData['eigenvectors'] as number[][]; private getHeatMapResult(data: any, variables: Variable[]): HeatMapResult {
const matrix = data['eigenvectors'] as number[][];
const heatMapChart: HeatMapResult = { const heatMapChart: HeatMapResult = {
name: 'Eigen vectors', name: 'Eigen vectors',
matrix, matrix,
heatMapStyle: HeatMapStyle.BUBBLE, heatMapStyle: HeatMapStyle.BUBBLE,
yAxis: { yAxis: {
categories: exp.variables, categories: variables.map((v) => v.label ?? v.id),
}, },
xAxis: { xAxis: {
categories: [...Array(matrix.length).keys()] categories: [...Array(matrix.length).keys()]
...@@ -62,8 +59,27 @@ export default class PCAHandler extends BaseHandler { ...@@ -62,8 +59,27 @@ export default class PCAHandler extends BaseHandler {
); );
} }
return heatMapChart;
}
handle(exp: Experiment, data: any, domain: Domain): void {
if (!this.canHandle(exp.algorithm.name, data))
return this.next?.handle(exp, data, domain);
const extractedData = data[0];
const variables =
exp.variables
?.map((v) => domain.variables.find((v2) => v2.id === v) ?? { id: v })
.filter((v) => v) ?? [];
const barChart = this.getBarChartResult(extractedData);
if (barChart.barValues && barChart.barValues.length > 0)
exp.results.push(barChart);
const heatMapChart = this.getHeatMapResult(extractedData, variables);
if (heatMapChart.matrix) exp.results.push(heatMapChart); if (heatMapChart.matrix) exp.results.push(heatMapChart);
this.next?.handle(exp, data); this.next?.handle(exp, data, domain);
} }
} }
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment