1 #ifndef __JTRIGGER__JALGORITHM__
2 #define __JTRIGGER__JALGORITHM__
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)
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)
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) {
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();