1 #ifndef __JTRIGGER__JALGORITHM__
2 #define __JTRIGGER__JALGORITHM__
18 namespace JPP {
using namespace JTRIGGER; }
44 template<
class JHitIterator_t,
class JHit_t>
50 return clusterize(__begin, __end, match, Nmin,
typename std::iterator_traits<JHitIterator_t>::iterator_category());
57 template<
class JHitIterator_t,
class JHit_t>
62 std::random_access_iterator_tag)
64 const int N = std::distance(__begin, __end);
71 JHitIterator_t buffer = __begin;
77 for (i = 0; i != N; ++i) {
79 for (j = i; ++j != N; ) {
81 if (match(buffer[i], buffer[j])) {
86 }
else if (n == Nmin) {
92 if (count[i] < Nmin) {
108 for ( ; n >= Nmin; ) {
112 for (i = 1; i != n; ++i) {
113 if (count[i] < count[j]) {
130 std::swap(buffer[j], buffer[n]);
131 std::swap(count [j], count [n]);
135 for (i = 0; i != n; ++i) {
136 if (match(buffer[i], buffer[n])) {
172 template<
class JHitIterator_t,
class JHit_t>
174 JHitIterator_t __end,
177 return reverse_clusterize(__begin, __end, match,
typename std::iterator_traits<JHitIterator_t>::iterator_category());
184 template<
class JHitIterator_t,
class JHit_t>
186 JHitIterator_t __end,
188 std::random_access_iterator_tag)
190 const int N = std::distance(__begin, __end);
196 JHitIterator_t buffer = __begin;
202 for (i = 0; i != N; ++i) {
204 for (j = 0; j != i; ++j) {
205 if (match(buffer[i], buffer[j])) {
215 for (
int k = 0; ; ) {
219 for (i = j; ++i != N; ) {
220 if (count[i] > count[j]) {
233 std::swap(buffer[j], buffer[k]);
234 std::swap(count [j], count [k]);
238 for (i = k; ++i != N; ) {
239 if (match(buffer[i], buffer[k])) {
267 template<
class JHitIterator_t,
class JComparator_t,
class JHit_t>
269 JHitIterator_t __end,
270 JComparator_t comparator,
273 if (__begin != __end) {
275 std::sort(__begin, __end, comparator);
277 const JHit_t& root = *__begin;
279 return std::partition(++__begin, __end,
JBind2nd(match, root));
309 template<
class JHitIterator_t,
class JHit_t>
311 JHitIterator_t __end,
314 return clusterizeWeight(__begin, __end, match,
typename std::iterator_traits<JHitIterator_t>::iterator_category());
321 template<
class JHitIterator_t,
class JHit_t>
323 JHitIterator_t __end,
325 std::random_access_iterator_tag)
327 if (__begin != __end) {
329 const int N = std::distance(__begin, __end);
337 JHitIterator_t buffer = __begin;
339 for (i = 0; i != N; ++i) {
341 weight[i] += buffer[i].getW();
343 for (j = i; ++j != N; ) {
345 if (match(buffer[i], buffer[j])) {
347 weight[i] += buffer[j].getW();
348 weight[j] += buffer[i].getW();
365 for (i = 1; i != n; ++i) {
367 if (weight[i] < weight[j]) {
378 if (weight[j] == W) {
388 std::swap(buffer[j], buffer[n]);
389 std::swap(weight[j], weight[n]);
393 for (i = 0; i != n; ++i) {
394 if (match(buffer[i], buffer[n])) {
395 weight[i] -= buffer[n].getW();
419 template<
class JHit_t>
422 return first.getW() > second.getW();
436 template<
class JHit_t>
437 inline bool timeSorter(
const JHit_t& first,
const JHit_t& second)
439 return first.getT() < second.getT();
JBinder2nd< JHit_t > JBind2nd(const JMatch< JHit_t > &match, const JHit_t &second)
Auxiliary method to create JBinder2nd object.
Function object interface for hit matching.
JHitIterator_t clusterizeWeight(JHitIterator_t __begin, JHitIterator_t __end, const JMatch< JHit_t > &match)
Partition data according given binary match operator.
Base class for match operations inside clusterize methods.
JHitIterator_t clusterize(JHitIterator_t __begin, JHitIterator_t __end, const JMatch< JHit_t > &match, const int Nmin=1)
Partition data according given binary match operator.
bool timeSorter(const JHit_t &first, const JHit_t &second)
Compare two hits by weight.
bool weightSorter(const JHit_t &first, const JHit_t &second)
Compare two hits by weight.
JHitIterator_t reverse_clusterize(JHitIterator_t __begin, JHitIterator_t __end, const JMatch< JHit_t > &match)
Partition data according given binary match operator.