Browse Source
Added some filter actions.
Added some filter actions.
- Also major cleanup of the filter.
- Implementation clompleted for pctl.
Next up: Wrap up the Csl and Ltl filter and then testing.
Former-commit-id: 8189f8462c
main
10 changed files with 742 additions and 217 deletions
-
1src/formula/AbstractFilter.h
-
61src/formula/Actions/AbstractAction.h
-
167src/formula/Actions/BoundAction.h
-
80src/formula/Actions/InvertAction.h
-
80src/formula/Actions/RangeAction.h
-
174src/formula/Actions/SortAction.h
-
18src/formula/Csl/CslFilter.h
-
257src/formula/Prctl/PrctlFilter.h
-
47src/parser/CslParser.cpp
-
74src/parser/PrctlParser.cpp
@ -0,0 +1,167 @@ |
|||||
|
/* |
||||
|
* BoundAction.h |
||||
|
* |
||||
|
* Created on: Jun 22, 2014 |
||||
|
* Author: Manuel Sascha Weiand |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STORM_FORMULA_ACTION_BOUNDACTION_H_ |
||||
|
#define STORM_FORMULA_ACTION_BOUNDACTION_H_ |
||||
|
|
||||
|
#include "src/formula/Actions/AbstractAction.h" |
||||
|
#include "src/formula/ComparisonType.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace property { |
||||
|
namespace action { |
||||
|
|
||||
|
template <class T> |
||||
|
class BoundAction : public AbstractAction<T> { |
||||
|
|
||||
|
typedef typename AbstractAction<T>::Result Result; |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
BoundAction() : comparisonOperator(storm::property::GREATER_EQUAL), bound(0) { |
||||
|
//Intentionally left empty. |
||||
|
} |
||||
|
|
||||
|
BoundAction(storm::property::ComparisonType comparisonOperator, T bound) : comparisonOperator(comparisonOperator), bound(bound) { |
||||
|
//Intentionally left empty. |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Virtual destructor |
||||
|
* To ensure that the right destructor is called |
||||
|
*/ |
||||
|
virtual ~BoundAction() { |
||||
|
//Intentionally left empty |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::prctl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::csl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::ltl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual std::string toString() const override { |
||||
|
std::string out = "bound("; |
||||
|
switch (comparisonOperator) { |
||||
|
case LESS: |
||||
|
out += "<"; |
||||
|
break; |
||||
|
case LESS_EQUAL: |
||||
|
out += "<="; |
||||
|
break; |
||||
|
case GREATER: |
||||
|
out += ">"; |
||||
|
break; |
||||
|
case GREATER_EQUAL: |
||||
|
out += ">="; |
||||
|
break; |
||||
|
default: |
||||
|
LOG4CPLUS_INFO(logger, "Unknown comparison operator of value " << comparisonOperator << "."); |
||||
|
std::cout << "Unknown comparison operator of value " << comparisonOperator << "." << std::endl; |
||||
|
break; |
||||
|
} |
||||
|
out += ", "; |
||||
|
out += std::to_string(bound); |
||||
|
out += ")"; |
||||
|
return out; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result) const { |
||||
|
|
||||
|
//Initialize the new selection vector. |
||||
|
storm::storage::BitVector out(result.selection.size()); |
||||
|
|
||||
|
if(result.pathResult.size() != 0) { |
||||
|
|
||||
|
//Fill the selction by comapring the values for all previously selected states with theegiven bound using the comparison operator. |
||||
|
for(uint_fast64_t i = 0; i < result.stateMap.size(); i++) { |
||||
|
if(result.selection[result.stateMap[i]]) { |
||||
|
switch(comparisonOperator) { |
||||
|
case storm::property::GREATER_EQUAL: |
||||
|
out.set(result.pathResult[result.stateMap[i]] >= bound); |
||||
|
break; |
||||
|
case storm::property::GREATER: |
||||
|
out.set(result.pathResult[result.stateMap[i]] > bound); |
||||
|
break; |
||||
|
case storm::property::LESS_EQUAL: |
||||
|
out.set(result.pathResult[result.stateMap[i]] <= bound); |
||||
|
break; |
||||
|
case storm::property::LESS: |
||||
|
out.set(result.pathResult[result.stateMap[i]] < bound); |
||||
|
break; |
||||
|
default: |
||||
|
LOG4CPLUS_INFO(logger, "Unknown comparison operator of value " << comparisonOperator << "."); |
||||
|
std::cout << "Unknown comparison operator of value " << comparisonOperator << "." << std::endl; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
|
||||
|
//Fill the selction by comapring the values for all previously selected states with theegiven bound using the comparison operator. |
||||
|
for(uint_fast64_t i = 0; i < result.stateMap.size(); i++) { |
||||
|
if(result.selection[result.stateMap[i]]) { |
||||
|
switch(comparisonOperator) { |
||||
|
case storm::property::GREATER_EQUAL: |
||||
|
out.set(result.stateResult[result.stateMap[i]] >= bound); |
||||
|
break; |
||||
|
case storm::property::GREATER: |
||||
|
out.set(result.stateResult[result.stateMap[i]] > bound); |
||||
|
break; |
||||
|
case storm::property::LESS_EQUAL: |
||||
|
out.set(result.stateResult[result.stateMap[i]] <= bound); |
||||
|
break; |
||||
|
case storm::property::LESS: |
||||
|
out.set(result.stateResult[result.stateMap[i]] < bound); |
||||
|
break; |
||||
|
default: |
||||
|
LOG4CPLUS_INFO(logger, "Unknown comparison operator of value " << comparisonOperator << "."); |
||||
|
std::cout << "Unknown comparison operator of value " << comparisonOperator << "." << std::endl; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return Result(out, result.stateMap, result.pathResult, result.stateResult); |
||||
|
} |
||||
|
|
||||
|
storm::property::ComparisonType comparisonOperator; |
||||
|
T bound; |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif /* STORM_FORMULA_ACTION_BOUNDACTION_H_ */ |
@ -0,0 +1,80 @@ |
|||||
|
/* |
||||
|
* InvertAction.h |
||||
|
* |
||||
|
* Created on: Jun 22, 2014 |
||||
|
* Author: Manuel Sascha Weiand |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STORM_FORMULA_ACTION_INVERTACTION_H_ |
||||
|
#define STORM_FORMULA_ACTION_INVERTACTION_H_ |
||||
|
|
||||
|
#include "src/formula/Actions/AbstractAction.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace property { |
||||
|
namespace action { |
||||
|
|
||||
|
template <class T> |
||||
|
class InvertAction : public AbstractAction<T> { |
||||
|
|
||||
|
typedef typename AbstractAction<T>::Result Result; |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
InvertAction() { |
||||
|
//Intentionally left empty. |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Virtual destructor |
||||
|
* To ensure that the right destructor is called |
||||
|
*/ |
||||
|
virtual ~InvertAction() { |
||||
|
//Intentionally left empty |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::prctl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::csl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::ltl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual std::string toString() const override { |
||||
|
return "invert"; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result) const { |
||||
|
storm::storage::BitVector out(result.selection); |
||||
|
return Result(~out, result.stateMap, result.pathResult, result.stateResult); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
} //namespace action |
||||
|
} //namespace property |
||||
|
} //namespace storm |
||||
|
|
||||
|
|
||||
|
#endif /* STORM_FORMULA_ACTION_INVERTACTION_H_ */ |
@ -0,0 +1,174 @@ |
|||||
|
/* |
||||
|
* SortAction.h |
||||
|
* |
||||
|
* Created on: Jun 22, 2014 |
||||
|
* Author: Manuel Sascha Weiand |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STORM_FORMULA_ACTION_SORTACTION_H_ |
||||
|
#define STORM_FORMULA_ACTION_SORTACTION_H_ |
||||
|
|
||||
|
#include "src/formula/Actions/AbstractAction.h" |
||||
|
#include <cctype> |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace property { |
||||
|
namespace action { |
||||
|
|
||||
|
template <class T> |
||||
|
class SortAction : public AbstractAction<T> { |
||||
|
|
||||
|
typedef typename AbstractAction<T>::Result Result; |
||||
|
|
||||
|
public: |
||||
|
|
||||
|
enum SortingCategory {INDEX, VALUE}; |
||||
|
|
||||
|
SortAction() : category(INDEX), ascending(true) { |
||||
|
//Intentionally left empty. |
||||
|
} |
||||
|
|
||||
|
SortAction(SortingCategory category, bool ascending = true) : category(category), ascending(ascending) { |
||||
|
//Intentionally left empty. |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Virtual destructor |
||||
|
* To ensure that the right destructor is called |
||||
|
*/ |
||||
|
virtual ~SortAction() { |
||||
|
//Intentionally left empty |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::prctl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::csl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual Result evaluate(Result const & result, storm::modelchecker::ltl::AbstractModelChecker<T> const & mc) const override { |
||||
|
return evaluate(result); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
virtual std::string toString() const override { |
||||
|
std::string out = "sort, "; |
||||
|
switch (category) { |
||||
|
case INDEX: |
||||
|
out += "index"; |
||||
|
break; |
||||
|
case VALUE: |
||||
|
out += "value"; |
||||
|
break; |
||||
|
default: |
||||
|
LOG4CPLUS_INFO(logger, "Unknown sorting category of value " << category << "."); |
||||
|
std::cout << "Unknown sorting category of value " << category << "." << std::endl; |
||||
|
break; |
||||
|
} |
||||
|
out += ", "; |
||||
|
out += ascending ? "ascending" : "descending"; |
||||
|
return out; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private: |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
Result evaluate(Result const & result) const { |
||||
|
|
||||
|
if(category == VALUE) { |
||||
|
//TODO |
||||
|
|
||||
|
if(result.pathResult.size() != 0) { |
||||
|
return Result(result.selection, sort(result.stateMap, result.pathResult), result.pathResult, result.stateResult); |
||||
|
} else { |
||||
|
return Result(result.selection, sort(result.stateMap, result.stateResult), result.pathResult, result.stateResult); |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
return Result(result.selection, sort(result.stateMap.size()), result.pathResult, result.stateResult); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
std::vector<uint_fast64_t> sort(uint_fast64_t length) const { |
||||
|
|
||||
|
// Project the vector down to its first component. |
||||
|
std::vector<uint_fast64_t> outMap(length); |
||||
|
|
||||
|
// Sort the combined vector. |
||||
|
if(ascending) { |
||||
|
for(uint_fast64_t i = 0; i < length; i++) { |
||||
|
outMap[i] = i; |
||||
|
} |
||||
|
} else { |
||||
|
for(uint_fast64_t i = 0; i < length; i++) { |
||||
|
outMap[i] = length - i - 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return outMap; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
std::vector<uint_fast64_t> sort(std::vector<uint_fast64_t> const & stateMap, std::vector<T> const & values) const { |
||||
|
|
||||
|
// Prepare the new state map. |
||||
|
std::vector<uint_fast64_t> outMap(stateMap); |
||||
|
|
||||
|
// Sort the state map. |
||||
|
if(ascending) { |
||||
|
std::sort(outMap.begin(), outMap.end(), [&] (uint_fast64_t a, uint_fast64_t b) -> bool { return values[a] <= values[b]; }); |
||||
|
} else { |
||||
|
std::sort(outMap.begin(), outMap.end(), [&] (uint_fast64_t a, uint_fast64_t b) -> bool { return values[a] >= values[b]; }); |
||||
|
} |
||||
|
|
||||
|
return outMap; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* |
||||
|
*/ |
||||
|
std::vector<uint_fast64_t> sort(std::vector<uint_fast64_t> const & stateMap, storm::storage::BitVector const & values) const { |
||||
|
|
||||
|
// Prepare the new state map. |
||||
|
std::vector<uint_fast64_t> outMap(stateMap); |
||||
|
|
||||
|
// Sort the state map. |
||||
|
if(ascending) { |
||||
|
std::sort(outMap.begin(), outMap.end(), [&] (uint_fast64_t a, uint_fast64_t b) -> bool { return values[a] <= values[b]; }); |
||||
|
} else { |
||||
|
std::sort(outMap.begin(), outMap.end(), [&] (uint_fast64_t a, uint_fast64_t b) -> bool { return values[a] >= values[b]; }); |
||||
|
} |
||||
|
|
||||
|
return outMap; |
||||
|
} |
||||
|
|
||||
|
SortingCategory category; |
||||
|
bool ascending; |
||||
|
}; |
||||
|
|
||||
|
} //namespace action |
||||
|
} //namespace property |
||||
|
} //namespace storm |
||||
|
|
||||
|
#endif /* STORM_FORMULA_ACTION_SORTACTION_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue