coloring_dsatur Module Subroutine

module subroutine coloring_dsatur(self, graph)

Arguments

Type IntentOptional Attributes Name
class(type_coloring), intent(inout) :: self
type(type_crs_adjacency_element), intent(in) :: graph

Calls

proc~~coloring_dsatur~~CallsGraph proc~coloring_dsatur coloring_dsatur interface~allocate_array allocate_array proc~coloring_dsatur->interface~allocate_array interface~deallocate_array deallocate_array proc~coloring_dsatur->interface~deallocate_array proc~get_degree_impl type_crs_adjacency_element%get_degree_impl proc~coloring_dsatur->proc~get_degree_impl proc~get_neighbors_impl type_crs_adjacency_element%get_neighbors_impl proc~coloring_dsatur->proc~get_neighbors_impl proc~get_num_elements_impl type_crs_adjacency_element%get_num_elements_impl proc~coloring_dsatur->proc~get_num_elements_impl proc~populate_coloring_result type_coloring%populate_coloring_result proc~coloring_dsatur->proc~populate_coloring_result proc~update_saturation update_saturation proc~coloring_dsatur->proc~update_saturation proc~allocate_rank1_int16 allocate_rank1_int16 interface~allocate_array->proc~allocate_rank1_int16 proc~allocate_rank1_int32 allocate_rank1_int32 interface~allocate_array->proc~allocate_rank1_int32 proc~allocate_rank1_int64 allocate_rank1_int64 interface~allocate_array->proc~allocate_rank1_int64 proc~allocate_rank1_int8 allocate_rank1_int8 interface~allocate_array->proc~allocate_rank1_int8 proc~allocate_rank1_logical1 allocate_rank1_logical1 interface~allocate_array->proc~allocate_rank1_logical1 proc~allocate_rank1_logical4 allocate_rank1_logical4 interface~allocate_array->proc~allocate_rank1_logical4 proc~allocate_rank1_logical8 allocate_rank1_logical8 interface~allocate_array->proc~allocate_rank1_logical8 proc~allocate_rank1_real128 allocate_rank1_real128 interface~allocate_array->proc~allocate_rank1_real128 proc~allocate_rank1_real32 allocate_rank1_real32 interface~allocate_array->proc~allocate_rank1_real32 proc~allocate_rank1_real64 allocate_rank1_real64 interface~allocate_array->proc~allocate_rank1_real64 proc~allocate_rank2_int16 allocate_rank2_int16 interface~allocate_array->proc~allocate_rank2_int16 proc~allocate_rank2_int32 allocate_rank2_int32 interface~allocate_array->proc~allocate_rank2_int32 proc~allocate_rank2_int64 allocate_rank2_int64 interface~allocate_array->proc~allocate_rank2_int64 proc~allocate_rank2_int8 allocate_rank2_int8 interface~allocate_array->proc~allocate_rank2_int8 proc~allocate_rank2_logical1 allocate_rank2_logical1 interface~allocate_array->proc~allocate_rank2_logical1 proc~allocate_rank2_logical4 allocate_rank2_logical4 interface~allocate_array->proc~allocate_rank2_logical4 proc~allocate_rank2_logical8 allocate_rank2_logical8 interface~allocate_array->proc~allocate_rank2_logical8 proc~allocate_rank2_real128 allocate_rank2_real128 interface~allocate_array->proc~allocate_rank2_real128 proc~allocate_rank2_real32 allocate_rank2_real32 interface~allocate_array->proc~allocate_rank2_real32 proc~allocate_rank2_real64 allocate_rank2_real64 interface~allocate_array->proc~allocate_rank2_real64 proc~deallocate_rank1_int32 deallocate_rank1_int32 interface~deallocate_array->proc~deallocate_rank1_int32 proc~deallocate_rank1_int64 deallocate_rank1_int64 interface~deallocate_array->proc~deallocate_rank1_int64 proc~deallocate_rank1_int8 deallocate_rank1_int8 interface~deallocate_array->proc~deallocate_rank1_int8 proc~deallocate_rank1_logical1 deallocate_rank1_logical1 interface~deallocate_array->proc~deallocate_rank1_logical1 proc~deallocate_rank1_logical4 deallocate_rank1_logical4 interface~deallocate_array->proc~deallocate_rank1_logical4 proc~deallocate_rank1_logical8 deallocate_rank1_logical8 interface~deallocate_array->proc~deallocate_rank1_logical8 proc~deallocate_rank1_real128 deallocate_rank1_real128 interface~deallocate_array->proc~deallocate_rank1_real128 proc~deallocate_rank1_real32 deallocate_rank1_real32 interface~deallocate_array->proc~deallocate_rank1_real32 proc~deallocate_rank1_real64 deallocate_rank1_real64 interface~deallocate_array->proc~deallocate_rank1_real64 proc~deallocate_rank2_int32 deallocate_rank2_int32 interface~deallocate_array->proc~deallocate_rank2_int32 proc~deallocate_rank2_int64 deallocate_rank2_int64 interface~deallocate_array->proc~deallocate_rank2_int64 proc~deallocate_rank2_int8 deallocate_rank2_int8 interface~deallocate_array->proc~deallocate_rank2_int8 proc~deallocate_rank2_logical1 deallocate_rank2_logical1 interface~deallocate_array->proc~deallocate_rank2_logical1 proc~deallocate_rank2_logical4 deallocate_rank2_logical4 interface~deallocate_array->proc~deallocate_rank2_logical4 proc~deallocate_rank2_logical8 deallocate_rank2_logical8 interface~deallocate_array->proc~deallocate_rank2_logical8 proc~deallocate_rank2_real128 deallocate_rank2_real128 interface~deallocate_array->proc~deallocate_rank2_real128 proc~deallocate_rank2_real32 deallocate_rank2_real32 interface~deallocate_array->proc~deallocate_rank2_real32 proc~deallocate_rank2_real64 deallocate_rank2_real64 interface~deallocate_array->proc~deallocate_rank2_real64 proc~get_neighbors_impl->interface~allocate_array proc~update_saturation->interface~deallocate_array proc~update_saturation->proc~get_neighbors_impl proc~error_message error_message proc~allocate_rank1_int16->proc~error_message proc~allocate_rank1_int32->proc~error_message proc~allocate_rank1_int64->proc~error_message proc~allocate_rank1_int8->proc~error_message proc~allocate_rank1_logical1->proc~error_message proc~allocate_rank1_logical4->proc~error_message proc~allocate_rank1_logical8->proc~error_message proc~allocate_rank1_real128->proc~error_message proc~allocate_rank1_real32->proc~error_message proc~allocate_rank1_real64->proc~error_message proc~allocate_rank2_int16->proc~error_message proc~allocate_rank2_int32->proc~error_message proc~allocate_rank2_int64->proc~error_message proc~allocate_rank2_int8->proc~error_message proc~allocate_rank2_logical1->proc~error_message proc~allocate_rank2_logical4->proc~error_message proc~allocate_rank2_logical8->proc~error_message proc~allocate_rank2_real128->proc~error_message proc~allocate_rank2_real32->proc~error_message proc~allocate_rank2_real64->proc~error_message proc~deallocate_rank1_int32->proc~error_message proc~deallocate_rank1_int64->proc~error_message proc~deallocate_rank1_int8->proc~error_message proc~deallocate_rank1_logical1->proc~error_message proc~deallocate_rank1_logical4->proc~error_message proc~deallocate_rank1_logical8->proc~error_message proc~deallocate_rank1_real128->proc~error_message proc~deallocate_rank1_real32->proc~error_message proc~deallocate_rank1_real64->proc~error_message proc~deallocate_rank2_int32->proc~error_message proc~deallocate_rank2_int64->proc~error_message proc~deallocate_rank2_int8->proc~error_message proc~deallocate_rank2_logical1->proc~error_message proc~deallocate_rank2_logical4->proc~error_message proc~deallocate_rank2_logical8->proc~error_message proc~deallocate_rank2_real128->proc~error_message proc~deallocate_rank2_real32->proc~error_message proc~deallocate_rank2_real64->proc~error_message log_error log_error proc~error_message->log_error

