org/objectweb/proactive/benchmarks/timit/result/SerieResultWriter.java

00001 /* 
00002  * ################################################################
00003  * 
00004  * ProActive: The Java(TM) library for Parallel, Distributed, 
00005  *            Concurrent computing with Security and Mobility
00006  * 
00007  * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
00008  * Contact: proactive@objectweb.org
00009  * 
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or any later version.
00014  *  
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  * 
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00023  * USA
00024  *  
00025  *  Initial developer(s):               The ProActive Team
00026  *                        http://www.inria.fr/oasis/ProActive/contacts.html
00027  *  Contributor(s): 
00028  * 
00029  * ################################################################
00030  */ 
00031 package org.objectweb.proactive.benchmarks.timit.result;
00032 
00033 import java.text.DecimalFormat;
00034 import java.util.Iterator;
00035 
00036 import org.jdom.Attribute;
00037 import org.jdom.Document;
00038 import org.jdom.Element;
00039 import org.jdom.filter.ElementFilter;
00040 import org.objectweb.proactive.benchmarks.timit.TimIt;
00041 import org.objectweb.proactive.benchmarks.timit.util.XMLHelper;
00042 
00049 public class SerieResultWriter {
00050 
00051     private Document document;
00052 
00053     private Element eTimit;
00054 
00055     private String filename;
00056 
00063     public SerieResultWriter( String filename ) {
00064         this.eTimit = new Element("timit");
00065         this.document = new Document(this.eTimit);
00066         this.filename = filename;
00067     }
00068 
00072     public Element getRoot() {
00073         return this.eTimit;
00074     }
00075 
00090     public void addResult(
00091             Element bResults, String name, int runs, int totalTimeoutErrors ) {
00092         Element benchResult = new Element("FinalStatistics");
00093         this.eTimit.addContent(benchResult);
00094         benchResult.setAttribute(new Attribute("name", name));
00095         benchResult.setAttribute(new Attribute("runs", "" + runs));
00096         benchResult.setAttribute(new Attribute("timeoutErrors", ""
00097                 + totalTimeoutErrors));
00098         benchResult.setAttribute(new Attribute("date", ""
00099                 + (new java.sql.Timestamp(System.currentTimeMillis()))));
00100 
00101         // Timer statistics
00102         this.fillTimersResults(benchResult, bResults
00103                 .getDescendants(new ElementFilter("timers")));
00104 
00105         // Event statistics
00106         this.fillEventsResults(benchResult, bResults
00107                 .getDescendants(new ElementFilter("events")));
00108         
00109         // Informations
00110         this.fillInformations(benchResult);
00111 
00112         // Save modification into file
00113         XMLHelper.writeFile(this.document, this.filename);
00114     }
00115 
00116 
00117     
00118     
00119     //
00120     // -- PRIVATE METHODS ----------------------------------------------------
00121     //
00122 
00127     private void fillTimersResults(Element eTimers, Iterator itTimers) {
00128 
00129         Iterator initIterator;
00130         Element temp;
00131 
00132         if (!itTimers.hasNext()) {
00133             return;
00134         }
00135 
00136         // Merged results will be put in a clone of first result
00137         Element eCurrentTimers = (Element) itTimers.next();
00138         Element eCloneTimers = (Element) eCurrentTimers.clone();
00139         eTimers.addContent(eCloneTimers);
00140         // Init the final values
00141         initIterator = eCloneTimers.getDescendants();
00142         while (initIterator.hasNext()) {
00143             temp = (Element) initIterator.next();
00144             // temp.setAttribute("min","0"); // do not init min values
00145             temp.setAttribute("avg", "0");
00146             temp.setAttribute("max", "0");
00147             temp.setAttribute("dev", "0");
00148         }
00149 
00150         // Merging results...
00151         // The array of double values ie min avg max dev
00152         double[] tab1 = new double[4];
00153         double[] tab2 = new double[4];
00154         int run = 0;
00155         do {
00156             run++;
00157             Iterator targetIterator = eCurrentTimers.getDescendants();
00158             Iterator finalIterator = eCloneTimers.getDescendants();
00159             while (targetIterator.hasNext() && finalIterator.hasNext()) {
00160                 Element e1 = (Element) targetIterator.next();
00161                 Element e2 = (Element) finalIterator.next();
00162                 if (!e1.getAttributeValue("name").equals(
00163                         e2.getAttributeValue("name"))) {
00164                     throw new IllegalStateException(
00165                             "You are trying to finalize different timers !");
00166                 }
00167                 // Get current target element ie timer values
00168                 tab1[0] = Double.valueOf(e1.getAttributeValue("min"));
00169                 tab1[1] = Double.valueOf(e1.getAttributeValue("avg"));
00170                 tab1[2] = Double.valueOf(e1.getAttributeValue("max"));
00171                 // Get final values
00172                 tab2[0] = Double.valueOf(e2.getAttributeValue("min"));
00173                 tab2[1] = Double.valueOf(e2.getAttributeValue("avg"));
00174                 tab2[2] = Double.valueOf(e2.getAttributeValue("max"));
00175                 tab2[3] = Double.valueOf(e2.getAttributeValue("dev"));
00176                 // Min
00177                 if (tab1[0] < tab2[0]) {
00178                     tab2[0] = tab1[0];
00179                 }
00180                 // Avg
00181                 tab2[1] += tab1[1];
00182                 // Max
00183                 if (tab1[2] > tab2[2]) {
00184                     tab2[2] = tab1[2];
00185                 }
00186                 // Deviation
00187                 tab2[3] += tab1[1] * tab1[1];
00188                 // Set back the final values
00189                 e2.setAttribute("min", "" + tab2[0]);
00190                 e2.setAttribute("avg", "" + TimIt.df.format(tab2[1]));
00191                 e2.setAttribute("max", "" + tab2[2]);
00192                 e2.setAttribute("dev", "" + tab2[3]);
00193             }
00194             if (itTimers.hasNext()) {
00195                 eCurrentTimers = (Element) itTimers.next();
00196             } else {
00197                 break;
00198             }
00199         } while (true);
00200 
00201         //
00202         // Finalize standard deviation, avg values and children sum
00203         double average, deviation, sqrt, childrenSum;
00204         Iterator children;
00205         Iterator finalIterator = eCloneTimers.getDescendants();
00206         while (finalIterator.hasNext()) {
00207             Element e1 = (Element) finalIterator.next();
00208             average = Double.valueOf(e1.getAttributeValue("avg")) / run;
00209             deviation = Double.valueOf(e1.getAttributeValue("dev"));
00210             // Set Avg value back
00211             e1.setAttribute("avg", "" + TimIt.df.format(average));
00212             // Compute Avg^2
00213             average = average * average;
00214             // Compute Deviation
00215             sqrt = deviation / run - average; // avoid truncatures problems
00216             deviation = Math.sqrt((sqrt > 0) ? sqrt : 0);
00217             // Set back the final deviation value
00218             e1.setAttribute("dev", "" + TimIt.df.format(deviation));
00219 
00220             // Children sum computation
00221             childrenSum = 0.0;
00222             children = e1.getChildren().iterator();
00223             while (children.hasNext()) {
00224                 childrenSum += Double.valueOf(((Element) children.next())
00225                         .getAttributeValue("avg"));
00226             }
00227             e1.setAttribute(new Attribute("sum", TimIt.df.format(childrenSum / run)));
00228         }
00229     }
00230 
00231 
00236     private void fillEventsResults(Element eEvents, Iterator itEvents) {
00237 
00238         Iterator initIterator;
00239         Element temp;
00240         DecimalFormat df = TimIt.df;
00241 
00242         if (!itEvents.hasNext()) {
00243             return;
00244         }
00245 
00246         // Merged results will be put in a clone of first result
00247         Element eCurrentEvents = (Element) itEvents.next();
00248         Element eCloneEvents = (Element) eCurrentEvents.clone();
00249         eEvents.addContent(eCloneEvents);
00250         // Init the final values
00251         initIterator = eCloneEvents.getChildren().iterator();
00252         while (initIterator.hasNext()) {
00253             temp = (Element) initIterator.next();
00254             try {
00255                 // If this instruction works, then we can perform
00256                 // a min/avg/max/dev computation on this value
00257                 Double.valueOf(temp.getValue());
00258                 Attribute min = new Attribute("min", "" + Double.MAX_VALUE);
00259                 Attribute avg = new Attribute("avg", "0");
00260                 Attribute max = new Attribute("max", "" + Double.MIN_VALUE);
00261                 Attribute dev = new Attribute("dev", "0");
00262                 temp.setAttribute(min);
00263                 temp.setAttribute(avg);
00264                 temp.setAttribute(max);
00265                 temp.setAttribute(dev);
00266 
00267             } catch (NumberFormatException e) {
00268                 // We can't perform a min/avg/max/dev computation on this value
00269                 temp.setAttribute( new Attribute(
00270                         "value", "Too complex value, first run shown") );
00271             }
00272         }
00273 
00274         // Merging results...
00275         double fMin, fAvg, fMax, fDev, tValue;
00276         int run = 0;
00277         do {
00278             run++;
00279             Iterator targetIterator = eCurrentEvents
00280                     .getDescendants(new ElementFilter("event"));
00281             Iterator finalIterator = eCloneEvents
00282                     .getDescendants(new ElementFilter("event"));
00283             while (targetIterator.hasNext() && finalIterator.hasNext()) {
00284                 Element e1 = (Element) targetIterator.next();
00285                 Element e2 = (Element) finalIterator.next();
00286                 if (!e1.getAttributeValue("name").equals(
00287                         e2.getAttributeValue("name"))) {
00288                     throw new IllegalStateException(
00289                             "You are trying to finalize different events !");
00290                 }
00291                 try {
00292                     if (e2.getAttribute("value") == null) {
00293                         // initialize values
00294                         tValue = Double.valueOf(e1.getValue());
00295                         fMin = Double.valueOf(e2.getAttributeValue("min"));
00296                         fAvg = Double.valueOf(e2.getAttributeValue("avg"));
00297                         fMax = Double.valueOf(e2.getAttributeValue("max"));
00298                         fDev = Double.valueOf(e2.getAttributeValue("dev"));
00299 
00300                         // compute min / avg / max / dev
00301                         if (tValue < fMin) {
00302                             fMin = tValue;
00303                         }
00304                         fAvg += tValue;
00305                         if (tValue > fMax) {
00306                             fMax = tValue;
00307                         }
00308                         fDev += tValue * tValue;
00309 
00310                         // Set back the final values
00311                         e2.setAttribute("min", "" + df.format(fMin));
00312                         e2.setAttribute("avg", "" + df.format(fAvg));
00313                         e2.setAttribute("max", "" + df.format(fMax));
00314                         e2.setAttribute("dev", "" + df.format(fDev));
00315                     }
00316                 } catch (NumberFormatException e) {
00317                     continue;
00318                 }
00319             }
00320             if (itEvents.hasNext()) {
00321                 eCurrentEvents = (Element) itEvents.next();
00322             } else {
00323                 break;
00324             }
00325         } while (true);
00326 
00327         //
00328         // Finalize standard deviation and avg values
00329         double average, deviation, sqrt;
00330         Iterator finalIterator = eCloneEvents.getChildren().iterator();
00331         while (finalIterator.hasNext()) {
00332             Element e1 = (Element) finalIterator.next();
00333             if (e1.getAttribute("value") == null) {
00334                 average = Double.valueOf(e1.getAttributeValue("avg")) / run;
00335                 deviation = Double.valueOf(e1.getAttributeValue("dev"));
00336                 // Set Avg value back
00337                 e1.setAttribute("avg", "" + TimIt.df.format(average));
00338                 // Compute Avg^2
00339                 average = average * average;
00340                 // Compute Deviation
00341                 sqrt = deviation / run - average; // avoid truncatures
00342                                                     // problems
00343                 deviation = Math.sqrt((sqrt > 0) ? sqrt : 0);
00344                 // Set back the final deviation value
00345                 e1.setAttribute("dev", "" + TimIt.df.format(deviation));
00346             }
00347         }
00348     }
00349     
00354     private void fillInformations( Element benchResults ) {
00355         Element eInfos = new Element("informations");
00356         benchResults.addContent(eInfos);
00357         
00358         
00359         //
00360         // Informations about deployer machine
00361         //
00362         Element eDeployer = new Element("deployer");
00363         eInfos.addContent(eDeployer);
00364         // JVM version
00365         String jvmVersion = System.getProperty("java.vm.vendor")
00366             + " " + System.getProperty("java.vm.name")
00367             + " " + System.getProperty("java.vm.version")
00368             + " - Version " + System.getProperty("java.version");
00369         eDeployer.setAttribute(new Attribute("jvm",jvmVersion));
00370         
00371         // OS Version
00372         String osVersion = System.getProperty("os.arch")
00373             + " " + System.getProperty("os.name")
00374             + " " + System.getProperty("os.version");
00375         eDeployer.setAttribute(new Attribute("os", osVersion));
00376         
00377         // Processor count
00378         eDeployer.setAttribute(new Attribute("processors",
00379                 ""+Runtime.getRuntime().availableProcessors()));
00380     }
00381 }

Generated on Mon Jan 22 15:16:04 2007 for ProActive by  doxygen 1.5.1