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" ) ;
233 private void ajoutDep( GTask _t )
239 for( int i = 0 ; i < _t.getNbDep() ; i++ )
241 tmp = _t.getDependencies().get( i ) ;
243 if( ! fait.contains( tmp ) && ! encours.contains( tmp )
244 && tmp.getNbDep() < _t.getNbDep() )
246 // System.out.println("haha => "+tmp.getNum() ) ;
248 for( j = 0 ; j < encours.size() ; j++ )
250 if( tmp.getNbDep() < encours.get( j ).getNbDep() )
252 encours.add( j, tmp ) ;
253 j = encours.size() + 10 ;
257 if( j == encours.size() )
262 atraiter.remove( tmp ) ;
276 private double calc_dep( GTask _t )
285 for( int i = 0 ; i < _t.getNbDep() ; i++ )
287 if( ! fait.contains( _t.getDependencies().get( i ) ) )
291 if( ! mappees.contains( _t.getDependencies().get( i ) ) )
299 if( ( dep + ext ) < _t.getNbDep() * dep_min )
303 res = dep + ( ext * 0.5 ) ;
306 // System.out.println("dep de "+t.getNum()+" => " + res);
321 @SuppressWarnings("unchecked")
322 private ArrayList<Architecture> construireArchi( Grid _gl, int _nbGTask )
324 ArrayList<Architecture> ar = new ArrayList<Architecture>() ;
326 ArrayList<Cluster> cl = (ArrayList<Cluster>) gl.getClusters().clone() ;
330 Architecture a = new Architecture() ;
332 for( int i = 0 ; i < cl.size() ; i ++ )
334 a.addCluster( cl.get( i ) ) ;
345 @SuppressWarnings("unchecked")
346 private void tri_dep()
348 int nb_tache = gr.getNbGTask() ;
351 int niveau_fait = -1 ;
354 ArrayList<GTask> tmp = new ArrayList<GTask>() ;
355 ArrayList<Integer> tab = new ArrayList<Integer>() ;
357 while( nb_tri < nb_tache )
359 // Recherche du niveau en décroissant
360 for( int i = 0 ; i < nb_tache ; i++ )
362 temp = atraiter.get(i).getNbDep() ;
366 if( niveau_fait != -1 )
368 if( temp < niveau_fait )
378 // Recherche des taches du niveau courrant
379 for( int i = 0 ; i < nb_tache ; i++ )
381 if( atraiter.get( i ).getNbDep() == niveau )
383 tmp.add( atraiter.get( i ) ) ;
384 tab.add( atraiter.get( i ).getNum() ) ;
390 niveau_fait = niveau ;
395 atraiter = (ArrayList<GTask>) tmp.clone() ;
397 // for( int i = 0 ; i < nb_tache ; i++ )
399 // System.out.print( atraiter.get(i).getNum() +" " ) ;
401 // System.out.println();
406 public GNode replaceNode( GNode _dead, ArrayList<GNode> _ag )
413 public GNode getOtherGNode( ArrayList<GNode> _ag ) {
414 // TODO Auto-generated method stub
420 /** La programmation est un art, respectons ceux qui la pratiquent !! **/