Skip to content

Commit 51ab413

Browse files
authored
Create StressTesting_Combination.py
1 parent f9d4545 commit 51ab413

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

StressTesting_Combination.py

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
2+
3+
import time
4+
import random
5+
import pandas as pd
6+
from statistics import mean, stdev
7+
8+
def split_matrix(matrix):
9+
rows, cols = len(matrix), len(matrix[0])
10+
split_row, split_col = rows // 2, cols // 2
11+
12+
A11 = [row[:split_col] for row in matrix[:split_row]]
13+
A12 = [row[split_col:] for row in matrix[:split_row]]
14+
A21 = [row[:split_col] for row in matrix[split_row:]]
15+
A22 = [row[split_col:] for row in matrix[split_row:]]
16+
17+
return A11, A12, A21, A22
18+
19+
def add_matrices(matrix1, matrix2):
20+
return [
21+
[matrix1[i][j] + matrix2[i][j] for j in range(len(matrix1[0]))]
22+
for i in range(len(matrix1))
23+
]
24+
25+
def subtract_matrices(matrix1, matrix2):
26+
return [
27+
[matrix1[i][j] - matrix2[i][j] for j in range(len(matrix1[0]))]
28+
for i in range(len(matrix1))
29+
]
30+
31+
def strassen(matrix1, matrix2):
32+
if len(matrix1) == 1:
33+
return [[matrix1[0][0] * matrix2[0][0]]]
34+
35+
A11, A12, A21, A22 = split_matrix(matrix1)
36+
B11, B12, B21, B22 = split_matrix(matrix2)
37+
38+
P1 = strassen(A11, subtract_matrices(B12, B22))
39+
P2 = strassen(add_matrices(A11, A12), B22)
40+
P3 = strassen(add_matrices(A21, A22), B11)
41+
P4 = strassen(A22, subtract_matrices(B21, B11))
42+
P5 = strassen(add_matrices(A11, A22), add_matrices(B11, B22))
43+
P6 = strassen(subtract_matrices(A12, A22), add_matrices(B21, B22))
44+
P7 = strassen(subtract_matrices(A11, A21), add_matrices(B11, B12))
45+
46+
C11 = subtract_matrices(add_matrices(P5, P4), subtract_matrices(P2, P6))
47+
C12 = add_matrices(P1, P2)
48+
C21 = add_matrices(P3, P4)
49+
C22 = subtract_matrices(subtract_matrices(P5, P3), subtract_matrices(P1, P7))
50+
51+
result = [
52+
C11[i] + C12[i]
53+
for i in range(len(C11))
54+
] + [
55+
C21[i] + C22[i]
56+
for i in range(len(C21))
57+
]
58+
59+
return result
60+
61+
def generate_random_matrix(rows, cols, seed=None):
62+
if seed is not None:
63+
random.seed(seed)
64+
return [[random.randint(1, 100) for _ in range(cols)] for _ in range(rows)]
65+
66+
def benchmark(matrix_size, repetitions=5, warm_up_runs=3, stress_runs=100, seed=None):
67+
data = {'Matrix Size': [], 'Run Number': [], 'Runtime (seconds)': []}
68+
69+
# Warm-up phase
70+
for _ in range(warm_up_runs):
71+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
72+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
73+
strassen(matrix1, matrix2)
74+
75+
# Actual benchmarking
76+
for run_number in range(1, repetitions + 1):
77+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
78+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
79+
80+
start_time = time.perf_counter()
81+
strassen(matrix1, matrix2)
82+
end_time = time.perf_counter()
83+
84+
runtime = end_time - start_time
85+
86+
data['Matrix Size'].append(matrix_size)
87+
data['Run Number'].append(run_number)
88+
data['Runtime (seconds)'].append(runtime)
89+
90+
df = pd.DataFrame(data)
91+
average_runtimes = df.groupby('Matrix Size')['Runtime (seconds)'].agg([mean, stdev]).reset_index()
92+
print("\nAverage Runtimes:\n", average_runtimes)
93+
94+
# Stress testing
95+
stress_data = []
96+
for _ in range(stress_runs):
97+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
98+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
99+
100+
start_time = time.perf_counter()
101+
strassen(matrix1, matrix2)
102+
end_time = time.perf_counter()
103+
104+
runtime = end_time - start_time
105+
stress_data.append(runtime)
106+
107+
print(f"\nStress Testing for Matrix Size {matrix_size}x{matrix_size}:")
108+
print(f"Mean Runtime: {mean(stress_data)} seconds")
109+
print(f"Standard Deviation: {stdev(stress_data)} seconds")
110+
111+
return df
112+
113+
# Collect benchmark data
114+
matrix_sizes = [2, 4, 8, 16, 32, 64, 128]
115+
repetitions = 5
116+
stress_runs = 100
117+
118+
all_data = pd.DataFrame()
119+
120+
for matrix_size in matrix_sizes:
121+
matrix_data = benchmark(matrix_size, repetitions=repetitions, stress_runs=stress_runs)
122+
all_data = pd.concat([all_data, matrix_data], ignore_index=True)
123+
124+
# Display the combined data table
125+
print("\nCombined Data Table:\n", all_data)

0 commit comments

Comments
 (0)