static printSensiMatrix(odeModel_t *odeModel, cvodeData_t *data) { int i, j; const ASTNode_t *f = NULL; char *formula; /* first, get the number of equations of the ODE system */ int neq = ODEModel_getNeq(odeModel); printf("i\\j "); for ( j=0; j<ODEModel_getNsens(odeModel); j++ ) printf("%d ", j); printf("\n"); for ( i=0; i<ODEModel_getNeq(odeModel); i++ ) { printf("%d ", i); for ( j=0; j<ODEModel_getNsens(odeModel); j++ ) { f = ODEModel_getSensIJEntry(odeModel, i, j); /* now let's see wether the entry is positive or negative at this point */ if ( evaluateAST((ASTNode_t *)f, data) < 0 ) printf("- "); if ( evaluateAST((ASTNode_t *)f, data) > 0 ) printf("+ "); if ( evaluateAST((ASTNode_t *)f, data) == 0 ) printf("0 "); } printf("\n\n"); } printf("\n"); }
static void printJacobian(odeModel_t *odeModel, cvodeData_t *data) { int i, j; const ASTNode_t *f = NULL; printf("i\\j "); for ( j=0; j<ODEModel_getNeq(odeModel); j++ ) printf("%d ", j); printf("\n"); for ( i=0; i<ODEModel_getNeq(odeModel); i++ ) { printf("%d ", i); for ( j=0; j<ODEModel_getNeq(odeModel); j++ ) { f = ODEModel_getJacobianIJEntry(odeModel, i, j); /* now let's see wether the entry is positive or negative at this point */ if ( evaluateAST((ASTNode_t *)f, data) < 0 ) printf("- "); if ( evaluateAST((ASTNode_t *)f, data) > 0 ) printf("+ "); if ( evaluateAST((ASTNode_t *)f, data) == 0 ) printf("0 "); } printf("\n\n"); } printf("\n"); }
void printOdes_fromFile(char* filename) { if (filename == NULL) return; int i; char *formula; variableIndex_t *vi = NULL; odeModel_t *model = ODEModel_createFromFile(filename); if (model == NULL) { printf("create odemodel fails:\n"); return; } /* Get some information from constructed odeModel */ printf("\n\n"); printf("ODE Model Statistics:\n"); printf("Number of ODEs: %d\n", ODEModel_getNeq(model)); printf("Number of Assignments: %d\n", ODEModel_getNumAssignments(model)); printf("Number of Constants: %d\n", ODEModel_getNumConstants(model)); printf(" ____\n"); printf("Total number of values: %d\n", ODEModel_getNumValues(model)); printf("\n"); printf("ODEs:\n"); for ( i=0; i<ODEModel_getNeq(model); i++ ){ vi = ODEModel_getOdeVariableIndex(model, i); formula = SBML_formulaToString(ODEModel_getOde(model, vi)); printf("d[%s]/dt = %s \n", ODEModel_getVariableName(model, vi), formula); free(formula); VariableIndex_free(vi); } // printf("Assigned Variables:\n"); // for ( i=0; i<ODEModel_getNumAssignments(model); i++ ){ // vi = ODEModel_getAssignedVariableIndex(model, i); // formula = SBML_formulaToString(ODEModel_getOde(model, vi)); // printf("%s = %s \n", ODEModel_getVariableName(model, vi), formula); // free(formula); // VariableIndex_free(vi); // } printf("Constants:\n"); for ( i=0; i<ODEModel_getNumConstants(model); i++ ){ vi = ODEModel_getConstantIndex(model, i); printf("%s\n", ODEModel_getVariableName(model, vi)); VariableIndex_free(vi); } printf("\n\n"); ODEModel_free(model); }
int main(void) { int i; char *formula; variableIndex_t *vi = NULL; odeModel_t *model = ODEModel_createFromFile("basic-model1-forward-l2.xml"); /* Get some information from constructed odeModel */ printf("\n\n"); printf("ODE Model Statistics:\n"); printf("Number of ODEs: %d\n", ODEModel_getNeq(model)); printf("Number of Assignments: %d\n", ODEModel_getNumAssignments(model)); printf("Number of Constants: %d\n", ODEModel_getNumConstants(model)); printf(" ____\n"); printf("Total number of values: %d\n", ODEModel_getNumValues(model)); printf("\n"); printf("ODEs:\n"); for ( i=0; i<ODEModel_getNeq(model); i++ ){ vi = ODEModel_getOdeVariableIndex(model, i); formula = SBML_formulaToString(ODEModel_getOde(model, vi)); printf("d[%s]/dt = %s \n", ODEModel_getVariableName(model, vi), formula); free(formula); VariableIndex_free(vi); } printf("Assigned Variables:\n"); for ( i=0; i<ODEModel_getNumAssignments(model); i++ ){ vi = ODEModel_getAssignedVariableIndex(model, i); formula = SBML_formulaToString(ODEModel_getOde(model, vi)); printf("%s = %s \n", ODEModel_getVariableName(model, vi), formula); free(formula); VariableIndex_free(vi); } printf("Constants:\n"); for ( i=0; i<ODEModel_getNumConstants(model); i++ ){ vi = ODEModel_getConstantIndex(model, i); printf("%s\n", ODEModel_getVariableName(model, vi)); VariableIndex_free(vi); } printf("\n\n"); ODEModel_free(model); return 1; }
int main(void) { int i, j, neq; 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_constructSensitivity(odeModel) && ODEModel_getNeq(odeModel) ) { printf("\n\nSuccessfully constructed the parametric matrix S "); printf("as used for CVODES sensitivity analysis\n\n"); printf("We might be interested in the `sparsity' of S,\n"); printf("... we can just evaluate the parametric entries:\n\n"); /* we need cvodeData for evaluating formulas */ data = CvodeData_create(odeModel); printf("... how many parametric entries: %d\n\n", ODEModel_getNsens(odeModel)); /* now take a look at a all entries of S: */ for ( i=0; i<ODEModel_getNeq(odeModel); i++ ) { vi = ODEModel_getOdeVariableIndex(odeModel, i); printf("\nODE VARIABLE %d: %s\n", i+1, ODEModel_getVariableName(odeModel, vi)); f = ODEModel_getOde(odeModel, vi); formula = SBML_formulaToString(f); printf("dY/dt = %s \n", formula); free(formula); for ( j=0; j<ODEModel_getNsens(odeModel); j++ ) { vj = ODEModel_getSensParamIndexByNum(odeModel, j); printf(" Parameter %d: %s ", j, ODEModel_getVariableName(odeModel, vj)); f = ODEModel_getSensIJEntry(odeModel, i, j); formula = SBML_formulaToString(f); printf(" S[%d][%d] = %s \n", i, j, formula); free(formula); VariableIndex_free(vj); } VariableIndex_free(vi); } printf("\n\n"); printf("Sensitivity: parametric matrix with initial conditions:\n"); printSensiMatrix(odeModel, data); /* we must free this cvodeData structure */ CvodeData_free(data); printf("Thx and good bye!\n"); } else { SolverError_dumpAndClearErrors(); printf("Sorry, for this system we couldn't generate the Parametric.\n"); printf("Sensitivity can still be run with internal approximation.\n"); } ODEModel_free(odeModel); return 1; }
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, 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); }