/** * @dataProvider realPointsProvider */ public function testHeuristicWithRealPoints($jobid, $metric_x, $metric_y, $num_clusters, $num_noise = 0) { $points = $this->getRealPoints($jobid, $metric_x, $metric_y); $dbscan = new DBSCAN(); list($cluster, $noise) = $dbscan->execute($points); $assert_error = ""; $assert_error .= "Check the chart here:\n"; $assert_error .= " http://127.0.0.1:8080/dbscan?jobid={$jobid}\n"; $assert_error .= " Metric X: \"" . DBUtils::$TASK_METRICS[$metric_x] . "\"\n"; $assert_error .= " Metric Y: \"" . DBUtils::$TASK_METRICS[$metric_y] . "\""; $this->assertCount($num_clusters, $cluster, $assert_error); $this->assertCount($num_noise, $noise, $assert_error); }
public function dbscanexecsDataAction() { //ini_set('memory_limit', '384M'); $db = $this->container->getDBUtils(); $this->buildFilters(); $whereClause = $this->filters->getWhereClause(array('execs' => 'e', 'clusters' => 'c')); $table_name = "e"; $jobid = Utils::get_GET_string("jobid"); $metric_x = Utils::get_GET_int("metric_x") !== null ? Utils::get_GET_int("metric_x") : 0; $metric_y = Utils::get_GET_int("metric_y") !== null ? Utils::get_GET_int("metric_y") : 1; $task_type = $db->get_task_type(Utils::get_GET_string("task_type")); list($bench, $job_offset, $id_exec) = $db->get_jobid_info($jobid); // Calc pending dbscanexecs (if any) $pending = $db->get_dbscanexecs_pending($bench, $job_offset, $metric_x, $metric_y, $task_type, $whereClause); if (count($pending) > 0) { $db->get_dbscan($pending[0]['jobid'], $metric_x, $metric_y, $task_type); } // Retrieve calculated dbscanexecs from database $task_type_select = $db->get_task_type_query($task_type, $filter_null = true); $query = "\n SELECT\n d.`id_exec`,\n d.`centroid_x`,\n d.`centroid_y`\n FROM aloja2.JOB_dbscan d, aloja2.execs e\n JOIN aloja2.clusters c USING (id_cluster)\n LEFT JOIN aloja_ml.predictions p USING (id_exec)\n WHERE\n d.`id_exec` = e.`id_exec` AND\n d.`bench` = :bench AND\n d.`job_offset` = :job_offset AND\n d.`metric_x` = :metric_x AND\n d.`metric_y` = :metric_y\n " . $task_type_select('d') . "\n {$whereClause}\n ;"; $query_params = array(":bench" => $bench, ":job_offset" => $job_offset, ":metric_x" => $metric_x, ":metric_y" => $metric_y); // Since we are calculating new results, we have to bypass the cache $_GET['NO_CACHE'] = 1; $rows = $db->get_rows($query, $query_params); $points = new Cluster(); // Used instead of a simple array to calc x/y min/max foreach ($rows as $row) { $points[] = new Point($row['centroid_x'], $row['centroid_y'], array('id_exec' => $row['id_exec'])); } $dbscan = new DBSCAN(); list($clusters, $noise) = $dbscan->execute((array) $points); $seriesData = array(); foreach ($clusters as $cluster) { $data = array(); foreach ($cluster as $point) { $data[] = array('x' => $point->x, 'y' => $point->y, 'id_exec' => $point->info['id_exec']); } if ($data) { $seriesData[] = array('points' => $data, 'size' => $cluster->count(), 'x_min' => $cluster->getXMin(), 'x_max' => $cluster->getXMax(), 'y_min' => $cluster->getYMin(), 'y_max' => $cluster->getYMax()); } } $noiseData = array(); foreach ($noise as $point) { $noiseData[] = array('x' => $point->x, 'y' => $point->y, 'id_exec' => $point->info['id_exec']); } $result = ['seriesData' => $seriesData, 'noiseData' => $noiseData, 'pending' => max(0, count($pending) - 1)]; header('Content-Type: application/json'); ob_start('ob_gzhandler'); echo json_encode($result, JSON_NUMERIC_CHECK); }
public function dbscanexecsDataAction() { //ini_set('memory_limit', '384M'); $db = $this->container->getDBUtils(); $where_configs = ''; $table_name = "e"; $datefrom = Utils::read_params('datefrom', $where_configs, false, $table_name); $dateto = Utils::read_params('dateto', $where_configs, false, $table_name); $benchs = Utils::read_params('benchs', $where_configs, false, $table_name); $nets = Utils::read_params('nets', $where_configs, false, $table_name); $disks = Utils::read_params('disks', $where_configs, false, $table_name); $blk_sizes = Utils::read_params('blk_sizes', $where_configs, false, $table_name); $comps = Utils::read_params('comps', $where_configs, false, $table_name); $id_clusters = Utils::read_params('id_clusters', $where_configs, false, $table_name); $mapss = Utils::read_params('mapss', $where_configs, false, $table_name); $replications = Utils::read_params('replications', $where_configs, false, $table_name); $iosfs = Utils::read_params('iosfs', $where_configs, false, $table_name); $iofilebufs = Utils::read_params('iofilebufs', $where_configs, false, $table_name); $money = Utils::read_params('money', $where_configs, false, $table_name); $datanodes = Utils::read_params('datanodess', $where_configs, false, $table_name); $benchtype = Utils::read_params('bench_types', $where_configs, false, $table_name); $vm_sizes = Utils::read_params('vm_sizes', $where_configs, false, $table_name); $vm_coress = Utils::read_params('vm_coress', $where_configs, false, $table_name); $vm_RAMs = Utils::read_params('vm_RAMs', $where_configs, false, $table_name); $hadoop_versions = Utils::read_params('hadoop_versions', $where_configs, false, $table_name); $types = Utils::read_params('types', $where_configs, false, $table_name); $filters = Utils::read_params('filters', $where_configs, false, $table_name); $allunchecked = isset($_GET['allunchecked']) ? $_GET['allunchecked'] : ''; $minexetime = Utils::read_params('minexetime', $where_configs, false, $table_name); $maxexetime = Utils::read_params('maxexetime', $where_configs, false, $table_name); $provider = Utils::read_params('providers', $where_configs, false, $table_name); $jobid = Utils::get_GET_string("jobid"); $metric_x = Utils::get_GET_int("metric_x") !== null ? Utils::get_GET_int("metric_x") : 0; $metric_y = Utils::get_GET_int("metric_y") !== null ? Utils::get_GET_int("metric_y") : 1; $task_type = $db->get_task_type(Utils::get_GET_string("task_type")); list($bench, $job_offset, $id_exec) = $db->get_jobid_info($jobid); // Calc pending dbscanexecs (if any) $pending = $db->get_dbscanexecs_pending($bench, $job_offset, $metric_x, $metric_y, $task_type, $where_configs); if (count($pending) > 0) { $db->get_dbscan($pending[0]['jobid'], $metric_x, $metric_y, $task_type); } // Retrieve calculated dbscanexecs from database $task_type_select = $db->get_task_type_query($task_type, $filter_null = true); $query = "\n SELECT\n d.`id_exec`,\n d.`centroid_x`,\n d.`centroid_y`\n FROM `JOB_dbscan` d, `execs` e\n WHERE\n d.`id_exec` = e.`id_exec` AND\n d.`bench` = :bench AND\n d.`job_offset` = :job_offset AND\n d.`metric_x` = :metric_x AND\n d.`metric_y` = :metric_y\n " . $task_type_select('d') . "\n {$where_configs}\n ;"; $query_params = array(":bench" => $bench, ":job_offset" => $job_offset, ":metric_x" => $metric_x, ":metric_y" => $metric_y); // Since we are calculating new results, we have to bypass the cache $_GET['NO_CACHE'] = 1; $rows = $db->get_rows($query, $query_params); $points = new Cluster(); // Used instead of a simple array to calc x/y min/max foreach ($rows as $row) { $points[] = new Point($row['centroid_x'], $row['centroid_y'], array('id_exec' => $row['id_exec'])); } $dbscan = new DBSCAN(); list($clusters, $noise) = $dbscan->execute((array) $points); $seriesData = array(); foreach ($clusters as $cluster) { $data = array(); foreach ($cluster as $point) { $data[] = array('x' => $point->x, 'y' => $point->y, 'id_exec' => $point->info['id_exec']); } if ($data) { $seriesData[] = array('points' => $data, 'size' => $cluster->count(), 'x_min' => $cluster->getXMin(), 'x_max' => $cluster->getXMax(), 'y_min' => $cluster->getYMin(), 'y_max' => $cluster->getYMax()); } } $noiseData = array(); foreach ($noise as $point) { $noiseData[] = array('x' => $point->x, 'y' => $point->y, 'id_exec' => $point->info['id_exec']); } $result = ['seriesData' => $seriesData, 'noiseData' => $noiseData, 'pending' => max(0, count($pending) - 1)]; header('Content-Type: application/json'); ob_start('ob_gzhandler'); echo json_encode($result, JSON_NUMERIC_CHECK); }
/** * Calculates the DBSCAN. */ public function get_dbscan($jobid, $metric_x, $metric_y, $task_type, $eps = null, $minPoints = null) { $query_select1 = $this->get_task_metric_query($this::$TASK_METRICS[$metric_x]); $query_select2 = $this->get_task_metric_query($this::$TASK_METRICS[$metric_y]); $task_type_select = $this->get_task_type_query($task_type); $query = "\n SELECT\n t.`TASKID` as TASK_ID,\n " . $query_select1('t') . " as TASK_VALUE_X,\n " . $query_select2('t') . " as TASK_VALUE_Y\n FROM `JOB_tasks` t\n WHERE t.`JOBID` = :jobid\n " . $task_type_select('t') . "\n ORDER BY t.`TASKID`\n ;"; $query_params = array(":jobid" => $jobid); $rows = $this->get_rows($query, $query_params); $points = new Cluster(); // Used instead of a simple array to calc x/y min/max foreach ($rows as $row) { $task_id = $row['TASK_ID']; $task_value_x = $row['TASK_VALUE_X'] ?: 0; $task_value_y = $row['TASK_VALUE_Y'] ?: 0; // Show only task id (not the whole string) $task_id = substr($task_id, 23); $points[] = new Point($task_value_x, $task_value_y, array('task_id' => $task_id)); } $dbscan = new DBSCAN($eps, $minPoints); $dbscan->execute((array) $points); // If heuristic was used, cache results in database if ($eps === null && $minPoints === null) { $this->add_dbscan($jobid, $metric_x, $metric_y, $task_type, $dbscan->getClusters()); } return $dbscan; }