4 import java.util.ArrayList;
10 * Mapping algorithm based on the Edge-Cut principles
11 * @author Sébastien Miquée
14 public class FT_FEC 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 ArrayList<Cluster> clList ;
23 private double dep_min ;
24 ArrayList<GTask> mappees ;
28 * Default constructor.
34 atraiter = new ArrayList<GTask>() ;
35 encours = new ArrayList<GTask>() ;
36 fait = new ArrayList<GTask>() ;
37 clList = new ArrayList<Cluster>() ;
45 * @param _gr Application graph to be mapped on
46 * @param _gl Grid graph
48 public FT_FEC( Graph _gr, Grid _gl )
52 atraiter = new ArrayList<GTask>() ;
53 encours = new ArrayList<GTask>() ;
54 fait = new ArrayList<GTask>() ;
55 clList = new ArrayList<Cluster>() ;
63 * @param _gr Application graph to be mapped on
64 * @param _gl Grid graph
65 * @param _dep_min Minimum amount of local dependencies
67 public FT_FEC( Graph _gr, Grid _gl, double _dep_min )
71 atraiter = new ArrayList<GTask>() ;
72 encours = new ArrayList<GTask>() ;
73 fait = new ArrayList<GTask>() ;
74 clList = new ArrayList<Cluster>() ;
80 @SuppressWarnings("unchecked")
84 System.out.println( "*********************************" ) ;
85 System.out.println( "* Launching the FT-F-EC Mapping *" ) ;
86 System.out.println( "*********************************\n\n" ) ;
88 /* If the mapping is possible ... */
89 if( gr.getNbGTask() <= gl.getNbGNode() )
91 boolean mapping_done =false ;
92 boolean reduce = false ;
104 while( ! mapping_done )
107 atraiter = (ArrayList<GTask>) gr.getGraph().clone() ;
109 clList = sortClusters() ;
121 boolean change_cluster = false ;
124 while( nb_ok < gr.getNbGTask() )
126 if( places == 0 || change_cluster )
131 mp.addMapping( cl, mappees ) ;
134 if( nb_ok < gr.getNbGTask() )
139 if( indice == clList.size() )
141 System.out.println( "No more cluster !! Impossible to respect constrains !! " ) ;
147 cl = clList.get( indice ) ;
148 places = cl.getNbGNode() ;
149 change_cluster = false ;
151 mappees = new ArrayList<GTask>() ;
155 if( ( atraiter.size() + encours.size() ) <= places )
158 for( int i = 0 ; i < atraiter.size() ; i++ )
160 mappees.add( atraiter.get( i ) ) ;
165 for( int i = 0 ; i < encours.size() ; i++ )
167 mappees.add( encours.get( i ) ) ;
175 atraiter = new ArrayList<GTask>() ;
176 encours = new ArrayList<GTask>() ;
178 mp.addMapping( cl, mappees ) ;
180 mapping_done = true ;
185 if( encours.size() == 0 && atraiter.size() > 0 )
187 encours.add( atraiter.remove(0) ) ;
192 if( encours.size() > 0 )
194 tmp = encours.get( 0 ) ;
199 dep = calc_dep( tmp ) ;
201 if( dep != -1 && 1 + ( dep * dep_min ) <= places && places > 0 )
211 atraiter.remove( tmp ) ;
212 encours.remove( tmp ) ;
214 change_cluster = true ;
219 change_cluster = true ;
228 mapping_done = false ;
230 System.out.println( "Reducing the minimum dependancies parameter..." ) ;
231 dep_min = dep_min - 0.1 ;
239 System.err.println( "\n\n!!! Mapping impossible ! There are more tasks than nodes !!!\n" ) ;
243 private ArrayList<Cluster> sortClusters()
245 ArrayList<Cluster> ret = new ArrayList<Cluster>() ;
249 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
253 if( ret.size() == 0 )
255 ret.add( gl.getClusters().get( i ) ) ;
257 for( int j = 0 ; j < ret.size() ; j++ )
259 if( gl.getClusters().get( i ).getNbFreeNodes() > ret.get( j ).getNbFreeNodes() )
261 ret.add( j, gl.getClusters().get( i ) ) ;
269 ret.add( gl.getClusters().get( i ) ) ;
282 private void ajoutDep( GTask _t )
288 for( int i = 0 ; i < _t.getNbDep() ; i++ )
290 tmp = _t.getDependencies().get( i ) ;
292 if( ! fait.contains( tmp ) && ! encours.contains( tmp )
293 && tmp.getNbDep() < _t.getNbDep() )
296 for( j = 0 ; j < encours.size() ; j++ )
298 if( tmp.getNbDep() < encours.get( j ).getNbDep() )
300 encours.add( j, tmp ) ;
301 j = encours.size() + 10 ;
305 if( j == encours.size() )
310 atraiter.remove( tmp ) ;
324 private double calc_dep( GTask _t )
333 for( int i = 0 ; i < _t.getNbDep() ; i++ )
335 if( ! fait.contains( _t.getDependencies().get( i ) ) )
339 if( ! mappees.contains( _t.getDependencies().get( i ) ) )
347 if( ( dep + ext ) < _t.getNbDep() * dep_min )
351 res = dep + ( ext * 0.5 ) ;
363 @SuppressWarnings("unchecked")
364 private void tri_dep()
366 int nb_tache = gr.getNbGTask() ;
369 int niveau_fait = -1 ;
372 ArrayList<GTask> tmp = new ArrayList<GTask>() ;
373 ArrayList<Integer> tab = new ArrayList<Integer>() ;
375 while( nb_tri < nb_tache )
377 // Recherche du niveau en décroissant
378 for( int i = 0 ; i < nb_tache ; i++ )
380 temp = atraiter.get(i).getNbDep() ;
384 if( niveau_fait != -1 )
386 if( temp < niveau_fait )
396 // Searching task of the current level
397 for( int i = 0 ; i < nb_tache ; i++ )
399 if( atraiter.get( i ).getNbDep() == niveau )
401 tmp.add( atraiter.get( i ) ) ;
402 tab.add( atraiter.get( i ).getNum() ) ;
408 niveau_fait = niveau ;
413 atraiter = (ArrayList<GTask>) tmp.clone() ;
418 public GNode replaceNode( GNode _dead, ArrayList<GNode> _ag )
422 /** If something has to be done **/
425 ArrayList<GNode> ac = new ArrayList<GNode>() ;
428 /** Searching if clusters have some free nodes **/
429 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
431 if( gl.getClusters().get( i ).getNbFreeNodes() > 0 )
434 tmp = gl.getClusters().get( i ).nextGNode() ;
443 /** If there some nodes in clusters **/
446 double dist = -1, best = -1 ;
449 /** Searching the replacing node with the lower distance
450 * between it and the failed node
452 for( int i = 0 ; i < ac.size() ; i++ )
454 dist = gl.getDistance( _dead, ac.get( i ) ) ;
469 /** Is there any node candidate ? **/
472 ret = ac.get( bestNode ) ;
474 ret.setMapped( true ) ;
484 public GNode getOtherGNode( ArrayList<GNode> _ag )
488 int free[] = new int[ gl.getNbCluster() ] ;
490 /** Searching if clusters have some free nodes **/
491 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
493 free[ i ] = gl.getClusters().get( i ).getNbFreeNodes() ;
496 /** Returning a node from the cluster which has the most
499 int most = -1, max = 0 ;
501 for( int i = 0 ; i < free.length ; i++ )
503 if( free[ i ] > max )
510 /** Is there any cluster candidate ? **/
513 ret = gl.getClusters().get( most ).nextGNode() ;
521 public boolean setParams(Object[] _params) {
527 /** La programmation est un art, respectons ceux qui la pratiquent !! **/