int main( ){

    USING_NAMESPACE_ACADO

    // INTRODUCE THE VARIABLES:
    // -------------------------
    Parameter               V ;
    Parameter               km;


    // READ THE MEASUREMENT FROM A DATA FILE:
    // --------------------------------------
    Matrix m = readFromFile( "michaelis_menten_data.txt" );


    // DEFINE A MEASUREMENT FUNCTION:
    // ------------------------------
    Function h;  // the measurement function

    int i;
    for( i = 0; i < (int) m.getNumRows(); i++ )
        h << V*m(i,0)/(km + m(i,0)) - m(i,1);


    // DEFINE A PARAMETER ESTIMATION PROBLEM:
    // --------------------------------------
    NLP nlp;
    nlp.minimizeLSQ( h );

    nlp.subjectTo( 0.0 <= V  <= 2.0 );
    nlp.subjectTo( 0.0 <= km <= 2.0 );


    // DEFINE AN OPTIMIZATION ALGORITHM AND SOLVE THE ESTIMATION PROBLEM:
    // ------------------------------------------------------------------
    ParameterEstimationAlgorithm algorithm(nlp);
    algorithm.solve();


    VariablesGrid parameters;
    algorithm.getParameters( parameters );

	return 0;
	
    // GET THE VARIANCE COVARIANCE IN THE SOLUTION:
    // ---------------------------------------------
    Matrix var;
    algorithm.getParameterVarianceCovariance( var );

    double LSSE = 2.0*algorithm.getObjectiveValue();
    double MSE  = LSSE/( m.getNumRows() - 2.0 );   // m.getNumRows() == number of measurements
                                                   // 2              == number of parameters

    var *=  MSE;  // rescale the variance-covariance with the MSE factor.


    // PRINT THE RESULT ON THE TERMINAL:
    // -----------------------------------------------------------------------
	printf("\n\nResults for the parameters: \n");
	printf("-----------------------------------------------\n");
	printf("   V   =  %.3e  +/-  %.3e \n", parameters(0,0), sqrt( var(0,0) ) );
	printf("   km  =  %.3e  +/-  %.3e \n", parameters(0,1), sqrt( var(1,1) ) );
	printf("-----------------------------------------------\n\n\n");

    return 0;
}