AIToolbox
A library that offers tools for AI problem solving.
OldPOMDPModel.hpp
Go to the documentation of this file.
1 #ifndef AI_TOOLBOX_OLD_POMDP_MODEL_HEADER_FILE
2 #define AI_TOOLBOX_OLD_POMDP_MODEL_HEADER_FILE
3 
4 #include <random>
5 
6 #include <AIToolbox/Seeder.hpp>
9 #include <AIToolbox/Types.hpp>
10 #include <AIToolbox/TypeTraits.hpp>
11 #include <AIToolbox/MDP/Types.hpp>
15 
62 template <AIToolbox::MDP::IsModel M>
63 class OldPOMDPModel : public M {
64  public:
66 
77  template <typename... Args>
78  OldPOMDPModel(size_t o, Args&&... parameters);
79 
108  // Check that ObFun is a triple-matrix, otherwise we'll call the other constructor!
109  template <AIToolbox::IsNaive3DMatrix ObFun, typename... Args>
110  OldPOMDPModel(size_t o, ObFun && of, Args&&... parameters);
111 
127  template <typename PM>
128  requires AIToolbox::POMDP::IsModel<PM> && std::constructible_from<M, PM>
129  OldPOMDPModel(const PM& model);
130 
148  template <AIToolbox::IsNaive3DMatrix ObFun>
149  void setObservationFunction(const ObFun & of);
150 
170  std::tuple<size_t,size_t, double> sampleSOR(size_t s,size_t a) const;
171 
188  std::tuple<size_t, double> sampleOR(size_t s,size_t a,size_t s1) const;
189 
199  double getObservationProbability(size_t s1, size_t a, size_t o) const;
200 
206  size_t getO() const;
207 
214 
215  private:
216  size_t O;
217  ObservationMatrix observations_;
218  // We need this because we don't know if our parent already has one,
219  // and we wouldn't know how to access it!
220  mutable AIToolbox::RandomEngine rand_;
221 };
222 
223 template <AIToolbox::MDP::IsModel M>
224 template <typename... Args>
225 OldPOMDPModel<M>::OldPOMDPModel(size_t o, Args&&... params) : M(std::forward<Args>(params)...), O(o), observations_(boost::extents[this->getS()][this->getA()][O]),
226  rand_(AIToolbox::Seeder::getSeed())
227 {
228  for ( size_t s = 0; s < this->getS(); ++s )
229  for ( size_t a = 0; a < this->getA(); ++a )
230  observations_[s][a][0] = 1.0;
231 }
232 
233 template <AIToolbox::MDP::IsModel M>
234 template <AIToolbox::IsNaive3DMatrix ObFun, typename... Args>
235 OldPOMDPModel<M>::OldPOMDPModel(size_t o, ObFun && of, Args&&... params) : M(std::forward<Args>(params)...), O(o), observations_(boost::extents[this->getS()][this->getA()][O]),
236  rand_(AIToolbox::Seeder::getSeed())
237 {
239 }
240 
241 template <AIToolbox::MDP::IsModel M>
242 template <typename PM>
243 requires AIToolbox::POMDP::IsModel<PM> && std::constructible_from<M, PM>
244 OldPOMDPModel<M>::OldPOMDPModel(const PM& model) : M(model), O(model.getO()), observations_(boost::extents[this->getS()][this->getA()][O]),
245  rand_(AIToolbox::Seeder::getSeed())
246 {
247  for ( size_t s1 = 0; s1 < this->getS(); ++s1 )
248  for ( size_t a = 0; a < this->getA(); ++a ) {
249  for ( size_t o = 0; o < O; ++o ) {
250  observations_[s1][a][o] = model.getObservationProbability(s1, a, o);
251  }
252  if ( ! AIToolbox::isProbability(O, observations_[s1][a]) ) throw std::invalid_argument("Input observation matrix does not contain valid probabilities.");
253  }
254 }
255 
256 template <AIToolbox::MDP::IsModel M>
257 template <AIToolbox::IsNaive3DMatrix ObFun>
259  for ( size_t s1 = 0; s1 < this->getS(); ++s1 )
260  for ( size_t a = 0; a < this->getA(); ++a )
261  if ( ! AIToolbox::isProbability(O, of[s1][a]) ) throw std::invalid_argument("Input observation matrix does not contain valid probabilities.");
262 
263  copyDumb3D(of, observations_, this->getS(), this->getA(), O);
264 }
265 
266 template <AIToolbox::MDP::IsModel M>
267 double OldPOMDPModel<M>::getObservationProbability(size_t s1, size_t a, size_t o) const {
268  return observations_[s1][a][o];
269 }
270 
271 template <AIToolbox::MDP::IsModel M>
272 size_t OldPOMDPModel<M>::getO() const {
273  return O;
274 }
275 
276 template <AIToolbox::MDP::IsModel M>
278  return observations_;
279 }
280 
281 template <AIToolbox::MDP::IsModel M>
282 std::tuple<size_t,size_t, double> OldPOMDPModel<M>::sampleSOR(size_t s, size_t a) const {
283  size_t s1, o;
284  double r;
285 
286  std::tie(s1, r) = this->sampleSR(s, a);
287  o = AIToolbox::sampleProbability(O, observations_[s1][a], rand_);
288 
289  return std::make_tuple(s1, o, r);
290 }
291 
292 template <AIToolbox::MDP::IsModel M>
293 std::tuple<size_t, double> OldPOMDPModel<M>::sampleOR(size_t s, size_t a, size_t s1) const {
294  size_t o = AIToolbox::sampleProbability(O, observations_[s1][a], rand_);
295  double r = this->getExpectedReward(s, a, s1);
296  return std::make_tuple(o, r);
297 }
298 
299 #endif
Core.hpp
AIToolbox::DumbMatrix3D
boost::multi_array< double, 3 > DumbMatrix3D
Definition: Types.hpp:37
TypeTraits.hpp
OldPOMDPModel::setObservationFunction
void setObservationFunction(const ObFun &of)
This function replaces the Model observation function with the one provided.
Definition: OldPOMDPModel.hpp:258
OldPOMDPModel
This class represents a Partially Observable Markov Decision Process.
Definition: OldPOMDPModel.hpp:63
AIToolbox::copyDumb3D
void copyDumb3D(const T &in, U &out, const size_t d1, const size_t d2, const size_t d3)
Copies a 3d container into another 3d container.
Definition: Core.hpp:350
OldPOMDPModel::OldPOMDPModel
OldPOMDPModel(size_t o, Args &&... parameters)
Basic constructor.
Definition: OldPOMDPModel.hpp:225
AIToolbox::isProbability
bool isProbability(const size_t size, const T &in)
This function checks whether the supplied 1D container is a valid discrete distribution.
Definition: Probability.hpp:38
OldPOMDPModel::getO
size_t getO() const
This function returns the number of observations possible.
Definition: OldPOMDPModel.hpp:272
TypeTraits.hpp
AIToolbox
Definition: Experience.hpp:6
Seeder.hpp
AIToolbox::RandomEngine
std::mt19937 RandomEngine
Definition: Types.hpp:14
OldPOMDPModel::ObservationMatrix
AIToolbox::DumbMatrix3D ObservationMatrix
Definition: OldPOMDPModel.hpp:65
Types.hpp
Types.hpp
OldPOMDPModel::getObservationFunction
const ObservationMatrix & getObservationFunction() const
This function returns the observation matrix for inspection.
Definition: OldPOMDPModel.hpp:277
AIToolbox::sampleProbability
size_t sampleProbability(const size_t d, const T &in, G &generator)
This function samples an index from a probability vector.
Definition: Probability.hpp:188
OldPOMDPModel::sampleSOR
std::tuple< size_t, size_t, double > sampleSOR(size_t s, size_t a) const
This function samples the POMDP for the specified state action pair.
Definition: OldPOMDPModel.hpp:282
AIToolbox::IsNaive3DMatrix
concept IsNaive3DMatrix
This concept checks for a simple 3D accessible matrix.
Definition: TypeTraits.hpp:42
Types.hpp
TypeTraits.hpp
OldPOMDPModel::sampleOR
std::tuple< size_t, double > sampleOR(size_t s, size_t a, size_t s1) const
This function samples the POMDP for the specified state action pair.
Definition: OldPOMDPModel.hpp:293
OldPOMDPModel::getObservationProbability
double getObservationProbability(size_t s1, size_t a, size_t o) const
This function returns the stored observation probability for the specified state-action pair.
Definition: OldPOMDPModel.hpp:267
Probability.hpp