struct copy_graph_node * permute_copies( struct copy_graph_node **copy_graph_head, struct add_list * add_list) { int count; struct copy_graph_node * topo_list_head; struct copy_graph_node ** node_array; if(do_stats) { timing(TIMING_START); } node_array = build_edges(*copy_graph_head,&count); if(do_stats) { rprintf(FINFO, "Build graph: %s\n", timing(TIMING_END)); } if(do_stats) { timing(TIMING_START); } topo_list_head = topo_sort(node_array,count, add_list); if(do_stats) { rprintf(FINFO, "Topological sort: %s\n", timing(TIMING_END)); } update_extra_memory(-(count * sizeof(struct copy_graph_node * ))); if(do_stats) { rprintf(FINFO, "Extra memory: %d Extra bytes sent: %d\n", max_extra_memory,extra_bytes); rprintf(FINFO, "Broken copies without delta comp: %d\n", broken_copies); rprintf(FINFO, "Cycles broken: %d Bytes trimmed: %d\n", cycles_broken, bytes_trimmed); } free(node_array); return topo_list_head; }
void algorithms::KDDecomposer<IROBOT>::AdaptiveDecompose(double larg_radius, double min_radius) { this->ShallowDecompose(larg_radius); algorithms::Analyzer<IROBOT> analyzer( *this ); //importance = analyzer.build_simple_weighted_centrality_matrix(M_PI/8, M_PI/64); std::vector<double> importance = analyzer.build_path_importance_matrix(larg_radius * 7, larg_radius); // node_index --> importance std::unordered_map<int, double> impt_map; std::stack<int> stack; for( int i = 0; i < this->cells.size(); i++ ) { double cell_radius = get_cell(i).radius(); if(cell_radius > larg_radius*2) continue; stack.push(get_cell(i).node_id); impt_map[get_cell(i).node_id] = importance[i]; } this->cells.clear(); this->DecomposeSubspaces( stack, larg_radius, min_radius, impt_map ); this->cells.reserve(nodes.size()); nodes.shrink_to_fit(); cells.shrink_to_fit(); clean_tree(); build_edges(); }
void algorithms::KDDecomposer<IROBOT>::DecomposeSpace() { std::clock_t t0 = std::clock(); const std::array<robotics::Range, DIM>& ranges = robot_.get_config_ranges(); ND::vec<DIM> center; for (int i = 0; i < DIM; i++) { center[i] = (std::get<0>(ranges[i]) + std::get<1>(ranges[i])) * 0.5; } radius_array[0] = (std::get<1>(ranges[0]) - std::get<0>(ranges[0])) * 0.5; for (int i = 1; i < sizeof(radius_array) / sizeof(radius_array[0]); ++i) radius_array[i] = radius_array[i-1] * 0.5; // NOTE: Assumes hypercube config space!! (Commented code more general) nodes.reserve(360000000); cells.reserve(3000000); root_index = get_new_node(center, 0); std::stack<int> stack; stack.emplace(root_index); while (!stack.empty()) { int node_index = stack.top(); stack.pop(); robot_.set_config(get_node(node_index).center()); double dist_to_obsts = obstacle_manager_.dist_to_obsts(robot_); if (dist_to_obsts > 0) { // Create free space ball double initial_guess = CalcFreeCellRadius(dist_to_obsts); double radius = robot_.free_space_oracle(obstacle_manager_, initial_guess /* lower bound */, 2 * initial_guess /* upper bound */); if (robot_.subconvex_radius(obstacle_manager_, radius, radius_array[get_node(node_index).depth()]) ) { get_node(node_index).set_covered(); get_node(node_index).set_free(); if (!MERGE_CELLS) get_node(node_index).set_cell(get_new_cell(get_node(node_index).center(), radius_array[get_node(node_index).depth()], node_index)); } else if (dist_to_obsts >= epsilon_ * 0.5 || radius_array[get_node(node_index).depth()] >= robot_.get_s_small(epsilon_ * 0.5) ) { SplitCell(node_index); for (int i = 0; i < NUM_SPLITS; ++i) stack.emplace(get_node(node_index).get_children() + i); } } else if (obstacle_manager_.penetration(robot_) / robot_.get_max_speed() >= (PENETRATION_CONSTANT / min_param_speed_) * radius_array[get_node(node_index).depth()] ) { continue; } else if (radius_array[get_node(node_index).depth()] >= robot_.get_s_small(epsilon_ * 0.5)) { SplitCell(node_index); for (int i = 0; i < NUM_SPLITS; ++i) stack.emplace(get_node(node_index).get_children() + i); } } nodes.shrink_to_fit(); cells.shrink_to_fit(); clean_tree(); build_edges(); }
void load_graph(const char *filename, graph *graph) { // open the file std::ifstream graph_file; graph_file.open(filename); get_meta_data(graph_file, graph); int* scratch = (int*) malloc(sizeof(int) * (graph->num_nodes + graph->num_edges)); read_graph_file(graph_file, scratch); build_start(graph, scratch); build_edges(graph, scratch); free(scratch); }
void algorithms::KDDecomposer<IROBOT>::ShallowDecompose( double min_radius ) { const std::array<robotics::Range, DIM>& ranges = robot_.get_config_ranges(); ND::vec<DIM> center; for (int i = 0; i < DIM; i++) { center[i] = (std::get<0>(ranges[i]) + std::get<1>(ranges[i])) * 0.5; } radius_array[0] = (std::get<1>(ranges[0]) - std::get<0>(ranges[0])) * 0.5; for (int i = 1; i < sizeof(radius_array) / sizeof(radius_array[0]); ++i) radius_array[i] = radius_array[i-1] * 0.5; // NOTE: Assumes hypercube config space!! (Commented code more general) nodes.reserve(360000000); cells.reserve(3000000); root_index = get_new_node(center, 0); std::stack<int> stack; stack.emplace(root_index); while (!stack.empty()) { int node_index = stack.top(); stack.pop(); double cell_radius = radius_array[get_node(node_index).depth()]; robot_.set_config(get_node(node_index).center()); double dist_to_obsts = obstacle_manager_.dist_to_obsts(robot_); if (dist_to_obsts > 0) { // Create free space ball double initial_guess = CalcFreeCellRadius(dist_to_obsts); double radius = robot_.free_space_oracle(obstacle_manager_, initial_guess /* lower bound */, 2 * initial_guess /* upper bound */); if (robot_.subconvex_radius(obstacle_manager_, radius, cell_radius) ) { get_node(node_index).set_covered(); get_node(node_index).set_free(); if (!MERGE_CELLS) get_node(node_index).set_cell(get_new_cell(get_node(node_index).center(), cell_radius, node_index)); } else if ( cell_radius > min_radius ) { SplitCell(node_index); for (int i = 0; i < NUM_SPLITS; ++i) stack.emplace(get_node(node_index).get_children() + i); } else { get_node(node_index).set_covered(); //get_node(node_index).set_mix(); get_node(node_index).set_free(); } } else { const double penetration = obstacle_manager_.penetration(robot_); if ( penetration >= cell_radius ) { continue; } /* else if (cell_radius > penetration ) { get_node(node_index).set_covered(); get_node(node_index).set_free(); }*/ else if (cell_radius > min_radius ) { SplitCell(node_index); for (int i = 0; i < NUM_SPLITS; ++i) stack.emplace(get_node(node_index).get_children() + i); } } } nodes.shrink_to_fit(); cells.shrink_to_fit(); clean_tree(); build_edges(false); }