// Path: src/fdt/fuzzy/measures/FuzzyMeasure.java
// public interface FuzzyMeasure extends Serializable {
//     
//     /**
//      * To calculate the fuzzy measure of a decision nodes S_i that is a subset of S.
//      * @param subset S_i
//      * @param universeSet S
//      * @return the fuzzy measure value.
//      */
//     double evaluate(List<DecisionNode> subset, DecisionSet universeSet);
//     
// }
// 
// Path: src/fdt/core/DecisionNode.java
// public class DecisionNode extends Node {
// 
//     private static final long serialVersionUID = 5241099508522414606L;
// 
//     private double support;
// 
//     /**
//      *
//      */
//     public DecisionNode() {
//     }
// 
//     /**
//      *
//      * @param text
//      * @param support
//      */
//     public DecisionNode(String text, double support) {
//         super(text);
//         this.support = support;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public double getSupport() {
//         return support;
//     }
// 
//     /**
//      *
//      * @param support
//      */
//     public void setSupport(double support) {
//         this.support = support;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     @Override
//     public boolean isLeaf() {
//         return true;
//     }
// 
// }
// 
// Path: src/fdt/core/DecisionSet.java
// public class DecisionSet implements Serializable {
// 
//     private static final long serialVersionUID = -2414492555910250695L;
// 
//     private String name;
//     private final List<DecisionNode> decisionNodes = new ArrayList<>();
//     private IntermediateNode estimator;
//     
//     private final List<Object> bag = new ArrayList<>();
//     
//     /**
//      *
//      */
//     public DecisionSet() {
//     }
// 
//     /**
//      *
//      * @param name
//      */
//     public DecisionSet(String name) {
//         this.name = name;
//     }
// 
//     /**
//      *
//      * @param name
//      * @param estimator
//      */
//     public DecisionSet(String name, IntermediateNode estimator) {
//         this.name = name;
//         this.estimator = estimator;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public IntermediateNode getEstimator() {
//         return estimator;
//     }
// 
//     /**
//      *
//      * @param estimator
//      */
//     public void setEstimator(IntermediateNode estimator) {
//         this.estimator = estimator;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public String getName() {
//         return name;
//     }
// 
//     /**
//      *
//      * @param name
//      */
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     @Override
//     public String toString() {
//         return name;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public List<DecisionNode> getDecisionNodes() {
//         return decisionNodes;
//     }
//     
//     /**
//      *
//      * @param val
//      */
//     public void addToBag(Object val) {
//         bag.add(val);
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public List<Object> getBag() {
//         return bag;
//     }
//     
//     /**
//      *
//      * @param obj
//      * @return
//      */
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == this) {
//             return true;
//         }
// 
//         return super.equals(obj); //To change body of generated methods, choose Tools | Templates.
//     }
// 
// }
// 
// Path: src/fdt/utils/Sorter.java
// public class Sorter<T> {
// 
//     /**
//      *
//      * @param target
//      * @param source
//      * @return
//      */
//     public List<T> sortBy(List<T> target, double[] source) {
// 
//         Tuple<Integer, Double>[] map = new Tuple[source.length];
//         for (int i = 0; i < source.length; i++) {
//             map[i] = new Tuple<>(i, source[i]);
//         }
// 
//         Arrays.sort(map, (a, b) -> a.getSecond().compareTo(b.getSecond()));
// 
//         List<T> sortedTarget = new ArrayList<>();
// 
//         for (int i = 0; i < target.size(); i++) {
//             sortedTarget.add(target.get(map[i].getFirst()));
//         }
// 
//         return sortedTarget;
//     }
// }


import fdt.fuzzy.measures.FuzzyMeasure;
import fdt.core.DecisionNode;
import fdt.core.DecisionSet;
import fdt.utils.Sorter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

package fdt.fuzzy.integrals;


/**
 *
 * An abstract class for the fuzzy integral methods. 
 * Each fuzzy integral needs a fuzzy measure method and a fuzzy value method.
 * 
 * @author Mohammed Jabreel
 */
public abstract class FuzzyIntegralBase implements FuzzyIntegral {

    private static final long serialVersionUID = 3931734251442980554L;

    /**
     * The fuzzy measure method.
     */
    protected FuzzyMeasure fuzzyMeasure;
    
    /**
     * The fuzzy value method. The default is @DefaultFuzzyValue.
     */
    protected FuzzyValue fuzzyValue;

    /**
     * Constructor to set the fuzzy measure that will be used in this integral.
     * @param fuzzyMeasure 
     */
    public FuzzyIntegralBase(FuzzyMeasure fuzzyMeasure) {
        this(fuzzyMeasure, new DefaultFuzzyValue());
    }

    /**
     * Constructor to set the fuzzy measure and the fuzzy value that will be used in this integral.
     * @param fuzzyMeasure
     * @param fuzzyValue 
     */
    public FuzzyIntegralBase(FuzzyMeasure fuzzyMeasure, FuzzyValue fuzzyValue) {
        this.fuzzyMeasure = fuzzyMeasure;
        this.fuzzyValue = fuzzyValue;
    }

    /**
     * Implementation of the abstract evaluate method.
     * @param set
     * @return 
     */
    @Override
    public double evaluate(DecisionSet set) {

// Path: src/fdt/fuzzy/measures/FuzzyMeasure.java
// public interface FuzzyMeasure extends Serializable {
//     
//     /**
//      * To calculate the fuzzy measure of a decision nodes S_i that is a subset of S.
//      * @param subset S_i
//      * @param universeSet S
//      * @return the fuzzy measure value.
//      */
//     double evaluate(List<DecisionNode> subset, DecisionSet universeSet);
//     
// }
// 
// Path: src/fdt/core/DecisionNode.java
// public class DecisionNode extends Node {
// 
//     private static final long serialVersionUID = 5241099508522414606L;
// 
//     private double support;
// 
//     /**
//      *
//      */
//     public DecisionNode() {
//     }
// 
//     /**
//      *
//      * @param text
//      * @param support
//      */
//     public DecisionNode(String text, double support) {
//         super(text);
//         this.support = support;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public double getSupport() {
//         return support;
//     }
// 
//     /**
//      *
//      * @param support
//      */
//     public void setSupport(double support) {
//         this.support = support;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     @Override
//     public boolean isLeaf() {
//         return true;
//     }
// 
// }
// 
// Path: src/fdt/core/DecisionSet.java
// public class DecisionSet implements Serializable {
// 
//     private static final long serialVersionUID = -2414492555910250695L;
// 
//     private String name;
//     private final List<DecisionNode> decisionNodes = new ArrayList<>();
//     private IntermediateNode estimator;
//     
//     private final List<Object> bag = new ArrayList<>();
//     
//     /**
//      *
//      */
//     public DecisionSet() {
//     }
// 
//     /**
//      *
//      * @param name
//      */
//     public DecisionSet(String name) {
//         this.name = name;
//     }
// 
//     /**
//      *
//      * @param name
//      * @param estimator
//      */
//     public DecisionSet(String name, IntermediateNode estimator) {
//         this.name = name;
//         this.estimator = estimator;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public IntermediateNode getEstimator() {
//         return estimator;
//     }
// 
//     /**
//      *
//      * @param estimator
//      */
//     public void setEstimator(IntermediateNode estimator) {
//         this.estimator = estimator;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public String getName() {
//         return name;
//     }
// 
//     /**
//      *
//      * @param name
//      */
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     @Override
//     public String toString() {
//         return name;
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public List<DecisionNode> getDecisionNodes() {
//         return decisionNodes;
//     }
//     
//     /**
//      *
//      * @param val
//      */
//     public void addToBag(Object val) {
//         bag.add(val);
//     }
// 
//     /**
//      *
//      * @return
//      */
//     public List<Object> getBag() {
//         return bag;
//     }
//     
//     /**
//      *
//      * @param obj
//      * @return
//      */
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == this) {
//             return true;
//         }
// 
//         return super.equals(obj); //To change body of generated methods, choose Tools | Templates.
//     }
// 
// }
// 
// Path: src/fdt/utils/Sorter.java
// public class Sorter<T> {
// 
//     /**
//      *
//      * @param target
//      * @param source
//      * @return
//      */
//     public List<T> sortBy(List<T> target, double[] source) {
// 
//         Tuple<Integer, Double>[] map = new Tuple[source.length];
//         for (int i = 0; i < source.length; i++) {
//             map[i] = new Tuple<>(i, source[i]);
//         }
// 
//         Arrays.sort(map, (a, b) -> a.getSecond().compareTo(b.getSecond()));
// 
//         List<T> sortedTarget = new ArrayList<>();
// 
//         for (int i = 0; i < target.size(); i++) {
//             sortedTarget.add(target.get(map[i].getFirst()));
//         }
// 
//         return sortedTarget;
//     }
// }


// Path: src/fdt/fuzzy/integrals/FuzzyIntegralBase.java
import fdt.fuzzy.measures.FuzzyMeasure;
import fdt.core.DecisionNode;
import fdt.core.DecisionSet;
import fdt.utils.Sorter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


package fdt.fuzzy.integrals;


/**
 *
 * An abstract class for the fuzzy integral methods. 
 * Each fuzzy integral needs a fuzzy measure method and a fuzzy value method.
 * 
 * @author Mohammed Jabreel
 */
public abstract class FuzzyIntegralBase implements FuzzyIntegral {

    private static final long serialVersionUID = 3931734251442980554L;

    /**
     * The fuzzy measure method.
     */
    protected FuzzyMeasure fuzzyMeasure;
    
    /**
     * The fuzzy value method. The default is @DefaultFuzzyValue.
     */
    protected FuzzyValue fuzzyValue;

    /**
     * Constructor to set the fuzzy measure that will be used in this integral.
     * @param fuzzyMeasure 
     */
    public FuzzyIntegralBase(FuzzyMeasure fuzzyMeasure) {
        this(fuzzyMeasure, new DefaultFuzzyValue());
    }

    /**
     * Constructor to set the fuzzy measure and the fuzzy value that will be used in this integral.
     * @param fuzzyMeasure
     * @param fuzzyValue 
     */
    public FuzzyIntegralBase(FuzzyMeasure fuzzyMeasure, FuzzyValue fuzzyValue) {
        this.fuzzyMeasure = fuzzyMeasure;
        this.fuzzyValue = fuzzyValue;
    }

    /**
     * Implementation of the abstract evaluate method.
     * @param set
     * @return 
     */
    @Override
    public double evaluate(DecisionSet set) {

        List<DecisionNode> filteredNodes = new ArrayList<>();