001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015:
016: package edu.isi.pegasus.planner.ranking;
017:
018: import org.griphyn.cPlanner.classes.PegasusBag;
019:
020: import org.griphyn.cPlanner.selector.site.heft.Algorithm;
021:
022: import org.griphyn.cPlanner.classes.ADag;
023:
024: import org.griphyn.cPlanner.common.LogManager;
025:
026: import org.griphyn.cPlanner.parser.DaxParser;
027:
028: import org.griphyn.cPlanner.parser.dax.DAXCallbackFactory;
029: import org.griphyn.cPlanner.parser.dax.Callback;
030:
031: import java.util.Collection;
032: import java.util.Collections;
033: import java.util.Iterator;
034: import java.util.List;
035: import java.util.LinkedList;
036:
037: /**
038: * The Rank class that ranks the DAX'es
039: *
040: * @author Karan Vahi
041: * @version $Revision: 445 $
042: */
043: public class Rank {
044:
045: /**
046: * The handle to the ranking algorithm.
047: */
048: private Algorithm mHeft;
049:
050: /**
051: * The pegasus bag.
052: */
053: private PegasusBag mBag;
054:
055: /**
056: * The list of candidate grid sites.
057: */
058: private List mSites;
059:
060: /**
061: * The optional request id.
062: */
063: private String mRequestID;
064:
065: /**
066: * The handle to the logging object.
067: */
068: private LogManager mLogger;
069:
070: /**
071: * The default constructor.
072: */
073: public Rank() {
074: mLogger = LogManager.getInstance();
075: }
076:
077: /**
078: * Initializes the rank client.
079: *
080: * @param bag the PegasusBag.
081: * @param sites the sites where the wf can run potentially.
082: * @param id the request id
083: */
084: public void initialize(PegasusBag bag, List sites, String id) {
085: mBag = bag;
086: mLogger = bag.getLogger();
087: mHeft = new Algorithm(bag);
088: mRequestID = id;
089: mSites = sites;
090: }
091:
092: /**
093: * Ranks the daxes, and returns a sort collection of Ranking objects.
094: *
095: * @param daxes Collection
096: *
097: * @return a sorted collection according to the ranks.
098: */
099: public Collection<Ranking> rank(Collection<String> daxes) {
100:
101: Collection result = new LinkedList();
102:
103: long max = 0;
104:
105: //traverse through the DAX'es
106: long rank;
107: for (Iterator it = daxes.iterator(); it.hasNext();) {
108: String dax = (String) it.next();
109: Callback cb = DAXCallbackFactory.loadInstance(mBag
110: .getPegasusProperties(), dax, "DAX2CDAG");
111:
112: mLogger.log("Ranking dax " + dax,
113: LogManager.DEBUG_MESSAGE_LEVEL);
114: DaxParser daxParser = new DaxParser(dax, mBag
115: .getPegasusProperties(), cb);
116:
117: ADag dag = (ADag) cb.getConstructedObject();
118: dag.setRequestID(mRequestID);
119: mHeft.schedule(dag, mSites);
120: rank = mHeft.getMakespan();
121: max = (rank > max) ? rank : max;
122: result.add(new Ranking(dax, rank));
123: }
124:
125: //update the ranks for all the daxes ( inverse them )
126: for (Iterator it = result.iterator(); it.hasNext();) {
127: Ranking r = (Ranking) it.next();
128: //inverse the ranking
129: r.setRank(max - r.getRank());
130: }
131:
132: Collections.sort((List) result, Collections.reverseOrder());
133: return result;
134: }
135:
136: }
|