/*
* 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.models;
import java.util.Vector;
import at.tuwien.ifs.somtoolbox.layers.GrowingLayer;
import at.tuwien.ifs.somtoolbox.layers.LayerAccessException;
import at.tuwien.ifs.somtoolbox.layers.Unit;
/**
* represents all layers of one level
*
* @author Simon Tragatschnig
*/
public class GHSOMLevelLayer {
/** the number of layers in the hierarchy * */
private static int depth = 0;
public static int getDepth() {
return depth;
}
public static void setDepth(int depth) {
GHSOMLevelLayer.depth = depth;
}
private GHSOMLevelLayer children = null;
private int level;
private Vector<GrowingLayer> levelLayer = new Vector<GrowingLayer>();
private GHSOMLevelLayer root;
/**
* the constructor for the root-level
*/
protected GHSOMLevelLayer(GrowingLayer root) {
Vector<GrowingLayer> rootLayer = new Vector<GrowingLayer>();
rootLayer.add(root);
levelLayer = rootLayer;
children = getSubLevelLayer(root);
this.level = 0;
this.root = this;
}
/** the constructor for any other level */
protected GHSOMLevelLayer(Vector<GrowingLayer> layer, int level) {
levelLayer = layer;
this.level = level;
}
/** creates the children-layer of a levelLayer */
private GHSOMLevelLayer getChildLevel(GHSOMLevelLayer levelLayer) {
Vector<GrowingLayer> childrenLayer = new Vector<GrowingLayer>();
for (GrowingLayer singleLayer : levelLayer.getLevelLayer()) {
GHSOMLevelLayer layer = getSubLevelLayer(singleLayer);
childrenLayer.addAll(layer.getLevelLayer());
}
GHSOMLevelLayer childlevellayer = new GHSOMLevelLayer(childrenLayer, this.getLevel() + 1);
if (GHSOMLevelLayer.depth < this.getLevel() + 1) {
GHSOMLevelLayer.depth = this.getLevel() + 1;
}
return childlevellayer;
}
/** returns the childrenLevelLayer of this levelLayer or null, if no children exist */
public GHSOMLevelLayer getChildren() {
if (children.levelLayer.size() > 0) {
return children;
}
return null;
}
public int getLevel() {
return level;
}
public Vector<GrowingLayer> getLevelLayer() {
return levelLayer;
}
public GHSOMLevelLayer getRoot() {
return root;
}
/** returns the levelLayer of a layer - all sub-layers of any units will be added */
private GHSOMLevelLayer getSubLevelLayer(GrowingLayer layer) {
Vector<GrowingLayer> sublevel = new Vector<GrowingLayer>();
// step through each unit and check, if there exists a sublevel
for (int i = 0; i < layer.getUnits().length; i++) {
for (int j = 0; j < layer.getUnits()[i].length; j++) {
try {
Unit u = layer.getUnit(i, j);
if (u != null) {
if (u.getMappedSOM() != null) {
sublevel.add(layer.getUnit(i, j).getMappedSOM().getLayer());
}
}
} catch (LayerAccessException e) {
// will not happen!
e.printStackTrace();
}
}
}
GHSOMLevelLayer sublevellayer = new GHSOMLevelLayer(sublevel, layer.getLevel() + 1);
sublevellayer.setChildren(getChildLevel(sublevellayer));
return sublevellayer;
}
public boolean hasChildren() {
if (children != null && children.levelLayer.size() > 0) {
return true;
}
return false;
}
public void setChildren(GHSOMLevelLayer children) {
this.children = children;
}
public void setLevel(int level) {
this.level = level;
}
public void setLevelLayer(Vector<GrowingLayer> levelLayer) {
this.levelLayer = levelLayer;
}
public void setRoot(GHSOMLevelLayer root) {
this.root = root;
}
}