/* * Copyright 2004-2010 Information & Software Engineering Group (188/1) * Institute of Software Technology and Interactive Systems * Vienna University of Technology, Austria * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.tuwien.ifs.somtoolbox.apps; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileWriter; import java.util.logging.Logger; import com.martiansoftware.jsap.JSAPResult; import com.martiansoftware.jsap.Parameter; import at.tuwien.ifs.somtoolbox.apps.config.OptionFactory; import at.tuwien.ifs.somtoolbox.data.InputData; import at.tuwien.ifs.somtoolbox.data.InputDataFactory; import at.tuwien.ifs.somtoolbox.input.SOMLibDataWinnerMapping; import at.tuwien.ifs.somtoolbox.input.SOMLibFileFormatException; import at.tuwien.ifs.somtoolbox.input.SOMLibFormatInputReader; import at.tuwien.ifs.somtoolbox.layers.GrowingLayer; import at.tuwien.ifs.somtoolbox.layers.quality.QualityMeasure; import at.tuwien.ifs.somtoolbox.models.GrowingSOM; import at.tuwien.ifs.somtoolbox.models.NetworkModel; /** * Wrapper for the individual Quality Measures. * * @author Gerd Platzgummer * @version $Id: QualityMeasureComputer.java 3896 2010-11-03 16:45:12Z mayer $ */ public class QualityMeasureComputer implements NetworkModel, SOMToolboxApp { public static final Parameter[] OPTIONS = new Parameter[] { OptionFactory.getOptWeightVectorFile(true), OptionFactory.getOptMapDescriptionFile(true), OptionFactory.getOptUnitDescriptionFile(true), OptionFactory.getOptInputVectorFile(true), OptionFactory.getOptTemplateVectorFile(false), OptionFactory.getOptDataWinnerMappingFile(false), OptionFactory.getOptQualityMeasureClass(true), OptionFactory.getOptQualityMeasureVariant(true), OptionFactory.getOptK(false), OptionFactory.getOptOutputFileName(true), OptionFactory.getOptProperties(false) }; public static final String DESCRIPTION = "Wrapper for the individual Quality Measures"; public static final String LONG_DESCRIPTION = DESCRIPTION; public static final Type APPLICATION_TYPE = Type.Helper; public static void main(String[] args) throws FileNotFoundException, SOMLibFileFormatException { GrowingSOM gsom = null; InputData data = null; // register and parse all options JSAPResult config = OptionFactory.parseResults(args, OPTIONS); String weightFileName = config.getString("weightVectorFile", null); String mapDescFileName = config.getString("mapDescriptionFile", null); String unitDescFileName = config.getString("unitDescriptionFile", null); String inputVectorFileName = config.getString("inputVectorFile", null); String dataWinnerMappingFile = config.getString("dataWinnerMappingFile", null); // String templateFileName = config.getString("templateVectorFile", null); String qualityMeasureClass = config.getString("qualityMeasureClass", null); String qualityMeasureVariant = config.getString("qualityMeasureVariant", null); String k = config.getString("k", "5"); String outputfile = config.getString("o", null); SOMLibDataWinnerMapping dataWinnerMapping = null; if (dataWinnerMappingFile != null) { dataWinnerMapping = new SOMLibDataWinnerMapping(dataWinnerMappingFile); } data = InputDataFactory.open(inputVectorFileName); try { gsom = new GrowingSOM(new SOMLibFormatInputReader(weightFileName, unitDescFileName, mapDescFileName)); } catch (Exception e) { Logger.getLogger("at.tuwien.ifs.somtoolbox").severe(e.getMessage() + " Aborting."); System.exit(-1); } // BEARBEITUNG DER EINGELESENEN ARGUMENTE try { GrowingLayer layer = gsom.getLayer(); /* * Quality measeures____________________________________________________________________________________ */ QualityMeasure inzrqm = null; at.tuwien.ifs.somtoolbox.layers.quality.TopographicFunction q5_tf = null; if (qualityMeasureClass.equals("q_te")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.TopographicError(layer, data); } else if (qualityMeasureClass.equals("q_qe")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.QuantizationError(layer, data); } else if (qualityMeasureClass.equals("q_id")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.IntrinsicDistance(layer, data); } else if (qualityMeasureClass.equals("q_tp")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.TopographicProduct(layer, data); } else if (qualityMeasureClass.equals("q_tf")) { q5_tf = new at.tuwien.ifs.somtoolbox.layers.quality.TopographicFunction(layer, data); } else if (qualityMeasureClass.equals("q_tw")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.Trustworthiness_NeighborhoodPreservation(layer, data); } else if (qualityMeasureClass.equals("q_np")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.Trustworthiness_NeighborhoodPreservation(layer, data); } else if (qualityMeasureClass.equals("q_dist")) { inzrqm = new at.tuwien.ifs.somtoolbox.layers.quality.SOMDistortion(layer, data); } else { throw new Exception("Quality measure class " + qualityMeasureClass + " is unknown."); } /* * Variants of the measures____________________________________________________________________________________ */ /* * @ 1. Topographic Error______________________ */ if (qualityMeasureVariant.equals("TE_Unit")) { printDoubles(inzrqm.getUnitQualities(qualityMeasureVariant), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("TE8_Unit")) { printDoubles(inzrqm.getUnitQualities(qualityMeasureVariant), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("TE_Map")) { printDouble(inzrqm.getMapQuality(qualityMeasureVariant), outputfile); } else if (qualityMeasureVariant.equals("TE8_Map")) { printDouble(inzrqm.getMapQuality(qualityMeasureVariant), outputfile); } /* * @ 2. Quantization Error_____________________ */ else if (qualityMeasureVariant.equals("QE_Unit")) { printDoubles(inzrqm.getUnitQualities("qe"), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("MQE_Unit")) { printDoubles(inzrqm.getUnitQualities("mqe"), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("QE_Map")) { printDouble(inzrqm.getMapQuality("mqe"), outputfile); } else if (qualityMeasureVariant.equals("MQE_Map")) { printDouble(inzrqm.getMapQuality("mmqe"), outputfile); } /* * @ 3. Intrinsic Distance_____________________ */ else if (qualityMeasureVariant.equals("ID_Unit")) { printDoubles(inzrqm.getUnitQualities(qualityMeasureVariant), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("ID_Map")) { printDouble(inzrqm.getMapQuality(qualityMeasureVariant), outputfile); } /* * @ 4. Topographic Product_____________________ */ else if (qualityMeasureVariant.equals("TP_Unit")) { String trickydick = qualityMeasureVariant + "|" + k; printDoubles(inzrqm.getUnitQualities(trickydick), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("TP_Map")) { printDouble(inzrqm.getMapQuality(qualityMeasureVariant), outputfile); } /* * @ 5. Topographic Funtion_____________________ */ else if (qualityMeasureClass.equals("q_tf")) { printFunctionValues(q5_tf.getFunctionValues(Integer.parseInt(k)), Integer.parseInt(k) * 2 + 1, outputfile); } /* * @ 6. Trustworthiness and 7. Neighborhood Preservation_____________________ */ else if (qualityMeasureVariant.equals("TW_Unit")) { String trickydick = qualityMeasureVariant + "|" + k; printDoubles(inzrqm.getUnitQualities(trickydick), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("TW_Map")) { String trickydick = qualityMeasureVariant + "|" + k; printDouble(inzrqm.getMapQuality(trickydick), outputfile); } else if (qualityMeasureVariant.equals("NP_Unit")) { String trickydick = qualityMeasureVariant + "|" + k; printDoubles(inzrqm.getUnitQualities(trickydick), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("NP_Map")) { String trickydick = qualityMeasureVariant + "|" + k; printDouble(inzrqm.getMapQuality(trickydick), outputfile); } /* * @ 8. SOM Distortion Measure_____________________ */ else if (qualityMeasureVariant.equals("Dist_UnitTotal")) { printDoubles(inzrqm.getUnitQualities(qualityMeasureVariant), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("Dist_UnitAvg")) { printDoubles(inzrqm.getUnitQualities(qualityMeasureVariant), layer.getXSize(), layer.getYSize(), outputfile); } else if (qualityMeasureVariant.equals("Dist_Map")) { printDouble(inzrqm.getMapQuality(qualityMeasureVariant), outputfile); } } catch (Exception ex) { System.out.println("Exception:" + ex.getMessage() + "\n\n"); ex.printStackTrace(); } } public static void printDouble(double dvalue, String outputfile) { try { System.out.print(dvalue); System.out.println(); if (outputfile != null) { BufferedWriter bw = new BufferedWriter(new FileWriter(outputfile)); /* Print output in File */ bw.write(dvalue + ""); bw.newLine(); bw.close(); } } catch (Exception ex) { System.out.println("Output error: " + ex.getMessage()); } } public static void printDoubles(double[][] values, int xsize, int ysize, String outputfile) { try { BufferedWriter bw = null; if (outputfile != null) { bw = new BufferedWriter(new FileWriter(outputfile)); /* Print output in File */ } for (int y = 0; y < ysize; y++) { for (int x = 0; x < xsize; x++) { System.out.print(values[x][y]); System.out.print(" "); if (outputfile != null) { bw.write(values[x][y] + (x == xsize - 1 ? "" : " ")); } } System.out.println(); if (outputfile != null) { bw.newLine(); } } if (outputfile != null) { bw.close(); } } catch (Exception ex) { System.out.println("Output error: " + ex.getMessage()); } } public static void printFunctionValues(double[] values, int length, String outputfile) { try { BufferedWriter bw = null; if (outputfile != null) { bw = new BufferedWriter(new FileWriter(outputfile)); /* Print output in File */ } for (int i = 0; i < length; i++) { System.out.print(i - (length - 1) / 2); System.out.print(": "); System.out.print(values[i]); System.out.print("\n"); if (outputfile != null) { bw.write(values[i] + (i == length - 1 ? "" : "\n")); } } if (outputfile != null) { bw.close(); } } catch (Exception ex) { System.out.println("Output error: " + ex.getMessage()); } } }