4 import java.io.Serializable;
5 import java.util.ArrayList;
6 import java.util.Random;
10 * Implementation of the Fault Tolerant AIAC Quick Quality Map (FT-AIAC-QM) algorithm
11 * @author Sébastien Miquée
14 public class FT_AIAC_QM extends Algo
16 private static final long serialVersionUID = 1L;
19 private ArrayList<GTask2> atraiter ;
20 private ArrayList<GNode> archi ;
21 private double f ; // search factor
25 * Default constructor.
36 * @param _gr Application graph to be mapped on
37 * @param _gd Grid graph
38 * @param _f Search factor
40 public FT_AIAC_QM( Graph _gr, Grid _gd, double _f )
52 private ArrayList<GNode> sortInitGNode()
54 ArrayList<GNode> grn = null ;
58 grn = new ArrayList<GNode>() ;
60 ArrayList<GNode> tmp = gl.getGNodes() ;
62 grn.add( tmp.get( 0 ) ) ;
66 for( int i = 1 ; i < tmp.size() ; i++ )
70 for( int j = 0 ; j < grn.size() ; j++ )
72 if( tmp.get( i ).getPower() > grn.get( j ).getPower() )
74 grn.add( j, tmp.get( i ) ) ;
82 grn.add( tmp.get( i ) ) ;
91 private ArrayList<GTask2> listToGTask2( Graph _gr )
93 ArrayList<GTask2> gr2 = null ;
97 gr2 = new ArrayList<GTask2>() ;
99 for( int i = 0 ; i < _gr.getNbGTask() ; i++ )
101 gr2.add( new GTask2( _gr.getGraph().get( i ) ) ) ;
112 /* If the mapping is possible ... */
113 if( gr.getNbGTask() <= gl.getNbGNode() )
115 atraiter = listToGTask2( gr ) ;
116 archi = sortInitGNode() ;
118 /** Local Variables **/
128 System.out.println( "**********************************************" ) ;
129 System.out.println( "* Launching the FT-AIAC-QM Mapping algorithm *" ) ;
130 System.out.println( "**********************************************\n\n" ) ;
132 /** Initial values **/
133 int r = 1 ; // Number of rounds
134 int n = gr.getNbGTask() ; // Number of tasks
136 /** Initial mapping **/
141 while( isOneMoveable() )
143 for( int ti = 0 ; ti < atraiter.size() ; ti++ )
145 if( atraiter.get( ti ).isMoveable() )
147 nc = atraiter.get( ti ).getMapedOn() ;
148 yc = atraiter.get( ti ).getExecTime() ;
152 /** Search a node to map on **/
153 for( int k = 0 ; k < ( f * n / r ) ; k++ )
155 nr = selectRandomGNode( n, r ) ;
156 yr = execTimeOn( atraiter.get( ti ).clone(), nr ) ;
165 /** Research of the neighbours' nodes **/
166 ArrayList<GNode> neighbours = researchNeighbours( atraiter.get( ti ), 1 ) ;
168 for( int ni = 0 ; ni < neighbours.size() ; ni++ )
170 ynb = execTimeOn( atraiter.get( ti ).clone(), neighbours.get( ni ) ) ;
174 nb = neighbours.get( ni ) ;
180 /** Mapping of the task **/
181 if( ! nb.equals( nc ) )
183 GTask2 t_ = taskOn( nb ) ;
184 if( t_ != null && t_.isMoveable() )
186 t_.setGNode( null ) ;
189 atraiter.get( ti ).setGNode( nb ) ;
191 updateExecTimeNeighbours( atraiter.get( ti ) ) ;
195 /** The task is fixed on this node **/
196 atraiter.get( ti ).setMoveable( false ) ;
198 /** If all tasks have been considered **/
199 if( ti == atraiter.size() - 1 )
206 /** Save the Mapping **/
207 for( int i = 0 ; i < atraiter.size() ; i++ )
209 mp.addMapping( atraiter.get( i ).getMapedOn(), atraiter.get( i ).getGTask() ) ;
213 System.err.println( "\n\n!!! Unable to map application !\n\n" ) ;
222 private GTask2 taskOn( GNode _nb )
224 for( int i = 0 ; i < atraiter.size() ; i++ )
226 if( atraiter.get( i ).getMapedOn().equals( _nb ) )
228 return atraiter.get( i ) ;
241 private ArrayList<GNode> researchNeighbours( GTask2 _g, double _deep)
243 ArrayList<GNode> nb = new ArrayList<GNode>() ;
244 ArrayList<GTask2> neighbours = new ArrayList<GTask2>() ;
246 for( int i = 0 ; i < _g.getGTask().getNbDep() ; i++ )
248 neighbours.add( atraiter.get( _g.getGTask().getDependencies().get( i ).getNum() ) ) ;
251 for( int i = 0 ; i < archi.size() ; i++ )
253 for( int j = 0 ; j < neighbours.size() ; j++ )
255 GNode tmp = neighbours.get( j ).getMapedOn() ;
257 if( gl.getDistance( tmp, archi.get( i ) ) <= _deep && ! nb.contains( tmp ) )
269 * Initialization of the mapping. Each task is mapped on computing
270 * nodes in order of their rank.
272 private void initMapping()
274 for( int i = 0 ; i < atraiter.size() ; i++ )
276 atraiter.get( i ).setGNode( archi.get( i ) ) ;
287 private double execTimeOn( GTask2 _g, GNode _n )
291 return calcExecTime( _g ) ;
300 private GNode selectRandomGNode( int _n, int _r )
304 Random rand = new Random() ;
306 g = archi.get( rand.nextInt( _n / _r ) ) ;
308 while( isTaskNotMoveableOn( g ) )
310 g = archi.get( rand.nextInt( _n / _r ) ) ;
322 private boolean isTaskNotMoveableOn( GNode _g )
324 for( int i = 0 ; i < atraiter.size() ; i++ )
326 if( atraiter.get( i ).getMapedOn().equals( _g ) && ! atraiter.get( i ).isMoveable() )
340 private boolean isOneMoveable()
342 if( atraiter != null && atraiter.size() > 0 )
344 for( int i = 0 ; i < atraiter.size() ; i++ )
346 if( atraiter.get( i ).isMoveable() )
362 private double calcExecTime( GTask2 _g )
368 // Weight of computation
369 w = ( _g.getGTask().getWeight() / _g.mappedOn.getPower() ) ;
371 // Weight of communications
372 int tab[] = new int[ _g.getGTask().getNbDep() ] ;
373 for( int i = 0 ; i < _g.getGTask().getNbDep() ; i++ )
375 tab[ i ] = _g.getGTask().getDependencies().get( i ).getNum() ;
378 for( int i = 0 ; i < tab.length ; i++ )
380 double tmp = gl.getDistance( _g.getMapedOn(), atraiter.get( tab[i] ).getMapedOn() ) ;
397 private void updateExecTime( GTask2 _g )
399 double w = calcExecTime( _g ) ;
403 if( w > _g.getExecTime() )
405 _g.setMoveable( true ) ;
408 _g.setExecTime( w ) ;
417 private void updateExecTimeNeighbours( GTask2 _g )
419 int tab[] = new int[ _g.getGTask().getNbDep() ] ;
420 for( int i = 0 ; i < _g.getGTask().getNbDep() ; i++ )
422 tab[ i ] = _g.getGTask().getDependencies().get( i ).getNum() ;
425 for( int i = 0 ; i < tab.length ; i++ )
427 updateExecTime( atraiter.get( tab[i] ) ) ;
437 private class GTask2 implements Serializable
439 private static final long serialVersionUID = 1L;
442 private boolean moveable ;
443 private double execTime ;
444 private GNode mappedOn ;
454 public GTask2( GTask _g )
462 public boolean isMoveable()
467 public void setMoveable( boolean b )
472 public void setGNode( GNode _g )
478 public GTask getGTask()
484 public double getExecTime()
490 public void setExecTime( double _d )
495 public GNode getMapedOn()
501 public GTask2 clone()
503 GTask2 g_new = new GTask2() ;
504 g_new.execTime = this.execTime ;
506 g_new.mappedOn = this.mappedOn ;
507 g_new.moveable = this.moveable ;
516 public GNode replaceNode( GNode _dead, ArrayList<GNode> _ag )
520 /** If something has to be done **/
523 ArrayList<GNode> ac = new ArrayList<GNode>() ;
526 /** Searching if clusters have some free nodes **/
527 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
529 if( gl.getClusters().get( i ).getNbFreeNodes() > 0 )
531 tmp = gl.getClusters().get( i ).nextGNode() ;
540 /** If there some nodes in clusters **/
543 double power = -1, best = -1 ;
546 /** Searching the replacing node with the higher
549 for( int i = 0 ; i < ac.size() ; i++ )
551 power = ac.get( i ).getPower() ;
566 /** Is there any node candidate ? **/
569 ret = ac.get( bestNode ) ;
581 public GNode getOtherGNode( ArrayList<GNode> _ag )
585 int free[] = new int[ gl.getNbCluster() ] ;
587 /** Searching if clusters have some free nodes **/
588 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
590 free[ i ] = gl.getClusters().get( i ).getNbFreeNodes() ;
593 /** Returning a node from the cluster which has the most
596 int most = -1, max = 0 ;
598 for( int i = 0 ; i < free.length ; i++ )
600 if( free[ i ] > max )
607 /** Is there any cluster candidate ? **/
610 ret = gl.getClusters().get( most ).nextGNode() ;
619 public boolean setParams(Object[] _params) {
626 /** La programmation est un art, respectons ceux qui la pratiquent !! **/