1 from ruleset import *
2 from constants import *
3 import math
4
5 __docformat__='epytext'
6
8 MAX_COST = 1000000
9
10 - def __init__(self,name=None,add_coverage=0,add_confidence=0):
11 """
12 Construct a new rule.
13 """
14 self.exceptions = Ruleset()
15 self.name = name
16 self.additional_coverage = add_coverage
17 self.additional_confidence = add_confidence
18 self.coverage = 0
19 self.confidence = 0
20 self.length = 0.0
21 self.error = 0.0
22 self.lenEH = 0.0
23 self.sub_data = {}
24 self.sub_pos_data = {}
25
27 """
28 String representation of the ruleset.
29 """
30 return self.name + str(self.sub_rules)
31
33 """
34 Append a rule to the ruleset.
35
36 @type rule: L{Rule}
37 @param rule: rule to be appended.
38 """
39 if(not isinstance(rule, Rule)):
40 raise "Not a rule!"
41 self.sub_rules.append(rule)
42
44 """
45 Add exceptions to the rule.
46
47 @type rules: L{Ruleset}
48 @param rules: exceptions to be added.
49 """
50 self.exceptions = rules
51 self.length = self.length + 1 + rules.length
52 self.error = rules.error
54 """
55 Calculate error percentage.
56
57 @rtype: float
58 @return: error percentage of the rule.
59 """
60 return (self.error / self.coverage) * 100
62 """
63 Calculate error percentage without taking exceptions into account.
64
65 @rtype: float
66 @return: error percentage of the rule without exceptions.
67 """
68 return ((self.coverage - self.confidence) / self.coverage) * 100
69
71 """
72 Compare rule's description length with another rule.
73
74 @type rule2: L{Rule}
75 @param rule2: rule to compare with.
76 @rtype: boolean
77 @return: True if rule has shorter description length than rule2.
78 """
79 if rule2.name == None:
80 return True
81 desc_length = c * self.length + self.lenEH
82 desc_length2 = c * rule2.length + rule2.lenEH
83 return (desc_length < desc_length2 or
84 (desc_length == desc_length2 and self.confidence/self.coverage > rule2.confidence/rule2.coverage) or
85 (desc_length == desc_length2 and self.confidence/self.coverage == rule2.confidence/rule2.coverage) and
86 self.confidence > rule2.confidence)
87
89 """
90 Find the cost per element for the rule.
91 """
92 if self.additional_confidence == 0 or self.name is None:
93 return Rule.MAX_COST
94 return (self.length + self.error) / self.additional_confidence
95