diff --git a/src/util/graph/ColorGraph.java b/src/util/graph/ColorGraph.java
index 55b867e821c8182073a421475d2ab4cb875c7215..61457fbb3de49feb2268a8f358f5c37724460306 100644
--- a/src/util/graph/ColorGraph.java
+++ b/src/util/graph/ColorGraph.java
@@ -34,5 +34,129 @@ public class ColorGraph {
 	}
     }
 
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /* associe une couleur à tous les sommets se trouvant dans la pile */
+    /*-------------------------------------------------------------------------------------------------------------*/
+    
+    public void select()
+    {
+	int t;
+	while(!stack.empty()){
+	    t = stack.pop();
+	    removed.remove(t);
+	    if(color[t] == NOCOLOR)
+		color[t] = chooseAvailableColor(neighborsColor(t));
+	    if(color[t] == NOCOLOR)
+		System.out.println("cannot find a color for vertex "+ t);
+	}
+    }
+    
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /* récupère les couleurs des voisins de t */
+    /*-------------------------------------------------------------------------------------------------------------*/
+    
+    public IntSet neighborsColor(int t)
+    {
+	IntSet colorSet = new IntSet(colorNb);
+
+	for(NodeList p = int2Node[t].succ(); p!=null; p=p.tail)
+	    if(color[p.head.label()] != NOCOLOR)
+		colorSet.add(color[p.head.label()]);
+	return colorSet;
+    }
+    
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /* recherche une couleur absente de colorSet */
+    /*-------------------------------------------------------------------------------------------------------------*/
+    
+    public int chooseAvailableColor(IntSet colorSet)
+    {
+	for(int c=0; c < colorSet.getSize(); c++)
+	    if(!colorSet.isMember(c))
+		return c;
+	return NOCOLOR;
+    }
+    
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /* calcule le nombre de voisins du sommet t */
+    /*-------------------------------------------------------------------------------------------------------------*/
+    
+    public int neighborsNb(int t)
+    {
+	int nb = 0;
+	for(NodeList p = this.int2Node[t].succ(); p!=null; p=p.tail)
+	    if(!removed.isMember(p.head.label()))
+		nb++;
+	return nb;
+    }
+
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /* simplifie le graphe d'interférence g                                                                        */
+    /* la simplification consiste à enlever du graphe les temporaires qui ont moins de k voisins                   */
+    /* et à les mettre dans une pile                                                                               */
+    /* à la fin du processus, le graphe peut ne pas être vide, il s'agit des temporaires qui ont au moins k voisin */
+    /*-------------------------------------------------------------------------------------------------------------*/
+
+    public int simplify()
+    {
+	boolean removedAtLeastOneTemp = true;
+	while(removedAtLeastOneTemp && stack.size() != vertexNb){
+	    removedAtLeastOneTemp = false;
+	    for(int t = 0; t < vertexNb; t++){
+		if(!removed.isMember(t)){
+		    int n = neighborsNb(t);
+		    //		    System.out.println("node " + t + " has " + n + " neighbours"); 
+		    int precolored = (color[t] == NOCOLOR)? 0 : 1;
+		    if(n < (colorNb - precolored)){
+			stack.push(t);
+			removed.add(t);
+			//			System.out.println("remove vertex " + t);
+			removedAtLeastOneTemp = true;
+		    }
+		}
+	    }
+	}
+	return stack.size();
+    }
+    
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /*-------------------------------------------------------------------------------------------------------------*/
+    
+    public void spill()
+    {
+	int t;
+	while(stack.size() != vertexNb){ /* some nodes have not been pushed */
+	    for(t=0; t < vertexNb; t++){
+		if(!removed.isMember(t)){ /* t i still in the graph */
+		    System.out.println("vertex " + t + " is a potential spill");
+		    spill.add(t);
+		    removed.add(t);
+		    stack.push(t);
+		    simplify();
+		}
+	    }
+	}
+    }
+
+
+    /*-------------------------------------------------------------------------------------------------------------*/
+    /*-------------------------------------------------------------------------------------------------------------*/
+
+    public void color()
+    {
+	this.simplify();
+	this.spill();
+	this.select();
+    }
+
+    public void affiche()
+    {
+	System.out.println("vertex\tcolor");
+	for(int i = 0; i < vertexNb; i++){
+	    System.out.println(i + "\t" + color[i]);
+	}
+    }
+    
+    
 
 }