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.