Example #1
0
    def _apply_parameters_to_objective(self):

        objective_free_variables = []
        objective_free_variables_parameters_applied = []

        for doe_setup in self._doe_setups:

            objective_free_variables.append( \
                doe_setup._discretization.optimization_variables["P"])
            objective_free_variables_parameters_applied.append( \
                doe_setup._pdata)

            for key in ["U", "Q", "X"]:

                objective_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])
                objective_free_variables_parameters_applied.append( \
                    doe_setup._discretization.optimization_variables[key])
                
        objective_free_variables = ci.veccat(objective_free_variables)
        objective_free_variables_parameters_applied = \
            ci.veccat(objective_free_variables_parameters_applied)

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        [self._objective] = objective_fcn( \
            [objective_free_variables_parameters_applied])
Example #2
0
    def _apply_parameters_to_equality_constraints(self):

        optimization_variables_for_equality_constraints = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_parameters_applied = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape), 
                self._pdata, 

            ])

        equality_constraints_fcn = ci.mx_function( \
            "equality_constraints_fcn", \
            [optimization_variables_for_equality_constraints], \
            [self._discretization.equality_constraints])

        [self._equality_constraints_parameters_applied] = \
            equality_constraints_fcn([optimization_variables_parameters_applied])
Example #3
0
    def _apply_controls_to_measurements(self, udata, qdata):

        udata = inputchecks.check_controls_data(udata, \
            self._discretization.system.nu, \
            self._discretization.number_of_controls)
        qdata = inputchecks.check_constant_controls_data(qdata, \
            self._discretization.system.nq)

        optimization_variables_for_measurements = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_controls_applied = ci.veccat([ \

                udata, 
                qdata, 
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        measurements_fcn = ci.mx_function( \
            "measurements_fcn", \
            [optimization_variables_for_measurements], \
            [self._discretization.measurements])

        [self._measurements_controls_applied] = \
            measurements_fcn([optimization_variables_controls_applied])
Example #4
0
    def _apply_parameters_to_objective(self):

        # As mentioned above, the objective does not depend on the actual
        # values of V, but on the values of P and EPS_U, while
        # P is fed from pdata, and EPS_U is supposed to be 0

        objective_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        objective_free_variables_parameters_applied = ci.veccat([ \

                self._pdata,
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape),

            ])

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        self._objective = objective_fcn( \
            objective_free_variables_parameters_applied)
Example #5
0
    def _apply_parameters_to_objective(self):

        # As mentioned above, the objective does not depend on the actual
        # values of V, but on the values of P and EPS_E and EPS_U, while
        # P is fed from pdata, and EPS_E, EPS_u are supposed to be 0

        objective_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        objective_free_variables_parameters_applied = ci.veccat([ \

                self._pdata,
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape),

            ])

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        [self._objective] = objective_fcn( \
            [objective_free_variables_parameters_applied])
Example #6
0
    def _apply_parameters_to_equality_constraints(self):

        optimization_variables_for_equality_constraints = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_parameters_applied = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape), 
                self._pdata, 

            ])

        equality_constraints_fcn = ci.mx_function( \
            "equality_constraints_fcn", \
            [optimization_variables_for_equality_constraints], \
            [self._discretization.equality_constraints])

        self._equality_constraints_parameters_applied = \
            equality_constraints_fcn(optimization_variables_parameters_applied)
Example #7
0
    def _apply_parameters_to_objective(self):

        objective_free_variables = []
        objective_free_variables_parameters_applied = []

        for doe_setup in self._doe_setups:

            objective_free_variables.append( \
                doe_setup._discretization.optimization_variables["P"])
            objective_free_variables_parameters_applied.append( \
                doe_setup._pdata)

            for key in ["U", "Q", "X"]:

                objective_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])
                objective_free_variables_parameters_applied.append( \
                    doe_setup._discretization.optimization_variables[key])
                
        objective_free_variables = ci.veccat(objective_free_variables)
        objective_free_variables_parameters_applied = \
            ci.veccat(objective_free_variables_parameters_applied)

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        self._objective = objective_fcn( \
            objective_free_variables_parameters_applied)
Example #8
0
    def _apply_controls_to_measurements(self, udata, qdata):

        udata = inputchecks.check_controls_data(udata, \
            self._discretization.system.nu, \
            self._discretization.number_of_controls)
        qdata = inputchecks.check_constant_controls_data(qdata, \
            self._discretization.system.nq)

        optimization_variables_for_measurements = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],
                self._discretization.optimization_variables["P"],

            ])

        optimization_variables_controls_applied = ci.veccat([ \

                udata,
                qdata,
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],
                self._discretization.optimization_variables["P"],

            ])

        measurements_fcn = ci.mx_function( \
            "measurements_fcn", \
            [optimization_variables_for_measurements], \
            [self._discretization.measurements])

        self._measurements_controls_applied = \
            measurements_fcn(optimization_variables_controls_applied)
