10
0
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-06-01 19:05:29 +02:00
QuantumPackage/src/utils_trust_region/org/trust_region_rho.org

3.8 KiB

Agreement with the model: Rho

Compute the ratio : rho = (prev_energy - energy) / (prev_energy - e_model)

Rho represents the agreement between the model (the predicted energy by the Taylor expansion truncated at the 2nd order) and the real energy :

\begin{equation} \rho^{k+1} = \frac{E^{k} - E^{k+1}}{E^{k} - m^{k+1}} \end{equation}

With : $E^{k}$ the energy at the previous iteration $E^{k+1}$ the energy at the actual iteration $m^{k+1}$ the predicted energy for the actual iteration (cf. trust_e_model)

If $\rho \approx 1$, the agreement is good, contrary to $\rho \approx 0$. If $\rho \leq 0$ the previous energy is lower than the actual energy. We have to cancel the last step and use a smaller trust region. Here we cancel the last step if $\rho < 0.1$, because even if the energy decreases, the agreement is bad, i.e., the Taylor expansion truncated at the second order doesn't represent correctly the energy landscape. So it's better to cancel the step and restart with a smaller trust region.

Provided in qp_edit:

thresh_rho

Input:

prev_energy double precision previous energy (energy before the rotation)
e_model double precision predicted energy after the rotation

Output:

rho double precision the agreement between the model (predicted) and the real energy
prev_energy double precision if rho >= 0.1 the actual energy becomes the previous energy
else the previous energy doesn't change

Internal:

energy double precision energy (real) after the rotation
i integer index
t* double precision time
subroutine trust_region_rho(prev_energy, energy,e_model,rho)

  include 'pi.h'

  !BEGIN_DOC
  ! Compute rho, the agreement between the predicted criterion/energy and the real one
  !END_DOC

  implicit none
   
  ! Variables

  ! In
  double precision, intent(inout) :: prev_energy
  double precision, intent(in)    :: e_model, energy
  
  ! Out
  double precision, intent(out)   :: rho

  ! Internal
  double precision                :: t1, t2, t3
  integer                         :: i

  print*,''
  print*,'---Rho_model---'
  
  !call wall_time(t1)

Rho

\begin{equation} \rho^{k+1} = \frac{E^{k} - E^{k+1}}{E^{k} - m^{k+1}} \end{equation}

In function of $\rho$ th step can be accepted or cancelled.

If we cancel the last step (k+1), the previous energy (k) doesn't change! If the step (k+1) is accepted, then the "previous energy" becomes E(k+1)

  ! Already done in an other subroutine
  !if (ABS(prev_energy - e_model) < 1d-12) then
  !  print*,'WARNING: prev_energy - e_model < 1d-12'
  !  print*,'=> rho will tend toward infinity'
  !  print*,'Check you convergence criterion !'
  !endif

  rho = (prev_energy - energy) / (prev_energy - e_model)

  !print*, 'previous energy, prev_energy:', prev_energy
  !print*, 'predicted energy, e_model:', e_model
  !print*, 'real energy, energy:', energy
  !print*, 'prev_energy - energy:', prev_energy - energy
  !print*, 'prev_energy - e_model:', prev_energy - e_model
  print*, 'Rho:', rho
  !print*, 'Threshold for rho:', thresh_rho

  ! Modification of prev_energy in function of rho
  if (rho < thresh_rho) then !0.1) then
    ! the step is cancelled  
    print*, 'Rho <', thresh_rho,', the previous energy does not changed'
    !print*, 'prev_energy :', prev_energy  
  else
    ! the step is accepted
    prev_energy = energy
    print*, 'Rho >=', thresh_rho,', energy -> prev_energy:', energy
  endif

  !call wall_time(t2)
  !t3 = t2 - t1
  !print*,'Time in rho model:', t3

  print*,'---End rho_model---'

end subroutine