// Path: CutletLib/src/main/java/com/cutlet/lib/model/Layout.java
// @ToString
// public class Layout implements Serializable {
// 
//     private final StockSheet sheet;
//     private final int id;
//     private final CutTree cutTree;
// 
//     public Layout(@NonNull final StockSheet sheet, final int id) {
//         this.sheet = sheet;
//         this.id = id;
//         this.cutTree = new CutTree(sheet);
//     }
// 
//     public StockSheet getSheet() {
//         return sheet;
//     }
// 
//     public int getId() {
//         return id;
//     }
// 
//     public int getNumberOfPlacedPanels() {
//         int num = 0;
//         for (CutTreeNode node : getCutTree()) {
//             if (node instanceof PanelNode) {
//                 num++;
//             }
//         }
//         return num;
//     }
// 
//     public int getNumberOfSubSheets() {
//         int num = 0;
//         for (CutTreeNode n : getCutTree()) {
//             num++;
//         }
//         return num;
//     }
// 
//     public CutTree getCutTree() {
//         return cutTree;
//     }
// }
// 
// Path: CutletLib/src/main/java/com/cutlet/lib/optimizer/OptimizationResult.java
// @ToString
// public class OptimizationResult implements Serializable {
// 
//     private final List<Layout> layouts = new ArrayList<>();
//     private double runtime;
// 
//     public void createNewLayout(@NonNull PanelInstance p) {
//         addLayout(new Layout(p.getSheet(), layouts.size()));
//     }
// 
//     private void addLayout(Layout l) {
//         layouts.add(l);
//     }
// 
//     public OptimizationResultStats getStats() {
//         int numberOfCuts = 0;
//         int numberOfLayouts = layouts.size();
//         double totalCutLength = 0;
//         double sheetArea = 0;
//         double usedArea = 0;
//         double boundingBoxArea = 0;
//         for (Layout layout : layouts) {
//             CutTreeStats substats = layout.getCutTree().getStats();
//             numberOfCuts += substats.getNumberOfCuts();
//             totalCutLength += substats.getTotalCutLength();
//             sheetArea += substats.getSheetArea();
//             usedArea += substats.getUsedArea();
//             boundingBoxArea += substats.getBoundingBoxArea();
//         }
//         OptimizationResultStats stats = new OptimizationResultStats(numberOfLayouts,
//                 numberOfCuts,
//                 totalCutLength,
//                 sheetArea,
//                 usedArea,
//                 boundingBoxArea);
//         return stats;
//     }
// 
//     public List<Layout> getLayouts() {
//         return layouts;
//     }
// 
//     public double getRuntime() {
//         return runtime;
//     }
// 
//     public void setRuntime(double runtime) {
//         this.runtime = runtime;
//     }
// 
// }


import java.io.PrintStream;
import lombok.NonNull;
import com.cutlet.lib.model.Layout;
import com.cutlet.lib.optimizer.OptimizationResult;

/*
 * Copyright (C) 2017 rudolf.muehlbauer@gmail.com
 */

package com.cutlet.lib.testing;


/**
 *
 * @author rmuehlba
 */
public class ConsoleOutput {

    public static void dumpResult(@NonNull OptimizationResult r) {
        dumpResult(System.err, r);
    }
    
    public static void dumpResult(@NonNull PrintStream out, @NonNull OptimizationResult r) {
        out.println("");
        out.println("");
        out.println("RESULT");


// Path: CutletLib/src/main/java/com/cutlet/lib/model/Layout.java
// @ToString
// public class Layout implements Serializable {
// 
//     private final StockSheet sheet;
//     private final int id;
//     private final CutTree cutTree;
// 
//     public Layout(@NonNull final StockSheet sheet, final int id) {
//         this.sheet = sheet;
//         this.id = id;
//         this.cutTree = new CutTree(sheet);
//     }
// 
//     public StockSheet getSheet() {
//         return sheet;
//     }
// 
//     public int getId() {
//         return id;
//     }
// 
//     public int getNumberOfPlacedPanels() {
//         int num = 0;
//         for (CutTreeNode node : getCutTree()) {
//             if (node instanceof PanelNode) {
//                 num++;
//             }
//         }
//         return num;
//     }
// 
//     public int getNumberOfSubSheets() {
//         int num = 0;
//         for (CutTreeNode n : getCutTree()) {
//             num++;
//         }
//         return num;
//     }
// 
//     public CutTree getCutTree() {
//         return cutTree;
//     }
// }
// 
// Path: CutletLib/src/main/java/com/cutlet/lib/optimizer/OptimizationResult.java
// @ToString
// public class OptimizationResult implements Serializable {
// 
//     private final List<Layout> layouts = new ArrayList<>();
//     private double runtime;
// 
//     public void createNewLayout(@NonNull PanelInstance p) {
//         addLayout(new Layout(p.getSheet(), layouts.size()));
//     }
// 
//     private void addLayout(Layout l) {
//         layouts.add(l);
//     }
// 
//     public OptimizationResultStats getStats() {
//         int numberOfCuts = 0;
//         int numberOfLayouts = layouts.size();
//         double totalCutLength = 0;
//         double sheetArea = 0;
//         double usedArea = 0;
//         double boundingBoxArea = 0;
//         for (Layout layout : layouts) {
//             CutTreeStats substats = layout.getCutTree().getStats();
//             numberOfCuts += substats.getNumberOfCuts();
//             totalCutLength += substats.getTotalCutLength();
//             sheetArea += substats.getSheetArea();
//             usedArea += substats.getUsedArea();
//             boundingBoxArea += substats.getBoundingBoxArea();
//         }
//         OptimizationResultStats stats = new OptimizationResultStats(numberOfLayouts,
//                 numberOfCuts,
//                 totalCutLength,
//                 sheetArea,
//                 usedArea,
//                 boundingBoxArea);
//         return stats;
//     }
// 
//     public List<Layout> getLayouts() {
//         return layouts;
//     }
// 
//     public double getRuntime() {
//         return runtime;
//     }
// 
//     public void setRuntime(double runtime) {
//         this.runtime = runtime;
//     }
// 
// }


// Path: CutletLib/src/main/java/com/cutlet/lib/testing/ConsoleOutput.java
import java.io.PrintStream;
import lombok.NonNull;
import com.cutlet.lib.model.Layout;
import com.cutlet.lib.optimizer.OptimizationResult;

/*
 * Copyright (C) 2017 rudolf.muehlbauer@gmail.com
 */

package com.cutlet.lib.testing;


/**
 *
 * @author rmuehlba
 */
public class ConsoleOutput {

    public static void dumpResult(@NonNull OptimizationResult r) {
        dumpResult(System.err, r);
    }
    
    public static void dumpResult(@NonNull PrintStream out, @NonNull OptimizationResult r) {
        out.println("");
        out.println("");
        out.println("RESULT");


        for (Layout l : r.getLayouts()) {
