4 import java.util.ArrayList;
10 * Mapping algorithm based on the Edge-Cut principles
11 * @author Sébastien Miquée
14 public class LSM extends Algo
16 private static final long serialVersionUID = 1L;
19 private ArrayList<GTask> atraiter ;
20 private ArrayList<GTask> encours ;
21 private ArrayList<GTask> fait ;
22 // private Architecture archi ;
23 private ArrayList<Architecture> liste_archi ;
24 private double dep_min ;
25 ArrayList<GTask> mappees ;
29 * Default constructor.
35 atraiter = new ArrayList<GTask>() ;
36 encours = new ArrayList<GTask>() ;
37 fait = new ArrayList<GTask>() ;
38 // archi = new Architecture() ;
39 liste_archi = new ArrayList<Architecture>() ;
47 * @param _gr Application graph to be mapped on
48 * @param _gl Grid graph
50 public LSM( Graph _gr, Grid _gl )
54 atraiter = new ArrayList<GTask>() ;
55 encours = new ArrayList<GTask>() ;
56 fait = new ArrayList<GTask>() ;
57 // archi = new Architecture() ;
58 liste_archi = new ArrayList<Architecture>() ;
66 * @param _gr Application graph to be mapped on
67 * @param _gl Grid graph
68 * @param _dep_min Minimum amount of local dependencies
70 public LSM( Graph _gr, Grid _gl, double _dep_min )
74 atraiter = new ArrayList<GTask>() ;
75 encours = new ArrayList<GTask>() ;
76 fait = new ArrayList<GTask>() ;
77 // archi = new Architecture() ;
78 liste_archi = new ArrayList<Architecture>() ;
84 @SuppressWarnings("unchecked")
88 System.out.println( "***********************************" ) ;
89 System.out.println( "* Launching the Edge-Cuts Mapping *" ) ;
90 System.out.println( "***********************************\n\n" ) ;
92 /* Si le mapping est possible ... */
93 if( gr.getNbGTask() <= gl.getNbGNode() )
95 atraiter = (ArrayList<GTask>) gr.getGraph().clone() ;
97 liste_archi = construireArchi( gl, gr.getNbGTask() ) ;
106 // double moy = gr.getAverageDep() ;
110 boolean change_cluster = false ;
112 // System.out.println("nb cluster : "+liste_archi.get(0).getNbClusters() );
115 while( nb_ok < gr.getNbGTask() )
117 if( places == 0 || change_cluster )
122 mp.addMapping( cl, mappees ) ;
125 if( nb_ok < gr.getNbGTask() )
127 // Changement de cluster
130 if( indice == liste_archi.get(0).getNbClusters() )
132 System.out.println( "No more cluster !! Impossible to respect constrains !! " ) ;
139 cl = liste_archi.get(0).getArchi().get( indice ) ;
140 places = cl.getNbGNode() ;
141 change_cluster = false ;
143 mappees = new ArrayList<GTask>() ;
147 if( ( atraiter.size() + encours.size() ) <= places )
149 for( int i = 0 ; i < atraiter.size() ; i++ )
151 mappees.add( atraiter.get( i ) ) ;
156 for( int i = 0 ; i < encours.size() ; i++ )
158 mappees.add( encours.get( i ) ) ;
166 atraiter = new ArrayList<GTask>() ;
167 encours = new ArrayList<GTask>() ;
169 mp.addMapping( cl, mappees ) ;
172 if( encours.size() == 0 && atraiter.size() > 0 )
174 encours.add( atraiter.get(0) ) ;
177 if( encours.size() > 0 )
179 tmp = encours.get( 0 ) ;
183 // if( ( calc_dep( tmp )* dep_min * moy ) <= places && places > 0 )
184 dep = calc_dep( tmp ) ;
186 if( dep != -1 && 1 + ( dep * dep_min ) <= places && places > 0 )
196 atraiter.remove( tmp ) ;
197 encours.remove( tmp ) ;
199 change_cluster = true ;
204 change_cluster = true ;
210 // Thread.sleep( 1000 ) ;
211 // } catch( InterruptedException e ) {
212 // e.printStackTrace() ;
216 // System.out.println( "reste : " + places + " sur " + cl.getNom() ) ;
217 // System.out.println( "nb_ok = " +nb_ok);
218 // System.out.println("etat : "+encours);
219 // System.out.println("etat2 : "+mappees);
220 // System.out.println( "etat3 : "+atraiter);
225 System.out.println( "\n\n!!! Mapping impossible ! There are more tasks than nodes !!!\n" ) ;
228 /** Update in cluster the status of nodes **/
236 private void ajoutDep( GTask _t )
242 for( int i = 0 ; i < _t.getNbDep() ; i++ )
244 tmp = _t.getDependencies().get( i ) ;
246 if( ! fait.contains( tmp ) && ! encours.contains( tmp )
247 && tmp.getNbDep() < _t.getNbDep() )
249 // System.out.println("haha => "+tmp.getNum() ) ;
251 for( j = 0 ; j < encours.size() ; j++ )
253 if( tmp.getNbDep() < encours.get( j ).getNbDep() )
255 encours.add( j, tmp ) ;
256 j = encours.size() + 10 ;
260 if( j == encours.size() )
265 atraiter.remove( tmp ) ;
279 private double calc_dep( GTask _t )
288 for( int i = 0 ; i < _t.getNbDep() ; i++ )
290 if( ! fait.contains( _t.getDependencies().get( i ) ) )
294 if( ! mappees.contains( _t.getDependencies().get( i ) ) )
302 if( ( dep + ext ) < _t.getNbDep() * dep_min )
306 res = dep + ( ext * 0.5 ) ;
309 // System.out.println("dep de "+t.getNum()+" => " + res);
324 @SuppressWarnings("unchecked")
325 private ArrayList<Architecture> construireArchi( Grid _gl, int _nbGTask )
327 ArrayList<Architecture> ar = new ArrayList<Architecture>() ;
329 ArrayList<Cluster> cl = (ArrayList<Cluster>) gl.getClusters().clone() ;
333 Architecture a = new Architecture() ;
335 for( int i = 0 ; i < cl.size() ; i ++ )
337 a.addCluster( cl.get( i ) ) ;
348 @SuppressWarnings("unchecked")
349 private void tri_dep()
351 int nb_tache = gr.getNbGTask() ;
354 int niveau_fait = -1 ;
357 ArrayList<GTask> tmp = new ArrayList<GTask>() ;
358 ArrayList<Integer> tab = new ArrayList<Integer>() ;
360 while( nb_tri < nb_tache )
362 // Recherche du niveau en décroissant
363 for( int i = 0 ; i < nb_tache ; i++ )
365 temp = atraiter.get(i).getNbDep() ;
369 if( niveau_fait != -1 )
371 if( temp < niveau_fait )
381 // Recherche des taches du niveau courrant
382 for( int i = 0 ; i < nb_tache ; i++ )
384 if( atraiter.get( i ).getNbDep() == niveau )
386 tmp.add( atraiter.get( i ) ) ;
387 tab.add( atraiter.get( i ).getNum() ) ;
393 niveau_fait = niveau ;
398 atraiter = (ArrayList<GTask>) tmp.clone() ;
400 // for( int i = 0 ; i < nb_tache ; i++ )
402 // System.out.print( atraiter.get(i).getNum() +" " ) ;
404 // System.out.println();
409 public GNode replaceNode( GNode _dead, ArrayList<GNode> _ag )
413 /** Updating the grid if there is any modification **/
414 if( _ag != null && _ag.size() != 0 )
416 gl.updateGrid( _ag ) ;
419 /** If something has to be done **/
422 ArrayList<GNode> ac = new ArrayList<GNode>() ;
424 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
426 if( gl.getClusters().get( i ).getNbFreeNodes() > 0 )
428 ac.add( gl.getClusters().get( i ).nextGNode() ) ;
433 /** Update in cluster the status of nodes **/
441 public GNode getOtherGNode( ArrayList<GNode> _ag )
449 /** La programmation est un art, respectons ceux qui la pratiquent !! **/