Example #9
0
    def __generate_scaled_dae(self):

        # ODE time scaling according to:
        # https://groups.google.com/forum/#!topic/casadi-users/AeXzJmBH0-Y

        t_scale = ci.mx_sym("t_scale", 1)

        dae_scaled = ci.mx_function(
            "dae_scaled",
            ci.daeIn(x=self.__system.x, p=ci.vertcat([t_scale, self.__system.u])),
            ci.daeOut(ode=t_scale * self.__ode_parameters_applied),
        )

        self.__dae_scaled = dae_scaled.expand()
Example #10
0
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
Example #11
0
    def __generate_simulation_ode(self, pdata, qdata):

        p = inputchecks.check_parameter_data(pdata, self.__system.np)
        q = inputchecks.check_constant_controls_data(qdata, self.__system.nq)

        ode_fcn = ci.mx_function("ode_fcn", \
            [self.__system.u, self.__system.q, self.__system.x, \
            self.__system.eps_u, self.__system.p], \
            [self.__system.f])

        # Needs to be changes for allowance of explicit time dependecy!

        self.__ode_parameters_applied = ode_fcn.call([ \
            self.__system.u, q, self.__system.x, \
            np.zeros(self.__system.neps_u), p])[0]
Example #12
0
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
Example #13
0
    def __generate_simulation_ode(self, pdata, qdata):

        p = inputchecks.check_parameter_data(pdata, self.__system.np)
        q = inputchecks.check_constant_controls_data(qdata, self.__system.nq)

        ode_fcn = ci.mx_function(
            "ode_fcn",
            [self.__system.u, self.__system.q, self.__system.x, self.__system.eps_u, self.__system.p],
            [self.__system.f],
        )

        # Needs to be changes for allowance of explicit time dependency!

        self.__ode_parameters_applied = ode_fcn(
            [self.__system.u, q, self.__system.x, np.zeros(self.__system.neps_u), p]
        )[0]
Example #14
0
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = []

        for doe_setup in self._doe_setups:

            for key in ["P", "U", "Q", "X"]:

                covariance_matrix_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])

        covariance_matrix_free_variables = ci.veccat( \
            covariance_matrix_free_variables)

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
Example #15
0
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = []

        for doe_setup in self._doe_setups:

            for key in ["P", "U", "Q", "X"]:

                covariance_matrix_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])

        covariance_matrix_free_variables = ci.veccat( \
            covariance_matrix_free_variables)

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
Example #16
0
    def compute_covariance_matrix(self):
        r'''
        This function computes the covariance matrix for the estimated
        parameters from the inverse of the KKT matrix for the parameter
        estimation problem, which allows for statements on the quality of
        the values of the estimated parameters [#f1]_ [#f2]_.

        For efficiency, only the inverse of the relevant part of the matrix
        is computed [#f3]_.

        The values of the covariance matrix :math:`\Sigma_{\hat{\text{p}}}` can afterwards
        be accessed via the class attribute ``LSq.covariance_matrix``, and the
        contained standard deviations :math:`\sigma_{\hat{\text{p}}}` for the
        estimated parameters directly via 
        ``LSq.standard_deviations``.

        .. rubric:: References

        .. [#f1] |linkf1|_

        .. _linkf1:  https://www.researchgate.net/publication/228407918_Computing_Covariance_Matrices_for_Constrained_Nonlinear_Large_Scale_Parameter_Estimation_Problems_Using_Krylov_Subspace_Methods

        .. |linkf1| replace:: *Kostina, Ekaterina and Kostyukova, Olga: Computing Covariance Matrices for Constrained Nonlinear Large Scale Parameter Estimation Problems Using Krylov Subspace Methods, 2012.*

        .. [#f2] |linkf2|_

        .. _linkf2: http://www.am.uni-erlangen.de/home/spp1253/wiki/images/b/b3/Freising10_19_-_Kostina_-_Towards_Optimum.pdf

        .. |linkf2| replace:: *Kostina, Ekaterina and Kriwet, Gregor: Towards Optimum Experimental Design for Partial Differential Equations, SPP 1253 annual conference 2010, slides 12/13.*

        .. [#f3] *Walter, Eric and Prozanto, Luc: Identification of Parametric Models from Experimental Data, Springer, 1997, pages 288/289.*

        '''

        print('\n' + '# ' + 17 * '-' + \
            ' casiopeia covariance matrix computation ' + 16 * '-' + ' #')

        print('''
Computing the covariance matrix for the estimated parameters,
this might take some time ...''')

        self._tstart_covariance_computation = time.time()

        kkt_matrix = KKTMatrix(self.gauss_newton_lagrangian_hessian, \
            self._constraints, self._optimization_variables)

        fisher_matrix = FisherMatrix(kkt_matrix.kkt_matrix, \
            self._discretization.system.np)

        self._covariance_matrix = CovarianceMatrix(fisher_matrix.fisher_matrix)

        # self._covariance_matrix = DirectFactorizationCovarianceMatrix( \
        #     kkt_matrix.kkt_matrix, self._discretization.system.np)

        beta = setup_covariance_matrix_scaling_factor_beta( \
            self._constraints, self._optimization_variables, self._residuals)

        beta_fcn = ci.mx_function("beta_fcn", \
            [self._optimization_variables], [beta])

        self._beta = beta_fcn(self.estimation_results["x"])

        self._covariance_matrix_scaled = self._beta * \
            self._covariance_matrix.covariance_matrix

        covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [self._optimization_variables], \
            [self._covariance_matrix_scaled])

        self._covariance_matrix = \
            covariance_matrix_fcn(self.estimation_results["x"])

        self._tend_covariance_computation = time.time()
        self._duration_covariance_computation = \
            self._tend_covariance_computation - \
            self._tstart_covariance_computation

        print("Covariance matrix computation finished.")
