11 #include "elementary_language.hh"
12 #include "fractional_order.hh"
13 #include "backward_regional_elementary_language.hh"
32 assert(this->fractionalOrder.
getSize() == this->wordSize() + 1);
47 std::vector<double> fractionalPart, accumulatedDuration;
48 fractionalPart.resize(timedWord.
wordSize() + 1);
49 accumulatedDuration.resize(timedWord.
wordSize() + 1);
50 accumulatedDuration.back() = timedWord.getDurations().back();
51 fractionalPart.back() = timedWord.getDurations().back() - std::floor(timedWord.getDurations().back());
52 for (
int i =
static_cast<int>(fractionalPart.size()) - 2; i >= 0; --i) {
53 accumulatedDuration.at(i) = accumulatedDuration.at(i + 1) + timedWord.getDurations().at(i);
54 fractionalPart.at(i) = accumulatedDuration.at(i);
55 fractionalPart.at(i) -= std::floor(fractionalPart.at(i));
66 return {{this->word + action, this->timedCondition.
extendN()}, fractionalOrder.
extendN()};
98 [[nodiscard]] std::optional<ForwardRegionalElementaryLanguage>
immediatePrefix()
const {
99 if (this->getWord().
empty() && !this->getTimedCondition().hasPrefix()) {
102 }
else if (this->getTimedCondition().hasPrefix()) {
109 auto word = this->getWord();
112 {word, this->timedCondition.
removeN()}, this->fractionalOrder.
removeN()});
119 [[nodiscard]] std::vector<ForwardRegionalElementaryLanguage>
prefixes()
const {
120 std::list<ForwardRegionalElementaryLanguage> resultList;
121 auto language = *
this;
122 resultList.push_front(language);
123 auto next = language.immediatePrefix();
125 while (next.has_value()) {
127 resultList.push_front(language);
128 next = language.immediatePrefix();
131 std::vector<ForwardRegionalElementaryLanguage> result;
132 result.resize(resultList.size());
133 std::move(resultList.begin(), resultList.end(), result.begin());
149 assert(this->word.compare(0, prefix.
wordSize(), prefix.getWord()) == 0);
150 const auto prefixWord = prefix.
sample();
152 const auto fullWord = tmpLanguage.
sample();
156 const std::string suffixWord = this->word.substr(prefix.
wordSize(), suffixWordSize);
157 auto suffixDurations = fullWord.getDurations();
158 suffixDurations.erase(suffixDurations.begin(), suffixDurations.begin() + prefix.
wordSize());
159 suffixDurations.front() -= prefixWord.getDurations().back();
163 std::vector<double> suffixDurationsFractional;
164 suffixDurationsFractional.resize(suffixDurations.size());
165 suffixDurationsFractional.front() = suffixDurations.front() - std::floor(suffixDurations.front());
166 for (std::size_t i = 1; i < suffixDurationsFractional.size(); ++i) {
167 suffixDurationsFractional.at(i) = suffixDurationsFractional.at(i - 1) + suffixDurations.at(i);
168 suffixDurationsFractional.at(i) -= std::floor(suffixDurationsFractional.at(i));
170 assert(std::all_of(suffixDurationsFractional.begin(), suffixDurationsFractional.end(),
171 [](
const double fractional) {
172 return 0 <= fractional && fractional < 1;
194 const TATransition::Resets &resets,
195 const std::size_t targetClockSize)
const {
196 assert(newWord.size() + 1 == targetClockSize);
198 this->timedCondition.applyResets(resets, targetClockSize)}.sample());
202 return this->getWord() == another.getWord() && this->getTimedCondition() == another.getTimedCondition() &&
203 this->fractionalOrder == another.fractionalOrder;
206 std::ostream &print(std::ostream &os)
const {
207 os <<
"(" << this->getWord() <<
", " << this->getTimedCondition() <<
", " << this->fractionalOrder <<
")";
212 [[nodiscard]] std::size_t hash_value()
const {
213 return boost::hash_value(std::make_tuple(this->getWord(), this->getTimedCondition(),
214 this->fractionalOrder.hash_value()));
219 return lang.print(os);
223 return lang.hash_value();
A back regional elementary language.
Definition: backward_regional_elementary_language.hh:22
An elementary language.
Definition: elementary_language.hh:23
bool isSimple() const
Returns if this elementary language is simple.
Definition: elementary_language.hh:66
ElementaryLanguage constrain(const TimedWord &prefix) const
Constrain the valuation using a timed word.
Definition: elementary_language.hh:167
static ElementaryLanguage empty()
Construct the empty elementary language containing only 0.
Definition: elementary_language.hh:38
std::size_t wordSize() const
Returns the number of the events in this elementary language.
Definition: elementary_language.hh:73
TimedWord sample() const
Return a timed word in this elementary language.
Definition: elementary_language.hh:114
A forward regional elementary language.
Definition: forward_regional_elementary_language.hh:23
ForwardRegionalElementaryLanguage successor() const
Construct the continuous successor.
Definition: forward_regional_elementary_language.hh:72
BackwardRegionalElementaryLanguage suffix(const ForwardRegionalElementaryLanguage &prefix) const
Return the suffix s such that this \subseteq p \cdot s.
Definition: forward_regional_elementary_language.hh:145
ForwardRegionalElementaryLanguage successor(char action) const
Construct the discrete successor.
Definition: forward_regional_elementary_language.hh:65
ForwardRegionalElementaryLanguage applyResets(const std::string &newWord, const TATransition::Resets &resets, const std::size_t targetClockSize) const
Return the language after applying the given reset.
Definition: forward_regional_elementary_language.hh:193
ForwardRegionalElementaryLanguage()=default
Construct the empty language.
void successorAssign()
Construct the continuous successor.
Definition: forward_regional_elementary_language.hh:80
std::vector< ForwardRegionalElementaryLanguage > prefixes() const
Return the prefixes in the shorter to the longer order.
Definition: forward_regional_elementary_language.hh:119
static ForwardRegionalElementaryLanguage fromTimedWord(const TimedWord &timedWord)
Construct the fractional elementary language containing the given timed word.
Definition: forward_regional_elementary_language.hh:46
std::optional< ForwardRegionalElementaryLanguage > immediatePrefix() const
Return the immediate prefix if exists.
Definition: forward_regional_elementary_language.hh:98
bool hasEqualityN() const
Return if there is .
Definition: forward_regional_elementary_language.hh:90
Order on the fractional part of the variables.
Definition: fractional_order.hh:24
FractionalOrder extendN() const
Add another variable such that .
Definition: fractional_order.hh:142
FractionalOrder predecessor() const
Make it to be the predecessor.
Definition: fractional_order.hh:125
void successorAssign()
Make it to be the successor.
Definition: fractional_order.hh:94
size_t getSize() const
Returns the number of the variables.
Definition: fractional_order.hh:179
const std::deque< ClockVariables > & successorVariables() const
Return the variable to elapse.
Definition: fractional_order.hh:66
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
FractionalOrder successor() const
Make it to be the successor.
Definition: fractional_order.hh:77
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
bool hasEqualityN() const
Return if there is .
Definition: timed_condition.hh:548
void successorAssign(const std::deque< ClockVariables > &variables)
Make a continuous successor by elapsing variables.
Definition: timed_condition.hh:391
TimedCondition successor(const std::deque< ClockVariables > &variables) const
Make a continuous successor by elapsing variables.
Definition: timed_condition.hh:367
TimedCondition prefix(const std::deque< ClockVariables > &variables) const
Make a continuous prefix.
Definition: timed_condition.hh:459
TimedCondition extendN() const
Add another variable such that .
Definition: timed_condition.hh:507
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