source: DCWoRMS/branches/coolemall/src/simulator/workload/generator/RandomNumbersWrapper.java @ 836

Revision 836, 14.9 KB checked in by wojtekp, 12 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package simulator.workload.generator;
2
3import java.io.IOException;
4import java.util.ArrayList;
5import java.util.HashMap;
6
7import javax.xml.parsers.DocumentBuilder;
8import javax.xml.parsers.DocumentBuilderFactory;
9import javax.xml.parsers.ParserConfigurationException;
10import javax.xml.xpath.XPath;
11import javax.xml.xpath.XPathConstants;
12import javax.xml.xpath.XPathExpression;
13import javax.xml.xpath.XPathExpressionException;
14import javax.xml.xpath.XPathFactory;
15
16import org.apache.commons.logging.Log;
17import org.apache.commons.logging.LogFactory;
18import org.w3c.dom.Document;
19import org.w3c.dom.Node;
20import org.xml.sax.SAXException;
21
22import simulator.RandomNumbers;
23import simulator.workload.reader.archive.AbstractWAParser;
24import simulator.workload.reader.archive.WAParser;
25import simulator.workload.reader.archive.swf.SWFFields;
26
27import bsh.EvalError;
28import bsh.Interpreter;
29
30import com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList;
31
32public class RandomNumbersWrapper {
33       
34        protected Log log = LogFactory.getLog(RandomNumbersWrapper.class);
35       
36        protected WAParser swfParser;
37        protected String jobId;
38        protected String taskId;
39       
40        protected RandomNumbers randomNumbers[];
41       
42        /**
43         * List of all dependency paths detected in workload.
44         */
45        protected ArrayList<ArrayList<String>> idDep;
46       
47        /**
48         * Map, where key is workload node id and value is arithmetic expression.
49         */
50        protected HashMap <String, String> idExpMap;
51        protected Interpreter interpreter;
52       
53        public RandomNumbersWrapper(){
54                swfParser = null;
55                idExpMap = new HashMap<String, String>();
56                interpreter = new Interpreter();
57                randomNumbers = new RandomNumbers[5];
58                /*
59                 * 0 - parameterRandomNumbers;
60                 * 1 - hardConstraintsRandomNumbers;
61                 * 2 - softConstraintsRandomNumbers;
62                 * 3 - timeConstraintsRandomNumbers;
63                 * 4 - precedingConstraintsRandomNumbers;
64                 */
65        }
66       
67        public void setExternalFileDpendencies(String fileName){
68                try {
69                       
70                        this.swfParser = AbstractWAParser.getInstance(fileName);
71                       
72                } catch (NullPointerException e) {
73                        e.printStackTrace();
74                }
75        }
76       
77        public void setCurrentJobId(String id){
78                this.jobId = id;
79        }
80       
81        public void setCurrentTaskId(String id){
82                this.taskId = id;
83        }
84       
85        public void setParameterRandomNumbers(RandomNumbers parameterRandomNumbers) {
86                randomNumbers[0] = parameterRandomNumbers;
87        }
88        public void setHardConstraintsRandomNumbers(
89                        RandomNumbers hardConstraintsRandomNumbers) {
90                randomNumbers[1] = hardConstraintsRandomNumbers;
91        }
92        public void setSoftConstraintsRandomNumbers(
93                        RandomNumbers softConstraintsRandomNumbers) {
94                randomNumbers[2] = softConstraintsRandomNumbers;
95        }
96        public void setTimeConstraintsRandomNumbers(
97                        RandomNumbers timeConstraintsRandomNumbers) {
98                randomNumbers[3] = timeConstraintsRandomNumbers;
99        }
100        public void setPrecedingConstraintsRandomNumbers(
101                        RandomNumbers precedingConstraintsRandomNumbers) {
102                randomNumbers[4] = precedingConstraintsRandomNumbers;
103        }
104       
105       
106        public double evalValueFor(String id, String refElementId){
107                ArrayList<String> path = null;
108                String idName;
109                boolean found = false;
110                int idx = 0;
111               
112                // find path which contains node.id .
113                for(int i = 0; i < idDep.size(); i++){
114                        path = idDep.get(i);
115                        // find position of id in path
116                        for(idx = 0; idx < path.size(); idx++){
117                                idName = path.get(idx);
118                                if(idName.equals(id)) {
119                                        found = true;
120                                        break;
121                                }
122                        }
123                        if(found) break;
124                }
125               
126                if(!found)
127                        throw new RuntimeException("No value for "+id);
128
129                RandomNumbers randomNumber;
130                String genName;
131                String expr;
132                double value = 0;
133                Number nValue;
134               
135               
136                try {
137                        // this is the id of the first node in the path. All others nodes depends on this node.
138                        idName = path.get(0);
139                               
140                        if(isExternalFileDependent(refElementId)){      // evaluate external file dependency
141                                value = evalExternalFileDependency(refElementId);
142                                if(idExpMap.containsKey(idName)){
143                                        expr = idExpMap.get(idName);
144                                        interpreter.set("x", value);
145                                        nValue = (Number) interpreter.eval(expr);
146                                        value = nValue.doubleValue();
147                                }
148                        } else {                                                                // if there is no external file dependency, try to use random generator
149                                for(int i = 0; i < randomNumbers.length; i++){
150                                        randomNumber = randomNumbers[i];
151                                        if(randomNumber.containsElement(idName)){
152                                                genName = randomNumber.getGeneratorName(idName);
153                                //              value = randomNumber.getRandomValue(genName);
154                                                value = randomNumber.getLastGeneratedRandomValue(genName);
155                                                break;
156                                        }
157                                }
158                        }
159                       
160                        // execute all arithmetic dependency expressions between first node and current one.
161                        for(int i = 1; i <= idx; i++){
162                                idName = path.get(i);
163                                expr = idExpMap.get(idName);
164                                interpreter.set("x", value);
165                                nValue = (Number)interpreter.eval(expr);
166                                value = nValue.doubleValue();
167                                if(i < idx) {
168                                        // random factor which was generated last time should be added to current value.
169                                        for(int j = 0; j < randomNumbers.length; j++){
170                                                randomNumber = randomNumbers[j];
171                                                if(randomNumber.containsElement(idName)){
172                                                        genName = randomNumber.getGeneratorName(idName);
173                                                        value = value + randomNumber.getLastGeneratedRandomValue(genName);
174                                                        break;
175                                                }
176                                        }
177                                }
178                        }
179                       
180                        // if for current node is defined any random generator, it means that to the value
181                        // accounted by arithmetic expressions some random factor must be added.
182                        for(int i = 0; i < randomNumbers.length; i++){
183                                randomNumber = randomNumbers[i];
184                                if(randomNumber.containsElement(idName)){
185                                        genName = randomNumber.getGeneratorName(idName);
186                                        value = value + randomNumber.getRandomValue(genName);
187                                        break;
188                                }
189                        }
190                       
191                } catch (IllegalAccessException e){
192                        e.printStackTrace();
193                } catch (EvalError e) {
194                        e.printStackTrace();
195                }
196
197                return value;
198        }
199       
200       
201        /**
202         *
203         * @param fileLocation - workload configuration file location
204         * @return list of lists of xml elements id's, organized in dependency order (top-down hierarchy)
205         * or null if no dependencies in workload configuration file were detected.
206         * @throws Exception if cycle in dependency graph was detected
207         */
208        public ArrayList<ArrayList<String>> findDependencies(String fileLocation) throws Exception{
209                ArrayList <ArrayList<String>> genOrderList = new ArrayList<ArrayList<String>>();
210               
211                try {
212                        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
213                        DocumentBuilder builder = docFactory.newDocumentBuilder();
214                        Document doc = builder.parse(fileLocation);
215                       
216                       
217                        //XPathFactory factory = XPathFactory.newInstance();
218                        XPathFactory factory = new com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl();
219                        XPath xpath = factory.newXPath();
220                        XPathExpression expr = xpath.compile("//*[@id]");
221                       
222                        Object wynik = expr.evaluate(doc, XPathConstants.NODESET);
223                        DTMNodeList list = (DTMNodeList) wynik;
224                        Node node = null;
225                        Node refAttr = null;
226                        Node idAttr = null;
227                       
228                        HashMap<String, Integer> nodeMap = new HashMap<String, Integer>();
229                        HashMap<Integer, String> nodeMapInv = new HashMap<Integer, String>();
230                        String key;
231                        for(int i = 0; i < list.getLength(); i++){
232                                node = list.item(i);
233                                key = node.getAttributes().getNamedItem("id").getNodeValue();
234                                nodeMap.put(key, i);
235                                nodeMapInv.put(i, key);
236                                node = node.getAttributes().getNamedItem("expr");
237                                if(node != null && node.getNodeValue() != null)
238                                        idExpMap.put(key, node.getNodeValue());
239                                else
240                                        idExpMap.put(key, "x");
241                        }
242                       
243                        int size = nodeMap.size();
244                        if(size == 0)
245                                return null;
246                       
247                        int refGraph[] = new int[size];
248                        for(int i = 0; i < refGraph.length; i++)
249                                refGraph[i] = -1;
250                       
251                        expr = xpath.compile("//*[@refElementId]");
252                        wynik = expr.evaluate(doc, XPathConstants.NODESET);
253                        int x = 0;
254                        int y = 0;
255                        String idValue = null;
256                        for(int i = 0; i < list.getLength(); i++){
257                                node = list.item(i);
258                                refAttr = node.getAttributes().getNamedItem("refElementId");
259                                idAttr = node.getAttributes().getNamedItem("id");
260                                if(refAttr != null){
261                                        try {
262                                                idValue = idAttr.getNodeValue();
263                                                y = nodeMap.get(idValue);
264                                                x = nodeMap.get(refAttr.getNodeValue());
265                                                refGraph[y] = nodeMap.get(nodeMapInv.get(x));
266                                               
267                                        } catch (NullPointerException e){
268                                                log.warn("Element referenced by " + idValue + " doeas not exist in configuration file.");
269                                        }
270                                }
271                        }
272
273                        // find start points
274                        /*
275                         * ostatni w grafie jest ten, ktory nie poprzedza innego wierzcholka (nie ma nastepnikow).
276                         * W celu lokalizacji:
277                         * jezeli wierzcholek 'i' posiada poprzednika 'p', to poprzednik 'p' oznaczany jest jako uzyty
278                         * (posiadajacy nastepnika) - pod indeksem reprezentujacym 'p' w helpTab wpisywne jest -1
279                         */
280                       
281                        int helpTab[] = new int[refGraph.length];
282                        for(int i = 0; i < refGraph.length; i++){
283                                if(refGraph[i] != -1)                   // bo -1 nie moze byc indeksem tablicy
284                                        helpTab[refGraph[i]] = -1;
285                        }
286                       
287                        // path end detection
288                        /*
289                         * jezeli wierzcholek 'i' posiada w tabeli helpTab wartosc 0, to oznacza, ze nie posiada
290                         * nastepnikow - jest ostatnim wierzcholkiem na sciezce
291                         */
292                        ArrayList <Integer> pathEnd = new ArrayList<Integer>();
293                        for(int i = 0; i < helpTab.length; i++){
294                                if(helpTab[i] == 0) {
295                                        pathEnd.add(i);
296                                }
297                        }
298                       
299                        int loopDetector[] = new int[refGraph.length];
300                        /*
301                         * jezeli jakis wierzcholek nigdy nie zostal uzyty w trakcie przejscia wszystkimi sciezkami
302                         * to albo jest wolnym strzelcem albo nalezy do cyklu, z ktorego zaden wierzcholek nie nalezy
303                         * do listy pathEnd
304                         */
305                        int usedNodes[] = new int[refGraph.length]; // 1 - used, 0 - not used
306                        boolean process = true;
307                        boolean loopNotFound = true;
308                        int idx = 0;
309                        int pathId = 0;
310                        int val = 0;
311                        String path = new String();
312                        ArrayList <String> genOrder = new ArrayList<String>();
313                       
314                        if(pathEnd.size() == 0)
315                                throw new Exception("ERROR: Loop detected in attributes dependency.");
316                       
317                        // for each path (path end)
318                        for(int i = 0; i < pathEnd.size(); i++){
319                                System.arraycopy(refGraph, 0, loopDetector, 0, refGraph.length);
320                                idx = pathEnd.get(i);
321                                usedNodes[idx] = 1;
322                                pathId = refGraph.length + idx;
323                                path = nodeMapInv.get(idx);
324                                genOrder.clear();
325                                genOrder.add(0, path);
326                                process = true;
327                                loopNotFound = true;
328                               
329                                // found ancestor of current nod
330                                // path is build from the end to the beginning
331                                while(process && loopNotFound){
332                                        val = loopDetector[idx];
333                                       
334                                        if(val == -1)
335                                                process = false;
336                                        else if(val == -pathId)
337                                                loopNotFound = false;
338                                        else {
339                                                loopDetector[idx] = -pathId;
340                                                path = nodeMapInv.get(val) + " -> " + path;
341                                                usedNodes[val] = 1;
342                                                genOrder.add(0, nodeMapInv.get(val));
343                                        }
344                                        idx = val;
345                                }
346                                if(!loopNotFound) {
347                                        throw new Exception("ERROR: Loop detected in atributes dependency, path: "+path);
348                                }
349                               
350                                if(genOrder.size() > 0){
351                                        genOrderList.add((ArrayList<String>)genOrder.clone());
352                                }
353                               
354                        }
355                       
356                        // the same as above loop, but for all unused nodes.
357                        for(int i = 0; i < usedNodes.length; i++){
358                                if(usedNodes[i] == 0){
359                                        System.arraycopy(refGraph, 0, loopDetector, 0, refGraph.length);
360                                        idx = i;
361                                        pathId = refGraph.length + idx;
362                                        path = nodeMapInv.get(idx);
363                                        genOrder.clear();
364                                        genOrder.add(0, path);
365                                        process = true;
366                                        loopNotFound = true;
367                                       
368                                        while(process && loopNotFound){
369                                                val = loopDetector[idx];
370                                               
371                                                if(val == -1)
372                                                        process = false;
373                                                else if(val == -pathId)
374                                                        loopNotFound = false;
375                                                else {
376                                                        loopDetector[idx] = -pathId;
377                                                        path = nodeMapInv.get(val) + " -> " + path;
378                                                        genOrder.add(0, nodeMapInv.get(val));
379                                                }
380                                                idx = val;
381                                        }
382                                        if(!loopNotFound){
383                                                throw new Exception("ERROR: Loop detected in atributes dependency, path: "+path);
384                                        }
385                                       
386                                        if(genOrder.size() > 0){
387                                                genOrderList.add((ArrayList<String>)genOrder.clone());
388                                        }
389                                }
390                        }
391                       
392                } catch (XPathExpressionException e) {
393                        e.printStackTrace();
394                } catch (ParserConfigurationException e) {
395                        e.printStackTrace();
396                } catch (SAXException e) {
397                        e.printStackTrace();
398                } catch (IOException e) {
399                        e.printStackTrace();
400                }
401               
402                idDep = genOrderList;
403                return genOrderList;
404        }
405       
406        protected boolean isExternalFileDependent(String idName){
407                if(idName.startsWith("swf."))
408                        return true;
409               
410                return false;
411        }
412       
413        protected double evalExternalFileDependency(String refElementId){
414                String filedName = refElementId.substring(4).toUpperCase();
415               
416                try {
417                        String value = null;
418                       
419                        if("JOB_NUMBER".equals(filedName)){
420                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_JOB_NUMBER];
421                        } else if("SUBMIT_TIME".equals(filedName)){
422                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_SUBMIT_TIME];
423                        } else if("WAIT_TIME".equals(filedName)){
424                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_WAIT_TIME];
425                        } else if("RUN_TIME".equals(filedName)){
426                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_RUN_TIME];
427                        } else if("NUMBER_OF_ALLOCATED_PROCESSORS".equals(filedName)){
428                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_NUMBER_OF_ALLOCATED_PROCESSORS];
429                        } else if("AVERAGE_CPU_TIME_USED".equals(filedName)){
430                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_AVERAGE_CPU_TIME_USED];
431                        } else if("USED_MEMORY".equals(filedName)){
432                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_USED_MEMORY];
433                        } else if("REQUESTED_NUMBER_OF_PROCESSORS".equals(filedName)){
434                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_REQUESTED_NUMBER_OF_PROCESSORS];
435                        } else if("REQUESTED_TIME".equals(filedName)){
436                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_REQUESTED_TIME];
437                        } else if("REQUESTED_MEMORY".equals(filedName)){
438                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_REQUESTED_MEMORY];
439                        } else if("STATUS".equals(filedName)){
440                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_STATUS];
441                        } else if("USER_ID".equals(filedName)){
442                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_USER_ID];
443                        } else if("GROUP_ID".equals(filedName)){
444                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_GROUP_ID];
445                        } else if("EXECUTABLE_NUMBER".equals(filedName)){
446                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_EXECUTABLE_NUMBER];
447                        } else if("QUEUE_NUMBER".equals(filedName)){
448                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_QUEUE_NUMBER];
449                        } else if("PARTITION_NUMBER".equals(filedName)){
450                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_PARTITION_NUMBER];
451                        } else if("PRECEDING_JOB_NUMBER".equals(filedName)){
452                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_PRECEDING_JOB_NUMBER];
453                        } else if("THINK_TIME_FROM_PRECEDING_JOB".equals(filedName)){
454                                value = swfParser.readTask(jobId, taskId)[SWFFields.DATA_THINK_TIME_FROM_PRECEDING_JOB];
455                        } else {
456                                log.error("No external value for element reference "+refElementId + ". Assign default value 0.");
457                                return 0;
458                        }
459                       
460                        return Double.valueOf(value);
461                       
462                } catch (IOException e) {
463                        // TODO Auto-generated catch block
464                        e.printStackTrace();
465                }
466               
467                return 0;
468        }
469       
470        public void close(){
471                try {
472                        swfParser.close();
473                } catch (IOException e) {
474                        e.printStackTrace();
475                }
476        }
477}
Note: See TracBrowser for help on using the repository browser.