32 #ifndef SHARK_STATISTICS_MULTINOMIALDISTRIBUTION_H 33 #define SHARK_STATISTICS_MULTINOMIALDISTRIBUTION_H 55 typedef std::size_t result_type;
62 : m_probabilities(probabilities){
69 template<
typename Archive>
70 void serialize( Archive & ar,
const unsigned int version ) {
71 ar & BOOST_SERIALIZATION_NVP( m_probabilities );
72 ar & BOOST_SERIALIZATION_NVP( m_q );
73 ar & BOOST_SERIALIZATION_NVP( m_J );
78 return m_probabilities;
86 return m_probabilities;
90 template<
class RngType>
92 std::size_t numStates = m_probabilities.size();
94 std::size_t index =
discrete(rng,0,numStates-1);
104 std::size_t numStates = m_probabilities.size();
105 m_q.resize(numStates);
107 m_probabilities/=
sum(m_probabilities);
111 std::deque<std::size_t> smaller;
112 std::deque<std::size_t> larger;
113 for(std::size_t i = 0;i != numStates; ++i){
114 m_q(i) = numStates*m_probabilities(i);
116 smaller.push_back(i);
123 while(!smaller.empty() && !larger.empty()){
124 std::size_t smallIndex = smaller.front();
125 std::size_t largeIndex = larger.front();
129 m_J[smallIndex] = largeIndex;
130 m_q[largeIndex] -= 1.0 - m_q[smallIndex];
132 if(m_q[largeIndex] < 1.0)
133 smaller.push_back(largeIndex);
135 larger.push_back(largeIndex);
137 for(std::size_t i = 0; i != larger.size(); ++i){
138 m_q[larger[i]]=
std::min(m_q[larger[i]],1.0);
143 RealVector m_probabilities;