/*
* 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.visualization.clustering;
import java.util.Hashtable;
import at.tuwien.ifs.somtoolbox.apps.viewer.GeneralUnitPNode;
public class UnitKMeans extends KMeans {
private static Hashtable<double[], GeneralUnitPNode> unitLookupTable;
public UnitKMeans(int k, GeneralUnitPNode[][] units) {
super(k, convert(units));
}
public UnitKMeans(int k, GeneralUnitPNode[][] units, InitType initialisation) {
super(k, convert(units), initialisation);
}
/**
* Convert a GeneralUnitPNode[][] to a simple doule[][].
*
* @param units units to convert to.
* @return plain double[][] data matrix.
*/
public static double[][] convert(GeneralUnitPNode[][] units) {
double[][] data = new double[units.length * units[0].length][];
unitLookupTable = new Hashtable<double[], GeneralUnitPNode>();
int i = 0;
for (int y = 0; y < units[0].length; y++) {
for (GeneralUnitPNode[] unit : units) {
data[i] = unit[y].getUnit().getWeightVector();
unitLookupTable.put(data[i], unit[y]);
i++;
}
}
return data;
}
/**
* Returns the ClusterNodes for the given level. Thanks a million Angela for this prime example of programming art
* :-)
*/
public ClusterNode[] getClusterNodes(int level) {
ClusterNode newNode = null;
ClusterNode[] clusterNodes = new ClusterNode[clusters.length];
for (int clusterIndex = 0; clusterIndex < clusters.length; clusterIndex++) {
level--;
double[][] instances = clusters[clusterIndex].getInstances(data);
for (int instanceIndex = 0; instanceIndex < instances.length; instanceIndex++) {
// create new node
if (instanceIndex == 0) {
newNode = new ClusterNode(unitLookupTable.get(instances[instanceIndex]), level);
} else {
newNode = new ClusterNode(newNode,
new ClusterNode(unitLookupTable.get(instances[instanceIndex]), 1), level);
}
}
clusterNodes[clusterIndex] = newNode;
}
return clusterNodes;
}
}