-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalgorithm_test.py
126 lines (104 loc) · 4.65 KB
/
algorithm_test.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
from memory_profiler import memory_usage
import random
import math
import sys
import time
import datetime
import configparser
import json
import factor_utils
from memory_profiler import profile
# globals
DATAFILE = "RSA-Digits.dat"
DATAFILESECTIONS = ["8-bits", "16-bits", "32-bits", "48-bits", "56-bits", "58-bits", "59-bits", "60-bits", "61-bits", "63-bits", "64-bits", "70-bits"]
class Num_Utils:
def randomIntGen(self, numDigits):
digits = [random.randint(0, 9) for _ in range (numDigits)] # Change range to create more digits
lastDigit = random.choice([1, 3, 7, 9]) # Avoid even digits or 5 as final digit
digits.append(lastDigit)
largeInteger = int("".join(str(_) for _ in digits))
return largeInteger
def getInts(self, numDigits, numIterations):
temp = []
for _ in range(numIterations):
temp.append(self.randomIntGen(numDigits))
return temp
class Driver(Num_Utils):
spaceUsage = []
primeList = []
digits = 0
report = None
datafile = None
def __init__(self, resultsFile, integerFile=None):
if resultsFile == None or resultsFile == '':
raise Exception("[ERROR] No File Given.")
self.datafile = configparser.ConfigParser()
self.datafile.read(DATAFILE)
self.resultsFile = open(resultsFile, "w")
def generateTestData(self, digits, iterations):
self.primeList = self.getInts(digits, iterations)
self.digits = digits
def report(self, msg):
#self.resultsFile.write(msg)
print(msg, end="")
def createNewFile(self, filename=""):
fn = self.resultsFile.name
self.resultsFile.close()
if filename == "":
self.resultsFile = open(fn + "_" +str(datetime.datetime.now()), "w")
else:
self.resultsFile = open(filename, "w")
def test(self, algorithm, bits):
# clear spaceUsage
self.spaceUsage = []
# create new report title
self.report(f"\n[TEST] Performance Test: {algorithm.__name__} with {bits} primes.")
x = 25 if self.digits < 20 else self.digits + 5
self.report("\n\t%-*s%-*s%-*s\n" % (x,"[Integer to Factor]", 30, "[Elapsed Time]", 20, "[Factors]"))
for line in self.primeList:
# start timer
startTime = time.perf_counter()
# get prime factors (mem_usage, retval)
numberFactors = algorithm(line)
# end time - in micro-seconds
endTime = time.perf_counter()
elapsedTime = endTime - startTime
elapsedTime = round(elapsedTime, 15)
# generate report for iteration
factors = ", ".join(str(i) for i in numberFactors)
# write to console & file: prime, time, factors
self.report(f"\t")
self.report(f"{line:<{x}}")
self.report(f"{str(elapsedTime):<30}")
self.report("[" + factors + "]\n")
self.resultsFile.write(f"{line}\t{elapsedTime}\t{factors}\n")
# report final stats to stdout
self.report(f"\n[INFO] Prime number stack size (size of an object in bytes): {sys.getsizeof(self.primeList[0])} bytes.")
self.report(f"\n[INFO] Function stack size (size of an object in bytes): {sys.getsizeof(algorithm(self.primeList[0]))} bytes.")
self.report(f"\n[INFO] Function runtime stack size: (size of an object in bytes): {self.getMemorySize(algorithm, self.primeList[0])} Mib.\n")
def getMemorySize(self, algorithm, line):
#(memory, numberFactors) = memory_usage(proc=(algorithm, (line,), {}), retval=True)
temp = memory_usage(proc=(algorithm, (line,), {}))
# return average memory usage
return temp
#return sum(temp) / len(temp)
def testFromFile(self, algorithm):
for datasections in DATAFILESECTIONS:
output = list(self.datafile.items(datasections))
if (output == []):
self.report("\n[INFO] Hit Empty List... Skipping.")
continue
self.primeList = json.loads(output[0][1])
self.primeList = list(map(int, self.primeList))
self.test(algorithm,datasections)
# main
if __name__ == "__main__":
try:
_driver = Driver("results_td.txt")
_driver.testFromFile(factor_utils.trialDivision)
_driver.report("\n[INFO] Testing Complete.")
_driver = Driver(f"results_pr.txt")
_driver.testFromFile(factor_utils.findAllPollard)
_driver.report("\n[INFO] Testing Complete.")
except KeyboardInterrupt as inst:
print("[INFO] Ctrl + C shutdown.")