/*
* 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.helper;
import com.martiansoftware.jsap.JSAPResult;
import com.martiansoftware.jsap.Parameter;
import at.tuwien.ifs.somtoolbox.SOMToolboxException;
import at.tuwien.ifs.somtoolbox.apps.SOMToolboxApp;
import at.tuwien.ifs.somtoolbox.apps.config.OptionFactory;
import at.tuwien.ifs.somtoolbox.input.SOMLibDataWinnerMapping;
import at.tuwien.ifs.somtoolbox.input.SOMLibFormatInputReader;
import at.tuwien.ifs.somtoolbox.layers.GrowingLayer;
import at.tuwien.ifs.somtoolbox.layers.GrowingLayer.Flip;
import at.tuwien.ifs.somtoolbox.models.GrowingSOM;
import at.tuwien.ifs.somtoolbox.output.SOMLibMapOutputter;
/**
* Rotates a map by the given degrees, and writes a new unit- and weight-vector file.
*
* @author Rudolf Mayer
* @author Jakob Frank
* @version $Id: MapRotator.java 3757 2010-08-17 14:15:41Z frank $
*/
public class MapRotator implements SOMToolboxApp {
public static final Parameter[] OPTIONS = new Parameter[] { OptionFactory.getOptUnitDescriptionFile(true),
OptionFactory.getOptWeightVectorFile(true), OptionFactory.getOptDataWinnerMappingFile(false),
OptionFactory.getOptOutputFileName(true), OptionFactory.getOptRotation(false),
OptionFactory.getOptFlip(false) };
public static final String DESCRIPTION = "Rotates a map by the given degrees, and writes a new unit- and weight-vector file";
public static final String LONG_DESCRIPTION = DESCRIPTION;
public static final Type APPLICATION_TYPE = Type.Helper;
public static void main(String[] args) {
// register and parse all options
JSAPResult config = OptionFactory.parseResults(args, OPTIONS);
String unitDescriptionFile = config.getString("unitDescriptionFile");
String weightVectorFile = config.getString("weightVectorFile");
String dwmFile = config.getString("dataWinnerMappingFile");
String output = config.getString("output");
final String dir = ".";
try {
GrowingSOM gsom = new GrowingSOM(new SOMLibFormatInputReader(weightVectorFile, unitDescriptionFile, null));
SOMLibDataWinnerMapping dwm = null;
if (dwmFile != null) {
dwm = new SOMLibDataWinnerMapping(dwmFile);
}
final int xSize = gsom.getLayer().getXSize();
final int ySize = gsom.getLayer().getYSize();
// Flip map?
if (config.userSpecified("flip")) {
char flip = config.getChar("flip");
switch (flip) {
case 'h':
gsom.getLayer().flip(Flip.HORIZONTAL);
if (dwm != null) {
dwm.flipH(ySize);
}
break;
case 'v':
gsom.getLayer().flip(Flip.VERTICAL);
if (dwm != null) {
dwm.flipV(xSize);
}
break;
default:
System.err.printf("Invalid flip operation: %s%n", config.getString("filp"));
System.exit(1);
break;
}
System.out.printf("Flip: %s%n", flip);
}
if (config.userSpecified("rotation")) {
int rotation = config.getInt("rotation");
try {
GrowingLayer.checkRotation(rotation);
System.out.printf("Rotate: %d%n", rotation);
} catch (SOMToolboxException e) {
System.err.printf("Invalid rotation operatrion: %d%n", rotation);
System.exit(1);
}
gsom.getLayer().rotate(rotation);
if (dwm != null) {
dwm.rotate(rotation / 90, xSize, ySize);
}
}
SOMLibMapOutputter.writeUnitDescriptionFile(gsom, dir, output, true);
SOMLibMapOutputter.writeWeightVectorFile(gsom, dir, output, true);
if (dwm != null) {
SOMLibMapOutputter.writeDataWinnerMappingFile(dwm, dir, output, true);
}
} catch (Exception e) {
System.err.printf("%s%n", e.getMessage());
System.exit(2);
}
}
}