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