<?php 
ini_set('memory_limit', '200G'); // Increase to 2GB or more as needed 
 
// Helper function to create a random matrix 
function create_random_matrix($rows, $cols) { 
    $matrix = array_fill(0, $rows, array_fill(0, $cols, 0)); 
    for ($i = 0; $i < $rows; ++$i) { 
        for ($j = 0; $j < $cols; ++$j) { 
            $matrix[$i][$j] = mt_rand() / mt_getrandmax(); 
        } 
    } 
    return $matrix; 
} 
 
// Function to measure execution time of a given operation 
function measure_time($callback, $description) { 
    $start_time = microtime(true); 
    $callback(); 
    $end_time = microtime(true); 
    $execution_time = $end_time - $start_time; 
    echo $description . ": " . $execution_time . " seconds\n"; 
} 
 
// Generate random matrices 
$rows = 10000; // Adjust size as needed 
$cols = 10000; 
$min_val = 0.2; 
$max_val = 0.8; 
 
echo " MATRIX($rows,$cols)\n\n"; 
 
$m1 = create_random_matrix($rows, $cols); 
$m2 = create_random_matrix($rows, $cols); 
 
$matrix1 = new MatrixWrapper($m1); 
$matrix2 = new MatrixWrapper($m2); 
 
measure_time(function() use ($m1) { 
    $matrix1 = new MatrixWrapper($m1); 
}, "Init Time"); 
 
 
measure_time(function() use ($matrix1) { 
    $matrix1->shape(); 
}, "Finding Shape Time"); 
 
// Perform subtraction first and then addition 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->sub($matrix2); 
}, "Subtraction Time"); 
 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->add($matrix2); 
}, "Addition Time after Subtraction"); 
 
// Perform addition first and then subtraction 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->add($matrix2); 
}, "Addition Time"); 
 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->sub($matrix2); 
}, "Subtraction Time after Addition"); 
 
// Measure constant addition time 
measure_time(function() use ($matrix1) { 
    $matrix1->add(2); 
}, "Addition Constant Time"); 
 
// Measure dot product time 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->dot($matrix2); 
}, "Dot Product Time"); 
 
measure_time(function() use ($matrix1, $matrix2) { 
    $matrix1->div($matrix2); 
}, "Matrix-to-Matrix Division Time"); 
 
// Measure matrix-to-scalar division time 
measure_time(function() use ($matrix1) { 
    $matrix1->div(2); 
}, "Matrix-to-Scalar Division Time"); 
 
// Measure transpose time 
measure_time(function() use ($matrix1) { 
    $matrix1->transpose(); 
}, "Transpose Time"); 
 
// Measure Multiplication time 
measure_time(function() use ($matrix1) { 
    $matrix1->mul(2); 
}, "Multiplication Time"); 
 
// Measure argmax time 
measure_time(function() use ($matrix1) { 
    $matrix1->argmax(1); 
}, "Arg max Time"); 
 
// Measure clip time 
measure_time(function() use ($matrix1, $min_val, $max_val) { 
    $matrix1->clip($min_val, $max_val); 
}, "Clip Time"); 
 
// Measure log 
measure_time(function() use ($matrix1) { 
    $matrix1->log(); 
}, "Log Time"); 
 
// Measure exp 
measure_time(function() use ($matrix1) { 
    $matrix1->exp(); 
}, "Exp Time"); 
 
// Measure sum 
measure_time(function() use ($matrix1) { 
    $matrix1->sum(); 
}, "Sum Time"); 
 
measure_time(function() use ($matrix1) { 
    $matrix1->sum(0); 
}, "Sum along columns Time"); 
 
measure_time(function() use ($matrix1) { 
    $matrix1->sum(1); 
}, "Sum along rows Time"); 
 
// Measure inverse 
measure_time(function() use ($matrix1) { 
    $matrix1->inverse(); 
}, "Inverse Time"); 
 
// Measure determinant 
measure_time(function() use ($matrix1) { 
    $matrix1->determinant(); 
}, "Determinant Time"); 
 
// Measure eigen 
measure_time(function() use ($matrix1) { 
    $matrix1->eigen(); 
}, "Eigenvalues and Eigenvectors Time"); 
?>
 
 |