delfos.io.xml.evaluationmeasures.confusionmatricescurve.ConfusionMatricesCurveXML.java Source code

Java tutorial

Introduction

Here is the source code for delfos.io.xml.evaluationmeasures.confusionmatricescurve.ConfusionMatricesCurveXML.java

Source

/* 
 * Copyright (C) 2016 jcastro
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package delfos.io.xml.evaluationmeasures.confusionmatricescurve;

import delfos.io.xml.UnrecognizedElementException;
import delfos.results.evaluationmeasures.confusionmatrix.ConfusionMatricesCurve;
import delfos.results.evaluationmeasures.confusionmatrix.ConfusionMatrix;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Element;

/**
 * Clase para efectuar la entrada/salida en xml de curvas ROC.
 *
 * @author jcastro-inf ( https://github.com/jcastro-inf )
 *
 * @version 1.0 (10-01-2013)s
 *
 * @see ConfusionMatricesCurve
 */
public class ConfusionMatricesCurveXML {

    /**
     * Constante para indicar el nombre de la caracterstica del par en el que
     * se guarda el k para el que se almacena el punto asociado. El k indica el
     * nmero de recomendaciones que se hacen al usuario
     */
    public static final String K = "k";
    /**
     * Nombre del elemento en que se guarda un punto de la curva.
     */
    public static final String MATRIX = "Matrix";
    public static final String FALSE_POSITIVE = "falsePositive";
    public static final String FALSE_NEGATIVE = "falseNegative";
    public static final String TRUE_POSITIVE = "truePositive";
    public static final String TRUE_NEGATIVE = "trueNegative";

    public final static String CONFUSION_MATRIX_CURVE_ELEMENT_NAME = ConfusionMatricesCurve.class.getSimpleName();
    public final static String CURVE_ELEMENT = ConfusionMatricesCurve.class.getSimpleName();

    /**
     * El constructor es privado porque esta clase se utiliza mediante sus
     * mtodos <code>static</code>.
     */
    private ConfusionMatricesCurveXML() {
    }

    /**
     * Construye un objeto {@link Element} con la informacin de la curva que
     * recibe como argumento. Este objeto {@link Element} se puede convertir
     * nuevamente a {@link ConfusionMatricesCurve} utilizando el mtodo {@link ConfusionMatricesCurveXML#getConfusionMatricesCurve(org.jdom2.Element)
     * }
     *
     * @param curve Curva que se desea convertir a {@link Element}
     * @return {@link Element} con la informacin almacenada en la curva
     */
    public static Element getElement(ConfusionMatricesCurve curve) {

        Element curveElement = new Element(CURVE_ELEMENT);

        /*
         * El ndice empieza en uno porque as se hace para recuperar los puntos
         * de una ConfusionMatricesCurve
         */
        for (int index = 0; index < curve.size(); index++) {
            Element par = new Element(MATRIX);

            par.setAttribute(K, Integer.toString(index));
            par.setAttribute(FALSE_POSITIVE, Integer.toString(curve.getFalsePositiveAt(index)));
            par.setAttribute(TRUE_POSITIVE, Integer.toString(curve.getTruePositiveAt(index)));
            par.setAttribute(FALSE_NEGATIVE, Integer.toString(curve.getFalseNegativeAt(index)));
            par.setAttribute(TRUE_NEGATIVE, Integer.toString(curve.getTrueNegativeAt(index)));

            curveElement.addContent(par);
        }

        return curveElement;
    }

    /**
     * Convierte un {@link Element} que contenga la informacin de un
     * ConfusionMatricesCurve en un objeto {@link ConfusionMatricesCurve}.
     *
     *
     * @param element Objeto {@link Element} que contiene la informacin
     * necesaria para construir el objeto {@link ConfusionMatricesCurve}
     *
     * @return {@link ConfusionMatricesCurve} con la informacin que el
     * parmetro element contiene
     *
     * @throws UnrecognizedElementException cuando el {@link Element} que se
     * desea convertir no tiene la informacin que se necesita para construir un
     * {@link ConfusionMatricesCurve} o no est estructurada como se esperaba.
     */
    public static ConfusionMatricesCurve getConfusionMatricesCurve(Element element)
            throws UnrecognizedElementException {
        List<ConfusionMatrix> matrices = new ArrayList<ConfusionMatrix>();

        /*
         * Recorro todos los elementos que representan un punto dentro de esta
         * curva
         */
        List<Element> pares = element.getChildren(MATRIX);
        if (pares.isEmpty()) {
            if ((element.getChild(CURVE_ELEMENT) != null
                    && !element.getChild(CURVE_ELEMENT).getChildren(MATRIX).isEmpty())
                    || !element.getChildren().isEmpty()) {
                // (Si el elemento tiene como hijo una curva y este tiene varias matrices )                                 o   el elemento tiene algn hijo.
                //Global.showWarning("BAD USAGE, the curve belongs to a group of users. Perform 'element.getChild(CURVE_ELEMENT)' to call this method");
                pares = element.getChild(CURVE_ELEMENT).getChildren(MATRIX);
            }
        }

        for (Object par : pares) {
            Element parElement = (Element) par;

            int k = Integer.parseInt(parElement.getAttributeValue(K));
            int falsePositive = Integer.parseInt(parElement.getAttributeValue(FALSE_POSITIVE));
            int falseNegative = Integer.parseInt(parElement.getAttributeValue(FALSE_NEGATIVE));
            int truePositive = Integer.parseInt(parElement.getAttributeValue(TRUE_POSITIVE));
            int trueNegative = Integer.parseInt(parElement.getAttributeValue(TRUE_NEGATIVE));
            matrices.add(new ConfusionMatrix(falsePositive, falseNegative, truePositive, trueNegative));
        }

        if (matrices.isEmpty()) {
            return ConfusionMatricesCurve.emptyCurve();
        } else {
            return new ConfusionMatricesCurve(matrices.toArray(new ConfusionMatrix[0]));
        }
    }
}