diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts index 7fce24e3d8c5a9410524a516e3ddb643dd72ea78..6c8a4cdc75c343db00bd58de21141719df824440 100644 --- a/api/src/engine/connectors/exareme/converters.ts +++ b/api/src/engine/connectors/exareme/converters.ts @@ -66,10 +66,7 @@ const algoParamInputToData = (param: AlgorithmParamInput) => { }; }; -export const experimentInputToData = ( - data: ExperimentCreateInput, - domains?: Domain[], -) => { +const getFormula = (data: ExperimentCreateInput) => { const formula = ((data.transformations?.length > 0 || data.interactions?.length > 0) && { single: @@ -84,6 +81,68 @@ export const experimentInputToData = ( }) || null; + return formula + ? [ + { + name: 'formula', + value: JSON.stringify(formula), + }, + ] + : []; +}; + +const getVariables = (data: ExperimentCreateInput) => { + if (!data.variables) return undefined; + + let variables = data.variables.join(','); + + if (data.algorithm.id === 'TTEST_PAIRED') { + const varCount = data.variables.length; + variables = data.variables + ?.reduce((vectors: string, v, i) => { + if ((i + 1) % 2 === 0) return `${vectors}${v},`; + if (varCount === i + 1) return `${vectors}${v}-${data.variables[0]}`; + return `${vectors}${v}-`; + }, '') + .replace(/,$/, ''); + } + + return { + name: 'y', + label: 'y', + value: variables, + }; +}; + +const getCoVariables = ( + data: ExperimentCreateInput, + design: { value: string }, +) => { + if (!data.coVariables || data.coVariables.length === 0) return undefined; + let separator = ','; + + const excludes = [ + 'Multiple Histograms', + 'CART', + 'ID3', + 'Naive Bayes Training', + ]; + + if (design && !excludes.includes(data.algorithm.id)) { + separator = design.value === 'additive' ? '+' : '*'; + } + + return { + name: 'x', + label: 'x', + value: data.coVariables.join(separator), + }; +}; + +export const experimentInputToData = ( + data: ExperimentCreateInput, + domains?: Domain[], +) => { const domain = domains?.find((d) => d.id === data.domain); const params = { @@ -106,14 +165,7 @@ export const experimentInputToData = ( ? `${data.domain}:${domain.version}` : data.domain, }, - ...(formula - ? [ - { - name: 'formula', - value: JSON.stringify(formula), - }, - ] - : []), + ...getFormula(data), ].concat(data.algorithm.parameters.map(algoParamInputToData)), type: data.algorithm.type ?? 'string', name: data.algorithm.id, @@ -121,52 +173,16 @@ export const experimentInputToData = ( name: data.name, }; - if (data.coVariables && data.coVariables.length) { - let separator = ','; - - const design = params.algorithm.parameters.find((p) => p.name === 'design'); - const excludes = [ - 'Multiple Histograms', - 'CART', - 'ID3', - 'Naive Bayes Training', - ]; - - if (design && !excludes.includes(data.algorithm.id)) { - separator = design.value === 'additive' ? '+' : '*'; - } - - params.algorithm.parameters.push({ - name: 'x', - label: 'x', - value: data.coVariables.join(separator), - }); + if (data.algorithm.id === 'DESCRIPTIVE_STATS' && data.coVariables) { + data.variables.push(...data.coVariables); + data.coVariables = []; } - if (data.variables) { - let variables = data.variables.join(','); - - if (data.algorithm.id === 'TTEST_PAIRED') { - const varCount = data.variables.length; - variables = data.variables - ?.reduce( - (vectors: string, v, i) => - (i + 1) % 2 === 0 - ? `${vectors}${v},` - : varCount === i + 1 - ? `${vectors}${v}-${data.variables[0]}` - : `${vectors}${v}-`, - '', - ) - .replace(/,$/, ''); - } + const design = params.algorithm.parameters.find((p) => p.name === 'design'); - params.algorithm.parameters.push({ - name: 'y', - label: 'y', - value: variables, - }); - } + [getVariables(data), getCoVariables(data, design)] + .filter((p) => p) + .forEach((p) => params.algorithm.parameters.push(p)); return params; };