Maintain largest-leaf-depth and number-of-dag-nodes

This commit is contained in:
Michal Kleinbort 2011-10-30 19:20:14 +00:00
parent 2213e7ee75
commit ec9fc196dc
1 changed files with 72 additions and 31 deletions

View File

@ -911,7 +911,9 @@ public:
(left->right()->curve_end(), right->left()->curve_end()))
{
left->merge_trapezoid(*right);
//set the depth to be the max of the two merged nodes
left->dag_node()->depth() = std::max ( left->dag_node()->depth(),
right->dag_node()->depth());
#ifdef CGAL_TD_DEBUG
CGAL_assertion(
left->is_on_right_boundary() == right->is_on_right_boundary());
@ -1141,7 +1143,8 @@ public:
Dag_node container2dag (Nodes_map& ar, int left, int right) const;
Dag_node container2dag (Nodes_map& ar, int left, int right,
int& num_of_new_nodes) const;
@ -1155,14 +1158,16 @@ public:
Trapezoidal_decomposition_2 (bool rebuild = true)
: depth_threshold(CGAL_TD_DEFAULT_DEPTH_THRESHOLD),
size_threshold(CGAL_TD_DEFAULT_SIZE_THRESHOLD),
m_arr(0), traits(0)
m_arr(0), traits(0), m_largest_leaf_depth(0),
m_number_of_curves(0), m_number_of_dag_nodes(1)
{
init();
set_needs_update(rebuild);
}
Trapezoidal_decomposition_2(const double& depth_th,const double& size_th)
: depth_threshold(depth_th),size_threshold(size_th), m_arr(0), traits(0)
: depth_threshold(depth_th),size_threshold(size_th), m_arr(0), traits(0),
m_largest_leaf_depth(0), m_number_of_curves(0), m_number_of_dag_nodes(1)
{
init();
set_needs_update(rebuild);
@ -1170,7 +1175,9 @@ public:
Trapezoidal_decomposition_2(const Self& td)
: m_needs_update(td.m_needs_update),
m_number_of_curves(td.m_number_of_curves),
m_number_of_curves(td.m_number_of_curves),
m_largest_leaf_depth(td.m_largest_leaf_depth),
m_number_of_dag_nodes(td.m_number_of_dag_nodes),
traits(td.traits),
m_arr(td.m_arr),
last_cv(NULL), prev_cv(NULL),
@ -1195,7 +1202,7 @@ public:
X_trapezoid* tr_copy = &*(*ds_copy);
tr_copy->set_dag_node(ds_copy);
CGAL_assertion(&*(*tr_copy->dag_node()) == tr_copy);
ds_copy->set_depth(cur->dag_node()->depth());
ds_copy->depth() = cur->dag_node()->depth();
// We cheat a little with the depth.
htr.insert(typename X_trapezoid_ptr_map::value_type(cur, tr_copy));
// Second iteration: generate new copies of trapezoids and nodes.
@ -1333,7 +1340,7 @@ public:
#endif
Dag_node curr = *m_dag_root;
Dag_node curr = *m_dag_root; //MICHAL: is it ok to add &?
#ifdef CGAL_TD_DEBUG
@ -1379,7 +1386,7 @@ public:
#endif
Dag_node curr = *m_dag_root;
Dag_node curr = *m_dag_root; //MICHAL: is it ok to add &?
#ifdef CGAL_TD_DEBUG
CGAL_precondition(!!curr);
@ -1451,6 +1458,7 @@ public:
// the merge uses the suspected halfedge before the arrangement merge
CGAL_precondition(merged_he == before_mrg_he ||
merged_he == before_mrg_he->twin());
//print_dag_addresses(*m_dag_root);
//rebuild();//MICHAL: added this to avoid point-nodes in the DAG that hold no longer existing vertex
}
@ -1459,10 +1467,7 @@ public:
{
return m_dag_root->size();
}
unsigned long depth() const
{
return m_dag_root->depth();
}
unsigned long number_of_curves() const
{
return m_number_of_curves;
@ -1543,6 +1548,7 @@ public:
------------------------------------------------------------------*/
Self& rebuild()
{
std::cout << "\nrebuild! " << m_number_of_curves << "\n\n";
#ifdef CGAL_TD_DEBUG
std::cout << "\nrebuild()" << std::flush;
#endif
@ -1682,11 +1688,11 @@ public:
bool needs_update()
{
unsigned long sz = number_of_curves();
unsigned long num_of_cv = number_of_curves();
//to avoid signed / unsigned conversion warnings
// rand() returns an int but a non negative one.
if (static_cast<unsigned long>(std::rand()) >
RAND_MAX / (sz+1))
RAND_MAX / ( num_of_cv + 1))
return false;
/* INTERNAL COMPILER ERROR overide
#ifndef __GNUC__
@ -1694,15 +1700,21 @@ public:
#ifdef CGAL_TD_REBUILD_DEBUG
std::cout << "\n|heavy!" << std::flush;
#endif
return
depth()>(get_depth_threshold()*(std::log(double(sz+1))))
|| size()>(get_size_threshold()*(sz+1));
bool cond1 = largest_leaf_depth() >
(get_depth_threshold()*(std::log(double(num_of_cv+1)))); //MICHAL: should we add +1 to the largest depth?
bool cond2 = number_of_dag_nodes() > (get_size_threshold()*(num_of_cv + 1));
//char c1 = cond1 ? 't' : 'f';
//char c2 = cond2 ? 't' : 'f';
//std::cout << "\n" << c1 <<"," << c2 << "\n";
return cond1 || cond2;
/*
#else
// to avoid comparison between signed and unsigned
return ((depth()/10)>log(sz+1))||((size()/10)>(sz+1));
//return ((((signed)depth())/10)>log(sz+1))||
((((signed)size())/10)>(sz+1));
return ((depth()/10)>log(num_of_cv+1))||((size()/10)>(num_of_cv+1));
//return ((((signed)depth())/10)>log(num_of_cv+1))||
((((signed)size())/10)>(num_of_cv+1));
#endif
*/
@ -1764,11 +1776,32 @@ public:
return size_threshold=size_th;
}
void update_largest_leaf_depth( unsigned long depth )
{
if(m_largest_leaf_depth < depth )
m_largest_leaf_depth = depth;
}
unsigned long largest_leaf_depth()
{
CGAL_assertion((m_largest_leaf_depth + 1) == m_dag_root->rec_depth());
return m_largest_leaf_depth;
}
unsigned long number_of_dag_nodes()
{
CGAL_assertion(m_number_of_dag_nodes == m_dag_root->size());
return m_number_of_dag_nodes;
}
protected:
//Trapezoidal Decomposition data members
Dag_node* m_dag_root;
unsigned long m_largest_leaf_depth; //holds the leargest depth of a leaf in the DAG
unsigned long m_number_of_dag_nodes; //holds the number of nodes in the DAG
bool m_needs_update;
unsigned long m_number_of_curves;
const Traits* traits;
@ -1823,7 +1856,9 @@ private:
#endif
m_number_of_curves=0;
m_number_of_curves = 0;
m_largest_leaf_depth = 0;
m_number_of_dag_nodes = 1; //the root is the only node in the DAG
#ifndef CGAL_NO_TRAPEZOIDAL_DECOMPOSITION_2_OPTIMIZATION
@ -1937,15 +1972,15 @@ private:
std::cout << "----------------- DAG ----------------" <<std::endl
<< "--------------------------------------" <<std::endl;
int level = 0;
print_dag_addresses(curr, level);
print_dag_addresses_rec(curr, 0);
std::cout << "----------------- END OF DAG ----------------" <<std::endl
<< "---------------------------------------------" <<std::endl;
}
void print_dag_addresses(const Dag_node& curr, int level )
void print_dag_addresses_rec(const Dag_node& curr ,int level)
{
std::cout << "------ level " << level << " ------\n";
std::cout << "------ level " << level << ", depth " << curr.depth() << " ------\n";
std::cout << " (void *)curr : " << (void *)(&curr) << std::endl;
std::cout << " (void *)curr->TRPZ : " << (void *)(curr.operator->()) << std::endl;
//curr is the current pointer to node in the data structure
@ -1957,8 +1992,8 @@ private:
print_ce_data(left_ce.cv(), left_ce.ce());
std::cout << " (void *)left_child: " << (void *)(&(curr.left_child())) << std::endl;
std::cout << " (void *)right_child: " << (void *)(&(curr.right_child())) << std::endl;
print_dag_addresses(curr.left_child(), level+1);
print_dag_addresses(curr.right_child(), level+1);
print_dag_addresses_rec(curr.left_child(), level+1);
print_dag_addresses_rec(curr.right_child(), level+1);
return;
}
if (traits->is_degenerate_curve(*curr))
@ -1973,8 +2008,8 @@ private:
print_cv_data(*p_he_cv);
std::cout << " (void *)left_child: " << (void *)(&(curr.left_child())) << std::endl;
std::cout << " (void *)right_child: " << (void *)(&(curr.right_child())) << std::endl;
print_dag_addresses(curr.left_child(), level+1);
print_dag_addresses(curr.right_child(), level+1);
print_dag_addresses_rec(curr.left_child(), level+1);
print_dag_addresses_rec(curr.right_child(), level+1);
return;
}
else
@ -1982,9 +2017,15 @@ private:
// if is_degenerate() == 0, meaning: the trapezoid (curr)
// is neither a point nor a curve , but a real trapezoid
if (curr->is_active())
std::cout << " UNBOUNDED_TRAPEZOID \n";
else
std::cout << " TRAPEZOID \n";
else //trapezoid is removed - may have a left child
{
std::cout << " REMOVED TRAPEZOID \n";
if (!curr.left_child())
return;
std::cout << " (void *)left_child: " << (void *)(&(curr.left_child())) << std::endl;
print_dag_addresses_rec(curr.left_child(), level+1);
}
}
}