from flask import Flask, render_template, request import numpy as np import concurrent.futures app = Flask(__name__) def multiply_matrices(matrix_a, matrix_b): if len(matrix_a[0]) != len(matrix_b): raise ValueError("Incompatible matrix dimensions for multiplication") result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))] for i in range(len(matrix_a)): for j in range(len(matrix_b[0])): for k in range(len(matrix_b)): result[i][j] += matrix_a[i][k] * matrix_b[k][j] return result def multiply_matrices_parallel(matrix_a, matrix_b, num_threads): if len(matrix_a[0]) != len(matrix_b): raise ValueError("Incompatible matrix dimensions for multiplication") result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))] with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: futures = [] for i in range(len(matrix_a)): futures.append(executor.submit(_multiply_row, matrix_a, matrix_b, i)) for i, future in enumerate(concurrent.futures.as_completed(futures)): result[i] = future.result() return result def _multiply_row(matrix_a, matrix_b, i): row_result = [0 for _ in range(len(matrix_b[0]))] for j in range(len(matrix_b[0])): for k in range(len(matrix_b)): row_result[j] += matrix_a[i][k] * matrix_b[k][j] return row_result @app.route('/') def index(): return render_template('index.html') @app.route('/multiply', methods=['POST']) def multiply(): n = int(request.form.get('matrix_a')) matrix_a = np.random.randint(10, size=(n, n)) matrix_b = np.random.randint(10, size=(n, n)) operation_type = request.form.get('operation_type') if operation_type == 'sequential': result = multiply_matrices(matrix_a, matrix_b) elif operation_type == 'parallel': result = multiply_matrices_parallel(matrix_a, matrix_b) else: return "Invalid operation type" return render_template('result.html', matrix_a=matrix_a, matrix_b=matrix_b, result=result) if __name__ == '__main__': app.run(debug=True)