From cb0b9de1ab0175756fae55b4c358f1e53865de84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= <mueller.seb@posteo.de> Date: Wed, 12 Mar 2025 15:07:19 +0100 Subject: [PATCH] move eval and objective interfaces to mo_opt_eval_utils --- src/mo_cost.f90 | 3 +-- src/mo_likelihood.f90 | 7 +------ src/mo_opt_eval_utils.f90 | 31 +++++++++++++++++++++++++++++-- src/mo_opt_functions.f90 | 5 +---- src/mo_optimizee.f90 | 28 +--------------------------- src/pf_tests/test_mo_mcmc.pf | 3 ++- 6 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/mo_cost.f90 b/src/mo_cost.f90 index 5656892..7b874eb 100644 --- a/src/mo_cost.f90 +++ b/src/mo_cost.f90 @@ -224,8 +224,7 @@ CONTAINS FUNCTION cost_objective(parameterset, eval, arg1, arg2, arg3) use mo_kind, only: dp, i4 - use mo_optimizee, only: eval_interface - use mo_opt_eval_utils, only : sim_data_t, config_t + use mo_opt_eval_utils, only: eval_interface, sim_data_t, config_t implicit none diff --git a/src/mo_likelihood.f90 b/src/mo_likelihood.f90 index b3d0816..0af3633 100644 --- a/src/mo_likelihood.f90 +++ b/src/mo_likelihood.f90 @@ -9,7 +9,7 @@ module mo_likelihood USE mo_kind, only: i4, dp USE mo_moment, only: stddev - use mo_optimizee, only: eval_interface + use mo_opt_eval_utils, only: eval_interface, sim_data_t, config_t Implicit NONE @@ -47,7 +47,6 @@ CONTAINS ! ------------------------------- !> \brief A Likelihood function: "real" likelihood (sigma is an error model or given) function likelihood_dp(paraset, eval, stddev_in, stddev_new, likeli_new) - use mo_opt_eval_utils, only : sim_data_t, config_t REAL(DP), DIMENSION(:), INTENT(IN) :: paraset ! parameter set procedure(eval_interface), INTENT(IN), pointer :: eval REAL(DP), INTENT(IN), optional :: stddev_in ! standard deviation of data @@ -77,7 +76,6 @@ CONTAINS ! ------------------------------- !> \brief A Log-Likelihood function: "real" likelihood (sigma is an error model or given) function loglikelihood_dp(paraset, eval, stddev_in, stddev_new, likeli_new) - use mo_opt_eval_utils, only : sim_data_t, config_t REAL(DP), DIMENSION(:), INTENT(IN) :: paraset ! parameter set procedure(eval_interface), INTENT(IN), pointer :: eval REAL(DP), INTENT(IN), optional :: stddev_in ! standard deviation of data @@ -107,7 +105,6 @@ CONTAINS ! ------------------------------- !> \brief A Likelihood function: "faked" likelihood (sigma is computed by obs vs model) function likelihood_stddev_dp(paraset, eval, stddev_in, stddev_new, likeli_new) - use mo_opt_eval_utils, only : sim_data_t, config_t REAL(DP), DIMENSION(:), INTENT(IN) :: paraset ! parameter set procedure(eval_interface), INTENT(IN), pointer :: eval REAL(DP), INTENT(IN), optional :: stddev_in ! standard deviation of data @@ -147,7 +144,6 @@ CONTAINS ! ------------------------------- !> \brief A Log-Likelihood_stddev function: "faked" likelihood (sigma is computed by obs vs model) function loglikelihood_stddev_dp(paraset, eval, stddev_in, stddev_new, likeli_new) - use mo_opt_eval_utils, only : sim_data_t, config_t REAL(DP), DIMENSION(:), INTENT(IN) :: paraset ! parameter set procedure(eval_interface), INTENT(IN), pointer :: eval REAL(DP), INTENT(IN), optional :: stddev_in ! standard deviation of data @@ -189,7 +185,6 @@ CONTAINS subroutine model_dp(config, sim_data) use mo_kind, only: dp - use mo_opt_eval_utils, only : sim_data_t, config_t use mo_message, only : error_message !! !$ USE omp_lib, only: OMP_GET_THREAD_NUM diff --git a/src/mo_opt_eval_utils.f90 b/src/mo_opt_eval_utils.f90 index 7532aee..c35c197 100644 --- a/src/mo_opt_eval_utils.f90 +++ b/src/mo_opt_eval_utils.f90 @@ -2,7 +2,7 @@ !> \brief \copybrief mo_opt_eval_utils !> \details \copydetails mo_opt_eval_utils -!> \brief Type definitions for optimization routines +!> \brief Type definitions and interfaces for optimization routines based on eval functions. !> \author Maren Kaluza !> \date Nov 2019 !> \copyright Copyright 2005-\today, the CHS Developers, Sabine Attinger: All rights reserved. @@ -14,7 +14,10 @@ MODULE mo_opt_eval_utils IMPLICIT NONE - public :: config_t, sim_data_t + public :: eval_interface + public :: objective_interface + public :: config_t + public :: sim_data_t private @@ -66,6 +69,30 @@ MODULE mo_opt_eval_utils procedure, public :: data_shape => sim_var_data_shape end type sim_var_t + !> \brief Interface for evaluation function. + abstract interface + subroutine eval_interface(config, sim_data) + import config_t, sim_data_t + type(config_t), intent(in) :: config !< configuration + type(sim_data_t), dimension(:), pointer, optional, intent(inout) :: sim_data !< simulated data + end subroutine + end interface + + !> \brief Interface for objective function. + !> \details The optional arguments are motivated by likelihood objective functions. + interface + function objective_interface(parameters, eval, arg1, arg2, arg3) + use mo_kind, only : dp + import eval_interface + real(dp), intent(in), dimension(:) :: parameters !< parameter set + procedure(eval_interface), INTENT(IN), pointer :: eval !< evaluation routine + real(dp), optional, intent(in) :: arg1 !< optional argument 1 + real(dp), optional, intent(out) :: arg2 !< optional argument 2 + real(dp), optional, intent(out) :: arg3 !< optional argument 3 + real(dp) :: objective_interface + end function objective_interface + end interface + contains !> \brief Check given data shape and ndim for consistency. diff --git a/src/mo_opt_functions.f90 b/src/mo_opt_functions.f90 index e17219b..36ff931 100644 --- a/src/mo_opt_functions.f90 +++ b/src/mo_opt_functions.f90 @@ -10,7 +10,7 @@ MODULE mo_opt_functions use mo_kind, only: i4, dp - use mo_optimizee, only: eval_interface + use mo_opt_eval_utils, only: eval_interface, sim_data_t, config_t IMPLICIT NONE @@ -5623,7 +5623,6 @@ CONTAINS function ackley_objective(parameterset, eval, arg1, arg2, arg3) use mo_constants, only: pi_dp - use mo_opt_eval_utils, only : sim_data_t, config_t implicit none @@ -5659,7 +5658,6 @@ CONTAINS function griewank_objective(parameterset, eval, arg1, arg2, arg3) use mo_kind, only: i4, dp - use mo_opt_eval_utils, only : sim_data_t, config_t implicit none @@ -5701,7 +5699,6 @@ CONTAINS subroutine eval_dummy(config, sim_data) use mo_kind, only : dp - use mo_opt_eval_utils, only : sim_data_t, config_t implicit none diff --git a/src/mo_optimizee.f90 b/src/mo_optimizee.f90 index 4ea9a35..6244827 100644 --- a/src/mo_optimizee.f90 +++ b/src/mo_optimizee.f90 @@ -18,11 +18,10 @@ module mo_optimizee use mo_kind, only : dp use mo_message, only : error_message + use mo_opt_eval_utils, only : eval_interface, objective_interface implicit none - public :: eval_interface - public :: objective_interface public :: optimizee public :: function_optimizee public :: likelihood_optimizee @@ -30,31 +29,6 @@ module mo_optimizee private - !> \brief Interface for evaluation function. - abstract interface - subroutine eval_interface(config, sim_data) - use mo_opt_eval_utils, only : config_t, sim_data_t - type(config_t), intent(in) :: config !< configuration - type(sim_data_t), dimension(:), pointer, optional, intent(inout) :: sim_data !< simulated data - end subroutine - end interface - - !> \brief Interface for objective function. - !> \details The optional arguments are motivated by likelihood objective functions. - interface - function objective_interface(parameters, eval, arg1, arg2, arg3) - use mo_kind, only : dp - import eval_interface - real(dp), intent(in), dimension(:) :: parameters !< parameter set - procedure(eval_interface), INTENT(IN), pointer :: eval !< evaluation routine - real(dp), optional, intent(in) :: arg1 !< optional argument 1 - real(dp), optional, intent(out) :: arg2 !< optional argument 2 - real(dp), optional, intent(out) :: arg3 !< optional argument 3 - - real(dp) :: objective_interface - end function objective_interface - end interface - !> \brief abstract type 'optimizee' to be used by optimizers type, abstract :: optimizee contains diff --git a/src/pf_tests/test_mo_mcmc.pf b/src/pf_tests/test_mo_mcmc.pf index f4df681..ea0aa3a 100644 --- a/src/pf_tests/test_mo_mcmc.pf +++ b/src/pf_tests/test_mo_mcmc.pf @@ -5,7 +5,8 @@ module test_mo_mcmc use mo_likelihood, only: setmeas, loglikelihood_dp, loglikelihood_stddev_dp, model_dp use mo_mcmc, only: mcmc, mcmc_stddev use mo_moment, only: mean, stddev - use mo_optimizee, only: eval_interface, objective_interface, eval_optimizee + use mo_optimizee, only: eval_optimizee + use mo_opt_eval_utils, only: eval_interface, objective_interface use mo_message, only: error_message implicit none -- GitLab