-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtest.py
More file actions
90 lines (66 loc) · 2.84 KB
/
test.py
File metadata and controls
90 lines (66 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import unittest as ut
import numpy as np
import sympy as sp
from generator import MBAGenerator
from bexpr import BExpr, evaluate_affine
# Test boolean expression used in the generator
EXPRS = [
BExpr("x", lambda vars: vars[0]),
BExpr("y", lambda vars: vars[1]),
BExpr("x & y", lambda vars: vars[0] & vars[1]),
BExpr("x | ~y", lambda vars: vars[0] | ~vars[1]),
BExpr("x ^ y", lambda vars: vars[0] ^ vars[1]),
BExpr("~x & ~y", lambda vars: ~vars[0] & ~vars[1]),
BExpr("~x", lambda vars: ~vars[0]),
BExpr("~y", lambda vars: ~vars[1]),
BExpr("~x ^ ~y", lambda vars: ~vars[0] ^ ~vars[1]),
BExpr("1", lambda vars: 1)
]
class TestLibrary(ut.TestCase):
# Controlla che le identità generate siano corrette
def test_generator_identities(self):
GEN_MAX_COEFF = 100000
GEN_MBA_COUNT = 10
RNG_STO_COUNT = 100
RNG_MAX_INPUT = 10000
generator = MBAGenerator(EXPRS)
for identity in generator.identities(max_coeff=GEN_MAX_COEFF, count=GEN_MBA_COUNT, check_identity=False):
self.assertTrue(identity.is_zero_identity())
# Controllo stocastico con valori interi
for _ in range(RNG_STO_COUNT):
vars = np.random.randint(RNG_MAX_INPUT, size=2)
self.assertEqual(0, identity.evaluate(vars))
# Controlla che le mutazioni siano corrette
def test_generator_mutate(self):
generator = MBAGenerator(EXPRS)
expr = BExpr("...", lambda bits: (~bits[0] & ~bits[1]) | (bits[0] & bits[1]))
for i in range(10):
mba = generator.mutate(expr)
self.assertTrue(mba.is_mutation(expr))
# Controlla che le mutazioni di combinazioni lineari siano corrette
def test_generator_mutate_linear(self):
generator = MBAGenerator(EXPRS)
terms = [
(4, BExpr("", lambda vars: vars[0] ^ ~vars[1])),
(6, BExpr("", lambda vars: ~vars[0] | vars[1])),
(9, BExpr("", lambda vars: ~vars[0] & ~vars[1]))
]
for i in range(100):
mba = generator.mutate_affine(terms, 0)
mba.print()
vars = np.random.randint(0, 1001, size=2)
self.assertTrue(mba.evaluate(vars) == evaluate_affine(vars, terms, 0))
# Controllo mutazione su somme semplice di variabili
def test_generator_mutate_linear_simple(self):
generator = MBAGenerator(EXPRS)
terms = [
(1, BExpr("x", lambda vars: vars[0])),
(1, BExpr("y", lambda vars: vars[1])),
]
for i in range(100):
mba = generator.mutate_affine(terms, 0)
mba.print()
vars = np.random.randint(0, 1001, size=2)
self.assertTrue(mba.evaluate(vars) == vars[0] + vars[1])
if __name__ == "__main__":
ut.main()