Ejemplo n.º 1
0
void clean_tree(struct avl_node *node, bool free_mapping) {
    struct avl_node *left = node->left;
    struct avl_node *right = node->right;

    // only free the mappings if told to to avoid redundant freeing
    if(free_mapping)
        free(node->mapping);

    free(node);

    // recurse on each subtrees if existent
    if(left != NULL)
        clean_tree(left, free_mapping);
    if(right != NULL)
        clean_tree(right, free_mapping);
}
Ejemplo n.º 2
0
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();
}
Ejemplo n.º 3
0
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();
}
Ejemplo n.º 4
0
t_tree	*get_tree(t_cmd *cmd_data)
{
	t_tree	*cmd_tree;

	if ((cmd_tree = init_cmd_tree(TYPE_CMD_SEP)) == NULL
		|| cut_cmd(cmd_tree, cmd_data, TYPE_CMD_SEP) == -1)
		return (NULL);
	clean_tree(cmd_tree);
	return (cmd_tree);
}
Ejemplo n.º 5
0
void		proceed_to_execution(t_var *var)
{
	var->list = lexer(var, var->lex);
	var->list = create_tokens(var->list);
	var->root = parser(var->list);
	execute_tree(var, var->root);
	clean_tree(var->root);
	var->root = NULL;
	var->list = NULL;
	clean_line_pointers(var);
}
Ejemplo n.º 6
0
void	clean_tree(t_tree *tree)
{
	t_param	*param;

	param = tree->param->next;
	while (param != tree->param)
	{
		if (param->tree)
		{
			clean_tree(param->tree);
			free(param->cmd);
			param->cmd = NULL;
		}
		param = param->next;
	}
}
Ejemplo n.º 7
0
Analysis::~Analysis()
{
  clean_tree();
}
Ejemplo n.º 8
0
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);
}