template struct mrpt::bayes::CParticleFilterDataImpl

Overview

A curiously recurring template pattern (CRTP) approach to providing the basic functionality of any CParticleFilterData<> class.

Users should inherit from CParticleFilterData<>, which in turn will automatically inhirit from this base class.

See also:

CParticleFilter, CParticleFilterCapable, CParticleFilterData

#include <mrpt/bayes/CParticleFilterData.h>

template <class Derived, class particle_list_t>
struct CParticleFilterDataImpl: public mrpt::bayes::CParticleFilterCapable
{
    // methods

    const Derived& derived() const;
    Derived& derived();
    virtual double getW(size_t i) const;
    virtual void setW(size_t i, double w);
    virtual size_t particlesCount() const;
    virtual double normalizeWeights(double* out_max_log_w = nullptr);
    virtual double ESS() const;
    virtual void performSubstitution(const std::vector<size_t>& indx);
};

// direct descendants

class CMultiMetricMapPDF;
class CPointPDFParticles;
class CPose3DPDFParticles;
class CPosePDFParticles;
struct SimpleParticlePDF;

Inherited Members

public:
    // typedefs

    typedef std::function<double(const bayes::CParticleFilter::TParticleFilterOptions&PF_options, const CParticleFilterCapable*obj, size_t index, const void*action, const void*observation)> TParticleProbabilityEvaluator;

    // structs

    struct TFastDrawAuxVars;

    // methods

    void prepareFastDrawSample(
        const bayes::CParticleFilter::TParticleFilterOptions& PF_options,
        TParticleProbabilityEvaluator partEvaluator = defaultEvaluator,
        const void* action = nullptr,
        const void* observation = nullptr
        ) const;

    size_t fastDrawSample(const bayes::CParticleFilter::TParticleFilterOptions& PF_options) const;
    virtual double getW(size_t i) const = 0;
    virtual void setW(size_t i, double w) = 0;
    virtual size_t particlesCount() const = 0;
    void prediction_and_update(const mrpt::obs::CActionCollection* action, const mrpt::obs::CSensoryFrame* observation, const bayes::CParticleFilter::TParticleFilterOptions& PF_options);
    virtual void performSubstitution(const std::vector<size_t>& indx) = 0;
    virtual double normalizeWeights(double* out_max_log_w = nullptr) = 0;
    virtual double ESS() const = 0;
    void performResampling(const bayes::CParticleFilter::TParticleFilterOptions& PF_options, size_t out_particle_count = 0);

    static double defaultEvaluator(
        ] const bayes::CParticleFilter::TParticleFilterOptions& PF_options,
        ] const CParticleFilterCapable* obj,
        size_t index,
        ] const void* action,
        ] const void* observation
        );

    static void computeResampling(
        CParticleFilter::TParticleResamplingAlgorithm method,
        const std::vector<double>& in_logWeights,
        std::vector<size_t>& out_indexes,
        size_t out_particle_count = 0
        );

    static void log2linearWeights(
        const std::vector<double>& in_logWeights,
        std::vector<double>& out_linWeights
        );

    static std::vector<double> logWeightsToLinear(const std::vector<double>& in_logWeights);

Methods

virtual double getW(size_t i) const

Access to i’th particle (logarithm) weight, where first one is index 0.

virtual void setW(size_t i, double w)

Modifies i’th particle (logarithm) weight, where first one is index 0.

virtual size_t particlesCount() const

Get the m_particles count.

virtual double normalizeWeights(double* out_max_log_w = nullptr)

Normalize the (logarithmic) weights, such as the maximum weight is zero.

Parameters:

out_max_log_w

If provided, will return with the maximum log_w before normalizing, such as new_weights = old_weights - max_log_w.

Returns:

The max/min ratio of weights (“dynamic range”)

virtual double ESS() const

Returns the normalized ESS (Estimated Sample Size), in the range [0,1].

Note that you do NOT need to normalize the weights before calling this.

virtual void performSubstitution(const std::vector<size_t>& indx)

Replaces the old particles by copies determined by the indexes in “indx”, performing an efficient copy of the necessary particles only and allowing the number of particles to change.

The input index vector is sorted internally before processing.