co.turnus.analysis.data.bottlenecks.io.XlsAlgoBottlenecksDataWriter.java Source code

Java tutorial

Introduction

Here is the source code for co.turnus.analysis.data.bottlenecks.io.XlsAlgoBottlenecksDataWriter.java

Source

/* 
 * TURNUS, the co-exploration framework
 * 
 * Copyright (C) 2014 EPFL SCI STI MM
 *
 * This file is part of TURNUS.
 *
 * TURNUS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * TURNUS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with TURNUS.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Additional permission under GNU GPL version 3 section 7
 * 
 * If you modify this Program, or any covered work, by linking or combining it
 * with Eclipse (or a modified version of Eclipse or an Eclipse plugin or 
 * an Eclipse library), containing parts covered by the terms of the 
 * Eclipse Public License (EPL), the licensors of this Program grant you 
 * additional permission to convey the resulting work.  Corresponding Source 
 * for a non-source form of such a combination shall include the source code 
 * for the parts of Eclipse libraries used as well as that of the  covered work.
 * 
 */
package co.turnus.analysis.data.bottlenecks.io;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;

import co.turnus.TurnusRuntimeException;
import co.turnus.analysis.bottlenecks.util.HotspotsDataAnalyser;
import co.turnus.analysis.bottlenecks.util.HotspotsDataAnalyser.Key;
import co.turnus.analysis.bottlenecks.util.HotspotsDataAnalyser.Order;
import co.turnus.analysis.data.bottlenecks.ActionImpactData;
import co.turnus.analysis.data.bottlenecks.AlgoBottlenecksData;
import co.turnus.analysis.data.bottlenecks.ExtendExecData;
import co.turnus.analysis.data.bottlenecks.ImpactData;
import co.turnus.analysis.util.AnalysisUtil;
import co.turnus.dataflow.Action;
import co.turnus.dataflow.Actor;
import co.turnus.dataflow.ActorClass;
import co.turnus.dataflow.Network;

import com.google.common.collect.Table;

public class XlsAlgoBottlenecksDataWriter {

    private HSSFFont titleFont;
    private CellStyle cellStyle;

