FuzzyTerm.java

package libai.fuzzy;

import libai.fuzzy.sets.FuzzySet;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.lang.reflect.Constructor;

/**
 * Created by kronenthaler on 23/04/2017.
 */
public class FuzzyTerm implements FuzzySet, XMLSerializer {

    private FuzzySet set;
    private String name;
    private boolean complement;

    public FuzzyTerm(Node xmlNode) {
        load(xmlNode);
    }

    public FuzzyTerm(FuzzySet set, String name) {
        this(set, name, false);
    }

    public FuzzyTerm(FuzzySet set, String name, boolean complement) {
        this.set = set;
        this.name = name;
        this.complement = complement;
    }

    @Override
    public double eval(double x) {
        if (complement) {
            return 1 - set.eval(x);
        }
        return set.eval(x);
    }

    @Override
    public String toXMLString(String indent) {
        return String.format("%s<FuzzyTerm name=\"%s\" complement=\"%s\">%n%s%n%s</FuzzyTerm>", indent, name, Boolean.toString(complement), set.toXMLString(indent + "\t"), indent);
    }

    @Override
    public void load(Node xmlNode) {
        NamedNodeMap attributes = xmlNode.getAttributes();
        name = attributes.getNamedItem("name").getTextContent();

        if (attributes.getNamedItem("complement") != null) {
            complement = Boolean.parseBoolean(attributes.getNamedItem("complement").getTextContent());
        }

        NodeList children = xmlNode.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node current = children.item(i);
            if (current.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }

            String setClass = current.getNodeName();
            try {
                Class<?> clazz = Class.forName("libai.fuzzy.sets." + setClass);
                Constructor<?> ctor = clazz.getConstructor(Node.class);
                set = (FuzzySet) ctor.newInstance(new Object[]{current});
            } catch (Exception e) {
                throw new IllegalArgumentException(e.getMessage());
            }
        }
    }

    public String getName() {
        return name;
    }
}