Skip to content

Commit

Permalink
Merge pull request #432 from uncharted-aske/feature/add-computed-meas…
Browse files Browse the repository at this point in the history
…ures-on-chime-models

Add computed measures on chime models and hard-code fitted params
  • Loading branch information
Rosa Romero Gómez authored Aug 27, 2021
2 parents f468f2a + d324d71 commit a264b6e
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 23 deletions.
92 changes: 73 additions & 19 deletions client/src/services/DonuService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,28 @@ export const getModelInterface = async (model: Model.Model, selectedModelGraphTy

const response = await callDonuCache(request);
if (response.status === Donu.ResponseStatus.success) {
if (selectedModelGraphType === Model.GraphTypes.PetriNetClassic) {
const result = response?.result as Donu.ModelDefinition;
if (modelGraph.model === 'SimpleSIR_metadata_gromet_PetriNetClassic.json') {
result.measures.push({
uid: 'beta*S*I',
value_type: 'float',
metadata: {
name: 'Daily New Infected',
type: 'float',
},
});
} else if (modelGraph.model === 'chime+.json') {
result.measures.push({
uid: 'computed',
value_type: 'float',
metadata: {
name: 'Daily New Infected',
type: 'float',
},
});
}
}
/** TODO
* This is a temporary mock up for Demonstration purposes.
* The DONU API needs to be clearer on which outputs can be selected programatically.
Expand Down Expand Up @@ -276,6 +298,11 @@ export const getModelResult = async (
step: config.step,
};

if (selectedModelGraphType === Model.GraphTypes.PetriNetClassic) {
// HACK: Algebraic Julia doesn't work when value types are wrong
request['sim-type'] = Donu.SimulationType.GSL;
}

/** TODO
* This is a temporary mock up for Demonstration purposes.
* The DONU API needs to be clearer on which outputs can be selected programatically.
Expand Down Expand Up @@ -303,7 +330,44 @@ export const getModelResult = async (

const response = await callDonuCache(request);
if (response.status === Donu.ResponseStatus.success) {
return response?.result as Donu.SimulationResponse ?? null;
const result = response.result as Donu.SimulationResponse;
if (selectedModelGraphType === Model.GraphTypes.PetriNetClassic) {
if (modelGraph.model === 'SimpleSIR_metadata_gromet_PetriNetClassic.json') {
const beta = parameters['J:beta_rate'] as unknown as number;
const I = result[0].values['J:I'];
const S = result[0].values['J:S'];
const dailyNewInfectedValues = [];
for (let i = 0; i < result[0].times.length; i++) {
dailyNewInfectedValues.push(beta * S[i] * I[i]);
}
result[0].values['beta*S*I'] = dailyNewInfectedValues;
} else if (modelGraph.model === 'chime+.json') {
// const beta = parameters['J:beta_rate'] as unknown as number;
// const I = result[0].values['J:I'];
const S = result[0].values['J:S'];
const I_U = result[0].values['J:I_U'];
const I_V = result[0].values['J:I_V'];
const V = result[0].values['J:V'];

// eslint-disable-next-line camelcase
const inf_uu = parameters['J:inf_uu_rate'] as unknown as number;
// eslint-disable-next-line camelcase
const inf_vu = parameters['J:inf_vu_rate'] as unknown as number;
// eslint-disable-next-line camelcase
const inf_uv = parameters['J:inf_uv_rate'] as unknown as number;
// eslint-disable-next-line camelcase
const inf_vv = parameters['J:inf_vv_rate'] as unknown as number;

const dailyNewInfectedValues = [];
for (let i = 0; i < result[0].times.length; i++) {
// eslint-disable-next-line camelcase
dailyNewInfectedValues.push(S[i] * I_U[i] * inf_uu + S[i] * I_V[i] * inf_vu + V[i] * I_U[i] * inf_uv + V[i] * I_V[i] * inf_vv);
}
result[0].values.computed = dailyNewInfectedValues;
}
}

return result;
} else {
console.error('[DONU Service] — getModelResult', response.error); // eslint-disable-line no-console
}
Expand Down Expand Up @@ -383,29 +447,19 @@ export const getDatasetResult = async (model: string): Promise<Donu.GetDatasetRe

const response = await callDonuCache(request);
if (response.status === Donu.ResponseStatus.success) {
return response.result as Donu.GetDatasetResponse;
const result = _.cloneDeep(response.result) as Donu.GetDatasetResponse;
// HACK
if (model === 'GDA-Infections-FL.json') {
const dailyCases = result.columns.find(c => c.name === 'daily_cases');
dailyCases.values = dailyCases.values.slice(25);
}
return result;
} else {
console.error('[DONU Service] — getDatasetResult', response); // eslint-disable-line no-console
}
};

// Get Dataset Response output
// {
// name: "GDA Infection Data",
// description: "Infection data for FL",
// columns: [
// {
// values: [0, 1, 2, 3, ...],
// name: 'date',
// description: 'date',
// },
// {
// values: [129, 32, 0, 213, ...],
// name: 'daily_cases',
// description: 'daily_cases',
// }
// ]
// }
// Fit Model Measures' to Observational Data
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const fitMeasures = async (data: any, parameters: string[], source: string, type: Donu.Type): Promise<Donu.FitMeasuresResponse> => {
const request: Donu.Request = {
Expand Down
36 changes: 32 additions & 4 deletions client/src/views/Simulation/components/ParametersPanel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,38 @@
// this.model.modelGraph[0].model,
// this.model.modelGraph[0].donuType,
// );
const fittedParameters = {
'J:rec_rate': 0.05,
'J:inf_rate': 0.4,
};
let fittedParameters: {
[paramUid: string]: number;
} = {};
if (this.model.metadata?.name === 'CHIME_SIR_Base') {
fittedParameters = {
'J:beta_rate': 1.7221469058282074e-7,
'J:gamma_rate': 0.04954677073300576,
'J:S_init': 720130.5394121626,
'J:I_init': 6368.2763686775015,
'J:R_init': 9.999999999999996e-11,
};
} else if (this.model.metadata?.name === 'CHIME_SVIIvR') {
fittedParameters = {
'J:S_init': 874270.0703645574,
'J:I_U_init': 2657.7553778002,
'J:V_init': 45.90865845686915,
'J:R_init': 0.10000000000000002,
'J:I_V_init': 1.5201678216286594,
'J:rec_v_rate': 2.3526228492762642e-5,
'J:inf_vv_rate': 2.6041225138605557e-8,
'J:inf_vu_rate': 2.8956286100930364e-9,
'J:inf_uu_rate': 1.466296766065254e-7,
'J:inf_uv_rate': 1.1577435141227581e-8,
'J:vax_rate': 0.011287926731402404,
'J:rec_u_rate': 1.7081993411296042e-5,
};
} else {
fittedParameters = {
'J:rec_rate': 0.05,
'J:inf_rate': 0.4,
};
}
Object.entries(fittedParameters).forEach(([pid, value]) => {
this.parameterValues[pid] = value;
Expand Down

0 comments on commit a264b6e

Please sign in to comment.