Quetzal-CoaTL
The Coalescence Template Library
Loading...
Searching...
No Matches
TransitionKernel.hpp
1// Copyright 2021 Arnaud Becheler <abechele@umich.edu> Florence Jornod <florence@jornod.com>
2
3/*********************************************************************** * This program is free software; you can
4 *redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free
5 *Software Foundation; either version 2 of the License, or * (at your option) any later version. *
6 * *
7 ************************************************************************/
8
9#ifndef __TRANSITION_KERNEL_H_INCLUDED__
10#define __TRANSITION_KERNEL_H_INCLUDED__
11
12#include <assert.h>
13#include <unordered_map>
14
16{
17
18template <class... T> class TransitionKernel;
19
32template <typename Distribution> class TransitionKernel<Distribution>
33{
34
35 private:
36 std::unordered_map<typename Distribution::result_type, Distribution> m_distributions;
37
38 public:
40 using state_type = typename Distribution::result_type;
41
46 {
47 }
48
54 TransitionKernel(state_type const &x, Distribution const &d)
55 {
56 m_distributions[x] = d;
57 }
58
64 TransitionKernel(state_type const &x, Distribution &&d)
65 {
66 m_distributions[x] = std::move(d);
67 }
68
73
78
83
88
94 TransitionKernel<Distribution> &set(state_type const &x, Distribution const &d)
95 {
96 m_distributions[x] = d;
97 return *this;
98 }
99
105 TransitionKernel<Distribution> &set(state_type const &x, Distribution &&d)
106 {
107 m_distributions[x] = std::move(d);
108 return *this;
109 }
110
116 bool has_distribution(state_type const &x) const
117 {
118 return m_distributions.find(x) != m_distributions.end();
119 }
120
126 template <typename Generator> state_type operator()(Generator &g, state_type const &x)
127 {
128 assert(has_distribution(x));
129 return m_distributions.at(x).operator()(g);
130 }
131};
132
145template <typename Time, typename Distribution> class TransitionKernel<Time, Distribution>
146{
147
148 private:
150
151 std::unordered_map<Time, InsiderType> m_kernels;
152
153 public:
155 using state_type = typename Distribution::result_type;
156
161 {
162 }
163
170 TransitionKernel(state_type const &x, Time const &t, Distribution const &d)
171 {
172 m_kernels[t] = InsiderType(x, d);
173 }
174
180 TransitionKernel(state_type const &x, Time const &t, Distribution &&d)
181 {
182 m_kernels[t] = InsiderType(x, std::move(d));
183 }
184
189
195
200
205
212 TransitionKernel<Time, Distribution> &set(state_type const &x, Time const &t, Distribution const &d)
213 {
214 m_kernels[t] = InsiderType(x, d);
215 return *this;
216 }
217
224 TransitionKernel<Time, Distribution> &set(state_type const &x, Time const &t, Distribution &&d)
225 {
226 m_kernels[t] = InsiderType(x, std::move(d));
227 return *this;
228 }
229
236 bool has_distribution(state_type const &x, Time const &t) const
237 {
238 bool answer = false;
239 if (m_kernels.count(t) == 1)
240 {
241 if (m_kernels.at(t).has_distribution(x))
242 {
243 answer = true;
244 }
245 }
246 return answer;
247 }
248
255 template <typename Generator> state_type operator()(Generator &g, state_type const &x, Time const &t)
256 {
257 assert(this->has_distribution(x, t));
258 return m_kernels.at(t).operator()(g, x);
259 }
260};
261
262} // namespace quetzal::utils::random
263
264#endif
Discrete markovian transition kernel for sampling the next state knowing the present state .
Definition TransitionKernel.hpp:33
TransitionKernel< Distribution > & operator=(const TransitionKernel< Distribution > &)=default
Copy assignment operator.
TransitionKernel< Distribution > & set(state_type const &x, Distribution const &d)
Set a departure state and its associated distribution to the kernel.
Definition TransitionKernel.hpp:94
TransitionKernel(const TransitionKernel &)=default
Copy constructor.
TransitionKernel< Distribution > & set(state_type const &x, Distribution &&d)
Set a departure state and its associated distribution to the kernel.
Definition TransitionKernel.hpp:105
state_type operator()(Generator &g, state_type const &x)
Sample an arrival state conditionnaly to departure state.
Definition TransitionKernel.hpp:126
TransitionKernel< Distribution > & operator=(TransitionKernel< Distribution > &&)=default
Move assignment operator.
TransitionKernel(TransitionKernel &&)=default
Move constructor.
TransitionKernel()
Default constructor.
Definition TransitionKernel.hpp:45
TransitionKernel(state_type const &x, Distribution const &d)
Initialize a transition kernel with a state and its associated distribution.
Definition TransitionKernel.hpp:54
TransitionKernel(state_type const &x, Distribution &&d)
Initialize a transition kernel with a state and its associated distribution.
Definition TransitionKernel.hpp:64
bool has_distribution(state_type const &x) const
Checks if a probability distribution is associated to a departure state.
Definition TransitionKernel.hpp:116
TransitionKernel()
Default constructor.
Definition TransitionKernel.hpp:160
TransitionKernel(state_type const &x, Time const &t, Distribution const &d)
Initialize a transition kernel with a state/time couple and its associated distribution.
Definition TransitionKernel.hpp:170
TransitionKernel< Time, Distribution > & set(state_type const &x, Time const &t, Distribution &&d)
Set a probability distribution for a departure state and time.
Definition TransitionKernel.hpp:224
TransitionKernel< Time, Distribution > & operator=(TransitionKernel< Time, Distribution > &&)=default
Move assignment operator.
bool has_distribution(state_type const &x, Time const &t) const
Checks if a probability distribution is associated to a departure state x at time t.
Definition TransitionKernel.hpp:236
TransitionKernel(const TransitionKernel &)=default
Copy constructor.
TransitionKernel(TransitionKernel &&)=default
Move constructor.
TransitionKernel(state_type const &x, Time const &t, Distribution &&d)
Initialize a transition kernel with a state/time couple and its associated distribution.
Definition TransitionKernel.hpp:180
state_type operator()(Generator &g, state_type const &x, Time const &t)
Sample an arrival state conditionnaly to departure state and a time.
Definition TransitionKernel.hpp:255
TransitionKernel< Time, Distribution > & set(state_type const &x, Time const &t, Distribution const &d)
Set a probability distribution for a departure state and time.
Definition TransitionKernel.hpp:212
TransitionKernel< Time, Distribution > & operator=(const TransitionKernel< Time, Distribution > &)=default
Copy assignment operator.
Definition TransitionKernel.hpp:18
Random sampling processes.
Definition utils.hpp:26