LearnTA  0.0.1
backward_regional_elementary_language.hh
1 
6 #pragma once
7 
8 #include <string>
9 #include <utility>
10 
11 #include "elementary_language.hh"
12 #include "fractional_order.hh"
13 
14 namespace learnta {
23  protected:
24  FractionalOrder fractionalOrder;
25  public:
28 
30  ElementaryLanguage(std::move(elementary)), fractionalOrder(std::move(fractionalOrder)) {}
31 
36  std::vector<double> fractionalPart, accumulatedDurationFromFront, accumulatedDurationFromBack;
37  fractionalPart.resize(timedWord.wordSize() + 1);
38  accumulatedDurationFromFront.resize(timedWord.wordSize() + 1);
39  accumulatedDurationFromFront.front() = timedWord.getDurations().front();
40  fractionalPart.front() = timedWord.getDurations().front() - std::floor(timedWord.getDurations().front());
41  for (std::size_t i = 1; i < fractionalPart.size(); ++i) {
42  accumulatedDurationFromFront.at(i) = accumulatedDurationFromFront.at(i - 1) + timedWord.getDurations().at(i);
43  fractionalPart.at(i) = accumulatedDurationFromFront.at(i);
44  fractionalPart.at(i) -= std::floor(fractionalPart.at(i));
45  }
46  accumulatedDurationFromBack.resize(timedWord.wordSize() + 1);
47  accumulatedDurationFromBack.back() = timedWord.getDurations().back();
48  for (int i = fractionalPart.size() - 2; i >= 0; --i) {
49  accumulatedDurationFromBack.at(i) = accumulatedDurationFromBack.at(i + 1) + timedWord.getDurations().at(i);
50  }
51 
52  return {ElementaryLanguage{timedWord.getWord(), TimedCondition{accumulatedDurationFromBack}},
53  FractionalOrder{fractionalPart}};
54  }
55 
59  [[nodiscard]] BackwardRegionalElementaryLanguage predecessor(char action) const {
60  return {{action + this->word, this->timedCondition.extendZero()}, fractionalOrder.extendZero()};
61  }
62 
67  return {{this->word, this->timedCondition.predecessor(fractionalOrder.predecessorVariables())},
68  fractionalOrder.predecessor()};
69  }
70 
74  [[nodiscard]] std::optional<BackwardRegionalElementaryLanguage> immediateSuffix() const {
75  if (this->getWord().empty() && !this->getTimedCondition().hasSuffix()) {
76  // When no prefix exists
77  return std::nullopt;
78  } else if (this->getTimedCondition().hasSuffix()) {
79  // return the continuous prefix
80  return std::make_optional(BackwardRegionalElementaryLanguage{
81  {this->getWord(), this->getTimedCondition().suffix(this->fractionalOrder.predecessorVariables())},
82  this->fractionalOrder.predecessor()});
83  } else {
84  // TODO: return the discrete suffix
85  auto word = this->getWord();
86  word.erase(word.begin());
87  return std::make_optional(BackwardRegionalElementaryLanguage{
88  {word, this->timedCondition.removeN()}, this->fractionalOrder.removeN()});
89  }
90  }
91 
95  [[nodiscard]] std::vector<BackwardRegionalElementaryLanguage> prefixes() const {
96  std::list<BackwardRegionalElementaryLanguage> resultList;
97  auto language = *this;
98  resultList.push_front(language);
99  auto next = language.immediateSuffix();
100 
101  while (next.has_value()) {
102  language = *next;
103  resultList.push_front(language);
104  next = language.immediateSuffix();
105  }
106 
107  std::vector<BackwardRegionalElementaryLanguage> result;
108  result.resize(resultList.size());
109  std::move(resultList.begin(), resultList.end(), result.begin());
110 
111  return result;
112  }
113 
114  std::ostream &print(std::ostream &os) const {
115  os << "(" << this->getWord() << ", " << this->getTimedCondition() << ", " << this->fractionalOrder;
116 
117  return os;
118  }
119 
120  [[nodiscard]] const FractionalOrder &getFractionalOrder() const {
121  return fractionalOrder;
122  }
123 
124  bool operator==(const BackwardRegionalElementaryLanguage &another) const {
125  return this->word == another.word && this->timedCondition == another.timedCondition &&
126  this->fractionalOrder == another.fractionalOrder;
127  }
128  };
129 
130  static inline std::ostream &operator<<(std::ostream &os, const learnta::BackwardRegionalElementaryLanguage &lang) {
131  return lang.print(os);
132  }
133 
134  inline std::size_t hash_value(learnta::BackwardRegionalElementaryLanguage const &lang) {
135  return boost::hash_value(std::make_tuple(lang.getWord(), lang.getTimedCondition(), lang.getFractionalOrder()));
136  }
137 }
A back regional elementary language.
Definition: backward_regional_elementary_language.hh:22
std::vector< BackwardRegionalElementaryLanguage > prefixes() const
Return the suffixes in the shorter to the longer order.
Definition: backward_regional_elementary_language.hh:95
BackwardRegionalElementaryLanguage predecessor() const
Construct the continuous predecessor.
Definition: backward_regional_elementary_language.hh:66
static BackwardRegionalElementaryLanguage fromTimedWord(const TimedWord &timedWord)
Construct the fractional elementary language containing the given timed word.
Definition: backward_regional_elementary_language.hh:35
BackwardRegionalElementaryLanguage predecessor(char action) const
Construct the discrete predecessor.
Definition: backward_regional_elementary_language.hh:59
BackwardRegionalElementaryLanguage()=default
Construct the empty language.
std::optional< BackwardRegionalElementaryLanguage > immediateSuffix() const
Return the immediate suffix if exists.
Definition: backward_regional_elementary_language.hh:74
An elementary language.
Definition: elementary_language.hh:23
static ElementaryLanguage empty()
Construct the empty elementary language containing only 0.
Definition: elementary_language.hh:38
Order on the fractional part of the variables.
Definition: fractional_order.hh:24
FractionalOrder extendZero() const
Rename each variable to and add such that .
Definition: fractional_order.hh:165
FractionalOrder predecessor() const
Make it to be the predecessor.
Definition: fractional_order.hh:125
FractionalOrder removeN() const
Remove .
Definition: fractional_order.hh:153
std::deque< ClockVariables > predecessorVariables() const
Return the variable to backward-elapse.
Definition: fractional_order.hh:108
A timed condition, a finite conjunction of inequalities of the form , where and .
Definition: timed_condition.hh:19
TimedCondition removeN() const
Remove .
Definition: timed_condition.hh:523
TimedCondition extendZero() const
Rename each variable to and add such that .
Definition: timed_condition.hh:558
TimedCondition predecessor(const std::deque< ClockVariables > &variables) const
Make a continuous predecessor by backward-elapsing variables.
Definition: timed_condition.hh:435
TimedCondition suffix(const std::deque< ClockVariables > &variables) const
Make a continuous suffix.
Definition: timed_condition.hh:483
A timed word.
Definition: timed_word.hh:25
std::size_t wordSize() const
Return the number of the actions in this timed word.
Definition: timed_word.hh:150
Definition: experiment_runner.hh:23
Definition: external_transition_maker.hh:149