triangular_dist Function

private function triangular_dist(mode)

Triangular distribution on [0,1] with specified mode. Uses inverse transform sampling - very efficient, no rejection needed.

Note

The mode parameter should be in [0,1]. Common choices:

  • mode = 0.5: symmetric triangular
  • mode < 0.5: left-skewed
  • mode > 0.5: right-skewed

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: mode

mode of the distribution (should be in [0,1])

Return Value real(kind=wp)


Calls

proc~~triangular_dist~~CallsGraph proc~triangular_dist triangular_dist proc~uniform_random_number uniform_random_number proc~triangular_dist->proc~uniform_random_number

Called by

proc~~triangular_dist~~CalledByGraph proc~triangular_dist triangular_dist proc~perturb_variable simulated_annealing_type%perturb_variable proc~perturb_variable->proc~triangular_dist proc~perturb_and_evaluate simulated_annealing_type%perturb_and_evaluate proc~perturb_and_evaluate->proc~perturb_variable proc~sa simulated_annealing_type%sa proc~sa->proc~perturb_and_evaluate proc~solve_simulated_annealing solve_simulated_annealing proc~solve_simulated_annealing->proc~sa

Source Code

   function triangular_dist(mode)

      real(wp),intent(in) :: mode !! mode of the distribution (should be in [0,1])
      real(wp) :: triangular_dist

      real(wp) :: u, mode_clipped

      ! ensure mode is in [0,1]
      mode_clipped = max(0.0_wp, min(1.0_wp, mode))

      u = uniform_random_number()

      if (u < mode_clipped) then
         ! left side of triangle
         triangular_dist = sqrt(u * mode_clipped)
      else
         ! right side of triangle
         triangular_dist = 1.0_wp - sqrt((1.0_wp - u) * (1.0_wp - mode_clipped))
      end if

   end function triangular_dist