package agg.xt_basis;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
/**
* Rule layer is a set of rule layer of a given layered graph grammar. The set
* is backed by a hash table.
*
* @author $Author: olga $
* @version $ID
*/
public class RuleLayer {
private Hashtable<Rule, Integer> ruleLayer;
// private Enumeration<Rule> rules;
private Vector<Rule> rulesVec;
/**
* Creates a new set of rule layers for a given layered graph grammar.
*
* @param rules
* The rules of a graph grammar.
*/
public RuleLayer(Enumeration<Rule> rules) {
// this.rules = rules;
this.rulesVec = new Vector<Rule>(0);
while (rules.hasMoreElements()) {
this.rulesVec.addElement(rules.nextElement());
}
initRuleLayer();
}
public RuleLayer(List<Rule> rules) {
this.rulesVec = new Vector<Rule>(0);
for (int i=0; i<rules.size(); i++) {
this.rulesVec.add(rules.get(i));
}
// this.rules = this.rulesVec.elements();
initRuleLayer();
}
public RuleLayer(Vector<Rule> rules) {
this.rulesVec = rules;
// this.rules = this.rulesVec.elements();
initRuleLayer();
}
public void dispose() {
this.ruleLayer.clear();
this.rulesVec = null;
// this.rules = null;
}
/** Sets the layer of the specified rule */
public void setLayer(Rule rule, int layer) {
rule.setLayer(layer);
this.ruleLayer.put(rule, Integer.valueOf(layer));
}
private void initRuleLayer() {
this.ruleLayer = new Hashtable<Rule, Integer>();
for (int i = 0; i < this.rulesVec.size(); i++) {
Rule rule = this.rulesVec.elementAt(i);
this.ruleLayer.put(rule, Integer.valueOf(rule.getLayer()));
}
}
public boolean compareTo(RuleLayer rl) {
return this.ruleLayer.equals(rl.getRuleLayer());
}
/**
* Returns the rule layer. A rule is a key, a layer is a value.
*
* @return The rule layer.
*/
public Hashtable<Rule, Integer> getRuleLayer() {
return this.ruleLayer;
}
/**
* Returns the smallest layer of the rule layer.
*
* @return The smallest layer.
*/
public Integer getStartLayer() {
int startLayer = Integer.MAX_VALUE;
Integer result = null;
for (Enumeration<Rule> keys = this.ruleLayer.keys(); keys.hasMoreElements();) {
Object key = keys.nextElement();
Integer layer = getRuleLayer().get(key);
if (layer.intValue() < startLayer) {
startLayer = layer.intValue();
result = layer;
}
}
return result;
}
/**
* Inverts a rule layer so that the layer is the key and the value is a set.
*
* @return The inverted layer function.
*/
public Hashtable<Integer, HashSet<Rule>> invertLayer() {
Hashtable<Integer, HashSet<Rule>> inverted = new Hashtable<Integer, HashSet<Rule>>();
for (Enumeration<Rule> keys = this.ruleLayer.keys(); keys.hasMoreElements();) {
Rule key = keys.nextElement();
Integer value = this.ruleLayer.get(key);
HashSet<Rule> invertedValue = inverted.get(value);
if (invertedValue == null) {
invertedValue = new HashSet<Rule>();
invertedValue.add(key);
inverted.put(value, invertedValue);
} else {
invertedValue.add(key);
}
}
return inverted;
}
/**
* Returns the rule layer in a human readable way.
*
* @return The text.
*/
public String toString() {
String resultString = "Rule:\t\tLayer:\n";
for (Enumeration<Rule> keys = this.ruleLayer.keys(); keys.hasMoreElements();) {
Rule key = keys.nextElement();
Integer value = this.ruleLayer.get(key);
resultString += key.getName() + "\t\t" + value.toString() + " "
+ key.getLayer() + "\n";
}
return resultString;
}
}
/*
* $Log: RuleLayer.java,v $
* Revision 1.11 2010/09/23 08:27:31 olga
* tuning
*
* Revision 1.10 2010/03/08 15:51:38 olga
* code optimizing
*
* Revision 1.9 2008/07/21 13:41:40 olga
* Code tuning
*
* Revision 1.8 2008/04/07 09:36:53 olga
* Code tuning: refactoring + profiling
* Extension: CPA - two new options added
*
* Revision 1.7 2007/11/19 08:48:40 olga
* Some GUI usability mistakes fixed.
* Default values in node/edge of a type graph implemented.
* Code tuning.
*
* Revision 1.6 2007/11/01 09:58:15 olga
* Code refactoring: generic types- done
*
* Revision 1.5 2007/09/10 13:05:35 olga
* In this update:
* - package xerces2.5.0 is not used anymore;
* - class com.objectspace.jgl.Pair is replaced by the agg own generic class agg.util.Pair;
* - bugs fixed in: usage of PACs in rules; match completion;
* usage of static method calls in attr. conditions
* - graph editing: added some new features
* Revision 1.4 2007/06/13 08:33:01 olga Update: V161
*
* Revision 1.3 2006/11/01 11:17:29 olga Optimized agg sources of CSP algorithm,
* match usability, graph isomorphic copy, node/edge type multiplicity check for
* injective rule and match
*
* Revision 1.2 2005/10/24 09:04:49 olga GUI tuning
*
* Revision 1.1 2005/08/25 11:56:54 enrico *** empty log message ***
*
* Revision 1.2 2005/06/20 13:37:03 olga Up to now the version 1.2.8 will be
* prepared.
*
* Revision 1.1 2005/05/30 12:58:02 olga Version with Eclipse
*
* Revision 1.6 2005/03/03 13:48:42 olga - Match with NACs and attr. conditions
* with mixed variables - error corrected - save/load class packages written by
* user - PACs : creating T-equivalents - improved - save/load matches of the
* rules (only one match of a rule) - more friendly graph/rule editor GUI - more
* syntactical checks in attr. editor
*
* Revision 1.5 2004/12/20 14:53:49 olga Changes because of matching
* optimisation.
*
* Revision 1.4 2004/04/15 10:49:48 olga Kommentare
*
* Revision 1.3 2003/05/14 17:56:46 komm Added minimum multiplicity and removed
* TODOs
*
* Revision 1.2 2003/03/05 18:24:04 komm sorted/optimized import statements
*
* Revision 1.1.1.1 2002/07/11 12:17:28 olga Imported sources
*
* Revision 1.1 2001/08/16 14:16:53 olga Aenderungen wegen layered graph
* transformation. Rule Layer wird in XML gespeichert und geladen. GraTra
* Optionen werden in XML gespeichert und geladen.
*
* Revision 1.4 2001/08/02 15:22:16 olga Error-Meldungen eingebaut in
* LayerFunction und die Anzeige dieser Meldungen in GUI.
*
* Revision 1.3 2001/07/19 15:20:09 olga Fehlermeldung bei Layer Function.
*
* Revision 1.2 2001/03/08 10:44:52 olga Neue Files aus parser branch in Head
* eingefuegt.
*
* Revision 1.1.2.6 2001/01/28 13:14:54 shultzke API fertig
*
* Revision 1.1.2.5 2001/01/11 11:36:08 shultzke Laden und speichern der
* kritischen Paare geht, es fehlt nur noch das Laden fuer den Parser.
*
* Revision 1.1.2.4 2000/12/26 10:00:04 shultzke Layered Parser hinzugefuegt
*
* Revision 1.1.2.3 2000/12/18 13:33:39 shultzke Optionen veraendert
*
* Revision 1.1.2.2 2000/12/10 20:26:08 shultzke Parser kann XML
*
* Revision 1.1.2.1 2000/12/10 14:55:48 shultzke um Layer erweitert
*
*/