forked from Julius-1998/ECE590
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathp4tests.py
160 lines (134 loc) · 5.14 KB
/
p4tests.py
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
"""
Math 560
Project 4
Fall 2021
p4tests.py
"""
# Import random and project4 code.
import random
from project4 import ED
################################################################################
def makeEdits(src, edits):
# Turn src into a list of chars.
srcList = list(src)
# Loop over the edits.
for ed in edits:
# Check if insert, delete, or sub.
if ed[0] == 'insert':
# Perform the insertion.
srcList.insert(ed[2], ed[1])
elif ed[0] == 'delete':
# Perform the deletion.
del srcList[ed[2]]
elif ed[0] == 'sub':
# Perform the substitution.
srcList[ed[2]] = ed[1]
elif ed[0] == 'match':
# Nothing to do.
continue
else:
raise Exception('Edit is not insert, delete, or sub!')
# Join the srcList back into a string.
editedSrc = ''.join(srcList)
return editedSrc
################################################################################
def edTests(verbatim=False):
# Set up the tests.
string1 = ['spam', 'libate', '', 'abc', 'aaa']
string2 = ['pims', 'flub', 'abc', '', 'bbb']
dists = [3, 5, 3, 3, 3]
labels = ['Class Ex 1', 'Class Ex 2', 'All Inserts', 'All Deletes', \
'All Subs']
# Track the number passed.
numPassed = 0
# Perform the tests.
for sInd in range(len(string1)):
s1 = string1[sInd]
s2 = string2[sInd]
print('Performing Test ' + str(sInd+1))
print('Test Description: ' + labels[sInd])
if verbatim:
print('\tString 1: ' + s1 + ',\tString 2: ' + s2)
dist, edits = ED(s1, s2)
if verbatim:
print('\tReported Distance: ' + str(dist))
print('\tReported Edits:')
for ed in edits:
print('\t\t' + str(ed))
edited = makeEdits(s1, edits)
passed = (edited == s2) and (dists[sInd] == dist)
if verbatim:
print('\tTarget String: ' + s2)
print('\tEdited String: ' + edited)
if passed:
print('Test ' + str(sInd+1) + ' Passed!')
print()
numPassed += 1
else:
print('Test ' + str(sInd+1) + ' Failed!')
print()
# Print number passed.
print('Passed ' + str(numPassed) + '/' + str(len(string1)) + ' Tests')
################################################################################
def getRandGenomes(n=10, seed=None):
# Set the rng seed (note: will use system time if no seed was given).
random.seed(seed)
# List of genome chars.
basePairs = ['A', 'G', 'T', 'C']
# Create random strings for ED.
s1List = [random.choice(basePairs) for x in range(n)]
s1 = ''.join(s1List)
s2List = [random.choice(basePairs) for x in range(n)]
s2 = ''.join(s2List)
return s1, s2
################################################################################
def compareGenomes(verbatim=False, trials=30, n=10, prob='ED', seed=None):
# For each trial, generate 2 genomes, compute ED, track average ED.
avg = 0
for t in range(trials):
s1, s2 = getRandGenomes(n, seed)
dist, edits = ED(s1, s2, prob)
avg += dist
if prob == 'ED':
edited = makeEdits(s1, edits)
if edited != s2:
print('Failed Test!!!')
avg = avg/trials
if verbatim:
print('Performed ' + str(trials) + ' trials.')
print('Compared genomes of size ' + str(n))
print(('Average %s: ' + str(avg)) % prob)
print(('Average %s as Fraction of Genome Length: ' + str(avg/n)) % prob)
return avg
################################################################################
def getRandStrings(n=10, seed=None):
# Set the rng seed (note: will use system time if no seed was given).
random.seed(seed)
# List of chars.
letters = list('abcdefghijklmnopqrstuvwxyz')
# Create random strings for ED.
s1List = [random.choice(letters) for x in range(n)]
s1 = ''.join(s1List)
s2List = [random.choice(letters) for x in range(n)]
s2 = ''.join(s2List)
return s1, s2
################################################################################
def compareRandStrings(verbatim=False, trials=30, n=10, prob='ED', seed=None):
# For each trial, generate 2 strings, compute ED, track average ED.
avg = 0
for t in range(trials):
s1, s2 = getRandStrings(n, seed)
dist, edits = ED(s1, s2, prob)
avg += dist
if prob == 'ED':
edited = makeEdits(s1, edits)
if edited != s2:
print('Failed Test!!!')
avg = avg/trials
if verbatim:
print('Performed ' + str(trials) + ' trials.')
print('Compared strings of size ' + str(n))
print(('Average %s: ' + str(avg)) % prob)
print(('Average %s as Fraction of String Length: ' + str(avg/n)) % prob)
return avg
################################################################################