public CostGenerator(MatrixGenerator m, ComponentInstance ci, int type) {
   mainComponent = ci;
   matrix = m;
   dsmGenerator = new DsmGenerator(matrix, mainComponent, type);
   depth = dsmGenerator.getDepth();
   cost = 0;
   total = 0;
   impactReports = new HashMap<String, CostImpactReport>();
 }
  public void compute() {
    int[][][] dsms;
    int[][] dsm;
    CostImpactReport impactReport;
    String componentName;
    dsms = new int[depth][depth][depth];

    if (depth == 0) {
      System.out.println("[COSTGENERATOR] ERROR depth==0");
      return;
    }

    /*
     * Compute all DSM matrixes
     */
    for (int i = 0; i < depth; i++) {
      dsms[i] = dsmGenerator.getDsm(i);
    }

    /*
     * Compute the final cost impact
     */
    for (int i = 0; i < depth; i++) {
      for (int j = 0; j < depth; j++) {
        for (int k = 0; k < depth; k++) {
          total += (double) dsms[i][j][k];
        }
      }
    }

    /*
     * Compute the slocs impact for each component
     */
    for (int c = 0; c < dsmGenerator.getComponents().size(); c++) {
      long slocs;
      int crit;
      String depName;
      ComponentInstance depInstance;
      ComponentInstance component;

      component = dsmGenerator.getComponents().get(c);
      componentName = Utils.getComponentName(component);

      impactReport = new CostImpactReport(componentName);
      System.out.println("Cost analysis for: " + componentName);
      for (int d = 0; d < depth; d++) {
        System.out.println("DEPTH=" + d);
        dsm = dsmGenerator.getDsm(d);

        for (int dep = 0; dep < dsmGenerator.getComponents().size(); dep++) {
          depInstance = dsmGenerator.getComponents().get(dep);
          depName = Utils.getComponentName(depInstance);

          slocs = SlocProperty.getSloc(depInstance);
          crit = CriticalityProperty.getCriticality(depInstance);
          System.out.println(
              "   Looking for dep (depth="
                  + d
                  + "): "
                  + depName
                  + "(crit="
                  + crit
                  + ";slocs="
                  + slocs
                  + ";coeff="
                  + dsm[c][dep]
                  + ")");

          if (dsm[dep][c] > 0) {
            System.out.println(
                "   Looking for dep (depth="
                    + d
                    + "): "
                    + depName
                    + "(crit="
                    + crit
                    + ";slocs="
                    + slocs
                    + ";coeff="
                    + dsm[c][dep]
                    + ")");
            impactReport.addSlocs(slocs * dsm[dep][c], crit);
          }
        }
      }
      impactReports.put(componentName, impactReport);
    }

    cost = total / (double) ((depth * depth));
    System.out.println(
        "[COSTGENERATOR] Cost=" + cost + "(total = " + total + " depth=" + depth + ")");
  }