function f() { global $_tpl; #$n = intval(($argc == 2) ? $argv[1] : 400); $n = 400; $u = array_fill(0, $n, 1.0); $_tpl = array_fill(0, $n, 0.0); for ($i = 0; $i < 10; $i++) { $v = AtAv($n, $u); $u = AtAv($n, $v); } $vBv = 0.0; $vv = 0.0; $i = 0; foreach ($v as $val) { $vBv += $u[$i] * $val; $vv += $val * $val; ++$i; } sqrt($vBv / $vv); }
if ($pid) { continue; } } break; } else { $range_end = $n; $parent = TRUE; } } $u = array_fill(0, $n, 1.0); $_tpl = array_fill($range_begin, $range_end - $range_begin, 0.0); $sync = $procs > 0; for ($i = 0; $i < 10; $i++) { $v = AtAv($n, $u, $range_begin, $range_end, $sync); $u = AtAv($n, $v, $range_begin, $range_end, $sync); } if (!$parent) { exit(0); } $childs = $procs - 1; while ($childs--) { pcntl_wait($s); } $vBv = 0.0; $vv = 0.0; $i = 0; foreach ($v as $val) { $vBv += $u[$i] * $val; $vv += $val * $val; ++$i;
$Atv = $_tpl; for ($i = 0; $i < $n; ++$i) { $sum = 0.0; foreach ($v as $j => $v_j) { $sum += A($j, $i) * $v_j; } $Atv[$i] = $sum; } return $Atv; } function AtAv(&$n, &$v) { $tmp = Av($n, $v); return Atv($n, $tmp); } $n = intval($argc == 2 ? $argv[1] : 1); $u = array_fill(0, $n, 1.0); $_tpl = array_fill(0, $n, 0.0); for ($i = 0; $i < 10; $i++) { $v = AtAv($n, $u); $u = AtAv($n, $v); } $vBv = 0.0; $vv = 0.0; $i = 0; foreach ($v as $val) { $vBv += $u[$i] * $val; $vv += $val * $val; ++$i; } printf("%0.9f\n", sqrt($vBv / $vv));
function spectral_norm($n = 200) { $u = array_pad(array(), $n, 1); for ($i = 0; $i < 10; $i++) { $v = AtAv($n, $u); $u = AtAv($n, $v); } $vBv = 0; $vv = 0; for ($i = 0; $i < $n; $i++) { $vBv += $u[$i] * $v[$i]; $vv += $v[$i] * $v[$i]; } printf("%0.9f\n", sqrt($vBv / $vv)); }
private static function spectralnorm($n) { //$n = (int) (($argc == 2) ? $argv[1] : 1); $procs = 1; if (file_exists('/proc/cpuinfo')) { $procs = preg_match_all('/^processor\\s/m', file_get_contents('/proc/cpuinfo'), $discard); } if ($n < $procs) { $procs = 1; } $chunk_size = (int) ($n / $procs); $double_size = strlen(pack('d', 0.0)); $chunk_data_size = $double_size * $chunk_size; $total_data_size = $double_size * $n; $pipes = array(); $parent = FALSE; for ($i = 0; $i < $procs; ++$i) { $range_begin = $i * $chunk_size; if ($i < $procs - 1) { $pipe = pipe(); $pipes[] = $pipe[0]; $pipe = $pipe[1]; $range_end = $range_begin + $chunk_size; $pid = pcntl_fork(); if ($pid === -1) { die('could not fork'); } else { if ($pid) { continue; } } break; } else { $range_end = $n; $parent = TRUE; } } $u = array_fill(0, $n, 1.0); $_tpl = array_fill($range_begin, $range_end - $range_begin, 0.0); $sync = $procs > 0; for ($i = 0; $i < 10; $i++) { $v = AtAv($n, $u, $range_begin, $range_end, $sync); $u = AtAv($n, $v, $range_begin, $range_end, $sync); } if (!$parent) { exit(0); } $childs = $procs - 1; while ($childs--) { pcntl_wait($s); } $vBv = 0.0; $vv = 0.0; $i = 0; foreach ($v as $val) { $vBv += $u[$i] * $val; $vv += $val * $val; ++$i; } printf("%0.9f\n", sqrt($vBv / $vv)); }