END_TEST START_TEST(test_IntegratorInstance_integrate) { integratorInstance_t *ii; cvodeSettings_t *cs; int r; model = ODEModel_createFromFile(EXAMPLES_FILENAME("MAPK.xml")); cs = CvodeSettings_create(); ii = IntegratorInstance_create(model, cs); r = IntegratorInstance_integrate(ii); ck_assert_int_eq(r, 1); CHECK_DOUBLE_WITH_TOLERANCE(IntegratorInstance_getTime(ii), 1.0); ck_assert_int_eq(IntegratorInstance_timeCourseCompleted(ii), 1); CvodeSettings_free(cs); IntegratorInstance_free(ii); }
END_TEST START_TEST(test_IntegratorInstance_updateModel) { integratorInstance_t *ii; cvodeSettings_t *cs; int r; model = ODEModel_createFromFile(EXAMPLES_FILENAME("MAPK.xml")); cs = CvodeSettings_create(); ii = IntegratorInstance_create(model, cs); r = IntegratorInstance_integrate(ii); ck_assert_int_eq(r, 1); r = IntegratorInstance_updateModel(ii); ck_assert_int_eq(r, 0); /* TODO: expected? */ CvodeSettings_free(cs); IntegratorInstance_free(ii); }
END_TEST START_TEST(test_IntegratorInstance_getResults) { integratorInstance_t *ii; cvodeSettings_t *cs; int r; const cvodeResults_t *cr; model = ODEModel_createFromFile(EXAMPLES_FILENAME("MAPK.xml")); cs = CvodeSettings_create(); ii = IntegratorInstance_create(model, cs); r = IntegratorInstance_integrate(ii); ck_assert_int_eq(r, 1); cr = IntegratorInstance_getResults(ii); ck_assert(ii->results == cr); CvodeSettings_free(cs); IntegratorInstance_free(ii); }
END_TEST START_TEST(test_IntegratorInstance_printResults) { integratorInstance_t *ii; cvodeSettings_t *cs; int r; FILE *fp; model = ODEModel_createFromFile(EXAMPLES_FILENAME("MAPK.xml")); cs = CvodeSettings_create(); ii = IntegratorInstance_create(model, cs); r = IntegratorInstance_integrate(ii); ck_assert_int_eq(r, 1); OPEN_TMPFILE_OR_ABORT(fp); IntegratorInstance_printResults(ii, fp); /* TODO: check the printed text */ fclose(fp); CvodeSettings_free(cs); IntegratorInstance_free(ii); }
SBML_ODESOLVER_API int IntegratorInstance_handleError(integratorInstance_t *engine) { cvodeData_t *data; cvodeSettings_t *opt; int errorCode; if ( SolverError_getNum(ERROR_ERROR_TYPE) == 0 ) return SolverError_getLastCode(WARNING_ERROR_TYPE); errorCode = SolverError_getLastCode(ERROR_ERROR_TYPE); data = engine->data; opt = engine->opt; /* if (om->algebraic) ?? */ /* if (opt->Sensitivity) ?? */ if ( errorCode ) { /* on flag CV_CONV_FAILURE try again, but now with/without generated Jacobian matrix */ if ( errorCode == CV_CONV_FAILURE && data->run == 1 && opt->StoreResults) { SolverError_error(WARNING_ERROR_TYPE, SOLVER_MESSAGE_RERUN_WITH_OR_WO_JACOBIAN, "Rerun with %s Jacobian matrix.", opt->UseJacobian ? "CVODE's internal approximation of the" : "automatically generated"); /* integrate again */ opt->UseJacobian = !opt->UseJacobian; IntegratorInstance_reset(engine); return IntegratorInstance_integrate(engine); } } return errorCode; }
int main(void) { char *formula; variableIndex_t *vi = NULL; variableIndex_t *vj = NULL; const ASTNode_t *f = NULL; cvodeData_t *data = NULL; cvodeSettings_t *set; integratorInstance_t *iI; /* first load an SBML model and directly construct the internal odeModel from it */ odeModel_t *odeModel = ODEModel_createFromFile("MAPK.xml"); if ( ODEModel_constructJacobian(odeModel) && ODEModel_getNeq(odeModel) ) { printf("\n\nSuccessfully constructed the jacobian matrix J\n\n"); printf("We might be interested in the `sparsity' of J,\n"); printf("... we can just evaluate the jacobian entries:\n\n"); /* we need cvodeData for evaluating formulas */ data = CvodeData_create(odeModel); /* ! IMPORTANT : initialize values */ CvodeData_initializeValues(data); printf("Jacobian with initial conditions:\n"); printJacobian(odeModel, data); /* we must free this cvodeData structure */ CvodeData_free(data); printf("Does it change after integration?\n\n"); /* creating settings and integrate */ set = CvodeSettings_create(); CvodeSettings_setTime(set, 1000, 1); iI = IntegratorInstance_create(odeModel, set); IntegratorInstance_integrate(iI); /* get cvodeData from integratorInstance, it contains the values at the last time point, and just do the same as above */ data = IntegratorInstance_getData(iI); printf("Jacobian at time %g:\n", IntegratorInstance_getTime(iI)); printJacobian(odeModel, data); printf("J[6,4] changed its sign. Let's take a look at the equations:\n\n"); vi = ODEModel_getOdeVariableIndex(odeModel, 6); vj = ODEModel_getOdeVariableIndex(odeModel, 4); f = ODEModel_getOde(odeModel, vi); formula = SBML_formulaToString(f); printf("The ODE d%s/dt = \n%s \n\n", ODEModel_getVariableName(odeModel, vi), formula); free(formula); f = ODEModel_getJacobianEntry(odeModel, vi, vj); formula = SBML_formulaToString(f); printf("The jacobian entry (d%s/dt)/d%s = \n%s \n\n", ODEModel_getVariableName(odeModel, vi), ODEModel_getVariableName(odeModel, vj), formula); free(formula); VariableIndex_free(vi); VariableIndex_free(vj); printf("MAPK_P is both a substrate and a product of MKK_PP "); printf("in different reactions.\nTherefor the corresponding "); printf("entry in the jacobian can change its sign, depending "); printf("on concentrations!\n"); /* finally draw a `species interaction graph' of the jacobian' */ drawJacoby(data, "jacobian", "gif"); printf("Take a look at jacobian interaction graph in"); printf("file jacobian_jm.gif that has just been constructed.\n"); printf("If you have compiled w/o graphviz, you just have a textfile"); printf(" jacobian.dot\n"); printf("Thx and good bye!\n"); /* note that this cvodeData MUST NOT be freed, it stays with and will be freed together with integratorInstance */ IntegratorInstance_free(iI); CvodeSettings_free(set); } else { SolverError_dumpAndClearErrors(); printf("Sorry, for this system we couldn't generate the Jacobian.\n"); printf("Integration can still be run with internal approximation.\n"); } ODEModel_free(odeModel); return 1; }
int main (int argc, char *argv[]){ int i, j; odeModel_t *om; cvodeSettings_t *set; integratorInstance_t *ii; cvodeResults_t *results; variableIndex_t *y, *p; /* Setting SBML ODE Solver integration parameters */ set = CvodeSettings_create(); CvodeSettings_setTime(set, 300.0, 10); CvodeSettings_setErrors(set, 1e-9, 1e-4, 1e9); /* ACTIVATE SENSITIVITY ANALYSIS */ CvodeSettings_setSensitivity(set, 1); /* 0: simultaneous 1: staggered, 2: staggered1 see CVODES user guide for details */ CvodeSettings_setSensMethod(set, 0); CvodeSettings_setJacobian(set, 1); /* for testing only */ /* CvodeSettings_dump(set); */ /* creating the odeModel */ om = ODEModel_createFromFile("MAPK.xml"); /* get a parameter for which we will check sensitivities */ p = ODEModel_getVariableIndex(om, "K1"); /* calling the integrator */ ii = IntegratorInstance_create(om, set); printf("### Printing Sensitivities to %s (%g) on the fly:\n", ODEModel_getVariableName(om, p), IntegratorInstance_getVariableValue(ii, p)); printf("#time "); IntegratorInstance_dumpNames(ii); IntegratorInstance_dumpPSensitivities(ii, p); while( !IntegratorInstance_timeCourseCompleted(ii) ) { if ( !IntegratorInstance_integrateOneStep(ii) ) { break; } IntegratorInstance_dumpPSensitivities(ii, p); } VariableIndex_free(p); if ( SolverError_getNum(FATAL_ERROR_TYPE) ) { printf("Integration not sucessful!\n"); SolverError_dumpAndClearErrors(); return(EXIT_FAILURE); } y = ODEModel_getVariableIndex(om, "MAPK_P"); printf("\nLet's look at a specific ODE variable:\n"); /* print sensitivities again, but now from stored results */ printf("### RESULTS for Sensitivity Analysis for one ODE variable\n"); printf("#time Variable Sensitivity Params...\n"); printf("#time "); printf("%s ", ODEModel_getVariableName(om, y)); for ( j=0; j<ODEModel_getNsens(om); j++ ) { p = ODEModel_getSensParamIndexByNum(om, j); printf("%s ", ODEModel_getVariableName(om, p)); VariableIndex_free(p); } printf("\n"); results = IntegratorInstance_createResults(ii); for ( i=0; i<CvodeResults_getNout(results); i++ ) { printf("%g ", CvodeResults_getTime(results, i)); printf("%g ", CvodeResults_getValue(results, y, i)); for ( j=0; j<ODEModel_getNsens(om); j++ ) { p = ODEModel_getSensParamIndexByNum(om, j); printf("%g ", CvodeResults_getSensitivity(results, y, p, i)); VariableIndex_free(p); } printf("\n"); } /* drawSensitivity(ii->data, "sensitivity", "ps", 0.9); */ p = ODEModel_getVariableIndex(om, "V1"); printf("\nWhat do sensitivities mean? Let's try out!\n\n"); printf("... add 1 to %s: %g + 1 = ", ODEModel_getVariableName(om, p), IntegratorInstance_getVariableValue(ii, p)); CvodeSettings_setSensitivity(set, 0); IntegratorInstance_reset(ii); IntegratorInstance_setVariableValue(ii, p, IntegratorInstance_getVariableValue(ii,p)+1); printf("%g\n", IntegratorInstance_getVariableValue(ii, p)); printf("... and integrate again:\n\n"); CvodeResults_free(results); IntegratorInstance_integrate(ii); results = IntegratorInstance_createResults(ii); /* and print changed results */ printf("#time %s\n", ODEModel_getVariableName(om, y)); for ( i=0; i<CvodeResults_getNout(results); i++ ) { printf("%g ", CvodeResults_getTime(results, i)); printf("%g\n", CvodeResults_getValue(results, y, i)); } printf("\nSee the difference?\n"); printf("Look what happens when the sensitivity changes its sign\n"); printf("between times 180 and 210.\n\n"); VariableIndex_free(y); VariableIndex_free(p); /* now we have the results and can free the inputs */ IntegratorInstance_free(ii); CvodeSettings_free(set); CvodeResults_free(results); ODEModel_free(om); return (EXIT_SUCCESS); }
int main (int argc, char *argv[]) { int i, j, k; int neq, nsens; odeModel_t *om; odeSense_t *os; cvodeSettings_t *set; integratorInstance_t *ii; variableIndex_t *p1, *p2, *p3, *vi; double *weights; /* Setting SBML ODE Solver integration parameters */ set = CvodeSettings_create(); CvodeSettings_setTime(set, 30, 10); CvodeSettings_setErrors(set, 1e-15, 1e-10, 1e9); CvodeSettings_setMethod(set, 0, 5); /* CvodeSettings_setStoreResults(set, 0); */ CvodeSettings_setJacobian(set, 1); /* for testing only */ CvodeSettings_setCompileFunctions(set, 0); /* for testing only */ /* CvodeSettings_dump(set); */ CvodeSettings_setFIM(set); /* ACTIVATE FIM */ /* creating the odeModel */ om = ODEModel_createFromFile("MAPK.xml"); ii = IntegratorInstance_create(om, set); printf("\nFirst try a few integrations without sensitivity\n"); IntegratorInstance_dumpNames(ii); printf("\n"); for ( i=0; i<2; i++ ) { printf("Run #%d:\n", i); IntegratorInstance_integrate(ii); /* IntegratorInstance_dumpData(ii); */ IntegratorInstance_printResults(ii, stderr); IntegratorInstance_reset(ii); printf("finished\n\n"); } /* ACTIVATE SENSITIVITY ANALYSIS */ CvodeSettings_setSensitivity(set, 1); /* 0: simultaneous 1: staggered, 2: staggered1 see CVODES user guide for details */ CvodeSettings_setSensMethod(set, 0); /* reset integrator to new settings */ IntegratorInstance_reset(ii); printf("Now Activate Sensitivity\n\n"); os = IntegratorInstance_getSensitivityModel(ii); nsens = ODESense_getNsens(os); printf("nsens = %i\n\n", nsens); for ( i=0; i<nsens; i++ ) { vi = ODESense_getSensParamIndexByNum(os, i); printf("%s\n", ODEModel_getVariableName(om, vi) ); VariableIndex_free(vi); } printf("\n"); printf("sensitivities calculated for all constants\n"); p1 = ODESense_getSensParamIndexByNum(os, 1); p2 = ODESense_getSensParamIndexByNum(os, 2); p3 = ODESense_getSensParamIndexByNum(os, 3); printf("sensitivities printed for constants %s, %s, %s\n\n", ODEModel_getVariableName(om, p1), ODEModel_getVariableName(om, p2), ODEModel_getVariableName(om, p3)); /* create non-default weights for computation of FIM */ /* weights should be extracted from objective function! */ neq = ODEModel_getNeq(om); ASSIGN_NEW_MEMORY_BLOCK(weights, neq, double, 0); for ( i=0; i<neq; i++ ) weights[i] = 1.; /* set weights (to non-default values) */ IntegratorInstance_setFIMweights(ii, weights, neq); /* *** *** *** *** *** *** discrete data *** *** *** *** *** *** *** */ CvodeSettings_setDiscreteObservation(set); printf("DISCRETE DATA\n\n"); i = 0; while ( i < 2 ) { printf("Run #%d:\n", i); while( !IntegratorInstance_timeCourseCompleted(ii) ) { IntegratorInstance_dumpPSensitivities(ii, p1); IntegratorInstance_dumpPSensitivities(ii, p2); IntegratorInstance_dumpPSensitivities(ii, p3); if ( !IntegratorInstance_integrateOneStep(ii) ) break; } IntegratorInstance_dumpPSensitivities(ii, p1); IntegratorInstance_dumpPSensitivities(ii, p2); IntegratorInstance_dumpPSensitivities(ii, p3); fprintf(stderr, "FIM =\n"); for ( j=0; j<nsens; j++ ) { for ( k=0; k<nsens; k++ ) fprintf(stderr, "%g ", IntegratorInstance_getFIM(ii,j,k)); fprintf(stderr, "\n"); } fprintf(stderr, "\n"); IntegratorInstance_reset(ii); i++; } /* *** *** *** *** *** *** continuous data *** *** *** *** *** *** *** */ CvodeSettings_unsetDiscreteObservation(set); printf("CONTINUOUS DATA\n\n"); i = 0; while ( i < 2 ) { printf("Run #%d:\n", i); while( !IntegratorInstance_timeCourseCompleted(ii) ) { IntegratorInstance_dumpPSensitivities(ii, p1); IntegratorInstance_dumpPSensitivities(ii, p2); IntegratorInstance_dumpPSensitivities(ii, p3); if ( !IntegratorInstance_integrateOneStep(ii) ) break; } IntegratorInstance_dumpPSensitivities(ii, p1); IntegratorInstance_dumpPSensitivities(ii, p2); IntegratorInstance_dumpPSensitivities(ii, p3); /* calculate FIM */ IntegratorInstance_CVODEQuad(ii); fprintf(stderr, "FIM =\n"); for ( j=0; j<nsens; j++ ) { for ( k=0; k<nsens; k++ ) fprintf(stderr, "%g ", IntegratorInstance_getFIM(ii,j,k)); fprintf(stderr, "\n"); } fprintf(stderr, "\n"); IntegratorInstance_reset(ii); i++; } fprintf(stderr, "finished\n"); /* VariableIndex_free(y); */ VariableIndex_free(p1); VariableIndex_free(p2); VariableIndex_free(p3); free(weights); /* now we have the results and can free the inputs */ IntegratorInstance_free(ii); CvodeSettings_free(set); ODEModel_free(om); return (EXIT_SUCCESS); }