abstract_parameter_distribution.h Source File

CPP API: abstract_parameter_distribution.h Source File
abstract_parameter_distribution.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 2020-2026 MEmilio
3 *
4 * Authors: Julia Bicker
5 *
6 * Contact: Martin J. Kuehn <Martin.Kuehn@DLR.de>
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20 #ifndef ABSTRACT_PARAMETER_DISTRIBUTION_H
21 #define ABSTRACT_PARAMETER_DISTRIBUTION_H
22 
23 #include "memilio/io/io.h"
25 #include "memilio/utils/logging.h"
28 #include <memory>
29 #include <string>
30 
31 namespace mio
32 {
33 
40 {
41 
42 public:
47  template <class Impl>
49  : m_dist(std::make_shared<Impl>(std::move(dist)))
50  , sample_impl1([](void* d, RandomNumberGenerator& rng) {
51  return static_cast<Impl*>(d)->get_sample(rng);
52  })
54  return static_cast<Impl*>(d)->get_sample(rng);
55  })
56  {
57  }
58 
60  : m_dist(other.m_dist)
61  , sample_impl1(other.sample_impl1)
62  , sample_impl2(other.sample_impl2)
63  {
64  }
65 
67  : m_dist(other.m_dist)
68  , sample_impl1(other.sample_impl1)
69  , sample_impl2(other.sample_impl2)
70  {
71  }
72 
74  : m_dist(other.m_dist)
75  , sample_impl1(other.sample_impl1)
76  , sample_impl2(other.sample_impl2)
77  {
78  }
79 
81  : m_dist(nullptr)
82  , sample_impl1([](void* /*dist*/, RandomNumberGenerator& /*rng*/) {
83  log_critical("AbstractParameterDistribution does not hold a distribution.");
84  if (true) {
85  exit(static_cast<int>(StatusCode::UnknownError));
86  }
87  else {
88  return -1.;
89  }
90  })
91  , sample_impl2([](void* /*dist*/, abm::PersonalRandomNumberGenerator& /*rng*/) {
92  log_critical("AbstractParameterDistribution does not hold a distribution.");
93  if (true) {
94  exit(static_cast<int>(StatusCode::UnknownError));
95  }
96  else {
97  return -1.;
98  }
99  })
100  {
101  }
102 
104 
106 
107  bool operator<(const AbstractParameterDistribution& other) const
108  {
109  return static_cast<ParameterDistribution*>(m_dist.get())
110  ->smaller_impl(*static_cast<ParameterDistribution*>(other.m_dist.get()));
111  }
112 
117  ScalarType get(RandomNumberGenerator& rng) const
118  {
119  return sample_impl1(m_dist.get(), rng);
120  }
121 
127  {
128  return sample_impl2(m_dist.get(), rng);
129  }
130 
134  std::vector<ScalarType> params() const
135  {
136  return static_cast<ParameterDistribution*>(m_dist.get())->params();
137  }
138 
143  template <class IOContext>
144  void serialize(IOContext& io) const
145  {
146  static_cast<ParameterDistribution*>(m_dist.get())->serialize(io);
147  }
148 
149 private:
150  std::shared_ptr<void> m_dist;
152  void*,
153  RandomNumberGenerator&);
155  void*,
156  abm::
157  PersonalRandomNumberGenerator&);
158 };
159 
164 template <class IOContext>
166 {
167  auto obj = io.expect_object("ParameterDistribution");
168  auto type = obj.expect_element("Type", Tag<std::string>{});
169  if (type) {
170  if (type.value() == "Uniform") {
171  BOOST_OUTCOME_TRY(auto&& r, ParameterDistributionUniform::deserialize_elements(io, obj));
172  return mio::success(AbstractParameterDistribution(std::move(r)));
173  }
174  else if (type.value() == "Normal") {
175  BOOST_OUTCOME_TRY(auto&& r, ParameterDistributionNormal::deserialize_elements(io, obj));
176  return mio::success(AbstractParameterDistribution(std::move(r)));
177  }
178  else if (type.value() == "LogNormal") {
179  BOOST_OUTCOME_TRY(auto&& r, ParameterDistributionLogNormal::deserialize_elements(io, obj));
180  return mio::success(AbstractParameterDistribution(std::move(r)));
181  }
182  else if (type.value() == "Exponential") {
183  BOOST_OUTCOME_TRY(auto&& r, ParameterDistributionExponential::deserialize_elements(io, obj));
184  return mio::success(AbstractParameterDistribution(std::move(r)));
185  }
186  else if (type.value() == "Constant") {
187  BOOST_OUTCOME_TRY(auto&& r, ParameterDistributionConstant::deserialize_elements(io, obj));
188  return mio::success(AbstractParameterDistribution(std::move(r)));
189  }
190  else {
191  return failure(StatusCode::InvalidValue, "Type of ParameterDistribution in AbstractParameterDistribution" +
192  type.value() + " not valid.");
193  }
194  }
195  return failure(type.error());
196 }
197 
198 } // namespace mio
199 
200 #endif //ABSTRACT_PARAMETER_DISTRIBUTION_H
This class represents an arbitrary ParameterDistribution.
Definition: abstract_parameter_distribution.h:40
AbstractParameterDistribution(Impl &&dist)
The implementation handed to the constructor should have get_sample function overloaded with mio::Ran...
Definition: abstract_parameter_distribution.h:48
AbstractParameterDistribution()
Definition: abstract_parameter_distribution.h:80
ScalarType(* sample_impl1)(void *, RandomNumberGenerator &)
Sample function of the distribution which gets a RandomNumberGenerator as rng.
Definition: abstract_parameter_distribution.h:151
AbstractParameterDistribution & operator=(AbstractParameterDistribution &&other)=default
ScalarType(* sample_impl2)(void *, abm::PersonalRandomNumberGenerator &)
Sample function of the distribution which gets a abm::PersonalRandomNumberGenerator as rng.
Definition: abstract_parameter_distribution.h:154
AbstractParameterDistribution & operator=(const AbstractParameterDistribution &other)=default
AbstractParameterDistribution(const AbstractParameterDistribution &other)
Definition: abstract_parameter_distribution.h:73
bool operator<(const AbstractParameterDistribution &other) const
Definition: abstract_parameter_distribution.h:107
std::vector< ScalarType > params() const
Get the parameters of the given distribution.
Definition: abstract_parameter_distribution.h:134
ScalarType get(RandomNumberGenerator &rng) const
Returns a value sampled with the given distribution.
Definition: abstract_parameter_distribution.h:117
std::shared_ptr< void > m_dist
Underlying distribtuion.
Definition: abstract_parameter_distribution.h:150
AbstractParameterDistribution(AbstractParameterDistribution &other)
Definition: abstract_parameter_distribution.h:59
ScalarType get(abm::PersonalRandomNumberGenerator &rng) const
Returns a value sampled with the given distribution.
Definition: abstract_parameter_distribution.h:126
AbstractParameterDistribution(AbstractParameterDistribution &&other)
Definition: abstract_parameter_distribution.h:66
void serialize(IOContext &io) const
serialize an AbstractParameterDistribution.
Definition: abstract_parameter_distribution.h:144
static IOResult< ParameterDistributionConstant > deserialize_elements(IOContext &io, IOObject &obj)
Definition: parameter_distributions.h:881
static IOResult< ParameterDistributionExponential > deserialize_elements(IOContext &io, IOObject &obj)
Definition: parameter_distributions.h:768
static IOResult< ParameterDistributionLogNormal > deserialize_elements(IOContext &io, IOObject &obj)
Definition: parameter_distributions.h:647
static IOResult< ParameterDistributionNormal > deserialize_elements(IOContext &io, IOObject &obj)
Definition: parameter_distributions.h:381
static IOResult< ParameterDistributionUniform > deserialize_elements(IOContext &io, IOObject &obj)
Definition: parameter_distributions.h:520
Definition: parameter_distributions.h:75
Random number generator of individual persons.
Definition: personal_rng.h:50
double ScalarType
Configuration of memilio library.
Definition: memilio/config.h:30
A collection of classes to simplify handling of matrix shapes in meta programming.
Definition: models/abm/analyze_result.h:30
auto failure(const IOStatus &s)
Create an object that is implicitly convertible to an error IOResult<T>.
Definition: io.h:380
boost::outcome_v2::in_place_type_t< T > Tag
Type that is used for overload resolution.
Definition: io.h:407
auto success()
Create an object that is implicitly convertible to a succesful IOResult<void>.
Definition: io.h:359
void log_critical(spdlog::string_view_t fmt, const Args &... args)
Definition: logging.h:106
boost::outcome_v2::unchecked< T, IOStatus > IOResult
Value-or-error type for operations that return a value but can fail.
Definition: io.h:353
IOResult< T > deserialize_internal(IOContext &io, Tag< T > tag)
Deserialization implementation for the default serialization feature.
Definition: default_serialize.h:236
Definition: io.h:94