264 lines
6.6 KiB
PHP
264 lines
6.6 KiB
PHP
|
<?php
|
||
|
|
||
|
error_reporting(E_ALL);
|
||
|
|
||
|
/**
|
||
|
* @package JAMA
|
||
|
*/
|
||
|
|
||
|
require_once '../Matrix.php';
|
||
|
require_once 'Stats.php';
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Example of use of Matrix Class, featuring magic squares.
|
||
|
*/
|
||
|
class Benchmark {
|
||
|
public $stat;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Simple function to replicate PHP 5 behaviour
|
||
|
*/
|
||
|
function microtime_float() {
|
||
|
list($usec, $sec) = explode(" ", microtime());
|
||
|
|
||
|
return ((float)$usec + (float)$sec);
|
||
|
} // function microtime_float()
|
||
|
|
||
|
|
||
|
function displayStats($times = null) {
|
||
|
$this->stat->setData($times);
|
||
|
$stats = $this->stat->calcFull();
|
||
|
|
||
|
echo '<table style="margin-left:32px;">';
|
||
|
echo '<tr><td style="text-align:right;"><b>n:</b><td style="text-align:right;">' . $stats['count'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>Mean:</b><td style="text-align:right;">' . $stats['mean'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>Min.:</b><td style="text-align:right;">' . $stats['min'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>Max.:</b><td style="text-align:right;">' . $stats['max'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>σ:</b><td style="text-align:right;">' . $stats['stdev'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>Variance:</b><td style="text-align:right;">' . $stats['variance'] . ' </td></tr>';
|
||
|
echo '<tr><td style="text-align:right;"><b>Range:</b><td style="text-align:right;">' . $stats['range'] . ' </td></tr>';
|
||
|
echo '</table>';
|
||
|
|
||
|
return $stats;
|
||
|
} // function displayStats()
|
||
|
|
||
|
|
||
|
function runEig($n = 4, $t = 100) {
|
||
|
$times = array();
|
||
|
|
||
|
for ($i = 0; $i < $t; ++$i) {
|
||
|
$M = Matrix::random($n, $n);
|
||
|
$start_time = $this->microtime_float();
|
||
|
$E = new EigenvalueDecomposition($M);
|
||
|
$stop_time = $this->microtime_float();
|
||
|
$times[] = $stop_time - $start_time;
|
||
|
}
|
||
|
|
||
|
return $times;
|
||
|
} // function runEig()
|
||
|
|
||
|
|
||
|
function runLU($n = 4, $t = 100) {
|
||
|
$times = array();
|
||
|
|
||
|
for ($i = 0; $i < $t; ++$i) {
|
||
|
$M = Matrix::random($n, $n);
|
||
|
$start_time = $this->microtime_float();
|
||
|
$E = new LUDecomposition($M);
|
||
|
$stop_time = $this->microtime_float();
|
||
|
$times[] = $stop_time - $start_time;
|
||
|
}
|
||
|
|
||
|
return $times;
|
||
|
} // function runLU()
|
||
|
|
||
|
|
||
|
function runQR($n = 4, $t = 100) {
|
||
|
$times = array();
|
||
|
|
||
|
for ($i = 0; $i < $t; ++$i) {
|
||
|
$M = Matrix::random($n, $n);
|
||
|
$start_time = $this->microtime_float();
|
||
|
$E = new QRDecomposition($M);
|
||
|
$stop_time = $this->microtime_float();
|
||
|
$times[] = $stop_time - $start_time;
|
||
|
}
|
||
|
|
||
|
return $times;
|
||
|
} // function runQR()
|
||
|
|
||
|
|
||
|
function runCholesky($n = 4, $t = 100) {
|
||
|
$times = array();
|
||
|
|
||
|
for ($i = 0; $i < $t; ++$i) {
|
||
|
$M = Matrix::random($n, $n);
|
||
|
$start_time = $this->microtime_float();
|
||
|
$E = new CholeskyDecomposition($M);
|
||
|
$stop_time = $this->microtime_float();
|
||
|
$times[] = $stop_time - $start_time;
|
||
|
}
|
||
|
|
||
|
return $times;
|
||
|
} // function runCholesky()
|
||
|
|
||
|
|
||
|
function runSVD($n = 4, $t = 100) {
|
||
|
$times = array();
|
||
|
|
||
|
for ($i = 0; $i < $t; ++$i) {
|
||
|
$M = Matrix::random($n, $n);
|
||
|
$start_time = $this->microtime_float();
|
||
|
$E = new SingularValueDecomposition($M);
|
||
|
$stop_time = $this->microtime_float();
|
||
|
$times[] = $stop_time - $start_time;
|
||
|
}
|
||
|
|
||
|
return $times;
|
||
|
} // function runSVD()
|
||
|
|
||
|
|
||
|
function run() {
|
||
|
$n = 8;
|
||
|
$t = 16;
|
||
|
$sum = 0;
|
||
|
echo "<b>Cholesky decomposition: $t random {$n}x{$n} matrices</b><br />";
|
||
|
$r = $this->displayStats($this->runCholesky($n, $t));
|
||
|
$sum += $r['mean'] * $n;
|
||
|
|
||
|
echo '<hr />';
|
||
|
|
||
|
echo "<b>Eigenvalue decomposition: $t random {$n}x{$n} matrices</b><br />";
|
||
|
$r = $this->displayStats($this->runEig($n, $t));
|
||
|
$sum += $r['mean'] * $n;
|
||
|
|
||
|
echo '<hr />';
|
||
|
|
||
|
echo "<b>LU decomposition: $t random {$n}x{$n} matrices</b><br />";
|
||
|
$r = $this->displayStats($this->runLU($n, $t));
|
||
|
$sum += $r['mean'] * $n;
|
||
|
|
||
|
echo '<hr />';
|
||
|
|
||
|
echo "<b>QR decomposition: $t random {$n}x{$n} matrices</b><br />";
|
||
|
$r = $this->displayStats($this->runQR($n, $t));
|
||
|
$sum += $r['mean'] * $n;
|
||
|
|
||
|
echo '<hr />';
|
||
|
|
||
|
echo "<b>Singular Value decomposition: $t random {$n}x{$n} matrices</b><br />";
|
||
|
$r = $this->displayStats($this->runSVD($n, $t));
|
||
|
$sum += $r['mean'] * $n;
|
||
|
|
||
|
return $sum;
|
||
|
} // function run()
|
||
|
|
||
|
|
||
|
public function __construct() {
|
||
|
$this->stat = new Base();
|
||
|
} // function Benchmark()
|
||
|
|
||
|
} // class Benchmark (end MagicSquareExample)
|
||
|
|
||
|
|
||
|
$benchmark = new Benchmark();
|
||
|
|
||
|
switch($_REQUEST['decomposition']) {
|
||
|
case 'cholesky':
|
||
|
$m = array();
|
||
|
for ($i = 2; $i <= 8; $i *= 2) {
|
||
|
$t = 32 / $i;
|
||
|
echo "<b>Cholesky decomposition: $t random {$i}x{$i} matrices</b><br />";
|
||
|
$s = $benchmark->displayStats($benchmark->runCholesky($i, $t));
|
||
|
$m[$i] = $s['mean'];
|
||
|
echo "<br />";
|
||
|
}
|
||
|
echo '<pre>';
|
||
|
foreach($m as $x => $y) {
|
||
|
echo "$x\t" . 1000*$y . "\n";
|
||
|
}
|
||
|
echo '</pre>';
|
||
|
break;
|
||
|
case 'eigenvalue':
|
||
|
$m = array();
|
||
|
for ($i = 2; $i <= 8; $i *= 2) {
|
||
|
$t = 32 / $i;
|
||
|
echo "<b>Eigenvalue decomposition: $t random {$i}x{$i} matrices</b><br />";
|
||
|
$s = $benchmark->displayStats($benchmark->runEig($i, $t));
|
||
|
$m[$i] = $s['mean'];
|
||
|
echo "<br />";
|
||
|
}
|
||
|
echo '<pre>';
|
||
|
foreach($m as $x => $y) {
|
||
|
echo "$x\t" . 1000*$y . "\n";
|
||
|
}
|
||
|
echo '</pre>';
|
||
|
break;
|
||
|
case 'lu':
|
||
|
$m = array();
|
||
|
for ($i = 2; $i <= 8; $i *= 2) {
|
||
|
$t = 32 / $i;
|
||
|
echo "<b>LU decomposition: $t random {$i}x{$i} matrices</b><br />";
|
||
|
$s = $benchmark->displayStats($benchmark->runLU($i, $t));
|
||
|
$m[$i] = $s['mean'];
|
||
|
echo "<br />";
|
||
|
}
|
||
|
echo '<pre>';
|
||
|
foreach($m as $x => $y) {
|
||
|
echo "$x\t" . 1000*$y . "\n";
|
||
|
}
|
||
|
echo '</pre>';
|
||
|
break;
|
||
|
case 'qr':
|
||
|
$m = array();
|
||
|
for ($i = 2; $i <= 8; $i *= 2) {
|
||
|
$t = 32 / $i;
|
||
|
echo "<b>QR decomposition: $t random {$i}x{$i} matrices</b><br />";
|
||
|
$s = $benchmark->displayStats($benchmark->runQR($i, $t));
|
||
|
$m[$i] = $s['mean'];
|
||
|
echo "<br />";
|
||
|
}
|
||
|
echo '<pre>';
|
||
|
foreach($m as $x => $y) {
|
||
|
echo "$x\t" . 1000*$y . "\n";
|
||
|
}
|
||
|
echo '</pre>';
|
||
|
break;
|
||
|
case 'svd':
|
||
|
$m = array();
|
||
|
for($i = 2; $i <= 8; $i *= 2) {
|
||
|
$t = 32 / $i;
|
||
|
echo "<b>Singular value decomposition: $t random {$i}x{$i} matrices</b><br />";
|
||
|
$s = $benchmark->displayStats($benchmark->runSVD($i, $t));
|
||
|
$m[$i] = $s['mean'];
|
||
|
echo "<br />";
|
||
|
}
|
||
|
echo '<pre>';
|
||
|
foreach($m as $x => $y) {
|
||
|
echo "$x\t" . 1000*$y . "\n";
|
||
|
}
|
||
|
echo '</pre>';
|
||
|
break;
|
||
|
case 'all':
|
||
|
$s = $benchmark->run();
|
||
|
print("<br /><b>Total<b>: {$s}s<br />");
|
||
|
break;
|
||
|
default:
|
||
|
?>
|
||
|
<ul>
|
||
|
<li><a href="benchmark.php?decomposition=all">Complete Benchmark</a>
|
||
|
<ul>
|
||
|
<li><a href="benchmark.php?decomposition=cholesky">Cholesky</a></li>
|
||
|
<li><a href="benchmark.php?decomposition=eigenvalue">Eigenvalue</a></li>
|
||
|
<li><a href="benchmark.php?decomposition=lu">LU</a></li>
|
||
|
<li><a href="benchmark.php?decomposition=qr">QR</a></li>
|
||
|
<li><a href="benchmark.php?decomposition=svd">Singular Value</a></li>
|
||
|
</ul>
|
||
|
</li>
|
||
|
</ul>
|
||
|
<?php
|
||
|
break;
|
||
|
}
|