Called by

proc~~coloring_dsatur~~CalledByGraph proc~coloring_dsatur coloring_dsatur interface~coloring_dsatur type_coloring%coloring_dsatur interface~coloring_dsatur->proc~coloring_dsatur proc~initialize_type_coloring type_coloring%initialize_type_coloring proc~initialize_type_coloring->interface~coloring_dsatur

Source Code

    module subroutine coloring_dsatur(self, graph)
        implicit none
        class(type_coloring), intent(inout) :: self
        type(type_crs_adjacency_element), intent(in) :: graph

        integer(int32) :: num_elements
        integer(int32) :: i, j, k, next_node, current_color, max_saturation, max_degree
        integer(int32), allocatable :: degrees(:), saturation(:), neighbor_colors(:), neighbors(:)
        logical, allocatable :: is_colored(:)

        num_elements = graph%get_num_elements()

        if (allocated(self%color)) call deallocate_array(self%color)
        call allocate_array(self%color, length=num_elements)
        self%color = 0
        call allocate_array(degrees, length=num_elements)
        call allocate_array(saturation, length=num_elements)
        call allocate_array(is_colored, length=num_elements)
        is_colored(:) = .false.
        saturation(:) = 0

        do i = 1, num_elements
            degrees(i) = graph%get_degree(i)
        end do

        ! --- 彩色ループ (全頂点を彩色するまで) ---
        do i = 1, num_elements
            ! --- 次に彩色する頂点を選択 ---
            max_saturation = -1
            max_degree = -1
            next_node = -1
            do j = 1, num_elements
                if (.not. is_colored(j)) then
                    ! 修正点2:条件判定をより効率的に
                    if (saturation(j) > max_saturation) then
                        max_saturation = saturation(j)
                        max_degree = degrees(j)
                        next_node = j
                    else if (saturation(j) == max_saturation .and. degrees(j) > max_degree) then
                        max_degree = degrees(j)
                        next_node = j
                    end if
                end if
            end do

            ! --- 選択した頂点に割り当てる色を決定 ---
            neighbors = graph%get_neighbors(next_node)
            if (size(neighbors) > 0) then
                allocate (neighbor_colors(size(neighbors)))
                k = 0
                do j = 1, size(neighbors)
                    if (self%color(neighbors(j)) /= 0) then
                        k = k + 1
                        neighbor_colors(k) = self%color(neighbors(j))
                    end if
                end do
            else
                k = 0 ! 隣接なしの場合
            end if

            current_color = 1
            if (k > 0) then
                do
                    if (count(neighbor_colors(1:k) == current_color) == 0) then
                        exit ! この色に決定
                    end if
                    current_color = current_color + 1
                end do
            end if
            if (allocated(neighbor_colors)) call deallocate_array(neighbor_colors)

            ! --- 彩色と状態の更新 ---
            self%color(next_node) = current_color
            is_colored(next_node) = .true.

            do j = 1, size(neighbors)
                call update_saturation(saturation(neighbors(j)), neighbors(j), graph, self)
            end do

            call deallocate_array(neighbors)
        end do

        call self%populate()

        call deallocate_array(is_colored)
        call deallocate_array(saturation)
        call deallocate_array(is_colored)

    end subroutine coloring_dsatur