next_combination Function

public function next_combination(combination, k, n) result(has_next)

Generate next combination in lexicographic order Returns .true. if there’s a next combination, .false. if we’ve exhausted all

Arguments

Type IntentOptional Attributes Name
integer, intent(inout) :: combination(:)
integer, intent(in) :: k
integer, intent(in) :: n

Return Value logical


Called by

proc~~next_combination~~CalledByGraph proc~next_combination next_combination proc~generate_k_way_intersections_for_level generate_k_way_intersections_for_level proc~generate_k_way_intersections_for_level->proc~next_combination proc~generate_k_way_intersections_from_lists generate_k_way_intersections_from_lists proc~generate_k_way_intersections_from_lists->proc~next_combination proc~generate_intersections generate_intersections proc~generate_intersections->proc~generate_k_way_intersections_for_level proc~generate_intersections_from_atom_lists generate_intersections_from_atom_lists proc~generate_intersections_from_atom_lists->proc~generate_k_way_intersections_from_lists proc~generate_polymer_intersections generate_polymer_intersections proc~generate_polymer_intersections->proc~generate_intersections_from_atom_lists

Variables

Type Visibility Attributes Name Initial
integer, private :: i

Source Code

   function next_combination(combination, k, n) result(has_next)
      !! Generate next combination in lexicographic order
      !! Returns .true. if there's a next combination, .false. if we've exhausted all
      integer, intent(inout) :: combination(:)
      integer, intent(in) :: k, n
      logical :: has_next
      integer :: i

      has_next = .true.

      ! Find the rightmost element that can be incremented
      i = k
      do while (i >= 1)
         if (combination(i) < n - k + i) then
            combination(i) = combination(i) + 1
            ! Reset all elements to the right
            do while (i < k)
               i = i + 1
               combination(i) = combination(i - 1) + 1
            end do
            return
         end if
         i = i - 1
      end do

      ! No more combinations
      has_next = .false.

   end function next_combination