CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions
PartitionGenerator Class Reference

#include <PartitionGenerator.h>

Classes

class  LessCollections
 

Public Types

typedef std::vector< int > Partition
 

Public Member Functions

std::vector< Partitionpartitions (int collectionSize, int minCollectionSize=1) const
 
std::vector< std::vector< Partition > > sortedPartitions (int collectionSize, int minCollectionSize=1) const
 

Detailed Description

Class to compute the possible partitions of a collection of 'collectionSize' elements. A Partition is a list of subcollection sizes that add up to 'collectionSize', ordered in decreasing order of subcollection size. No subcollection size is less than 'minCollectionSize'.

Definition at line 13 of file PartitionGenerator.h.

Member Typedef Documentation

typedef std::vector<int> PartitionGenerator::Partition

Definition at line 17 of file PartitionGenerator.h.

Member Function Documentation

vector< PartitionGenerator::Partition > PartitionGenerator::partitions ( int  collectionSize,
int  minCollectionSize = 1 
) const

Return partitions in a row.

Definition at line 8 of file PartitionGenerator.cc.

References popcon2dropbox::copy(), plotBeamSpotDB::first, and edm::second().

Referenced by CombinationGenerator< T >::combinations().

9  {
10 
11  std::vector<Partition> partitions;
12 
13  // at the very least, we have a single bag of size 'collectionSize'
14  partitions.push_back( Partition(1, collectionSize) );
15 
16  int first = collectionSize - minCollectionSize, second = minCollectionSize;
17  while( first >= second ) {
18  // try to further divide the first
19  std::vector<Partition> subPartitions = this->partitions(first, second);
20  std::vector<Partition>::iterator isub;
21  for( isub = subPartitions.begin(); isub != subPartitions.end(); isub++ ) {
22  const Partition& sub = *isub;
23  // reject subPartitions of first with a last element smaller than second
24  if( sub.back() < second ) continue;
25  Partition partition( sub.size()+1 );
26  copy( sub.begin(), sub.end(), partition.begin() );
27  partition[ partition.size()-1 ] = second;
28  partitions.push_back( partition );
29  }
30  first--; second++;
31  }
32 
33  return partitions;
34 }
U second(std::pair< T, U > const &p)
Partition
Definition: HLTHPDFilter.cc:32
std::vector< Partition > partitions(int collectionSize, int minCollectionSize=1) const
std::vector< int > Partition
vector< std::vector< PartitionGenerator::Partition > > PartitionGenerator::sortedPartitions ( int  collectionSize,
int  minCollectionSize = 1 
) const

Return partitions ordered according to the number of subcollections they have. 'sortedPartitions[N]' = list of partitions with N subcollections.

Definition at line 38 of file PartitionGenerator.cc.

References mps_fire::i.

Referenced by CombinationGenerator< T >::combinations().

39  {
40 
41  std::vector<Partition> partitions
42  = this->partitions(collectionSize, minCollectionSize);
43  sort (partitions.begin(), partitions.end(), LessCollections());
44 
45  std::vector< std::vector<Partition> > sortedPartitions;
46  sortedPartitions.resize(partitions.rbegin()->size());
47 
48  for (std::vector<Partition>::const_iterator i = partitions.begin();
49  i != partitions.end(); i++) {
50  sortedPartitions[(*i).size() - 1].push_back(*i);
51  }
52 
53  return sortedPartitions;
54 }
std::vector< std::vector< Partition > > sortedPartitions(int collectionSize, int minCollectionSize=1) const
std::vector< Partition > partitions(int collectionSize, int minCollectionSize=1) const