QedeqNumbers.java
001 package org.qedeq.kernel.se.visitor;
002 
003 /**
004  * Contains various counter values for a {@link org.qedeq.kernel.se.base.module.Qedeq}.
005  *
006  @author  Michael Meyling
007  */
008 public class QedeqNumbers {
009 
010     /** Number of imports. */
011     private int imports;
012 
013     /** Number of chapters. */
014     private int chapters;
015 
016     /** Number of subsections (within current chapter). */
017     private int sections;
018 
019     /** Number of subsections (within current section). */
020     private int subsectionsAndNodes;
021 
022     /** Import we currently work on (or lastly visited). */
023     private int importNumber;
024 
025     /** Chapter numbering currently on? */
026     private boolean chapterNumbering;
027 
028     /** Chapter number the node is within. */
029     private int chapterNumber;
030 
031     /** Absolute chapter number the node is within. Includes chapters with no numbers. */
032     private int absoluteChapterNumber;
033 
034     /** Section numbering currently on? */
035     private boolean sectionNumbering;
036 
037     /** Section number the node is within. */
038     private int sectionNumber;
039 
040     /** Absolute section number the node is within. Includes sections with no numbers. */
041     private int absoluteSectionNumber;
042 
043     /** Sub section number for section. */
044     private int subsectionNumber;
045 
046     /** Node number the node for section. */
047     private int nodeNumber;
048 
049     /** Axioms before node (including this one). */
050     private int axiomNumber;
051 
052     /** Function definitions before node (including this one). */
053     private int functionDefinitionNumber;
054 
055     /** Predicate definitions before node (including this one). */
056     private int predicateDefinitionNumber;
057 
058     /** Propositions before node (including this one). */
059     private int propositionNumber;
060 
061     /** Rule definitions before node (including this one). */
062     private int ruleNumber;
063 
064     /** No further numbering will be done. */
065     private boolean finished;
066 
067     /**
068      * Constructor.
069      *
070      @param   imports     Number of imported QEDEQ modules.
071      @param   chapters    Number of chapters in QEDEQ module.
072      */
073     public QedeqNumbers(final int imports, final int chapters) {
074         this.imports = imports;
075         this.chapters = chapters;
076     }
077 
078     /**
079      * Copy constructor.
080      *
081      @param   original    Original to copy values from.
082      */
083     public QedeqNumbers(final QedeqNumbers original) {
084         imports = original.imports;
085         chapters = original.chapters;
086         sections = original.sections;
087         subsectionsAndNodes = original.subsectionsAndNodes;
088         importNumber = original.importNumber;
089         chapterNumbering = original.chapterNumbering;
090         chapterNumber = original.chapterNumber;
091         absoluteChapterNumber = original.absoluteChapterNumber;
092         sectionNumbering = original.sectionNumbering;
093         nodeNumber = original.nodeNumber;
094         sectionNumber = original.sectionNumber;
095         absoluteSectionNumber = original.absoluteSectionNumber;
096         subsectionNumber = original.subsectionNumber;
097         axiomNumber = original.axiomNumber;
098         functionDefinitionNumber = original.functionDefinitionNumber;
099         predicateDefinitionNumber = original.predicateDefinitionNumber;
100         propositionNumber = original.propositionNumber;
101         ruleNumber = original.ruleNumber;
102         finished = original.finished;
103     }
104 
105     /**
106      * Last import number.
107      *
108      @return  Import number.
109      */
110     public int getImportNumber() {
111         return importNumber;
112     }
113 
114     /**
115      * Increase import number.
116      */
117     public void increaseImportNumber() {
118         importNumber++;
119     }
120 
121     /**
122      * Chapter number the node is within.
123      *
124      @return  Chapter number.
125      */
126     public int getChapterNumber() {
127         return chapterNumber;
128     }
129 
130     /**
131      * Increase chapter number.
132      *
133      @param   sections            Number of subsections in new chapter.
134      @param   chapterNumbering    Chapter numbering on?
135      */
136     public void increaseChapterNumber(final int sections, final boolean chapterNumbering) {
137         this.chapterNumbering = chapterNumbering;
138         absoluteChapterNumber++;
139         if (chapterNumbering) {
140             chapterNumber++;
141         }
142         this.sections = sections;
143         this.subsectionsAndNodes = 0;
144         this.sectionNumber = 0;
145         this.absoluteSectionNumber = 0;
146         this.sectionNumbering = true;
147         this.subsectionNumber = 0;
148         this.nodeNumber = 0;
149     }
150 
151     /**
152      * Is chapter numbering currently on?
153      *
154      @return  Chapter numbering is on.
155      */
156     public boolean isChapterNumbering() {
157         return chapterNumbering;
158     }
159 
160     /**
161      * Absolute chapter number the node is within. This includes chapters with no numbers.
162      *
163      @return  Chapter number.
164      */
165     public int getAbsoluteChapterNumber() {
166         return absoluteChapterNumber;
167     }
168 
169     /**
170      * Section number the node is within.
171      *
172      @return  Section number.
173      */
174     public int getSectionNumber() {
175         return sectionNumber;
176     }
177 
178     /**
179      * Increase chapter number.
180      *
181      @param   subsectionsAndNodes         Number of subsections and nodes for current section.
182      @param   sectionNumbering    Should this section be numbered?
183      */
184     public void increaseSectionNumber(final int subsectionsAndNodes,
185             final boolean sectionNumbering) {
186         this.subsectionsAndNodes = subsectionsAndNodes;
187         this.sectionNumbering = sectionNumbering;
188         absoluteSectionNumber++;
189         if (sectionNumbering) {
190             sectionNumber++;
191         }
192         subsectionNumber = 0;
193         nodeNumber = 0;
194     }
195 
196     /**
197      * Absolute section number the node is within. This includes sections with no numbers.
198      *
199      @return  Section number.
200      */
201     public int getAbsoluteSectionNumber() {
202         return absoluteSectionNumber;
203     }
204 
205     /**
206      * Is section numbering currently on?
207      *
208      @return  Section numbering is on.
209      */
210     public boolean isSectionNumbering() {
211         return sectionNumbering;
212     }
213 
214     /**
215      * Sub section number within section.
216      *
217      @return  Sub section number.
218      */
219     public int getSubsectionNumber() {
220         return subsectionNumber;
221     }
222 
223     /**
224      * Increase subsection number.
225      */
226     public void increaseSubsectionNumber() {
227         subsectionNumber++;
228     }
229 
230     /**
231      * Node number within section.
232      *
233      @return  Node number.
234      */
235     public int getNodeNumber() {
236         return nodeNumber;
237     }
238 
239     /**
240      * Increase node number.
241      */
242     public void increaseNodeNumber() {
243         nodeNumber++;
244     }
245 
246     /**
247      * Get number of axioms before node (including this one).
248      *
249      @return  Number of axioms before node (including this one).
250      */
251     public int getAxiomNumber() {
252         return axiomNumber;
253     }
254 
255     /**
256      * Increase number of axioms before node (including this one).
257      */
258     public void increaseAxiomNumber() {
259         axiomNumber++;
260     }
261 
262     /**
263      * Get number of function definitions before node (including this one).
264      *
265      @return  Number function definitions before node (including this one).
266      */
267     public int getFunctionDefinitionNumber() {
268         return functionDefinitionNumber;
269     }
270 
271     /**
272      * Increase number of function definitions before node (including this one).
273      */
274     public void increaseFunctionDefinitionNumber() {
275         functionDefinitionNumber++;
276     }
277 
278     /**
279      * Get number of predicate definitions before node (including this one).
280      *
281      @return  Number of predicate definitions before node (including this one).
282      */
283     public int getPredicateDefinitionNumber() {
284         return predicateDefinitionNumber;
285     }
286 
287     /**
288      * Increase number of predicate definitions before node (including this one).
289      */
290     public void increasePredicateDefinitionNumber() {
291         predicateDefinitionNumber++;
292     }
293 
294     /**
295      * Get number of Propositions before node (including this one).
296      *
297      @return  Get number of Propositions before node (including this one).
298      */
299     public int getPropositionNumber() {
300         return propositionNumber;
301     }
302 
303     /**
304      * Increase number of predicate definitions before node (including this one).
305      */
306     public void increasePropositionNumber() {
307         propositionNumber++;
308     }
309 
310     /**
311      * Get number of rule definitions before node (including this one).
312      *
313      @return  Number of rule definitions before node (including this one).
314      */
315     public int getRuleNumber() {
316         return ruleNumber;
317     }
318 
319     /**
320      * Increase number of rule definitions before node (including this one).
321      */
322     public void increaseRuleNumber() {
323         ruleNumber++;
324     }
325 
326     /**
327      * Is there nothing more to be numbered?
328      *
329      @return  There will be no more number changes.
330      */
331     public boolean isFinished() {
332         return finished;
333     }
334 
335     /**
336      * Set if numbering has ended.
337      *
338      @param   finished    Will there be no more number changes?
339      */
340     public void setFinished(final boolean finished) {
341         this.finished = finished;
342     }
343 
344     /**
345      * Get calculated visit percentage.
346      * This is a monotonically nondecreasing visit function.
347      *
348      @return  Value between 0 and 100.
349      */
350     public double getVisitPercentage() {
351         if (finished) {
352             return 100;
353         }
354         double result = (double) (importNumber(imports + 1(chapters + 3);
355         result += (double) (absoluteChapterNumber(chapters + 3);
356         result += (double) (absoluteSectionNumber(sections + 2(chapters + 3);
357         result += (double) (subsectionNumber + nodeNumber)
358             (subsectionsAndNodes + 2(sections + 2(chapters + 3);
359         return 100 * result;
360     }
361 
362     public boolean equals(final Object compare) {
363         if (!(compare instanceof QedeqNumbers)) {
364             return false;
365         }
366         final QedeqNumbers other = (QedeqNumberscompare;
367         return imports == other.imports && importNumber == other.importNumber
368           && chapterNumbering == other.chapterNumbering
369           && absoluteChapterNumber == other.absoluteChapterNumber
370           && sectionNumbering == other.sectionNumbering
371           && sections == other.sections
372           && absoluteSectionNumber == other.absoluteSectionNumber
373           && subsectionNumber == other.subsectionNumber
374           && nodeNumber == other.nodeNumber
375           && axiomNumber == other.axiomNumber
376           && propositionNumber == other.propositionNumber
377           && predicateDefinitionNumber == other.predicateDefinitionNumber
378           && functionDefinitionNumber == other.functionDefinitionNumber
379           && ruleNumber == other.ruleNumber;
380     }
381 
382     public int hashCode() {
383         return imports ^ (importNumber * 4)
384             (chapters * 16(absoluteChapterNumber * 64)
385             (sections * 256(absoluteSectionNumber * 1024)
386             (subsectionsAndNodes * 4096(nodeNumber * 16384(subsectionNumber * 65536)
387             (axiomNumber * 262144(propositionNumber * 1048576)
388             (predicateDefinitionNumber * 4194304)
389             (functionDefinitionNumber * 16777216(ruleNumber * 67108864);
390     }
391 
392     public String toString() {
393         return "(" + importNumber + "/" + imports + " I) "
394             "(" + absoluteChapterNumber + "/" + chapters + " C) "
395             "(" + absoluteSectionNumber + "/" + sections + " S) "
396             "(" (subsectionNumber + nodeNumber"/" + subsectionsAndNodes + ")";
397     }
398 
399 }