1 #ifndef __NUMERIC_COMBINATORICS_HPP__ 2 #define __NUMERIC_COMBINATORICS_HPP__ 12 #include <base-logging/Logging.hpp> 15 #include <numeric/Twiddle.hpp> 16 #include <boost/math/special_functions/binomial.hpp> 54 std::sort(mItems.begin(), mItems.end());
63 return std::next_permutation(mItems.begin(), mItems.end());
79 uint64_t
numberOfPermutations()
const {
return static_cast<uint64_t
>( boost::math::factorial<double>(mItems.size()) ); }
83 extern std::map<Mode, std::string>
ModeTxt;
117 std::vector<T> mItems;
118 uint32_t mSizeOfDraw;
120 typedef std::vector<bool> Draw;
121 typedef std::vector< uint32_t > DrawList;
125 std::vector<T> mCurrentDraw;
127 std::set< ItemList > mExistingDraws;
129 int mCurrentDrawSize;
140 DrawList::const_iterator mCurrentDrawList;
150 : mItems(uniqueItems)
151 , mSizeOfDraw(sizeOfDraw)
154 std::sort(mItems.begin(), mItems.end());
155 if(sizeOfDraw > uniqueItems.size())
157 throw std::invalid_argument(
"base::combinatorics::Combination: size of draw is greater than number of available items");
160 uint32_t numberOfItems = mItems.size();
165 createStartDraw(numberOfItems, mSizeOfDraw);
166 mDrawList.push_back(mSizeOfDraw);
171 createStartDraw(numberOfItems, mSizeOfDraw);
172 mDrawList.push_back(mSizeOfDraw);
174 for(uint32_t i = mSizeOfDraw + 1; i <= numberOfItems; ++i)
176 mDrawList.push_back(i);
182 createStartDraw(numberOfItems, 1);
183 mDrawList.push_back(1);
185 for(uint32_t i = 2; i <= mSizeOfDraw; ++i)
187 mDrawList.push_back(i);
192 throw std::runtime_error(
"Invalid type given to switch");
195 mCurrentDrawList = mDrawList.begin();
197 LOG_DEBUG_S <<
"Creating Combination: n = " << numberOfItems <<
", k = " << sizeOfDraw << std::endl
198 <<
" expected number of combinations for (mode: " << ModeTxt[mode] <<
"): " << numberOfCombinations() << std::endl;
203 mCurrentDraw.clear();
204 mCurrentDrawSize = k;
208 for(
size_t i = 0; i < n; ++i)
212 mCurrentDraw.push_back( mItems[i]);
216 mExistingDraws.clear();
217 mExistingDraws.insert(mCurrentDraw);
222 while(mTwiddle.
next())
224 mCurrentDraw.clear();
225 for(
size_t i = 0; i != mItems.size(); ++i)
229 mCurrentDraw.push_back(mItems[i]);
233 typename std::pair< typename std::set< std::vector<T> >::iterator,
bool > result = mExistingDraws.insert(mCurrentDraw);
248 if(mCurrentDrawList + 1 != mDrawList.end())
251 createStartDraw(mItems.size(), *mCurrentDrawList);
265 uint32_t numberOfItems = mItems.size();
270 return static_cast<uint64_t
>( boost::math::binomial_coefficient<double>(numberOfItems, mSizeOfDraw) );
275 for(uint32_t i = mSizeOfDraw; i <= mItems.size(); ++i)
277 sum +=
static_cast<uint64_t
>( boost::math::binomial_coefficient<double>(numberOfItems, i) );
284 for(uint32_t i = 1; i <= mSizeOfDraw; ++i)
286 sum +=
static_cast<uint64_t
>( boost::math::binomial_coefficient<double>(numberOfItems, i) );
291 throw std::runtime_error(
"Invalid type given to switch");
297 #endif // __NUMERIC_COMBINATORICS_HPP__ Create permutation on a list of given types.
Definition: Combinatorics.hpp:37
Combination(const std::vector< T > &uniqueItems, size_t sizeOfDraw, Mode mode=EXACT)
Combination of a unique item map Binomialcoefficient (n k)
Definition: Combinatorics.hpp:149
std::vector< T > ItemList
Definition: Combinatorics.hpp:114
void createStartDraw(uint32_t n, uint32_t k)
Definition: Combinatorics.hpp:201
void init(int m, int n)
Definition: Twiddle.cpp:76
Permutation(const std::vector< T > items)
Definition: Combinatorics.hpp:51
bool next()
Definition: Combinatorics.hpp:220
Definition: Combinatorics.hpp:82
bool next()
Definition: Twiddle.cpp:21
Definition: Combinatorics.hpp:82
Twiddle algorithm – modifications applied only to simplify integration.
Definition: Twiddle.hpp:102
Mode
Definition: Combinatorics.hpp:82
uint64_t numberOfPermutations() const
Definition: Combinatorics.hpp:79
bool next()
Definition: Combinatorics.hpp:61
std::vector< T > ItemList
Definition: Combinatorics.hpp:40
std::map< Mode, std::string > ModeTxt
Definition: Combinatorics.cpp:15
Combination of a unique item map Binomialcoefficient (n k)
Definition: Combinatorics.hpp:111
bool isActivePosition(size_t position) const
Definition: Twiddle.cpp:16
uint64_t numberOfCombinations() const
Definition: Combinatorics.hpp:263
ItemList current() const
Definition: Combinatorics.hpp:258
const ItemList & current() const
Definition: Combinatorics.hpp:70
Definition: Combinatorics.hpp:82