update Subroutine

public subroutine update(cube, params, n_gauss, dim_v, dim_y, dim_x, lambda_amp, lambda_mu, lambda_sig, lambda_var_amp, lambda_var_mu, lambda_var_sig, maxiter, m, kernel, iprint, std_map)

Update parameters (entire cube) using minimize function (here based on L-BFGS-B optimization module)

Arguments

Type IntentOptional AttributesName
real(kind=xp), intent(in), dimension(:,:,:), allocatable:: cube

cube

real(kind=xp), intent(inout), dimension(:,:,:), allocatable:: params

parameters cube to update

integer, intent(in) :: n_gauss

Number of Gaussian

integer, intent(in) :: dim_v

dimension along v axis

integer, intent(in) :: dim_y

dimension along spatial axis y

integer, intent(in) :: dim_x

dimension along spatial axis x

real(kind=xp), intent(in) :: lambda_amp

lambda for amplitude parameter

real(kind=xp), intent(in) :: lambda_mu

lambda for mean position parameter

real(kind=xp), intent(in) :: lambda_sig

lambda for dispersion parameter

real(kind=xp), intent(in) :: lambda_var_amp

lambda for amp dispersion parameter

real(kind=xp), intent(in) :: lambda_var_mu

lambda for mean position dispersion parameter

real(kind=xp), intent(in) :: lambda_var_sig

lambda for variance dispersion parameter

integer, intent(in) :: maxiter

max number of iteration

integer, intent(in) :: m

number of corrections used in the limited memory matrix by LBFGS-B

real(kind=xp), intent(in), dimension(:,:), allocatable:: kernel

convolution kernel

integer, intent(in) :: iprint

print option

real(kind=xp), intent(in), dimension(:,:), allocatable:: std_map

Standard deviation map


Calls

proc~~update~~CallsGraph proc~update update proc~ravel_3d ravel_3D proc~update->proc~ravel_3d proc~ravel_2d ravel_2D proc~update->proc~ravel_2d proc~minimize minimize proc~update->proc~minimize proc~mean mean proc~update->proc~mean proc~unravel_3d unravel_3D proc~update->proc~unravel_3d proc~setulb setulb proc~minimize->proc~setulb proc~f_g_cube f_g_cube proc~minimize->proc~f_g_cube proc~f_g_cube->proc~ravel_3d proc~f_g_cube->proc~unravel_3d proc~myfunc_spec myfunc_spec proc~f_g_cube->proc~myfunc_spec proc~convolution_2d_mirror convolution_2D_mirror proc~f_g_cube->proc~convolution_2d_mirror

Contents

Source Code


Source Code

  subroutine update(cube, params, n_gauss, dim_v, dim_y, dim_x, lambda_amp, lambda_mu, lambda_sig, lambda_var_amp, &
       lambda_var_mu, lambda_var_sig, maxiter, m, kernel, iprint, std_map)
    !! Update parameters (entire cube) using minimize function (here based on L-BFGS-B optimization module)
    implicit none
    
    real(xp), intent(in), dimension(:,:,:), allocatable :: cube !! cube 
    real(xp), intent(in), dimension(:,:), allocatable :: std_map !! Standard deviation map 
    real(xp), intent(in), dimension(:,:), allocatable :: kernel !! convolution kernel
    integer, intent(in) :: dim_v !! dimension along v axis
    integer, intent(in) :: dim_y !! dimension along spatial axis y 
    integer, intent(in) :: dim_x !! dimension along spatial axis x
    integer, intent(in) :: n_gauss !! Number of Gaussian
    integer, intent(in) :: maxiter !! max number of iteration
    integer, intent(in) :: m !! number of corrections used in the limited memory matrix by LBFGS-B
    integer, intent(in) :: iprint !! print option
    real(xp), intent(in) :: lambda_amp !! lambda for amplitude parameter
    real(xp), intent(in) :: lambda_mu !! lambda for mean position parameter
    real(xp), intent(in) :: lambda_sig !! lambda for dispersion parameter
    real(xp), intent(in) :: lambda_var_amp !! lambda for amp dispersion parameter
    real(xp), intent(in) :: lambda_var_mu  !! lambda for mean position dispersion parameter
    real(xp), intent(in) :: lambda_var_sig !! lambda for variance dispersion parameter

    real(xp), intent(inout), dimension(:,:,:), allocatable :: params !! parameters cube to update
    
    integer :: i,j
    integer :: n_beta
    real(xp), dimension(:,:,:), allocatable :: lb_3D, ub_3D
    real(xp), dimension(:), allocatable :: lb, ub
    real(xp), dimension(:), allocatable :: beta
    real(xp), dimension(:), allocatable :: ravel_amp, ravel_mu, ravel_sig
    real(xp), dimension(:), allocatable :: mean_amp, mean_mu, mean_sig    
    real(xp), dimension(:,:), allocatable :: image_amp, image_mu, image_sig


    n_beta = 3*n_gauss * dim_y * dim_x

    allocate(lb(n_beta), ub(n_beta), beta(n_beta))
    allocate(lb_3D(3*n_gauss,dim_y,dim_x), ub_3D(3*n_gauss,dim_y,dim_x))
    allocate(mean_amp(n_gauss), mean_mu(n_gauss), mean_sig(n_gauss))
    allocate(image_amp(dim_y, dim_x), image_mu(dim_y, dim_x), image_sig(dim_y, dim_x))
    allocate(ravel_amp(dim_y*dim_x), ravel_mu(dim_y*dim_x), ravel_sig(dim_y*dim_x))

    do j=1, dim_x
       do i=1, dim_y
          call init_bounds(cube(:,i,j), n_gauss, dim_v, lb_3D(:,i,j), ub_3D(:,i,j))
       end do
    end do

    call ravel_3D(lb_3D, lb, 3*n_gauss, dim_y, dim_x)
    call ravel_3D(ub_3D, ub, 3*n_gauss, dim_y, dim_x)
    call ravel_3D(params, beta, 3*n_gauss, dim_y, dim_x)

    !Compute mean sig vector    
    do i=1,n_gauss
       image_amp = params(1+(3*(i-1)),:,:)
       image_mu = params(2+(3*(i-1)),:,:)
       image_sig = params(3+(3*(i-1)),:,:)

       call ravel_2D(image_amp, ravel_amp, dim_y, dim_x)
       call ravel_2D(image_mu, ravel_mu, dim_y, dim_x)
       call ravel_2D(image_sig, ravel_sig, dim_y, dim_x)

       mean_amp(i) = mean(ravel_amp)
       mean_mu(i) = mean(ravel_mu)
       mean_sig(i) = mean(ravel_sig)
    end do

    call minimize(n_beta, m, beta, lb, ub, cube, n_gauss, dim_v, dim_y, dim_x, lambda_amp, lambda_mu, lambda_sig, &
         lambda_var_amp, lambda_var_mu, lambda_var_sig, maxiter, kernel, iprint, std_map, mean_amp, mean_mu, mean_sig)

    call unravel_3D(beta, params, 3*n_gauss, dim_y, dim_x)
        
  end subroutine update