28 if (i1 == i2)
return false;
29 const base_node &pt1((i1 ==
size_type(-1)) ? *c : (*vbn)[i1]);
30 const base_node &pt2((i2 ==
size_type(-1)) ? *c : (*vbn)[i2]);
31 unsigned d = pt1.size();
32 base_small_vector::const_iterator it = v.begin();
33 base_node::const_iterator it1 = pt1.begin(), it2 = pt2.begin();
35 for (
size_type i = 0; i < d; ++i) a += (*it++) * (*it1++ - *it2++);
36 if (a != scalar_type(0))
return a < 0;
41 node_tab::component_comp::component_comp
42 (
const dal::dynamic_tas<base_node> &vbn_,
const base_node &c_,
unsigned dim)
43 : vbn(&vbn_), c(&c_), v(dim) {
45 gmm::scale(v, scalar_type(1) / gmm::vect_norm2(v) );
48 void node_tab::add_sorter(
void)
const {
49 if (sorters.size() > 1)
50 GMM_WARNING3(
"Multiple sort needed for node tab : " << sorters.size()+1);
51 sorters.push_back(sorter(component_comp(*
this, c, dim_)));
52 for (dal::bv_visitor i(index()); !i.finished(); ++i)
56 size_type node_tab::search_node(
const base_node &pt,
57 const scalar_type radius)
const {
58 if (card() == 0 || radius < 0.)
61 scalar_type eps_radius = std::max(eps, radius);
62 for (size_type is = 0; is < 5; ++is) {
63 if (is >= sorters.size()) add_sorter();
65 c = pt - eps_radius * sorters[is].key_comp().v;
67 sorter::const_iterator it = sorters[is].lower_bound(
size_type(-1));
69 = gmm::vect_sp(pt, sorters[is].key_comp().v) + 2*eps_radius;
72 for (; it != sorters[is].end() && count < 20; ++it, ++count) {
80 if (gmm::vect_dist2(pt, pt2) < eps_radius)
return *it;
81 if (gmm::vect_sp(pt2, sorters[is].key_comp().v) > up_bound)
84 if (it == sorters[is].end())
return size_type(-1);
86 GMM_ASSERT1(
false,
"Problem in node structure !!");
89 void node_tab::clear() {
90 dal::dynamic_tas<base_node>::clear();
91 sorters = std::vector<sorter>();
92 max_radius = scalar_type(1e-60);
93 eps = max_radius * prec_factor;
97 const scalar_type radius,
98 bool remove_duplicated_nodes) {
99 scalar_type npt = gmm::vect_norm2(pt);
100 max_radius = std::max(max_radius, npt);
101 eps = max_radius * prec_factor;
103 if (this->card() == 0)
106 GMM_ASSERT1(dim_ == pt.size(),
"Nodes should have the same dimension");
108 if (remove_duplicated_nodes && radius >= 0.)
109 id = search_node(pt, radius);
111 id = dal::dynamic_tas<base_node>::add(pt);
112 for (size_type i = 0; i < sorters.size(); ++i) {
113 sorters[i].insert(
id);
114 GMM_ASSERT3(sorters[i].size() == card(),
"internal error");
122 bool existi = index().is_in(i), existj = index().is_in(j);
123 for (
size_type is = 0; is < sorters.size(); ++is) {
124 if (existi) sorters[is].erase(i);
125 if (existj) sorters[is].erase(j);
127 dal::dynamic_tas<base_node>::swap(i, j);
128 for (
size_type is = 0; is < sorters.size(); ++is) {
129 if (existi) sorters[is].insert(j);
130 if (existj) sorters[is].insert(i);
131 GMM_ASSERT3(sorters[is].size() == card(),
"internal error");
137 if (index().is_in(i)) {
138 for (
size_type is = 0; is < sorters.size(); ++is) {
139 sorters[is].erase(i);
140 GMM_ASSERT3(sorters[is].size()+1 == card(),
"Internal error");
143 dal::dynamic_tas<base_node>::sup(i);
148 void node_tab::translation(
const base_small_vector &V) {
149 for (dal::bv_visitor i(index()); !i.finished(); ++i) (*
this)[i] += V;
153 void node_tab::transformation(
const base_matrix &M) {
154 base_small_vector w(M.nrows());
155 GMM_ASSERT1(gmm::mat_nrows(M) != 0 && gmm::mat_ncols(M) == dim(),
156 "invalid dimensions for the transformation matrix");
157 dim_ = unsigned(gmm::mat_nrows(M));
158 for (dal::bv_visitor i(index()); !i.finished(); ++i) {
161 gmm::mult(M,w,(*
this)[i]);
166 node_tab::node_tab(scalar_type prec_loose) {
167 max_radius = scalar_type(1e-60);
169 prec_factor = gmm::default_tol(scalar_type()) * prec_loose;
170 eps = max_radius * prec_factor;
173 node_tab::node_tab(
const node_tab &t)
174 :
dal::dynamic_tas<base_node>(t), sorters(), eps(t.eps),
175 prec_factor(t.prec_factor), max_radius(t.max_radius), dim_(t.dim_) {}
177 node_tab &node_tab::operator =(
const node_tab &t) {
178 dal::dynamic_tas<base_node>::operator =(t);
179 sorters = std::vector<sorter>();
180 eps = t.eps; prec_factor = t.prec_factor;
181 max_radius = t.max_radius; dim_ = t.dim_;