## ---- include = FALSE---------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = FALSE,
  echo = TRUE)

## -----------------------------------------------------------------------------
#  
#  require(VMDecomp)
#  require(glue)
#  
#  data(arrhythmia)
#  
#  alpha = 2000       # moderate bandwidth constraint
#  tau = 0            # noise-tolerance (no strict fidelity enforcement)
#  K = 9              # 9 modes
#  DC = FALSE         # no DC part imposed
#  init = 1           # initialize omegas uniformly
#  tol = 1e-6
#  
#  vec_arrhythmia = arrhythmia[['MLII']]
#  
#  set.seed(1)
#  arr_vmd = vmd(data = vec_arrhythmia,
#                alpha = alpha,
#                tau = tau,
#                K = K,
#                DC = DC,
#                init = init,
#                tol = tol,
#                verbose = TRUE)
#  
#  # 1-dimensional VMD starts ...
#  # --------------------------------
#  # The 1-dimensional VMD starts ...
#  # --------------------------------
#  # Iteration: 10   uDiff: 2.28024
#  # Iteration: 20   uDiff: 1.05777
#  # Iteration: 30   uDiff: 0.515047
#  # Iteration: 40   uDiff: 0.346114
#  # Iteration: 50   uDiff: 0.277273
#  # Iteration: 60   uDiff: 0.240478
#  # Iteration: 70   uDiff: 0.212126
#  # Iteration: 80   uDiff: 0.20821
#  # Iteration: 90   uDiff: 0.196179
#  # ...............
#  # Iteration: 470   uDiff: 0.00728391
#  # Iteration: 480   uDiff: 0.00698528
#  # Iteration: 490   uDiff: 0.00663912
#  # Iteration: 500   uDiff: 0.00629761
#  # -----------------------------------------
#  # The algorithm converged in iteration: 500
#  # -----------------------------------------
#  # Elapsed time: 0 hours and 0 minutes and 19 seconds.
#  
#  
#  str(arr_vmd)
#  # List of 3
#  #  $ u    : num [1:10000, 1:9] -0.0695 -0.0697 -0.0702 -0.0707 -0.0711 ...
#  #  $ u_hat: cplx [1:10000, 1:9] 6.54e-04+0.0i -3.83e-03+5.1e-04i -1.99e-03+8.5e-04i ...
#  #  $ omega: num [1:500, 1:9] 0 0.00561 0.00595 0.00596 0.00586 ...
#  
#  
#  op <- par(mfrow = c(3, K/3))
#  
#  for (item in K:1) {
#    item_mode = glue::glue("IMF {K-item+1}")
#    plot(x = arr_vmd$u[, item], type = 'l', main = item_mode, xlab = 'Time', ylab = '')
#  }
#  

## -----------------------------------------------------------------------------
#  
#  imfs_noise_free = rowSums(arr_vmd$u[, -c(1,K)])
#  
#  op <- par(mfrow = c(1,1))
#  
#  plot(x = vec_arrhythmia, type = 'l', col = "blue", xlab = 'Time', ylab = 'Signal')
#  lines(x = imfs_noise_free, col = "orange")
#  legend("topright",
#         legend = c("Original ECG", "Clean ECG"),
#         col = c("blue", "orange"),
#         lty = 1:2,
#         cex = 0.8)
#  

