public static function clear_iqr_outlier_results(&$test_result_buffer) { $is_multi_way = pts_render::multi_way_identifier_check($test_result_buffer->get_identifiers()); if ($is_multi_way) { $group_values = array(); $group_keys = array(); foreach ($test_result_buffer->buffer_items as $key => &$buffer_item) { $identifier_r = pts_strings::trim_explode(': ', $buffer_item->get_result_identifier()); if (!isset($group_values[$identifier_r[1]])) { $group_values[$identifier_r[1]] = array(); $group_keys[$identifier_r[1]] = array(); } array_push($group_values[$identifier_r[1]], $buffer_item->get_result_value()); array_push($group_keys[$identifier_r[1]], $key); } foreach ($group_values as $group_key => $values) { // From: http://www.mathwords.com/o/outlier.htm $fqr = pts_math::first_quartile($values); $tqr = pts_math::third_quartile($values); $iqr_cut = ($tqr - $fqr) * 1.5; $bottom_cut = $fqr - $iqr_cut; $top_cut = $tqr + $iqr_cut; foreach ($group_keys[$group_key] as $key) { $value = $test_result_buffer->buffer_items[$key]->get_result_value(); if ($value > $top_cut || $value < $bottom_cut) { unset($test_result_buffer->buffer_items[$key]); } } } } else { // From: http://www.mathwords.com/o/outlier.htm $values = $test_result_buffer->get_values(); $fqr = pts_math::first_quartile($values); $tqr = pts_math::third_quartile($values); $iqr_cut = ($tqr - $fqr) * 1.5; $bottom_cut = $fqr - $iqr_cut; $top_cut = $tqr + $iqr_cut; foreach ($test_result_buffer->buffer_items as $key => &$buffer_item) { $value = $buffer_item->get_result_value(); if ($value > $top_cut || $value < $bottom_cut) { unset($test_result_buffer->buffer_items[$key]); } } } }
public function points_of_possible_interest($threshold_level = 0.1) { $points_of_interest = array(); if ($this->test_profile->get_display_format() != 'BAR_GRAPH') { return $points_of_interest; } $is_multi_way = pts_render::multi_way_identifier_check($this->test_result_buffer->get_identifiers()); $keys = array_keys($this->test_result_buffer->buffer_items); if ($is_multi_way) { $key_sets = array(); foreach ($keys as $k) { $identifier_r = pts_strings::trim_explode(': ', $this->test_result_buffer->buffer_items[$k]->get_result_identifier()); if (!isset($key_sets[$identifier_r[0]])) { $key_sets[$identifier_r[0]] = array(); } $key_sets[$identifier_r[0]][] = $k; } } else { $key_sets = array($keys); } foreach ($key_sets as $keys) { $prev_value = -1; $prev_id = -1; foreach ($keys as $k) { $this_value = $this->test_result_buffer->buffer_items[$k]->get_result_value(); $this_id = $this->test_result_buffer->buffer_items[$k]->get_result_identifier(); if ($prev_value != -1 && $prev_id != -1) { $d = abs($prev_value / $this_value - 1); if ($d > $threshold_level) { $points_of_interest[] = $this_id . ' - ' . $prev_id . ': ' . round($d * 100, 2) . '%'; } } $prev_value = $this_value; $prev_id = $this_id; } } return $points_of_interest; }
public function normalize_buffer_values($normalize_against = false) { if ($this->test_profile->get_display_format() != 'BAR_GRAPH') { return false; } $is_multi_way = pts_render::multi_way_identifier_check($this->test_result_buffer->get_identifiers()); $keys = array_keys($this->test_result_buffer->buffer_items); if ($is_multi_way) { $key_sets = array(); foreach ($keys as $k) { $identifier_r = pts_strings::trim_explode(': ', $this->test_result_buffer->buffer_items[$k]->get_result_identifier()); if (!isset($key_sets[$identifier_r[0]])) { $key_sets[$identifier_r[0]] = array(); } array_push($key_sets[$identifier_r[0]], $k); } } else { $key_sets = array($keys); } foreach ($key_sets as $keys) { if ($this->test_profile->get_result_proportion() == 'LIB') { // Invert values for LIB foreach ($keys as $k) { $this->test_result_buffer->buffer_items[$k]->reset_result_value(1 / $this->test_result_buffer->buffer_items[$k]->get_result_value()); } } $divide_value = -1; if ($normalize_against != false) { foreach ($keys as $k) { if ($is_multi_way && strpos($this->test_result_buffer->buffer_items[$k]->get_result_identifier(), ': ' . $normalize_against) !== false) { // This allows it to just normalize against part of the string $divide_value = $this->test_result_buffer->buffer_items[$k]->get_result_value(); break; } else { if ($this->test_result_buffer->buffer_items[$k]->get_result_identifier() == $normalize_against) { $divide_value = $this->test_result_buffer->buffer_items[$k]->get_result_value(); break; } } } } if ($divide_value == -1) { foreach ($keys as $k) { if ($this->test_result_buffer->buffer_items[$k]->get_result_value() < $divide_value || $divide_value == -1) { $divide_value = $this->test_result_buffer->buffer_items[$k]->get_result_value(); } } } if ($divide_value != 0) { foreach ($keys as $k) { $normalized = pts_math::set_precision($this->test_result_buffer->buffer_items[$k]->get_result_value() / $divide_value, max(3, $this->result_precision)); $this->test_result_buffer->buffer_items[$k]->reset_result_value($normalized); $this->test_result_buffer->buffer_items[$k]->reset_raw_value(0); } } } $this->test_profile->set_result_proportion('HIB'); $this->test_profile->set_result_scale('Relative Performance'); return true; }
public function is_multi_way_comparison($identifiers = false, $extra_attributes = null) { if (isset($extra_attributes['force_tracking_line_graph'])) { // Phoromatic result tracker $is_multi_way = true; $this->is_multi_way_inverted = true; } else { $hw = null; // XXX: this isn't used anymore at least for now on system hardware if ($identifiers == false) { $identifiers = $this->get_system_identifiers(); } $is_multi_way = count($identifiers) < 2 ? false : pts_render::multi_way_identifier_check($identifiers, $hw, $this); $this->is_multi_way_inverted = $is_multi_way && $is_multi_way[1]; } return $is_multi_way; }
public function __construct(&$result_object = null, &$result_file = null, $extra_attributes = null) { // Initalize Colors $this->i['identifier_size'] = self::$c['size']['identifiers']; // Copy this since it's commonly overwritten $this->i['graph_orientation'] = 'VERTICAL'; $this->i['graph_value_type'] = 'NUMERICAL'; $this->i['hide_graph_identifiers'] = false; $this->i['show_graph_key'] = false; $this->i['show_background_lines'] = false; $this->i['iveland_view'] = false; $this->i['graph_max_value_multiplier'] = 1.285; $this->i['graph_max_value'] = 0; $this->i['bottom_offset'] = 0; $this->i['hide_y_title'] = false; $this->i['compact_result_view'] = false; $this->i['key_line_height'] = 0; $this->i['graph_height'] = 0; $this->i['graph_width'] = 0; $this->i['left_start'] = 10; $this->i['left_end_right'] = 10; $this->i['top_start'] = 62; $this->i['top_end_bottom'] = 22; $this->i['mark_count'] = 6; // Number of marks to make on vertical axis $this->i['multi_way_comparison_invert_default'] = true; $this->i['notes'] = array(); // Reset of setup besides config if ($result_object != null) { $test_version = $result_object->test_profile->get_app_version(); if (isset($test_version[2]) && is_numeric($test_version[0])) { $test_version = 'v' . $test_version; } $this->graph_title = trim($result_object->test_profile->get_title() . ' ' . $test_version); $this->graph_y_title = $result_object->test_profile->get_result_scale_formatted(); $this->test_identifier = $result_object->test_profile->get_identifier(); $this->i['graph_proportion'] = $result_object->test_profile->get_result_proportion(); $this->addSubTitle($result_object->get_arguments_description()); } $this->update_graph_dimensions(self::$c['graph']['width'], self::$c['graph']['height'], true); if (isset($extra_attributes['force_tracking_line_graph'])) { // Phoromatic result tracker $this->is_multi_way_comparison = true; } else { if (isset($result_object->test_result_buffer)) { $this->is_multi_way_comparison = pts_render::multi_way_identifier_check($result_object->test_result_buffer->get_identifiers()); } } $this->i['graph_version'] = 'Phoronix Test Suite ' . PTS_VERSION; if (isset($extra_attributes['regression_marker_threshold'])) { $this->d['regression_marker_threshold'] = $extra_attributes['regression_marker_threshold']; } if (isset($extra_attributes['set_alternate_view'])) { $this->d['link_alternate_view'] = $extra_attributes['set_alternate_view']; } if (isset($extra_attributes['highlight_graph_values'])) { $this->value_highlights = $extra_attributes['highlight_graph_values']; } else { if (PTS_IS_CLIENT && pts_client::read_env('GRAPH_HIGHLIGHT') != false) { $this->value_highlights = pts_strings::comma_explode(pts_client::read_env('GRAPH_HIGHLIGHT')); } } if (isset($extra_attributes['force_simple_keys'])) { $this->override_i_value('force_simple_keys', true); } if (isset($extra_attributes['multi_way_comparison_invert_default'])) { $this->i['multi_way_comparison_invert_default'] = $extra_attributes['multi_way_comparison_invert_default']; } $this->test_result =& $result_object; if (!isset($extra_attributes['no_compact_results_var'])) { $this->generate_results_var(); } }
public function buffer_values_to_percent() { $is_multi_way = pts_render::multi_way_identifier_check($this->get_identifiers()); if ($is_multi_way) { $group_values = array(); foreach ($this->buffer_items as &$buffer_item) { $identifier_r = pts_strings::trim_explode(': ', $buffer_item->get_result_identifier()); if (!isset($group_values[$identifier_r[1]])) { $group_values[$identifier_r[1]] = 0; } $group_values[$identifier_r[1]] += $buffer_item->get_result_value(); } foreach ($this->buffer_items as &$buffer_item) { $identifier_r = pts_strings::trim_explode(': ', $buffer_item->get_result_identifier()); $percent = pts_math::set_precision($buffer_item->get_result_value() / $group_values[$identifier_r[1]] * 100, 3); $buffer_item->reset_result_value($percent); } } else { $total_value = array_sum($this->get_values()); foreach ($this->buffer_items as &$buffer_item) { $percent = pts_math::set_precision($buffer_item->get_result_value() / $total_value * 100, 3); $buffer_item->reset_result_value($percent); } } }