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