// 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/model/PanelInstance.java
// @ToString(exclude = "sheet")
// public class PanelInstance implements Serializable {
// 
//     private final String title;
//     private final StockSheet sheet;
//     private final Dimension dimension;
//     private final boolean canRotate;
//     private final int instanceId;
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public PanelInstance(@NonNull final StockSheet sheet,
//             @NonNull final Dimension dimension,
//             @NonNull final String title,
//             final int instanceId,
//             final boolean canRotate) {
// 
//         this.sheet = sheet;
//         this.title = title;
//         this.dimension = dimension;
//         this.canRotate = canRotate;
//         this.instanceId = instanceId;
// 
//         if (dimension.getWidth() > sheet.getDimension().getWidth() || dimension.getLength() > sheet.getDimension().getLength()) {
//             throw new RuntimeException("panel too large for sheet");
//         }
//     }
// 
//     public StockSheet getSheet() {
//         return sheet;
//     }
// 
//     public Dimension getDimension() {
//         return dimension;
//     }
// 
//     public int getInstanceId() {
//         return instanceId;
//     }
// }
// 
// Path: CutletLib/src/main/java/com/cutlet/lib/data/cuttree/CutTreeStats.java
// @ToString
// public class CutTreeStats {
// 
//     private final int numberOfCuts;
//     private final double totalCutLength;
//     private final double sheetArea;
//     private final double usedArea;
//     private final double wastagePercent;
//     private final double boundingBoxArea;
// 
//     public CutTreeStats(
//             final int numberOfCuts,
//             final double totalCutLength,
//             final double sheetArea,
//             final double usedArea,
//             final double boundingBoxArea) {
// 
//         this.numberOfCuts = numberOfCuts;
//         this.totalCutLength = totalCutLength;
//         this.sheetArea = sheetArea;
//         this.usedArea = usedArea;
//         this.wastagePercent = 100 * (1 - (usedArea / sheetArea));
//         this.boundingBoxArea = boundingBoxArea;
//     }
// 
//     public int getNumberOfCuts() {
//         return numberOfCuts;
//     }
// 
//     public double getTotalCutLength() {
//         return totalCutLength;
//     }
// 
//     public double getSheetArea() {
//         return sheetArea;
//     }
// 
//     public double getUsedArea() {
//         return usedArea;
//     }
// 
//     public double getWastagePercent() {
//         return wastagePercent;
//     }
// 
//     public double getBoundingBoxArea() {
//         return boundingBoxArea;
//     }
// 
// }


import com.cutlet.lib.model.Layout;
import com.cutlet.lib.model.PanelInstance;
import com.cutlet.lib.data.cuttree.CutTreeStats;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.NonNull;
import lombok.ToString;

/*
 * Copyright (C) 2017 rudolf.muehlbauer@gmail.com
 */
package com.cutlet.lib.optimizer;


/**
 *
 * @author rmuehlba
 */
@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;

// 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/model/PanelInstance.java
// @ToString(exclude = "sheet")
// public class PanelInstance implements Serializable {
// 
//     private final String title;
//     private final StockSheet sheet;
//     private final Dimension dimension;
//     private final boolean canRotate;
//     private final int instanceId;
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public PanelInstance(@NonNull final StockSheet sheet,
//             @NonNull final Dimension dimension,
//             @NonNull final String title,
//             final int instanceId,
//             final boolean canRotate) {
// 
//         this.sheet = sheet;
//         this.title = title;
//         this.dimension = dimension;
//         this.canRotate = canRotate;
//         this.instanceId = instanceId;
// 
//         if (dimension.getWidth() > sheet.getDimension().getWidth() || dimension.getLength() > sheet.getDimension().getLength()) {
//             throw new RuntimeException("panel too large for sheet");
//         }
//     }
// 
//     public StockSheet getSheet() {
//         return sheet;
//     }
// 
//     public Dimension getDimension() {
//         return dimension;
//     }
// 
//     public int getInstanceId() {
//         return instanceId;
//     }
// }
// 
// Path: CutletLib/src/main/java/com/cutlet/lib/data/cuttree/CutTreeStats.java
// @ToString
// public class CutTreeStats {
// 
//     private final int numberOfCuts;
//     private final double totalCutLength;
//     private final double sheetArea;
//     private final double usedArea;
//     private final double wastagePercent;
//     private final double boundingBoxArea;
// 
//     public CutTreeStats(
//             final int numberOfCuts,
//             final double totalCutLength,
//             final double sheetArea,
//             final double usedArea,
//             final double boundingBoxArea) {
// 
//         this.numberOfCuts = numberOfCuts;
//         this.totalCutLength = totalCutLength;
//         this.sheetArea = sheetArea;
//         this.usedArea = usedArea;
//         this.wastagePercent = 100 * (1 - (usedArea / sheetArea));
//         this.boundingBoxArea = boundingBoxArea;
//     }
// 
//     public int getNumberOfCuts() {
//         return numberOfCuts;
//     }
// 
//     public double getTotalCutLength() {
//         return totalCutLength;
//     }
// 
//     public double getSheetArea() {
//         return sheetArea;
//     }
// 
//     public double getUsedArea() {
//         return usedArea;
//     }
// 
//     public double getWastagePercent() {
//         return wastagePercent;
//     }
// 
//     public double getBoundingBoxArea() {
//         return boundingBoxArea;
//     }
// 
// }


// Path: CutletLib/src/main/java/com/cutlet/lib/optimizer/OptimizationResult.java
import com.cutlet.lib.model.Layout;
import com.cutlet.lib.model.PanelInstance;
import com.cutlet.lib.data.cuttree.CutTreeStats;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.NonNull;
import lombok.ToString;

/*
 * Copyright (C) 2017 rudolf.muehlbauer@gmail.com
 */
package com.cutlet.lib.optimizer;


/**
 *
 * @author rmuehlba
 */
@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) {
