User:Überfuzz/sandbox

The Normann algorithm is a parallel algorithm developed to perform graph coloring on sparse matrices. The Normann algorithm is presently the fastest graph coloring algorithm. A brute force method, where each vertex of a graph is checked multiple times, is utilized to achieve parallelism.

Normann
The basic idea is to minimize the number of conflicting colors by checking adjacent vertices multiple times. A matrix is first divided into sub-sets which are distributed among threads. When a thread is coloring interface vertices in the owned set of vertices the risk of conflicting coloring is present. The Normann algorithm minimizes the risk of conflicting colorings by checking all adjacent vertices multiple times. If a pair of vertices have conflicting colors the conflict only has to be resolved once to never appear again. In implementations of the Normann algorithm a color control has to be done. This is due to the fact that Normann algorithm only minimizes the risk.

Parallel graph coloring
The Normann algorithm can be used in the graph analysis step in solvers of linear systems such as Krylov subspace and Multigrid method. The graph analysis step is used as decomposition tool in order to accelerate the Incomplete LU factorization. Generally the graph analysis step is sequential in contemporary solvers of linear systems. The color quality of the Normann-Lukarski algorithm when implemented as a graph coloring tool is dependent on the sequential graph coloring algorithm that is implemented on each sub-set. If Greedy coloring is parallelized by implementation of the Normann-lukarski algorithm the color quality is generally high, the worst case is known to be Δ+1 where Δ is the degree of a graph. Note, the color quality of the Greedy coloring algorithm is dependent on how a graph is traversed. This feature transpires into parallel graph coloring.

Pseudo-code description
Given a sparse matrix M with non zero elements V.

divide M into intervals I=(start,end) and distribute intervals among threads for Vi do in parallel for Vj adjacent to Vi do for Vj adjacent to Vi do color(Vi)=min{m>0 | m≠color(Vj), ∀Vj adjacent to Vi} end for end for end for for Vi do in parallel 'if(conflict(Vi'')) set color(Vi) ≠ color(Vj adjacent to Vi) end for