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