3 #include "definitions.hpp" 4 #include "Transition.hpp" 6 #include "cpp11-range-master/range.hpp" 45 vector<Transition>
get_outcomes()
const {
return vector<Transition>{outcome};};
80 result.append(
"1(reg)");
111 result +=
"\"actionid\" : ";
112 result += std::to_string(actionid);
113 result +=
",\"transition\" : ";
152 throw invalid_argument(
"Outcomeid must be non-negative.");
154 if(outcomeid >= (
long) outcomes.size())
155 outcomes.resize(outcomeid + 1);
157 return outcomes[outcomeid];
167 assert((outcomeid >= 0l && outcomeid < (
long) outcomes.size()));
168 return outcomes[outcomeid];};
172 assert((outcomeid >= 0l && outcomeid < (
long) outcomes.size()));
173 return outcomes[outcomeid];};
185 size_t size()
const {
return outcome_count();};
207 {
return (oid.size() == outcomes.size());};
211 result.append(std::to_string(get_outcomes().size()));
245 1.0 /
prec_t(outcomes.size())) {};
274 throw invalid_argument(
"Outcomeid must be non-negative.");
277 size_t newsize = outcomeid + 1;
278 size_t oldsize = outcomes.size();
279 if(newsize <= oldsize){
280 return outcomes[outcomeid];
286 auto weightsum = accumulate(distribution.begin(), distribution.end(), 0.0);
289 prec_t normal = (oldsize * newweight) / weightsum;
290 transform(distribution.begin(), distribution.end(),distribution.begin(),
291 [normal](
prec_t x){
return x * normal;});
294 outcomes.resize(newsize);
296 distribution.resize(newsize, newweight);
297 return outcomes[outcomeid];
317 throw invalid_argument(
"Outcomeid must be non-negative.");
318 assert(weight >= 0 && weight <= 1);
320 if(outcomeid >= static_cast<long>(outcomes.size())){
321 outcomes.resize(outcomeid+1);
322 distribution.resize(outcomeid+1);
324 set_distribution(outcomeid, weight);
325 return outcomes[outcomeid];
336 if(distribution.size() != outcomes.size())
337 throw invalid_argument(
"Invalid distribution size.");
338 prec_t sum = accumulate(distribution.begin(),distribution.end(), 0.0);
339 if(sum < 0.99 || sum > 1.001)
340 throw invalid_argument(
"Distribution does not sum to 1.");
341 if((*min_element(distribution.begin(),distribution.end())) < 0)
342 throw invalid_argument(
"Distribution must be non-negative.");
344 this->distribution = distribution;
356 assert(outcomeid >= 0 && (
size_t) outcomeid < outcomes.size());
357 distribution[outcomeid] = weight;
369 auto weightsum = accumulate(distribution.begin(), distribution.end(), 0.0);
372 for(
auto& p : distribution)
375 throw invalid_argument(
"Distribution sums to 0 and cannot be normalized.");
383 return abs(1.0-accumulate(distribution.begin(), distribution.end(), 0.0)) <
SOLPREC;
391 distribution.clear();
392 if(outcomes.size() > 0)
393 distribution.resize(outcomes.size(), 1.0/ (
prec_t) outcomes.size());
398 result.append(std::to_string(get_outcomes().size()));
399 result.append(
" / ");
400 result.append(std::to_string(get_distribution().size()));
405 assert(outcomedist.size() == outcomes.size());
407 for(
size_t i = 0; i < outcomes.size(); i++){
408 result += outcomedist[i] * outcomes[i].mean_reward();
415 return mean_reward(distribution);
420 assert(outcomedist.size() == outcomes.size());
422 for(
size_t i = 0; i < outcomes.size(); i++)
423 outcomes[i].probabilities_addto(outcomedist[i], result);
429 return mean_transition(distribution);
435 result +=
"\"actionid\" : ";
436 result += std::to_string(actionid);
437 result +=
",\"outcomes\" : [";
438 for(
auto oi : indices(outcomes)){
439 const auto& o = outcomes[oi];
440 result +=o.to_json(oi);
443 if(!outcomes.empty()) result.pop_back();
444 result +=
"],\"distribution\" : [";
445 for(
auto d : distribution){
446 result += std::to_string(d);
449 if(!distribution.empty()) result.pop_back();
const Transition & get_outcome() const
Returns the single outcome.
Definition: Action.hpp:60
bool is_nature_correct(numvec oid) const
Whether the provided outcomeid is correct.
Definition: Action.hpp:206
virtual Transition & create_outcome()
Creates a new outcome at the end.
Definition: Action.hpp:163
string to_json(long actionid=-1) const
Returns a json representation of action.
Definition: Action.hpp:433
prec_t mean_reward() const
Returns the mean reward from the transition.
Definition: Action.hpp:88
Transition & operator[](long outcomeid)
Returns a transition for the outcome.
Definition: Action.hpp:179
Transition & operator[](long outcomeid)
Returns the outcome.
Definition: Action.hpp:57
Transition & create_outcome(long outcomeid)
Adds a sufficient number of empty outcomes for the outcomeid to be a correct identifier.
Definition: Action.hpp:69
void add_outcome(const Transition &t)
Adds an outcome defined by the transition as the last outcome.
Definition: Action.hpp:194
bool is_distribution_normalized() const
Checks whether the outcome distribution is normalized.
Definition: Action.hpp:382
bool is_nature_correct(numvec oid) const
Whether the provided outcome is valid.
Definition: Action.hpp:85
string to_json(long actionid=-1) const
Returns a json representation of the action.
Definition: Action.hpp:109
const numvec & get_distribution() const
Returns the baseline distribution over outcomes.
Definition: Action.hpp:361
RegularAction()
Creates an empty action.
Definition: Action.hpp:39
const vector< Transition > & get_outcomes() const
Returns the list of outcomes.
Definition: Action.hpp:197
size_t size() const
Returns number of outcomes.
Definition: Action.hpp:185
void set_distribution(const numvec &distribution)
Sets the base distribution over the outcomes.
Definition: Action.hpp:335
prec_t mean_reward(numvec natpolicy) const
Returns the mean reward from the transition.
Definition: Action.hpp:94
void normalize()
Normalizes transitions for outcomes.
Definition: Action.hpp:200
Transition mean_transition(const numvec &outcomedist) const
Returns the mean transition probabilities for the provided nature action.
Definition: Action.hpp:419
Transition & get_outcome(long outcomeid)
Returns the single outcome.
Definition: Action.hpp:51
const indvec & get_indices() const
Indices with positive probabilities.
Definition: Transition.hpp:323
const Transition & get_outcome(long outcomeid) const
Returns a transition for the outcome.
Definition: Action.hpp:166
Transition & create_outcome(long outcomeid) override
Adds a sufficient number (or 0) of empty outcomes/transitions for the provided outcomeid to be a vali...
Definition: Action.hpp:272
virtual ~OutcomeManagement()
Empty virtual destructor.
Definition: Action.hpp:142
double prec_t
Default precision used throughout the code.
Definition: definitions.hpp:25
An action in a robust MDP that allows for outcomes chosen by nature.
Definition: Action.hpp:230
vector< prec_t > numvec
Default numerical vector.
Definition: definitions.hpp:28
void normalize_distribution()
Normalizes outcome weights to sum to one.
Definition: Action.hpp:368
vector< Transition > outcomes
List of possible outcomes.
Definition: Action.hpp:132
void add_outcome(long outcomeid, const Transition &t)
Adds an outcome defined by the transition.
Definition: Action.hpp:190
string to_json(long outcomeid=-1) const
Returns a json representation of transition probabilities.
Definition: Transition.hpp:350
size_t outcome_count() const
Returns number of outcomes.
Definition: Action.hpp:182
void to_string(string &result) const
Appends a string representation to the argument.
Definition: Action.hpp:210
Transition & get_outcome()
Returns the single outcome.
Definition: Action.hpp:63
void to_string(string &result) const
Appends a string representation to the argument.
Definition: Action.hpp:397
void normalize()
Normalizes transition probabilities.
Definition: Action.hpp:72
const Transition & operator[](long outcomeid) const
Returns the outcome.
Definition: Action.hpp:54
size_t size() const
Returns the number of target states with non-zero transition probabilities.
Definition: Transition.hpp:249
Transition mean_transition(numvec natpolicy) const
Returns the mean transition probabilities.
Definition: Action.hpp:103
Represents sparse transition probabilities and rewards from a single state.
Definition: Transition.hpp:31
Transition mean_transition() const
Returns the mean transition probabilities.
Definition: Action.hpp:97
constexpr prec_t SOLPREC
Default solution precision.
Definition: definitions.hpp:40
const Transition & get_outcome(long outcomeid) const
Returns the single outcome.
Definition: Action.hpp:48
void to_string(string &result) const
Appends a string representation to the argument.
Definition: Action.hpp:79
Transition & create_outcome(long outcomeid, prec_t weight)
Adds a sufficient number of empty outcomes/transitions for the provided outcomeid to be a valid ident...
Definition: Action.hpp:315
void set_distribution(long outcomeid, prec_t weight)
Sets weight for a particular outcome.
Definition: Action.hpp:355
numvec distribution
Weights used in computing the worst/best case.
Definition: Action.hpp:234
Action in a regular MDP.
Definition: Action.hpp:31
const Transition & operator[](long outcomeid) const
Returns a transition for the outcome.
Definition: Action.hpp:176
OutcomeManagement()
Empty list of outcomes.
Definition: Action.hpp:136
size_t outcome_count() const
Returns number of outcomes (1).
Definition: Action.hpp:75
void uniform_distribution()
Sets an initial uniform value for the distribution.
Definition: Action.hpp:390
Transition outcome
Transition probabilities.
Definition: Action.hpp:34
WeightedOutcomeAction(const vector< Transition > &outcomes)
Initializes outcomes to the provided vector.
Definition: Action.hpp:243
vector< Transition > get_outcomes() const
Returns the outcomes.
Definition: Action.hpp:45
A class that manages creation and access to outcomes to be used by actions.
Definition: Action.hpp:128
prec_t mean_reward() const
Returns the mean reward from the transition using the nominal distribution on outcomes.
Definition: Action.hpp:414
void normalize()
Normalizes the transition probabilities to sum to 1.
Definition: Transition.hpp:171
Transition & get_outcome(long outcomeid)
Returns a transition for the outcome.
Definition: Action.hpp:171
prec_t mean_reward(const numvec &outcomedist) const
Returns the mean reward from the transition for the provided nature action.
Definition: Action.hpp:404
OutcomeManagement(const vector< Transition > &outcomes)
Initializes with a list of outcomes.
Definition: Action.hpp:139
Transition mean_transition() const
Returns the mean transition probabilities using the nominal distribution on outcomes.
Definition: Action.hpp:428
virtual Transition & create_outcome(long outcomeid)
Adds a sufficient number of empty outcomes for the outcomeid to be a valid identifier.
Definition: Action.hpp:150
Main namespace which includes modeling a solving functionality.
Definition: Action.hpp:18
RegularAction(const Transition &outcome)
Initializes outcomes to the provided transition vector.
Definition: Action.hpp:42
WeightedOutcomeAction()
Creates an empty action.
Definition: Action.hpp:239
prec_t mean_reward(const numvec &probabilities) const
Computes the mean return from this transition with custom transition probabilities.
Definition: Transition.hpp:234