    public void write(AlgoBottlenecksData report, File file) {
        try {
            HSSFWorkbook workbook = new HSSFWorkbook();

            titleFont = workbook.createFont();
            titleFont.setFontName("Arial");
            titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

            cellStyle = workbook.createCellStyle();
            cellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("m/d/yy h:mm"));

            HotspotsDataAnalyser analyzer = new HotspotsDataAnalyser(report);
            writeSummary(workbook, report.getNetwork(), analyzer);
            writeActorClassesTable(workbook, analyzer);
            writeActorsTable(workbook, analyzer);
            writeActionActorClassTable(workbook, analyzer);
            writeActionActorTable(workbook, analyzer);

            // check if there are also impact analysis data
            ImpactData impactData = report.getImpactData();
            if (impactData != null) {
                writeImpactAnalysis(workbook, impactData);
            }

            OutputStream out = new FileOutputStream(file);
            out = new BufferedOutputStream(out);
            workbook.write(out);
            out.close();
        } catch (Exception e) {
            throw new TurnusRuntimeException("Error writing the excel file " + file, e.getCause());
        }

    }

    private void writeActionActorClassTable(HSSFWorkbook workbook, HotspotsDataAnalyser analyzer) {
        HSSFSheet sheet = workbook.createSheet("<Action, ActorClass>");
        // Action Actor Class Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("Action and Actor Class Results");
        title.applyFont(titleFont);
        cell.setCellValue(title);

        Row row = sheet.createRow(1);
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));
        row.createCell(0).setCellValue("Action");
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));
        row.createCell(1).setCellValue("Actor Class");

        sheet.addMergedRegion(new CellRangeAddress(1, 1, 2, 7));
        row.createCell(2).setCellValue("Total Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 8, 12));
        row.createCell(8).setCellValue("Non Deferrable Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 17));
        row.createCell(13).setCellValue("Critical Executions");

        row = sheet.createRow(2);
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 3));
        row.createCell(2).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 6));
        row.createCell(4).setCellValue("Clock Cycles");
        row.createCell(7).setCellValue("Slack");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 8, 9));
        row.createCell(8).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 10, 12));
        row.createCell(10).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 13, 14));
        row.createCell(13).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 15, 17));
        row.createCell(15).setCellValue("Clock Cycles");

        row = sheet.createRow(3);
        row.createCell(2).setCellValue("%");
        row.createCell(3).setCellValue("abs");
        row.createCell(4).setCellValue("%");
        row.createCell(5).setCellValue("mean");
        row.createCell(6).setCellValue("variance");
        row.createCell(7).setCellValue("min");
        row.createCell(8).setCellValue("%");
        row.createCell(9).setCellValue("abs");
        row.createCell(10).setCellValue("%");
        row.createCell(11).setCellValue("mean");
        row.createCell(12).setCellValue("variance");
        row.createCell(13).setCellValue("%");
        row.createCell(14).setCellValue("abs");
        row.createCell(15).setCellValue("%");
        row.createCell(16).setCellValue("mean");
        row.createCell(17).setCellValue("variance");

        Table<ActorClass, Action, ExtendExecData> cTable = analyzer.getSumDataTable(ActorClass.class,
                Key.CRITICAL_CLOCKCYCLES, Order.DECREASING);

        // row index
        int rowi = 4;
        for (Table.Cell<ActorClass, Action, ExtendExecData> entry : cTable.cellSet()) {

            row = sheet.createRow(rowi);
            rowi++;

            row.createCell(0).setCellValue(entry.getColumnKey().getId());
            row.createCell(1).setCellValue(entry.getRowKey().getName());

            ExtendExecData exec = entry.getValue();
            cell = row.createCell(2);
            cell.setCellFormula("D" + rowi + "/Summary!A14*100");
            row.createCell(3).setCellValue(exec.getTotalExec().getExecutions());
            cell = row.createCell(4);
            cell.setCellFormula("F" + rowi + "/Summary!B14*100");
            row.createCell(5).setCellValue(exec.getTotalExec().getClockCyclesMean());
            row.createCell(6).setCellValue(exec.getTotalExec().getClockCyclesVariance());

            double slack = exec.getSlack().getMin();
            slack = slack > AnalysisUtil.PRECISION_EPS ? slack : 0.0;
            row.createCell(7).setCellValue(slack);
            cell = row.createCell(8);
            cell.setCellFormula("J" + rowi + "/Summary!E14*100");
            row.createCell(9).setCellValue(exec.getNotDeferrableExec().getExecutions());
            cell = row.createCell(10);
            cell.setCellFormula("L" + rowi + "/Summary!G14*100");
            row.createCell(11).setCellValue(exec.getNotDeferrableExec().getClockCyclesMean());
            row.createCell(12).setCellValue(exec.getNotDeferrableExec().getClockCyclesVariance());
            cell = row.createCell(13);
            cell.setCellFormula("O" + rowi + "/Summary!J14*100");
            row.createCell(14).setCellValue(exec.getCriticalExec().getExecutions());
            cell = row.createCell(15);
            cell.setCellFormula("Q" + rowi + "/Summary!L14*100");
            row.createCell(16).setCellValue(exec.getCriticalExec().getClockCyclesMean());
            row.createCell(17).setCellValue(exec.getCriticalExec().getClockCyclesVariance());
        }
    }

    private void writeActionActorTable(HSSFWorkbook workbook, HotspotsDataAnalyser analyzer) {
        HSSFSheet sheet = workbook.createSheet("<Action, Actor>");
        // Action Actor Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("Action and Actor Results");
        title.applyFont(titleFont);
        cell.setCellValue(title);
        Row row = sheet.createRow(1);
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));
        row.createCell(0).setCellValue("Action");
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));
        row.createCell(1).setCellValue("Actor");

        sheet.addMergedRegion(new CellRangeAddress(1, 1, 2, 9));
        row.createCell(2).setCellValue("Total Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 10, 14));
        row.createCell(10).setCellValue("Non Deferrable Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 15, 19));
        row.createCell(15).setCellValue("Critical Executions");

        row = sheet.createRow(2);
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 3));
        row.createCell(2).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 6));
        row.createCell(4).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 7, 9));
        row.createCell(7).setCellValue("Slack");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 10, 11));
        row.createCell(10).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 12, 14));
        row.createCell(12).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 15, 16));
        row.createCell(15).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 17, 19));
        row.createCell(17).setCellValue("Clock Cycles");

        row = sheet.createRow(3);
        row.createCell(2).setCellValue("%");
        row.createCell(3).setCellValue("abs");
        row.createCell(4).setCellValue("%");
        row.createCell(5).setCellValue("mean");
        row.createCell(6).setCellValue("variance");
        row.createCell(7).setCellValue("min");
        row.createCell(8).setCellValue("average");
        row.createCell(9).setCellValue("variance");
        row.createCell(10).setCellValue("%");
        row.createCell(11).setCellValue("abs");
        row.createCell(12).setCellValue("%");
        row.createCell(13).setCellValue("mean");
        row.createCell(14).setCellValue("variance");
        row.createCell(15).setCellValue("%");
        row.createCell(16).setCellValue("abs");
        row.createCell(17).setCellValue("%");
        row.createCell(18).setCellValue("mean");
        row.createCell(19).setCellValue("variance");

        Table<Actor, Action, ExtendExecData> aTable = analyzer.getSumDataTable(Actor.class,
                Key.CRITICAL_CLOCKCYCLES, Order.DECREASING);

        // row index
        int rowi = 4;
        for (Table.Cell<Actor, Action, ExtendExecData> entry : aTable.cellSet()) {
            row = sheet.createRow(rowi);
            rowi++;

            row.createCell(0).setCellValue(entry.getColumnKey().getId());
            row.createCell(1).setCellValue(entry.getRowKey().getId());

            ExtendExecData exec = entry.getValue();
            cell = row.createCell(2);
            cell.setCellFormula("D" + rowi + "/Summary!A14*100");
            row.createCell(3).setCellValue(exec.getTotalExec().getExecutions());
            cell = row.createCell(4);
            cell.setCellFormula("F" + rowi + "/Summary!B14*100");
            row.createCell(5).setCellValue(exec.getTotalExec().getClockCyclesMean());
            row.createCell(6).setCellValue(exec.getTotalExec().getClockCyclesVariance());

            double slack = exec.getSlack().getMin();
            slack = slack > AnalysisUtil.PRECISION_EPS ? slack : 0.0;
            row.createCell(7).setCellValue(slack);
            double slackAvg = exec.getSlack().getMean();
            slackAvg = slackAvg > AnalysisUtil.PRECISION_EPS ? slackAvg : 0.0;
            row.createCell(8).setCellValue(slackAvg);
            double slackVar = exec.getSlack().getVariance();
            slackVar = slackVar > AnalysisUtil.PRECISION_EPS ? slackVar : 0.0;
            row.createCell(9).setCellValue(slackVar);
            cell = row.createCell(10);
            cell.setCellFormula("L" + rowi + "/Summary!E14*100");
            row.createCell(11).setCellValue(exec.getNotDeferrableExec().getExecutions());
            cell = row.createCell(12);
            cell.setCellFormula("N" + rowi + "/Summary!G14*100");
            row.createCell(13).setCellValue(exec.getNotDeferrableExec().getClockCyclesMean());
            row.createCell(14).setCellValue(exec.getNotDeferrableExec().getClockCyclesVariance());
            cell = row.createCell(15);
            cell.setCellFormula("Q" + rowi + "/Summary!J14*100");
            row.createCell(16).setCellValue(exec.getCriticalExec().getExecutions());
            cell = row.createCell(17);
            cell.setCellFormula("S" + rowi + "/Summary!L14*100");
            row.createCell(18).setCellValue(exec.getCriticalExec().getClockCyclesMean());
            row.createCell(19).setCellValue(exec.getCriticalExec().getClockCyclesVariance());

        }

    }

    private void writeActorClassesTable(HSSFWorkbook workbook, HotspotsDataAnalyser analyzer) {
        HSSFSheet sheet = workbook.createSheet("ActorClasses");

        // Actor classes Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("ActorClasses Results");
        title.applyFont(titleFont);
        cell.setCellValue(title);

        Row row = sheet.createRow(1);
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));
        row.createCell(0).setCellValue("Class");
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));
        row.createCell(1).setCellValue("File");
        sheet.addMergedRegion(new CellRangeAddress(1, 2, 2, 3));
        row.createCell(2).setCellValue("Version");

        sheet.addMergedRegion(new CellRangeAddress(1, 1, 4, 8));
        row.createCell(4).setCellValue("Total Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 9, 13));
        row.createCell(9).setCellValue("Non Deferrable Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 14, 18));
        row.createCell(14).setCellValue("Critical Executions");

        row = sheet.createRow(2);
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 5));
        row.createCell(4).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 6, 8));
        row.createCell(6).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 9, 10));
        row.createCell(9).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 11, 13));
        row.createCell(11).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 14, 15));
        row.createCell(14).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 16, 18));
        row.createCell(16).setCellValue("Clock Cycles");

        row = sheet.createRow(3);
        row.createCell(2).setCellValue("ID");
        row.createCell(3).setCellValue("Last Modification");
        row.createCell(4).setCellValue("%");
        row.createCell(5).setCellValue("abs");
        row.createCell(6).setCellValue("%");
        row.createCell(7).setCellValue("mean");
        row.createCell(8).setCellValue("variance");
        row.createCell(9).setCellValue("%");
        row.createCell(10).setCellValue("abs");
        row.createCell(11).setCellValue("%");
        row.createCell(12).setCellValue("mean");
        row.createCell(13).setCellValue("variance");
        row.createCell(14).setCellValue("%");
        row.createCell(15).setCellValue("abs");
        row.createCell(16).setCellValue("%");
        row.createCell(17).setCellValue("mean");
        row.createCell(18).setCellValue("variance");

        Map<ActorClass, ExtendExecData> cMap = analyzer.getSumDataMap(ActorClass.class, Key.CRITICAL_CLOCKCYCLES,
                Order.DECREASING);

        // row index
        int rowi = 4;
        for (Entry<ActorClass, ExtendExecData> entry : cMap.entrySet()) {
            ActorClass clazz = entry.getKey();
            ExtendExecData exec = entry.getValue();

            row = sheet.createRow(rowi);
            rowi++;

            row.createCell(0).setCellValue(clazz.getName());
            row.createCell(1).setCellValue(clazz.getSourceFile());
            row.createCell(2).setCellValue(clazz.getVersion().getId());
            cell = row.createCell(3);
            cell.setCellValue(clazz.getVersion().getLastModificationDate());
            cell.setCellStyle(cellStyle);
            cell = row.createCell(4);
            cell.setCellFormula("F" + rowi + "/Summary!A14*100");
            row.createCell(5).setCellValue(exec.getTotalExec().getExecutions());
            cell = row.createCell(6);
            cell.setCellFormula("H" + rowi + "/Summary!B14*100");
            row.createCell(7).setCellValue(exec.getTotalExec().getClockCyclesMean());
            row.createCell(8).setCellValue(exec.getTotalExec().getClockCyclesVariance());
            cell = row.createCell(9);
            cell.setCellFormula("K" + rowi + "/Summary!E14*100");
            row.createCell(10).setCellValue(exec.getNotDeferrableExec().getExecutions());
            cell = row.createCell(11);
            cell.setCellFormula("M" + rowi + "/Summary!G14*100");
            row.createCell(12).setCellValue(exec.getNotDeferrableExec().getClockCyclesMean());
            row.createCell(13).setCellValue(exec.getNotDeferrableExec().getClockCyclesVariance());
            cell = row.createCell(14);
            cell.setCellFormula("P" + rowi + "/Summary!J14*100");
            row.createCell(15).setCellValue(exec.getCriticalExec().getExecutions());
            cell = row.createCell(16);
            cell.setCellFormula("R" + rowi + "/Summary!L14*100");
            row.createCell(17).setCellValue(exec.getCriticalExec().getClockCyclesMean());
            row.createCell(18).setCellValue(exec.getCriticalExec().getClockCyclesVariance());

        }

    }

    private void writeActorsTable(HSSFWorkbook workbook, HotspotsDataAnalyser analyzer) {
        HSSFSheet sheet = workbook.createSheet("Actors");

        // Actors Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("Actors Results");
        title.applyFont(titleFont);
        cell.setCellValue(title);

        Row row = sheet.createRow(1);
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));
        row.createCell(0).setCellValue("Actor");
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));
        row.createCell(1).setCellValue("Class");

        sheet.addMergedRegion(new CellRangeAddress(1, 1, 2, 6));
        row.createCell(2).setCellValue("Total Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 7, 11));
        row.createCell(7).setCellValue("Non Deferrable Executions");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 12, 16));
        row.createCell(12).setCellValue("Critical Executions");

        row = sheet.createRow(2);
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 3));
        row.createCell(2).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 6));
        row.createCell(4).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 7, 8));
        row.createCell(7).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 9, 11));
        row.createCell(9).setCellValue("Clock Cycles");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 12, 13));
        row.createCell(12).setCellValue("Executions");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 14, 16));
        row.createCell(14).setCellValue("Clock Cycles");

        row = sheet.createRow(3);
        row.createCell(2).setCellValue("%");
        row.createCell(3).setCellValue("abs");
        row.createCell(4).setCellValue("%");
        row.createCell(5).setCellValue("mean");
        row.createCell(6).setCellValue("variance");
        row.createCell(7).setCellValue("%");
        row.createCell(8).setCellValue("abs");
        row.createCell(9).setCellValue("%");
        row.createCell(10).setCellValue("mean");
        row.createCell(11).setCellValue("variance");
        row.createCell(12).setCellValue("%");
        row.createCell(13).setCellValue("abs");
        row.createCell(14).setCellValue("%");
        row.createCell(15).setCellValue("mean");
        row.createCell(16).setCellValue("variance");

        Map<Actor, ExtendExecData> aMap = analyzer.getSumDataMap(Actor.class, Key.CRITICAL_CLOCKCYCLES,
                Order.DECREASING);

        // row index
        int rowi = 4;
        for (Entry<Actor, ExtendExecData> entry : aMap.entrySet()) {
            Actor actor = entry.getKey();
            ExtendExecData exec = entry.getValue();

            row = sheet.createRow(rowi);
            rowi++;

            row.createCell(0).setCellValue(actor.getId());
            row.createCell(1).setCellValue(actor.getActorClass().getName());
            cell = row.createCell(2);
            cell.setCellFormula("D" + rowi + "/Summary!A14*100");
            row.createCell(3).setCellValue(exec.getTotalExec().getExecutions());
            cell = row.createCell(4);
            cell.setCellFormula("F" + rowi + "/Summary!B14*100");
            row.createCell(5).setCellValue(exec.getTotalExec().getClockCyclesMean());
            row.createCell(6).setCellValue(exec.getTotalExec().getClockCyclesVariance());
            cell = row.createCell(7);
            cell.setCellFormula("I" + rowi + "/Summary!E14*100");
            row.createCell(8).setCellValue(exec.getNotDeferrableExec().getExecutions());
            cell = row.createCell(9);
            cell.setCellFormula("K" + rowi + "/Summary!G14*100");
            row.createCell(10).setCellValue(exec.getNotDeferrableExec().getClockCyclesMean());
            row.createCell(11).setCellValue(exec.getNotDeferrableExec().getClockCyclesVariance());
            cell = row.createCell(12);
            cell.setCellFormula("N" + rowi + "/Summary!J14*100");
            row.createCell(13).setCellValue(exec.getCriticalExec().getExecutions());
            cell = row.createCell(14);
            cell.setCellFormula("P" + rowi + "/Summary!L14*100");
            row.createCell(15).setCellValue(exec.getCriticalExec().getClockCyclesMean());
            row.createCell(16).setCellValue(exec.getCriticalExec().getClockCyclesVariance());

        }

    }

    private void writeImpactAnalysis(HSSFWorkbook workbook, ImpactData impact) {
        HSSFSheet sheet = workbook.createSheet("Impact Analysis");

        // Impact Analysis Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("Impact analysis");
        title.applyFont(titleFont);
        cell.setCellValue(title);

        int colli = 0;
        Map<Integer, Row> rowsMap = new HashMap<Integer, Row>();
        for (ActionImpactData step : impact.getActionsData()) {
            // action row
            Row row = rowsMap.get(1);
            if (row == null) {
                row = sheet.createRow(1);
                rowsMap.put(1, row);
            }
            row.createCell(colli).setCellValue("Action");
            row.createCell(colli + 1).setCellValue(step.getAction().getId());

            // actor or actor class row
            row = rowsMap.get(2);
            if (row == null) {
                row = sheet.createRow(2);
                rowsMap.put(2, row);
            }
            if (impact.isActorsLevel()) {
                row.createCell(colli).setCellValue("Actor");
                row.createCell(colli + 1).setCellValue(step.getActors().get(0).getId());
            } else {
                row.createCell(colli).setCellValue("ActorClass");
                row.createCell(colli + 1).setCellValue(step.getActors().get(0).getActorClass().getName());
            }

            // reductions row
            row = rowsMap.get(3);
            if (row == null) {
                row = sheet.createRow(3);
                rowsMap.put(3, row);
            }
            row.createCell(colli).setCellValue("WL reduction");
            row.createCell(colli + 1).setCellValue("CP WL reduction");
            for (int i = 0; i < step.getCplReduction().size(); i++) {
                double wl = step.getWlReduction().get(i);
                double cp = step.getCplReduction().get(i);
                row = rowsMap.get(4 + i);
                if (row == null) {
                    row = sheet.createRow(4 + i);
                    rowsMap.put(4 + i, row);
                }
                row.createCell(colli).setCellValue(wl);
                row.createCell(colli + 1).setCellValue(cp);
            }

            colli += 2;
        }

    }

    private void writeSummary(HSSFWorkbook workbook, Network network, HotspotsDataAnalyser analyzer) {
        HSSFSheet sheet = workbook.createSheet("Summary");

        // Network Results
        Cell cell = sheet.createRow(0).createCell(0);
        HSSFRichTextString title = new HSSFRichTextString("Hotspots and Algorithmic Bottlenecks Report Summary");
        title.applyFont(titleFont);
        cell.setCellValue(title);

        // network name
        Row row = sheet.createRow(2);
        row.createCell(0).setCellValue("Network");
        row.createCell(1).setCellValue(network.getName());

        // network cal project
        row = sheet.createRow(3);
        row.createCell(0).setCellValue("CAL Project");
        row.createCell(1).setCellValue(network.getCalProject());

        // network source file
        row = sheet.createRow(4);
        row.createCell(0).setCellValue("Source File");
        row.createCell(1).setCellValue(network.getSourceFile());

        // network version
        sheet.addMergedRegion(new CellRangeAddress(5, 7, 0, 0));
        row = sheet.createRow(5);
        row.createCell(0).setCellValue("Version");
        row.createCell(1).setCellValue("Id");
        row.createCell(2).setCellValue(network.getVersion().getId());
        row = sheet.createRow(6);
        row.createCell(1).setCellValue("Last Modification Date");
        cell = row.createCell(2);
        cell.setCellValue(network.getVersion().getLastModificationDate());
        cell.setCellStyle(cellStyle);
        row = sheet.createRow(7);
        row.createCell(1).setCellValue("Versioning Date");
        cell = row.createCell(2);
        cell.setCellValue(network.getVersion().getVersioningDate());
        cell.setCellStyle(cellStyle);

        // [total | non deferrable | critical]
        row = sheet.createRow(10);
        sheet.addMergedRegion(new CellRangeAddress(10, 10, 0, 2));
        cell = row.createCell(0);
        cell.setCellValue("Total Executions");

        sheet.addMergedRegion(new CellRangeAddress(10, 10, 3, 7));
        cell = row.createCell(3);
        cell.setCellValue("Non Deferrable Executions");

        sheet.addMergedRegion(new CellRangeAddress(10, 10, 8, 12));
        cell = row.createCell(8);
        cell.setCellValue("Critical Executions");

        // [Executions | Workload | slack || Executions | workload || Executions
        // | workload ]
        row = sheet.createRow(11);
        sheet.addMergedRegion(new CellRangeAddress(11, 12, 0, 0));
        cell = row.createCell(0);
        cell.setCellValue("Executions");

        sheet.addMergedRegion(new CellRangeAddress(11, 11, 1, 2));
        cell = row.createCell(1);
        cell.setCellValue("Clock Cycles");

        sheet.addMergedRegion(new CellRangeAddress(11, 11, 3, 4));
        cell = row.createCell(3);
        cell.setCellValue("Executions");

        sheet.addMergedRegion(new CellRangeAddress(11, 11, 5, 7));
        cell = row.createCell(5);
        cell.setCellValue("Clock Cycles");

        sheet.addMergedRegion(new CellRangeAddress(11, 11, 8, 9));
        cell = row.createCell(8);
        cell.setCellValue("Executions");

        sheet.addMergedRegion(new CellRangeAddress(11, 11, 10, 12));
        cell = row.createCell(10);
        cell.setCellValue("Clock Cycles");

        // [* | mean , variance, % ... ]
        row = sheet.createRow(12);
        row.createCell(1).setCellValue("mean");
        row.createCell(2).setCellValue("variance");
        row.createCell(3).setCellValue("%");
        row.createCell(4).setCellValue("abs");
        row.createCell(5).setCellValue("%");
        row.createCell(6).setCellValue("mean");
        row.createCell(7).setCellValue("variance");
        row.createCell(8).setCellValue("%");
        row.createCell(9).setCellValue("abs");
        row.createCell(10).setCellValue("%");
        row.createCell(11).setCellValue("mean");
        row.createCell(12).setCellValue("variance");

        // write down data
        ExtendExecData sumData = analyzer.getSumData();
        row = sheet.createRow(13);

        row.createCell(0).setCellValue(sumData.getTotalExec().getExecutions());
        row.createCell(1).setCellValue(sumData.getTotalExec().getClockCyclesMean());
        row.createCell(2).setCellValue(sumData.getTotalExec().getClockCyclesVariance());
        cell = row.createCell(3);
        cell.setCellFormula("E14/A14*100");
        row.createCell(4).setCellValue(sumData.getNotDeferrableExec().getExecutions());
        cell = row.createCell(5);
        cell.setCellFormula("G14/B14*100");
        row.createCell(6).setCellValue(sumData.getNotDeferrableExec().getClockCyclesMean());
        row.createCell(7).setCellValue(sumData.getNotDeferrableExec().getClockCyclesVariance());
        cell = row.createCell(8);
        cell.setCellFormula("J14/A14*100");
        row.createCell(9).setCellValue(sumData.getCriticalExec().getExecutions());
        cell = row.createCell(10);
        cell.setCellFormula("L14/B14*100");
        row.createCell(11).setCellValue(sumData.getCriticalExec().getClockCyclesMean());
        row.createCell(12).setCellValue(sumData.getCriticalExec().getClockCyclesVariance());
    }

}