package agg.termination;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import agg.xt_basis.GraphObject;
/**
* Type layer is a set of type layers of a given layered graph grammar.
* A type means to be an object (Node resp. Edge) of a type graph.
*
* @author $Author: olga $
* @version $ID
*/
public class TypeLayerOfTypeGraph {
private Hashtable<GraphObject, Integer> typeLayer;
private Hashtable<GraphObject, Integer> types;
/**
* Creates a new set of type layers for a given layered graph grammar.
*
* @param types
* The types of a graph grammar.
*/
public TypeLayerOfTypeGraph(Hashtable<GraphObject, Integer> types) {
this.types = types;
initTypeLayer();
}
/** Sets the layer of the specified type */
public void setLayer(GraphObject type, int layer) {
this.typeLayer.put(type, Integer.valueOf(layer));
// System.out.println("type layer: "+((Integer)
// this.typeLayer.get(type)).toString());
}
private void initTypeLayer() {
this.typeLayer = new Hashtable<GraphObject, Integer>();
for (Enumeration<GraphObject> keys = this.types.keys(); keys.hasMoreElements();) {
GraphObject t = keys.nextElement();
this.typeLayer.put(t, this.types.get(t));
// System.out.println("type , layer: "+t+" ," +((Integer)
// this.typeLayer.get(t)).toString());
}
}
/**
* Returns the type layer. A type graph object is a key, a layer is a value.
*
* @return The type layer.
*/
public Hashtable<GraphObject, Integer> getTypeLayer() {
return this.typeLayer;
}
/**
* Returns the smallest layer of the type layer.
*
* @return The smallest layer.
*/
public Integer getStartLayer() {
int startLayer = Integer.MAX_VALUE;
Integer result = null;
for (Enumeration<GraphObject> keys = getTypeLayer().keys(); keys.hasMoreElements();) {
Object key = keys.nextElement();
Integer layer = getTypeLayer().get(key);
if (layer.intValue() < startLayer) {
startLayer = layer.intValue();
result = layer;
}
}
return result;
}
/**
* Inverts a type layer so that the layer is the key and the value is a set.
*
* @return The inverted layer function.
*/
public Hashtable<Integer, HashSet<Object>> invertLayer() {
Hashtable<Integer, HashSet<Object>> inverted = new Hashtable<Integer, HashSet<Object>>();
for (Enumeration<GraphObject> keys = this.typeLayer.keys(); keys.hasMoreElements();) {
GraphObject key = keys.nextElement();
// System.out.println("TypeLayer:: "+key);
Integer value = this.typeLayer.get(key);
// System.out.println("TypeLayer:: "+value);
HashSet<Object> invertedValue = inverted.get(value);
if (invertedValue == null) {
invertedValue = new HashSet<Object>();
invertedValue.add(key);
inverted.put(value, invertedValue);
} else {
invertedValue.add(key);
}
}
return inverted;
}
/**
* Returns the type layer in a human readable way.
*
* @return The text.
*/
public String toString() {
String resultString = "Type:\t\tLayer:\n";
for (Enumeration<GraphObject> keys = this.typeLayer.keys(); keys.hasMoreElements();) {
GraphObject key = keys.nextElement();
Integer value = this.typeLayer.get(key);
resultString += key.toString() + "\t\t" + value.toString()
+ "\n";
}
return resultString;
}
}