8 #ifdef DROPPINGTHISINRPACKAGE
12 #include <Eigen/Dense>
34 template<
typename float_t,
size_t dimobs,
size_t dimstate>
39 using float_type = float_t;
42 using obs_sized_vec = Eigen::Matrix<float_t,dimobs,1>;
45 using state_sized_vec = Eigen::Matrix<float_t,dimstate,1>;
48 using dynamic_matrix = Eigen::Matrix<float_t,Eigen::Dynamic,Eigen::Dynamic>;
51 using func = std::function<
const dynamic_matrix(
const state_sized_vec&)>;
54 using func_vec = std::vector<func>;
57 static constexpr
unsigned int dim_obs = dimobs;
60 static constexpr
unsigned int dim_state = dimstate;
68 virtual void filter(
const obs_sized_vec &data,
const func_vec& fs = func_vec() ) = 0;
97 template<
typename float_t,
size_t dimobs,
size_t dimstate,
size_t dimcov>
102 using float_type = float_t;
105 using obs_sized_vec = Eigen::Matrix<float_t,dimobs,1>;
108 using state_sized_vec = Eigen::Matrix<float_t,dimstate,1>;
114 using dynamic_matrix = Eigen::Matrix<float_t,Eigen::Dynamic,Eigen::Dynamic>;
117 using func = std::function<
const dynamic_matrix(
const state_sized_vec&,
121 using func_vec = std::vector<func>;
124 static constexpr
unsigned int dim_obs = dimobs;
127 static constexpr
unsigned int dim_state = dimstate;
135 virtual void filter(
const obs_sized_vec &data,
137 const func_vec& fs = func_vec() ) = 0;
165 template<
typename float_t,
size_t dim_s_state,
size_t dim_ns_state,
size_t dimobs>
170 using obs_sized_vec = Eigen::Matrix<float_t,dimobs,1>;
173 using sampled_state_sized_vec = Eigen::Matrix<float_t,dim_s_state,1>;
176 using not_sampled_state_sized_vec = Eigen::Matrix<float_t,dim_ns_state,1>;
179 using dynamic_matrix = Eigen::Matrix<float_t,Eigen::Dynamic,Eigen::Dynamic>;
182 using func = std::function<
const dynamic_matrix(
const not_sampled_state_sized_vec&,
const sampled_state_sized_vec&)>;
185 using func_vec = std::vector<func>;
188 static constexpr
unsigned int dim_sampled_state = dim_s_state;
191 static constexpr
unsigned int dim_not_sampled_state = dim_ns_state;
194 static constexpr
unsigned int dim_obs = dimobs;
202 virtual void filter(
const obs_sized_vec &data,
const func_vec& fs = func_vec() ) = 0;
221 template<
size_t dimx,
size_t dimy,
typename float_t>
226 using obs_sized_vec = Eigen::Matrix<float_t,dimy,1>;
229 using state_sized_vec = Eigen::Matrix<float_t,dimx,1>;
234 using aPair = std::pair<std::vector<state_sized_vec>, std::vector<obs_sized_vec> >;
247 virtual state_sized_vec
muSamp() = 0;
256 virtual state_sized_vec
fSamp (
const state_sized_vec &xtm1) = 0;
265 virtual obs_sized_vec
gSamp (
const state_sized_vec &xt) = 0;
269 template<
size_t dimx,
size_t dimy,
typename float_t>
272 std::vector<state_sized_vec> xs;
273 std::vector<obs_sized_vec> ys;
276 xs.push_back(this->muSamp());
277 ys.push_back(this->gSamp(xs[0]));
280 for(
size_t i = 1; i < T; ++i) {
282 auto xt = this->fSamp(xs[i-1]);
284 ys.push_back(this->gSamp(xt));
287 return aPair(xs, ys);
301 template<
size_t dimx,
size_t dimy,
typename float_t>
306 using obs_sized_vec = Eigen::Matrix<float_t,dimy,1>;
309 using state_sized_vec = Eigen::Matrix<float_t,dimx,1>;
314 using aPair = std::pair<std::vector<state_sized_vec>, std::vector<obs_sized_vec> >;
327 virtual state_sized_vec
muSamp() = 0;
336 virtual state_sized_vec
fSamp (
const state_sized_vec &xtm1,
const obs_sized_vec &ytm1) = 0;
345 virtual obs_sized_vec
gSamp (
const state_sized_vec &xt) = 0;
349 template<
size_t dimx,
size_t dimy,
typename float_t>
352 std::vector<state_sized_vec> xs;
353 std::vector<obs_sized_vec> ys;
356 xs.push_back(this->muSamp());
357 ys.push_back(this->gSamp(xs[0]));
360 for(
size_t i = 1; i < T; ++i) {
362 auto xt = this->fSamp(xs[i-1], ys[i-1]);
364 ys.push_back(this->gSamp(xt));
367 return aPair(xs, ys);
380 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
385 using obs_sized_vec = Eigen::Matrix<float_t,dimy,1>;
388 using state_sized_vec = Eigen::Matrix<float_t,dimx,1>;
392 using timePair = std::pair<std::array<state_sized_vec, nparts>, std::array<obs_sized_vec, nparts> >;
395 using manyPairs = std::vector<timePair>;
398 using obsPaths = std::vector<std::array<obs_sized_vec, nparts> >;
401 using statePaths = std::vector<std::array<state_sized_vec, nparts> >;
410 manyPairs
sim_future(
unsigned int num_time_steps);
434 virtual std::array<state_sized_vec,nparts>
get_uwtd_samps()
const = 0;
443 virtual state_sized_vec
fSamp (
const state_sized_vec &xtm1) = 0;
451 virtual obs_sized_vec
gSamp (
const state_sized_vec &xt) = 0;
455 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
459 manyPairs allFutures;
462 std::array<state_sized_vec, nparts> states;
463 std::array<obs_sized_vec, nparts> observations;
464 std::array<state_sized_vec,nparts> past_states;
465 std::array<state_sized_vec,nparts> first_states = this->get_uwtd_samps();
468 for(
unsigned int time = 0; time < num_time_steps; ++time){
473 past_states = first_states;
477 for(
size_t j = 0; j < nparts; ++j){
478 states[j] = this->fSamp( past_states[j] );
479 observations[j] = this->gSamp( states[j] );
483 allFutures.push_back(timePair(states, observations));
484 past_states = states;
491 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
495 manyPairs obs_and_state_paths = this->sim_future(num_time_steps);
497 for(
size_t time = 0; time < obs_and_state_paths.size(); ++time){
498 future_obs.push_back( std::get<1>(obs_and_state_paths[time]) );
505 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
509 statePaths future_states;
510 manyPairs obs_and_state_paths = sim_future(num_time_steps);
511 for(
size_t time = 0; time < obs_and_state_paths.size(); ++time){
512 future_states.push_back( std::get<0>(obs_and_state_paths[time]) );
515 return future_states;
529 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
534 using obs_sized_vec = Eigen::Matrix<float_t,dimy,1>;
537 using state_sized_vec = Eigen::Matrix<float_t,dimx,1>;
541 using timePair = std::pair<std::array<state_sized_vec, nparts>, std::array<obs_sized_vec, nparts> >;
544 using manyPairs = std::vector<timePair>;
547 using obsPaths = std::vector<std::array<obs_sized_vec, nparts> >;
550 using statePaths = std::vector<std::array<state_sized_vec, nparts> >;
559 manyPairs
sim_future(
unsigned int num_time_steps,
const obs_sized_vec &yt);
568 obsPaths
sim_future_obs(
unsigned int num_time_steps,
const obs_sized_vec &yt);
577 statePaths
sim_future_states(
unsigned int num_time_steps,
const obs_sized_vec &yt);
583 virtual std::array<state_sized_vec,nparts>
get_uwtd_samps()
const = 0;
592 virtual state_sized_vec
fSamp (
const state_sized_vec &xtm1,
const obs_sized_vec &ytm1) = 0;
600 virtual obs_sized_vec
gSamp (
const state_sized_vec &xt) = 0;
604 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
608 manyPairs allFutures;
611 std::array<state_sized_vec, nparts> states;
612 std::array<obs_sized_vec, nparts> observations;
613 std::array<state_sized_vec,nparts> past_states;
614 std::array<obs_sized_vec,nparts> past_obs;
615 std::array<state_sized_vec, nparts> first_states = this->get_uwtd_samps();
618 for(
unsigned int time = 0; time < num_time_steps; ++time){
623 past_states = first_states;
628 for(
size_t j = 0; j < nparts; ++j){
629 states[j] = this->fSamp( past_states[j], past_obs[j] );
630 observations[j] = this->gSamp( states[j] );
634 allFutures.push_back(timePair(states, observations));
635 past_states = states;
636 past_obs = observations;
643 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
647 manyPairs obs_and_state_paths = this->sim_future(num_time_steps, yt);
649 for(
size_t time = 0; time < obs_and_state_paths.size(); ++time){
650 future_obs.push_back( std::get<1>(obs_and_state_paths[time]) );
657 template<
size_t dimx,
size_t dimy,
typename float_t,
size_t nparts>
661 statePaths future_states;
662 manyPairs obs_and_state_paths = sim_future(num_time_steps,yt);
663 for(
size_t time = 0; time < obs_and_state_paths.size(); ++time){
664 future_states.push_back( std::get<0>(obs_and_state_paths[time]) );
667 return future_states;
680 template<
size_t dimstate,
size_t dimobs,
typename float_t>
686 using obs_sized_vec = Eigen::Matrix<float_t,dimobs,1>;
689 using state_sized_vec = Eigen::Matrix<float_t,dimstate,1>;
705 template<
size_t dimstate,
size_t dimobs,
typename float_t>
723 template<
typename float_t,
size_t dimobs,
size_t dimstate,
size_t dimu,
size_t dimur,
size_t numparts>
728 using float_type = float_t;
731 using obs_sized_vec = Eigen::Matrix<float_t,dimobs,1>;
734 using state_sized_vec = Eigen::Matrix<float_t,dimstate,1>;
737 using dynamic_matrix = Eigen::Matrix<float_t,Eigen::Dynamic,Eigen::Dynamic>;
740 using func = std::function<
const dynamic_matrix(
const state_sized_vec&)>;
743 using func_vec = std::vector<func>;
746 using usv = Eigen::Matrix<float_t, dimu, 1>;
749 using usvr = Eigen::Matrix<float_t, dimur, 1>;
752 static constexpr
unsigned int dim_obs = dimobs;
755 static constexpr
unsigned int dim_state = dimstate;
763 virtual void filter(
const obs_sized_vec &data,
const std::array<usv,numparts>& Us,
const usvr& Uresamp,
const func_vec& fs = func_vec() ) = 0;