function Percentiles($a) { sort($a); $n = sizeof($a); $mid = floor($n / 2); if ($n % 2 != 0) { $median = $a[$mid]; $lower = Median(array_slice($a, 0, $mid + 1)); // include median in both quartiles $upper = Median(array_slice($a, $mid)); } else { $median = ($a[$mid - 1] + $a[$mid]) / 2.0; $lower = Median(array_slice($a, 0, $mid)); $upper = Median(array_slice($a, $mid)); } $maxwhisker = ($upper - $lower) * 1.5; $xlower = $lower - $maxwhisker < $a[0] ? $a[0] : $lower - $maxwhisker; $xupper = $upper + $maxwhisker > $a[$n - 1] ? $a[$n - 1] : $upper + $maxwhisker; return array($a[0], $xlower, $lower, $median, $upper, $xupper, $a[$n - 1], $n); }
function TimeSizeShapes($FileName, $Tests, $Langs, $Incl, $Excl, $HasHeading = TRUE) { list($data, $time_mins, $gz_mins) = ValidRowsAndMins($FileName, $Tests, $Langs, $Incl, $Excl, $HasHeading); $shapes = array(); $medians = array(); foreach ($data as $k => $test) { if (sizeof($test) / sizeof($Tests) > 0.5) { $points = array(); $xs = array(); $ys = array(); unset($minpoint); foreach ($test as $t => $v) { // wait until now to filter so sizeof($test) is consistent with FullWeightedData if ($Tests[$t][TEST_WEIGHT] > 0) { // normalized source code size on X, normalized measured time on Y $x = $v[DATA_GZ] / $gz_mins[$t]; $y = $v[DATA_TIME] / $time_mins[$t]; $points[] = array($x, $y); $xs[] = $x; // collect for median $ys[] = $y; // collect for median } } $shapes[$k] = $points; sort($xs); $xm = Median($xs); sort($ys); $ym = Median($ys); $medians[$k] = array($xm, $ym); // median } } return array($shapes, $medians); }