Skip to content

Commit 55da591

Browse files
authored
Create Multiple IndependentRun.py
Multi independent Run , Warm up run , stress testing algo , High resolution timing alog using time.pref.counter(_) ,
1 parent 51ab413 commit 55da591

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

Multiple IndependentRun.py

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

0 commit comments

Comments
 (0)