3 import java.util.ArrayList;
7 public class Maheve extends Algo
9 private static final long serialVersionUID = 1L;
11 private static final int minNode = 5 ;
12 private static final int nbSave = 2 ;
15 private ArrayList<Cluster> sortedCluster = null ;
16 private ArrayList<GTask> tasks = null ;
20 * Empty default constructor.
26 sortedCluster = new ArrayList<Cluster>() ;
31 * Constructor of this algorithm, which takes into parameter
32 * the application graph, the grid architecture, and the correction
33 * parameter which indicates the threshold of the heterogeneity degree.
34 * @param _gr The application graph
35 * @param _gl The grid architecture
36 * @param _threshold The heterogeneity threshold
38 public Maheve( Graph _gr, Grid _gl )
43 sortedCluster = new ArrayList<Cluster>() ;
44 tasks = new ArrayList<GTask>() ;
51 /** If the mapping is possible ... **/
52 if( ( gr != null ) && ( gr.getNbGTask() <= gl.getNbGNode() ) )
54 System.out.println( "******************************************" ) ;
55 System.out.println( "* Launching the MAHEVE Mapping algorithm *" ) ;
56 System.out.println( "******************************************\n\n" ) ;
58 /** Local variables **/
59 ArrayList<GNode> used = null ;
61 /** Initialization of heterogeneity degree **/
62 hd = gl.getHeterogenityDegre() ;
65 /** Ordering clusters according to their real power **/
66 updateSortedClusters() ;
68 /** Searching the corresponding nodes **/
69 used = searchNodes( gr.getNbGTask() ) ;
71 if( used == null || used.size() == 0 )
73 System.err.println( "No node returned!" ) ;
78 /** Ordering tasks **/
81 if( tasks == null || tasks.size() == 0 )
83 System.err.println( "Unable to retrieve tasks to be mapped on!" ) ;
88 /** Save the Mapping **/
89 for( int i = 0 ; i < tasks.size() ; i++ )
91 mp.addMapping( new Association( used.get( i ), tasks.get( i ) ) ) ;
95 System.err.println( "\n\n!!! Unable to map application!\n\n" ) ;
101 private void orderTasks()
103 ArrayList<GTask> l1 = sortTasks() ;
105 ArrayList<Integer> st = new ArrayList<Integer>() ;
107 if( l1 != null && l1.size() > 0 )
109 ArrayList<GTask> l2 = new ArrayList<GTask>() ;
110 ArrayList<GTask> tmp = new ArrayList<GTask>() ;
112 while( l1.size() > 0 )
116 l2.add( l1.get( 0 ) ) ;
117 st.add( l1.get( 0 ).getNum() ) ;
120 while( l2.size() > 0 )
122 l1.remove( l2.get( 0 ) ) ;
123 tmp = addTask( l2.remove( 0 ), l1, st ) ;
125 for( int i = 0 ; i < tmp.size() ; i++ )
127 l2.add( tmp.get( i ) ) ;
128 st.add( tmp.get( i ).getNum() ) ;
136 private ArrayList<GTask> addTask(GTask _gt, ArrayList<GTask> _ar,
137 ArrayList<Integer> _st )
140 ArrayList<GTask> ret = null ;
142 if( _gt != null && _ar != null )
144 ret = new ArrayList<GTask>() ;
146 // ** Adding the task in the main list ** //
149 // ** Searching its dependencies ** //
150 int nbDep = (int) (_gt.getNbDep() * (1.0 - hd)) ;
154 ArrayList<Integer> dep = new ArrayList<Integer>() ;
156 // ** Retrieving dependencies and eliminating tasks already treated
157 // ** or in instance to be treated. **//
158 for( int i = 0 ; i < _gt.getDependencies().size() ; i++ )
160 if( ! _st.contains( _gt.getDependencies().get( i ).getNum() ) )
162 dep.add( _gt.getDependencies().get( i ).getNum() ) ;
167 // ** Searching dependencies in sorted tasks list ** //
168 for( int i = 0 ; i < _ar.size() ; i++ )
170 num = _ar.get( i ).getNum() ;
172 if( dep.contains( num ) )
174 // for( int j = 0 ; j < dep.size() ; j++ )
176 // if( num == dep.get( j ) )
178 ret.add( _ar.remove( i ) ) ;
196 private ArrayList<GTask> sortTasks()
198 ArrayList<GTask> ret = null ;
200 ArrayList<GTask> tmp = gr.getGraph() ;
202 if( tmp != null && tmp.size() > 0 )
204 ret = new ArrayList<GTask>() ;
206 ArrayList<Double> mt = new ArrayList<Double>() ;
211 for( int i = 0 ; i < tmp.size() ; i++ )
213 W = tmp.get( i ).getWeight() ;
214 D = tmp.get( i ).getNbDep() ;
218 MT = Math.pow( W, hd ) * Math.pow( D, ( 1.0 - hd) ) ;
220 if( ret.size() == 0 )
222 ret.add( tmp.get( i ) ) ;
225 for( int j = 0 ; j < ret.size() ; j++ )
227 if( MT > mt.get( j ) )
229 ret.add( j, tmp.get( i ) ) ;
239 ret.add( tmp.get( i ) ) ;
250 private ArrayList<GNode> searchNodes( int _nbTask )
252 ArrayList<GNode> ret = null ;
256 ret = new ArrayList<GNode>() ;
261 for( int i = 0 ; i < sortedCluster.size() ; i++ )
263 /** If there is enough nodes ... **/
264 if( sortedCluster.get( i ).getNbFreeNodes() >= minNode )
267 sortedCluster.get( i ).initMoreGNode() ;
269 max = sortedCluster.get( i ).getNbFreeNodes() - nbSave ;
271 for( int j = 0 ; j < max ; j++ )
273 g = sortedCluster.get( i ).moreGNode() ;
278 if( nbFound >= _nbTask )
283 if( nbFound >= _nbTask )
293 * Sort clusters according to the heterogeneity degree of the platform and
294 * the eventual application's threshold.
296 private void updateSortedClusters()
300 /** Purging the local list **/
301 sortedCluster = null ;
302 sortedCluster = new ArrayList<Cluster>() ;
304 ArrayList<Double> calcMark = new ArrayList<Double>() ;
306 hd = gl.getHeterogenityDegre() ;
308 /** Sorting clusters **/
309 ArrayList<Cluster> tmp = gl.getClusters() ;
317 double Nm = 0, Pm = 0 ;
319 for( int i = 0 ; i < tmp.size() ; i++ )
321 Nm += tmp.get( i ).getNbFreeNodes() ;
322 Pm += tmp.get( i ).getAvgAvailablePower() ;
325 for( int i = 0 ; i < tmp.size() ; i++ )
327 normN = tmp.get( i ).getNbFreeNodes() * 100 / Nm ;
328 normP = tmp.get( i ).getAvgAvailablePower() * 100 / Pm ;
330 /** The magic formula :P **/
331 calcLoc = Math.sqrt( Math.pow( (normP * hd), 2) +
332 Math.pow( (normN *(1 - hd)), 2 ) ) ;
336 if( sortedCluster.size() == 0 )
338 sortedCluster.add( tmp.get( i ) ) ;
339 calcMark.add( calcLoc ) ;
342 for( int j = 0 ; j < sortedCluster.size() ; j++ )
344 if( calcLoc > calcMark.get( j ) )
346 sortedCluster.add( j, tmp.get( i ) ) ;
347 calcMark.add( j, calcLoc ) ;
355 sortedCluster.add( tmp.get( i ) ) ;
356 calcMark.add( calcLoc ) ;
365 public GNode replaceNode( GNode _dead, ArrayList<GNode> _ag )
369 /** If something has to be done **/
373 /** Any place on the same cluster ? **/
374 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
378 int id = gl.getClusterOfNode( _dead ) ;
382 cl = gl.getClusters().get(id) ;
384 if( cl.getNbFreeNodes() > 0 )
386 ret = cl.nextGNode() ;
390 System.err.println( "Cluster not found!" ) ;
394 /** If there is no more place, try other clusters **/
397 updateSortedClusters() ;
399 for( int i = 0 ; i < sortedCluster.size() ; i++ )
401 if( sortedCluster.get( i ).getNbFreeNodes() > 0 )
403 ret = sortedCluster.get( i ).nextGNode() ;
418 public GNode getOtherGNode( ArrayList<GNode> _ag )
422 /** Searching the cluster which has the more free nodes **/
423 int pos = -1, max = 0, cur = 0 ;
424 for( int i = 0 ; i < gl.getNbCluster() ; i++ )
426 cur = gl.getClusters().get( i ).getNbFreeNodes() ;
434 ret = gl.getClusters().get( pos ).nextGNode() ;
441 /** La programmation est un art, respectons ceux qui la pratiquent !! **/