Example #17
0
    def _setup_nlp(self):

        self._nlp = ci.mx_function("nlp", \
            ci.nlpIn(x = self._optimization_variables), \
            ci.nlpOut(f = self._objective, g = self._constraints))
Example #18
0
    def compute_covariance_matrix(self):

        r'''
        This function computes the covariance matrix for the estimated
        parameters from the inverse of the KKT matrix for the parameter
        estimation problem, which allows for statements on the quality of
        the values of the estimated parameters [#f1]_ [#f2]_.

        For efficiency, only the inverse of the relevant part of the matrix
        is computed [#f3]_.

        The values of the covariance matrix :math:`\Sigma_{\hat{\text{p}}}` can afterwards
        be accessed via the class attribute ``LSq.covariance_matrix``, and the
        contained standard deviations :math:`\sigma_{\hat{\text{p}}}` for the
        estimated parameters directly via 
        ``LSq.standard_deviations``.

        .. rubric:: References

        .. [#f1] |linkf1|_

        .. _linkf1:  https://www.researchgate.net/publication/228407918_Computing_Covariance_Matrices_for_Constrained_Nonlinear_Large_Scale_Parameter_Estimation_Problems_Using_Krylov_Subspace_Methods

        .. |linkf1| replace:: *Kostina, Ekaterina and Kostyukova, Olga: Computing Covariance Matrices for Constrained Nonlinear Large Scale Parameter Estimation Problems Using Krylov Subspace Methods, 2012.*

        .. [#f2] |linkf2|_

        .. _linkf2: http://www.am.uni-erlangen.de/home/spp1253/wiki/images/b/b3/Freising10_19_-_Kostina_-_Towards_Optimum.pdf

        .. |linkf2| replace:: *Kostina, Ekaterina and Kriwet, Gregor: Towards Optimum Experimental Design for Partial Differential Equations, SPP 1253 annual conference 2010, slides 12/13.*

        .. [#f3] *Walter, Eric and Prozanto, Luc: Identification of Parametric Models from Experimental Data, Springer, 1997, pages 288/289.*

        '''

        print('\n' + '# ' + 17 * '-' + \
            ' casiopeia covariance matrix computation ' + 16 * '-' + ' #')

        print('''
Computing the covariance matrix for the estimated parameters,
this might take some time ...''')

        self._tstart_covariance_computation = time.time()

        kkt_matrix = KKTMatrix(self.gauss_newton_lagrangian_hessian, \
            self._constraints, self._optimization_variables)

        fisher_matrix = FisherMatrix(kkt_matrix.kkt_matrix, \
            self._discretization.system.np)

        self._covariance_matrix = CovarianceMatrix(fisher_matrix.fisher_matrix)

        # self._covariance_matrix = DirectFactorizationCovarianceMatrix( \
        #     kkt_matrix.kkt_matrix, self._discretization.system.np)

        beta = setup_covariance_matrix_scaling_factor_beta( \
            self._constraints, self._optimization_variables, self._residuals)

        beta_fcn = ci.mx_function("beta_fcn", \
            [self._optimization_variables], [beta])

        self._beta = beta_fcn([self.estimation_results["x"]])[0]

        self._covariance_matrix_scaled = self._beta * \
            self._covariance_matrix.covariance_matrix

        covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [self._optimization_variables], \
            [self._covariance_matrix_scaled])

        self._covariance_matrix = \
            covariance_matrix_fcn([self.estimation_results["x"]])[0]

        self._tend_covariance_computation = time.time()
        self._duration_covariance_computation = \
            self._tend_covariance_computation - \
            self._tstart_covariance_computation

        print("Covariance matrix computation finished.")
Example #19
0
    def _setup_nlp(self):

        self._nlp = ci.mx_function("nlp", \
            ci.nlpIn(x = self._optimization_variables), \
            ci.nlpOut(f = self._objective, \
                g = self._equality_constraints_parameters_applied))