## -----------------------------------------------------------------------------
#  
#  require(R.matlab)
#  require(OpenImageR)
#  
#  pth_texture = system.file('Matlab', 'VMD_2D', 'texture.mat', package = 'VMDecomp')
#  data = R.matlab::readMat(pth_texture)
#  data = data$f
#  dim(data)
#  # [1] 256 256
#  
#  alpha = 1000       # bandwidth constraint
#  tau = 0.25         # Lagrangian multipliers dual ascent time step
#  K = 5              # number of modes
#  DC = TRUE          # includes DC part (first mode at DC)
#  init = 1           # initialize omegas randomly, may need multiple runs!
#  tol = 1e-7         # tolerance (for convergence)
#  
#  set.seed(2)
#  res_2d = vmd(data = data,
#               alpha = alpha,
#               tau = tau,
#               K = K,
#               DC = DC,
#               init = init,
#               tol = tol,
#               verbose = TRUE)
#  
#  # --------------------------------
#  # The 2-dimensional VMD starts ...
#  # --------------------------------
#  # Iteration: 10  uDiff: 42.7451  omegaDiff: 0.00012395
#  # Iteration: 20  uDiff: 1.05264  omegaDiff: 1.15039e-09
#  # Iteration: 30  uDiff: 0.31892  omegaDiff: 4.14469e-10
#  # Iteration: 40  uDiff: 0.117648  omegaDiff: 1.45234e-10
#  # Iteration: 50  uDiff: 0.0491776  omegaDiff: 6.399e-11
#  # Iteration: 60  uDiff: 0.0222704  omegaDiff: 3.33701e-11
#  # Iteration: 70  uDiff: 0.0106591  omegaDiff: 1.87647e-11
#  # Iteration: 80  uDiff: 0.0053165  omegaDiff: 1.08343e-11
#  # Iteration: 90  uDiff: 0.00273909  omegaDiff: 6.30121e-12
#  # ............
#  # Iteration: 250  uDiff: 6.31694e-07  omegaDiff: 1.22605e-15
#  # Iteration: 260  uDiff: 4.33964e-07  omegaDiff: 8.05652e-16
#  # Iteration: 270  uDiff: 3.08055e-07  omegaDiff: 5.66624e-16
#  # Iteration: 280  uDiff: 2.26559e-07  omegaDiff: 4.31241e-16
#  # Iteration: 290  uDiff: 1.728e-07  omegaDiff: 3.54727e-16
#  # Iteration: 300  uDiff: 1.36554e-07  omegaDiff: 3.11406e-16
#  # Iteration: 310  uDiff: 1.11508e-07  omegaDiff: 2.86634e-16
#  # -----------------------------------------
#  # The algorithm converged in iteration: 317
#  # -----------------------------------------
#  # Elapsed time: 0 hours and 0 minutes and 41 seconds.
#  
#  end_dims = dim(res_2d$u)[3]
#  str(res_2d)
#  # List of 3
#  #  $ u    : num [1:256, 1:256, 1:5] 3.16e-05 1.80e-05 -3.32e-06 -3.17e-05 -6.32e-05 ...
#  #  $ u_hat: cplx [1:256, 1:256, 1:5] 7.65e-04+0.00i -6.63e-04-3.28e-04i 7.74e-04-3.15e-04i ...
#  #  $ omega: num [1:317, 1:2, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
#  

## -----------------------------------------------------------------------------
#  
#  res_2d_lst = lapply(1:end_dims, function(x) res_2d$u[,, x])
#  res_2d_lst = append(res_2d_lst, list(data), after = 0)
#  str(res_2d_lst)
#  # List of 6
#  #  $ : num [1:256, 1:256] 0 0 0 0 0 0 0 0 0 0 ...
#  #  $ : num [1:256, 1:256] 3.16e-05 1.80e-05 -3.32e-06 -3.17e-05 -6.32e-05 ...
#  #  $ : num [1:256, 1:256] -4.36e-05 -3.08e-05 -1.19e-05 2.28e-05 6.01e-05 ...
#  #  $ : num [1:256, 1:256] -2.67e-07 2.53e-06 1.03e-06 1.94e-06 2.44e-07 ...
#  #  $ : num [1:256, 1:256] 3.31e-06 1.21e-06 2.15e-06 1.66e-07 4.97e-07 ...
#  #  $ : num [1:256, 1:256] 6.72e-06 9.27e-06 1.14e-05 8.79e-06 1.45e-06 ...
#  
#  
#  init_plt = OpenImageR::GaborFeatureExtract$new()
#  mlt_plt = init_plt$plot_multi_images(list_images = res_2d_lst,
#                                       par_ROWS = 3,
#                                       par_COLS = 2,
#                                       axes = TRUE,
#                                       titles = c("Input Image", glue::glue("Imf_{1:end_dims}")))
#