5 /** This class computes the maximum size of sets and relations */
7 public class ComputeMaxSize {
9 Hashtable sizemap; /* -1 means infinity */
12 public ComputeMaxSize(State state) {
14 sizemap=new Hashtable();
18 /** This method compute relation and set maximum sizes */
19 private void computesizes() {
20 Vector rules=state.vRules;
22 Set descriptorset=new HashSet();
23 descriptorset.addAll(state.stSets.getAllDescriptors());
24 descriptorset.addAll(state.stRelations.getAllDescriptors());
27 for(Iterator dit=descriptorset.iterator();dit.hasNext();) {
28 Descriptor d=(Descriptor)dit.next();
29 if (d instanceof ReservedSetDescriptor)
32 for(int i=0;i<rules.size();i++) {
33 Rule r=(Rule)rules.get(i);
34 if (r.getInclusion().getTargetDescriptors().contains(d)) {
35 /* This rule may add items to this set or relation */
37 for(int j=0;j<r.numQuantifiers();j++) {
38 Quantifier q=r.getQuantifier(j);
40 if (q instanceof RelationQuantifier) {
41 Descriptor d2=((RelationQuantifier)q).getRelation();
42 if (sizemap.containsKey(d2)) {
43 size=((Integer)sizemap.get(d2)).intValue();
45 if ((size!=0)&&(d==d2))
47 } if (q instanceof SetQuantifier) {
48 Descriptor d2=((SetQuantifier)q).getSet();
49 if (sizemap.containsKey(d2)) {
50 size=((Integer)sizemap.get(d2)).intValue();
52 if ((size!=0)&&(d==d2))
57 if ((rulesize!=0)&&((size==-1)||(rulesize==-1)))
60 rulesize=rulesize*size;
63 if ((rulesize==-1)||(totalsize==-1))
69 if (!sizemap.containsKey(d)||((Integer)sizemap.get(d)).intValue()!=totalsize) {
71 sizemap.put(d,new Integer(totalsize));
76 int getsize(Descriptor d) {
77 return ((Integer)sizemap.get(d)).intValue();