23 class CParticleFilterCapable;
32 template <
class Derived,
class particle_list_t>
38 return *
dynamic_cast<const Derived*
>(
this);
41 inline Derived&
derived() {
return *
dynamic_cast<Derived*
>(
this); }
42 double getW(
size_t i)
const override
44 if (i >=
derived().m_particles.size())
46 return derived().m_particles[i].log_w;
49 void setW(
size_t i,
double w)
override
51 if (i >=
derived().m_particles.size())
58 return derived().m_particles.size();
64 if (
derived().m_particles.empty())
return 0;
65 double minW =
derived().m_particles[0].log_w;
71 it !=
derived().m_particles.end(); ++it)
73 maxW = std::max<double>(maxW, it->log_w);
74 minW = std::min<double>(minW, it->log_w);
79 it !=
derived().m_particles.end(); ++it)
81 if (out_max_log_w) *out_max_log_w = maxW;
84 return std::exp(maxW - minW);
88 double ESS()
const override
94 double sumLinearWeights = 0;
97 it !=
derived().m_particles.end(); ++it)
98 sumLinearWeights += std::exp(it->log_w);
102 it !=
derived().m_particles.end(); ++it)
103 cum +=
mrpt::square(std::exp(it->log_w) / sumLinearWeights);
108 return 1.0 / (
derived().m_particles.size() * cum);
119 std::vector<size_t> sorted_indx(indx);
120 std::sort(sorted_indx.begin(), sorted_indx.end());
123 particle_list_t parts;
124 parts.resize(sorted_indx.size());
129 const size_t M_old =
derived().m_particles.size();
130 std::vector<bool> oldParticlesReused(M_old,
false);
133 size_t i, lastIndxOld = 0;
135 for (i = 0, itDest = parts.begin(); itDest != parts.end();
138 const size_t sorted_idx = sorted_indx[i];
139 itDest->log_w =
derived().m_particles[sorted_idx].log_w;
142 for (
size_t j = lastIndxOld; j < sorted_idx; j++)
144 if (!oldParticlesReused
146 derived().m_particles[j].d.reset();
150 lastIndxOld = sorted_idx;
154 if (!oldParticlesReused[sorted_idx])
157 parts[i].d.reset(
derived().m_particles[sorted_idx].d.get());
158 oldParticlesReused[sorted_idx] =
true;
165 new typename Derived::CParticleDataContent(
166 *
derived().m_particles[sorted_idx].d));
170 for (itSrc =
derived().m_particles.begin(),
171 oldPartIt = oldParticlesReused.begin();
172 itSrc !=
derived().m_particles.end(); itSrc++, oldPartIt++)
173 if (!*oldPartIt) itSrc->d.reset();
178 auto it_idx = sorted_indx.begin();
179 auto itDest = parts.begin();
180 for (; itDest != parts.end(); ++it_idx, ++itDest)
181 *itDest =
derived().m_particles[*it_idx];
184 derived().m_particles = std::move(parts);
229 template <
class STREAM>
250 template <
class STREAM>
264 it->d.reset(
new T());
284 for (it = out_logWeights.begin(), it2 =
m_particles.begin();
299 if (ret ==
nullptr ||
p.log_w > ret->log_w) ret = &
p;