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 = (QedeqNumbers) compare;
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 }
|