9 #ifndef CParticleFilterData_H
10 #define CParticleFilterData_H
23 class CParticleFilterCapable;
30 template <
class Derived,
class particle_list_t>
34 inline const Derived&
derived()
const {
return *
static_cast<const Derived*
>(
this); }
36 inline Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
41 return derived().m_particles[i].log_w;
47 derived().m_particles[i].log_w = w;
52 return derived().m_particles.size();
58 if (
derived().m_particles.empty())
return 0;
59 double minW =
derived().m_particles[0].log_w;
65 maxW = std::max<double>( maxW, it->log_w );
66 minW = std::min<double>( minW, it->log_w );
71 if (out_max_log_w) *out_max_log_w = maxW;
74 return exp(maxW-minW);
84 double sumLinearWeights = 0;
86 sumLinearWeights += exp( it->log_w );
93 else return 1.0/(
derived().m_particles.size()*cum);
101 particle_list_t parts;
103 const size_t M_old =
derived().m_particles.size();
104 size_t i,j,lastIndxOld = 0;
105 std::vector<bool> oldParticlesReused(M_old,
false);
107 std::vector<size_t> sorted_indx(indx);
110 std::sort( sorted_indx.begin(), sorted_indx.end() );
112 parts.resize( sorted_indx.size() );
113 for (i=0,itDest=parts.begin();itDest!=parts.end();i++,itDest++)
115 const size_t sorted_idx = sorted_indx[i];
116 itDest->log_w =
derived().m_particles[ sorted_idx ].log_w;
118 for (j=lastIndxOld;j<sorted_idx;j++)
120 if (!oldParticlesReused[j])
122 delete derived().m_particles[j].d;
123 derived().m_particles[j].d = NULL;
128 lastIndxOld = sorted_idx;
132 if (!oldParticlesReused[sorted_idx])
135 parts[i].d =
derived().m_particles[ sorted_idx ].d;
136 oldParticlesReused[sorted_idx]=
true;
142 parts[i].d =
new typename Derived::CParticleDataContent( *
derived().m_particles[ sorted_idx ].d );
146 for (itSrc=
derived().m_particles.begin(),oldPartIt=oldParticlesReused.begin();itSrc!=
derived().m_particles.end();itSrc++,oldPartIt++)
153 derived().m_particles.resize( parts.size() );
154 for (itSrc=parts.begin(),itDest=
derived().m_particles.begin(); itSrc!=parts.end(); itSrc++, itDest++ )
156 itDest->log_w = itSrc->log_w;
157 itDest->d = itSrc->d;
196 if (it->d)
delete it->d;
210 template <
class STREAM>
214 uint32_t n =
static_cast<uint32_t
>(
m_particles.size());
218 out << it->log_w << (*it->d);
225 template <
class STREAM>
268 if (ret==NULL || it->log_w > ret->log_w)