46 template <
typename FLT_TYPE =
float>
50 virtual FLT_TYPE&
operator[](
const size_t i) = 0;
51 virtual size_t size()
const = 0;
58 for (
size_t i = 0; i <
size(); i++)
60 ret[i] = (*this)[i] + in[i];
66 const T& e,
const size_t& j,
const size_t& k)
69 return ((*
this)[k] - exp[k]) * ((*this)[j] - exp[j]);
72 template <
typename T,
typename RANDOM_ENGINE,
typename NOISE_GEN>
75 const auto org_noise = gen(engine);
77 for (
size_t i = 0; i < noise.size(); i++)
79 noise[i] = org_noise[i];
89 template <
typename T,
typename FLT_TYPE =
float>
112 template <
typename T,
typename FLT_TYPE =
float>
126 void add(
const T& s,
const FLT_TYPE& prob)
131 for (
size_t i = 0; i < e1.size(); i++)
133 e1[i] = e1[i] * prob;
144 for (
size_t i = 0; i <
s.size(); i++)
158 template <
typename T,
typename FLT_TYPE =
float,
typename MEAN = ParticleWeightedMean<T, FLT_TYPE>,
159 typename RANDOM_ENGINE = std::default_random_engine>
164 explicit ParticleFilter(
const int num_particles,
const unsigned int random_seed = std::random_device()())
173 template <
typename GEN>
178 p.state_ = T::template generateNoise<T>(
engine_, generator);
186 template <
typename GEN>
192 accum += p.probability_;
193 p.accum_probability_ = accum;
198 const FLT_TYPE pstep = accum /
particles_.size();
199 const FLT_TYPE initial_p = std::uniform_real_distribution<FLT_TYPE>(0.0, pstep)(
engine_);
202 const FLT_TYPE prob = 1.0 /
particles_.size();
203 for (
size_t i = 0; i <
particles_.size(); ++i)
206 const FLT_TYPE pscan = pstep * i + initial_p;
208 p.probability_ = prob;
211 p.state_ = it_prev->state_;
214 else if (it == it_prev)
216 p.state_ = it->state_ + T::template generateNoise<T>(
engine_, generator);
217 p.state_.normalize();
221 p.state_ = it->state_;
230 template <
typename GEN>
235 p.state_ = p.state_ + T::template generateNoise<T>(
engine_, generator);
245 void bias(std::function<
void(
const T&,
float& p_bias)> prob)
249 prob(p.state_, p.probability_bias_);
252 void measure(std::function<FLT_TYPE(
const T&)> likelihood)
258 p.probability_ *= likelihood(p.state_);
259 sum += p.probability_;
266 p.probability_ /= sum;
267 if (p.probability_ > 0)
269 entropy_ += p.probability_ * std::log(p.probability_);
284 if (pass_ratio < 1.0)
288 mean.add(p.state_, p.probability_);
289 if (mean.getTotalProbability() > pass_ratio)
292 return mean.getMean();
300 mean.add(p.state_, p.probability_ * p.probability_bias_);
302 return mean.getMean();
305 const FLT_TYPE pass_ratio = 1.0,
306 const FLT_TYPE random_sample_ratio = 1.0)
315 p_sum += p.probability_;
316 if (p_sum > pass_ratio)
320 std::vector<size_t> indices(p_num);
321 std::iota(indices.begin(), indices.end(), 0);
322 if (random_sample_ratio < 1.0)
324 std::shuffle(indices.begin(), indices.end(),
engine_);
326 const size_t sample_num =
331 static_cast<size_t>(p_num * random_sample_ratio)));
332 indices.resize(sample_num);
336 cov.resize(
ie_.covDimension());
339 for (
size_t i : indices)
342 p_sum += p.probability_;
343 for (
size_t j = 0; j <
ie_.covDimension(); j++)
345 for (
size_t k = j; k <
ie_.covDimension(); k++)
347 cov[k][j] = cov[j][k] += p.state_.covElement(e, j, k) * p.probability_;
351 for (
size_t j = 0; j <
ie_.covDimension(); j++)
353 for (
size_t k = 0; k <
ie_.covDimension(); k++)
364 FLT_TYPE max_probability =
particles_[0].probability_;
367 if (max_probability < p.probability_)
369 max_probability = p.probability_;
378 FLT_TYPE max_probability =
382 const FLT_TYPE prob = p.probability_ * p.probability_bias_;
383 if (max_probability < prob)
385 max_probability = prob;
404 accum += p.probability_;
405 p.accum_probability_ = accum;
411 FLT_TYPE pstep = accum / num;
418 FLT_TYPE prob = 1.0 / num;
424 p.probability_ = prob;
427 p.state_ = it_prev->state_;
432 p.state_ = it->state_;
437 typename std::vector<Particle<T, FLT_TYPE>>::iterator
appendParticle(
const size_t num)
441 return begin() + size_orig;
443 typename std::vector<Particle<T, FLT_TYPE>>::iterator
begin()
447 typename std::vector<Particle<T, FLT_TYPE>>::iterator
end()
467 #endif // MCL_3DL_PF_H