def fitness(self, ind: Expression) -> float: counter: float = 0.0 for word in self.X: counter += 1.0 if ind.consume(word) else 0.0 for word in self.Y: counter += 1.0 if ind.consume(word) is None else 0.0 return counter / self.WordSetSize
def RandomWalk(): a = Terminal('a') b = Terminal('b') B = Expression('B') B = a >> ~b hit = set() uniqueExpr = set() for _ in range(1000): (ret, _) = randomWalk(B, 1) assert (ret is not None) hit.add(hex(id(ret))) uniqueExpr.add(ret.__str__()) assert (len(hit) == 4) assert (len(uniqueExpr) == 4) A: Expression = induce(['aba', 'abb', 'abc'], ['aa', 'ab', 'ac', 'abcd']) hit.clear() uniqueExpr.clear() for _ in range(1000): (ret, _) = randomWalk(A, 1) assert (ret is not None) hit.add(hex(id(ret))) uniqueExpr.add(ret.__str__()) assert (len(hit) == 10) assert (len(uniqueExpr) == 10)
def SimpleWalkTest(): a = Terminal('a') b = Terminal('b') A = Expression('A') A = a | ~b >> a | ~b assert (walkWithParent(A, 1)[1] == None) assert (walkWithParent(A, 1)[0].symbol == '|') assert (walkWithParent(A, 2)[1].symbol == '|') assert (walkWithParent(A, 2)[0].symbol == '|') assert (walkWithParent(A, 3)[1].symbol == '|') assert (walkWithParent(A, 3)[0].symbol == 'a') assert (walkWithParent(A, 4)[1].symbol == '|') assert (walkWithParent(A, 4)[0].symbol == '>>') assert (walkWithParent(A, 5)[1].symbol == '>>') assert (walkWithParent(A, 5)[0].symbol == '~') assert (walkWithParent(A, 6)[1].symbol == '~') assert (walkWithParent(A, 6)[0].symbol == 'b') assert (walkWithParent(A, 7)[1].symbol == '>>') assert (walkWithParent(A, 7)[0].symbol == 'a') assert (walkWithParent(A, 8)[1].symbol == '|') assert (walkWithParent(A, 8)[0].symbol == '~') assert (walkWithParent(A, 9)[1].symbol == '~') assert (walkWithParent(A, 9)[0].symbol == 'b') assert (walkWithParent(A, 10)[0] == None) assert (walkWithParent(A, 10)[1] == None)
def TestCount(): A: Expression = induce(['aba', 'abb', 'abc'], ['aa', 'ab', 'ac', 'abcd']) assert (count(A) == 12) a = Terminal('a') B = Expression('B') B = a >> a assert (count(B) == 3)
def TestHeightUp(): a = Terminal('a') b = Terminal('b') c = Terminal('c') d = Terminal('d') A = Expression('A') A = a >> b >> (b | a | c >> ~d) (exp, parExp) = walkWithParent(A, 8) assert (heightUp(A, exp, parExp) == 3) (exp, parExp) = walkWithParent(A, 12) assert (heightUp(A, exp, parExp) == 4) (exp, parExp) = walkWithParent(A, 4) assert (heightUp(A, exp, parExp) == 2) (exp, parExp) = walkWithParent(A, 2) assert (heightUp(A, exp, parExp) == 1)
def TestBasicSwitch(): X = ['aba', 'abb', 'abc'] Y = ['aa', 'ab', 'ac', 'abcd'] A: Expression B: Expression A2: Expression B2: Expression for _ in range(1000): a = Terminal('a') b = Terminal('b') A = Expression('A') A = a >> b >> ~b >> a B = Expression('B') B = b >> a >> a >> b (A2, A2Par) = randomWalk(A, 2) (B2, B2Par) = randomWalk(B, 2) switch(A2, A2Par, B2, B2Par) for word in zip(X, Y): A.consume(word) B.consume(word)
def TestSwitchConsistency4(): #unary 2 a = Terminal('a') b = Terminal('b') c = Terminal('c') A = Expression('A') B = Expression('B') A = a >> ~a | c B = a | b >> b (nodeA, parA) = walkWithParent(A, 5) (nodeB, parB) = walkWithParent(B, 3) switch(nodeA, parA, nodeB, parB) assert (A.__str__() == 'a >> ~(b >> b) | c') assert (B.__str__() == 'a | a')
def TestSwitchConsistency1(): #non terminal a = Terminal('a') b = Terminal('b') c = Terminal('c') A = Expression('A') B = Expression('B') A = a >> ~a | c B = a | b >> b (nodeA, parA) = walkWithParent(A, 2) (nodeB, parB) = walkWithParent(B, 3) switch(nodeA, parA, nodeB, parB) assert (A.__str__() == 'b >> b | c') assert (B.__str__() == 'a | a >> ~a')
def TestHeight3(): a = Terminal('a') B = Expression('B') B = a >> a assert (height(B) == 1)
def TestHeight2(): a = Terminal('a') b = Terminal('b') B = Expression('B') B = a | ~b >> a | ~b assert (height(B) == 4)