7 #ifndef JADE_NEIGHBOR_JOINING_HPP__
8 #define JADE_NEIGHBOR_JOINING_HPP__
10 #include "jade.matrix.hpp"
17 template <
typename TValue>
53 _root = _add_leaf(next_id);
60 typedef std::vector<id_type> vector_type;
62 for (
size_t i = 0; i < n; i++)
63 x.push_back(_add_leaf(next_id));
83 const id_type id (next_id++);
84 _add_parent(
id, x[q.i], q.d_ik);
85 _add_parent(
id, x[q.j], q.d_jk);
92 vector_type xx {
id };
93 for (
size_t r = 0, rr = 1; r < n; r++)
95 if (r == q.i || r == q.j)
99 (d(r, q.i) + d(r, q.j) - q.d_ij);
100 for (
size_t c = 0, cc = 1; c < r; c++)
101 if (c != q.i && c != q.j)
102 dd(rr, cc++) = d(r, c);
123 _add_parent(_root, x[1], d(1, 0));
131 std::ostringstream out;
144 if (_root != invalid_id)
152 typedef size_t id_type;
154 static constexpr id_type invalid_id =
155 std::numeric_limits<id_type>::max();
158 id_type _add_leaf(id_type & next_id)
160 const auto id = next_id++;
168 const id_type parent_id,
169 const id_type child_id,
172 _children[parent_id].push_back(child_id);
173 _lengths[child_id] = child_length;
177 void _write(std::ostream & out,
const id_type
id)
const
179 const auto & children = _children.find(
id)->second;
180 if (!children.empty())
184 auto iter = children.begin();
187 while (++iter != children.end())
196 const auto name_iter = _names.find(
id);
197 if (name_iter != _names.end())
200 const auto length_iter = _lengths.find(
id);
201 if (length_iter != _lengths.end())
202 out <<
":" << length_iter->second;
224 const auto n = d.get_height();
231 std::vector<value_type> sigma;
232 for (
size_t c = 0; c < n; c++)
233 sigma.push_back(d.get_row_sum(c));
239 for (
size_t r = 0; r < n; r++)
240 for (
size_t c = 0; c < r; c++)
241 q(r, c) = k_n_2 * d(r, c) - sigma[r] - sigma[c];
247 for (
size_t r = 2; r < n; r++)
248 for (
size_t c = 0; c < r; c++)
249 if (q(r, c) < q(i, j))
256 d_ik = k_0_5 * (d_ij + ((sigma[i] - sigma[j]) / k_n_2));
261 std::map<id_type, std::vector<id_type>> _children;
262 std::map<id_type, value_type> _lengths;
263 std::set<id_type> _names;
268 #endif // JADE_NEIGHBOR_JOINING_HPP__