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;
							 | 
						||
| 
								 | 
							
								}
							 |