Browse Source
Started on the filters.
Started on the filters.
- Got the general structure down.
- Now writing the output functions.
Next up: Finish the basic filter functionality.
Former-commit-id: 91daa0a9f7
tempestpy_adaptions
masawei
11 years ago
4 changed files with 347 additions and 0 deletions
-
79src/formula/AbstractFilter.h
-
52src/formula/Actions/Action.h
-
74src/formula/Actions/RangeAction.h
-
142src/formula/Prctl/PrctlFilter.h
@ -0,0 +1,79 @@ |
|||
/* |
|||
* Filter.h |
|||
* |
|||
* Created on: Apr 26, 2014 |
|||
* Author: Manuel Sascha Weiand |
|||
*/ |
|||
|
|||
#ifndef STORM_FORMULA_ABSTRACTFILTER_H_ |
|||
#define STORM_FORMULA_ABSTRACTFILTER_H_ |
|||
|
|||
#include <vector> |
|||
#include "src/formula/AbstractFormula.h" |
|||
#include "src/formula/Actions/Action.h" |
|||
|
|||
namespace storm { |
|||
namespace property { |
|||
|
|||
template <class T> |
|||
class AbstractFilter { |
|||
|
|||
public: |
|||
|
|||
AbstractFilter() { |
|||
// Intentionally left empty. |
|||
} |
|||
|
|||
AbstractFilter(action::Action<T>* action) { |
|||
actions.push_back(action); |
|||
} |
|||
|
|||
AbstractFilter(std::vector<action::Action<T>*> actions) : actions(actions) { |
|||
// Intentionally left empty. |
|||
} |
|||
|
|||
virtual ~AbstractFilter() { |
|||
actions.clear(); |
|||
} |
|||
|
|||
std::string toFormulaString() const { |
|||
std::string desc = "filter("; |
|||
return desc; |
|||
} |
|||
|
|||
std::string toString() const { |
|||
std::string desc = "Filter: "; |
|||
desc += "\nActions:"; |
|||
for(auto action : actions) { |
|||
desc += "\n\t" + action.toString(); |
|||
} |
|||
return desc; |
|||
} |
|||
|
|||
void addAction(action::Action<T>* action) { |
|||
actions.push_back(action); |
|||
} |
|||
|
|||
void removeAction() { |
|||
actions.pop_back(); |
|||
} |
|||
|
|||
action::Action<T>* getAction(uint_fast64_t pos) const { |
|||
return actions[pos]; |
|||
} |
|||
|
|||
uint_fast64_t getActionCount() const { |
|||
return actions.size(); |
|||
} |
|||
|
|||
protected: |
|||
|
|||
std::vector<action::Action<T>*> actions; |
|||
}; |
|||
|
|||
} //namespace property |
|||
} //namespace storm |
|||
|
|||
|
|||
|
|||
#endif /* STORM_FORMULA_ABSTRACTFILTER_H_ */ |
@ -0,0 +1,52 @@ |
|||
/* |
|||
* Action.h |
|||
* |
|||
* Created on: Apr 26, 2014 |
|||
* Author: Manuel Sascha Weiand |
|||
*/ |
|||
|
|||
#ifndef STORM_FORMULA_ACTION_ACTION_H_ |
|||
#define STORM_FORMULA_ACTION_ACTION_H_ |
|||
|
|||
#include <vector> |
|||
#include "src/storage/BitVector.h" |
|||
|
|||
namespace storm { |
|||
namespace property { |
|||
namespace action { |
|||
|
|||
template <class T> |
|||
class Action { |
|||
|
|||
public: |
|||
|
|||
/*! |
|||
* Virtual destructor |
|||
* To ensure that the right destructor is called |
|||
*/ |
|||
virtual ~Action() { |
|||
//Intentionally left empty |
|||
} |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual std::vector<T> evaluate(std::vector<T> input) const = 0; |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual storm::storage::BitVector<T> evaluate(storm::storage::BitVector<T> input) const = 0; |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual std::string toString() const = 0; |
|||
}; |
|||
|
|||
} //namespace action |
|||
} //namespace property |
|||
} //namespace storm |
|||
|
|||
|
|||
#endif /* STORM_FORMULA_ACTION_ACTION_H_ */ |
@ -0,0 +1,74 @@ |
|||
/* |
|||
* RangeAction.h |
|||
* |
|||
* Created on: Apr 26, 2014 |
|||
* Author: Manuel Sascha Weiand |
|||
*/ |
|||
|
|||
#ifndef STORM_FORMULA_ACTION_RANGEACTION_H_ |
|||
#define STORM_FORMULA_ACTION_RANGEACTION_H_ |
|||
|
|||
#include "src/formula/Actions/Action.h" |
|||
|
|||
namespace storm { |
|||
namespace property { |
|||
namespace action { |
|||
|
|||
template <class T> |
|||
class RangeAction : Action<T> { |
|||
|
|||
public: |
|||
|
|||
RangeAction() : from(0), to(0) { |
|||
//Intentionally left empty. |
|||
} |
|||
|
|||
RangeAction(uint_fast64_t from, uint_fast64_t to) : from(from), to(to) { |
|||
//Intentionally left empty. |
|||
} |
|||
|
|||
/*! |
|||
* Virtual destructor |
|||
* To ensure that the right destructor is called |
|||
*/ |
|||
virtual ~RangeAction() { |
|||
//Intentionally left empty |
|||
} |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual std::vector<T> evaluate(std::vector<T> input) const override { |
|||
// The range constructor is used here instead of manipulating the incoming vector. |
|||
// While deleting the element at the end of the vector is efficient, deleting elements at any position but the end is not. |
|||
// Also this leaves the incoming vector unchanged. |
|||
std::vector<T> out(input.begin() + from, input.begin() + to); |
|||
return out; |
|||
} |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual storm::storage::BitVector<T> evaluate(storm::storage::BitVector<T> input) const override { |
|||
storm::storage::BitVector<T> out(to - from + 1, input.begin() + from, input.begin() + to); |
|||
return out; |
|||
} |
|||
|
|||
/*! |
|||
* |
|||
*/ |
|||
virtual std::string toString() const override { |
|||
return "range, " + from + ", " + to; |
|||
} |
|||
|
|||
private: |
|||
uint_fast64_t from; |
|||
uint_fast64_t to; |
|||
|
|||
}; |
|||
|
|||
} //namespace action |
|||
} //namespace property |
|||
} //namespace storm |
|||
|
|||
#endif /* STORM_FORMULA_ACTION_RANGEACTION_H_ */ |
@ -0,0 +1,142 @@ |
|||
/* |
|||
* PrctlFilter.h |
|||
* |
|||
* Created on: Apr 26, 2014 |
|||
* Author: Manuel Sascha Weiand |
|||
*/ |
|||
|
|||
#ifndef STORM_FORMULA_PRCTL_PRCTLFILTER_H_ |
|||
#define STORM_FORMULA_PRCTL_PRCTLFILTER_H_ |
|||
|
|||
#include "src/formula/AbstractFilter.h" |
|||
#include "src/formula/Prctl/AbstractPrctlFormula.h" |
|||
#include "src/formula/Prctl/AbstractPathFormula.h" |
|||
#include "src/formula/Prctl/AbstractStateFormula.h" |
|||
|
|||
namespace storm { |
|||
namespace property { |
|||
namespace prctl { |
|||
|
|||
template <class T> |
|||
class PrctlFilter : storm::property::AbstractFilter<T> { |
|||
|
|||
public: |
|||
|
|||
PrctlFilter() : child(nullptr) { |
|||
// Intentionally left empty. |
|||
} |
|||
|
|||
PrctlFilter(AbstractFormula* child) : child(child) { |
|||
// Intentionally left empty. |
|||
} |
|||
|
|||
PrctlFilter(AbstractFormula* child, action::Action<T>* action) : child(child) { |
|||
actions.push_back(action); |
|||
} |
|||
|
|||
PrctlFilter(AbstractFormula* child, std::vector<action::Action<T>*> actions) : child(child), actions(actions) { |
|||
// Intentionally left empty. |
|||
} |
|||
|
|||
virtual ~PrctlFilter() { |
|||
actions.clear(); |
|||
delete child; |
|||
} |
|||
|
|||
void check(AbstractModelChecker& modelchecker) const { |
|||
|
|||
// Do a dynamic cast to test for the actual formula type and call the correct evaluation function. |
|||
if(dynamic_cast<AbstractStateFormula<T>*>(child) != nullptr) { |
|||
// Check the formula and apply the filter actions. |
|||
storm::storage::BitVector result = evaluate(modelchecker, static_cast<AbstractStateFormula<T>*>(child)); |
|||
|
|||
// Now write out the result. |
|||
|
|||
} |
|||
else if (dynamic_cast<AbstractPathFormula<T>*>(child) != nullptr) { |
|||
// Check the formula and apply the filter actions. |
|||
std::vector<T> result = evaluate(modelchecker, static_cast<AbstractPathFormula<T>*>(child)); |
|||
|
|||
// Now write out the result. |
|||
} |
|||
else { |
|||
// This branch should be unreachable. If you ended up here, something strange has happened. |
|||
//TODO: Error here. |
|||
} |
|||
} |
|||
|
|||
bool validate() const { |
|||
// Test whether the stored filter actions are consistent in relation to themselves and to the ingoing modelchecking result. |
|||
|
|||
// Do a dynamic cast to test for the actual formula type. |
|||
if(dynamic_cast<AbstractStateFormula<T>*>(child) != nullptr) { |
|||
//TODO: Actual validation. |
|||
} |
|||
else if (dynamic_cast<AbstractPathFormula<T>*>(child) != nullptr) { |
|||
//TODO: Actual validation. |
|||
} |
|||
else { |
|||
// This branch should be unreachable. If you ended up here, something strange has happened. |
|||
//TODO: Error here. |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
std::string toFormulaString() const { |
|||
std::string desc = "filter("; |
|||
return desc; |
|||
} |
|||
|
|||
std::string toString() const { |
|||
std::string desc = "Filter: "; |
|||
desc += "\nActions:"; |
|||
for(auto action : actions) { |
|||
desc += "\n\t" + action.toString(); |
|||
} |
|||
desc += "\nFormula:\n\t" + child->toString(); |
|||
return desc; |
|||
} |
|||
|
|||
void setChild(AbstractFormula* child) { |
|||
this->child = child; |
|||
} |
|||
|
|||
AbstractFormula* getChild() const { |
|||
return child; |
|||
} |
|||
|
|||
private: |
|||
|
|||
BitVector<T> evaluate(AbstractModelChecker& modelchecker, AbstractStateFormula<T>* formula) const { |
|||
// First, get the model checking result. |
|||
BitVector result = formula->check(modelchecker); |
|||
|
|||
// Now apply all filter actions and return the result. |
|||
for(auto action : actions) { |
|||
result = action->evaluate(result); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
std::vector<T> evaluate(AbstractModelChecker& modelchecker, AbstractPathFormula<T>* formula) const { |
|||
// First, get the model checking result. |
|||
std::vector<T> result = formula->check(modelchecker); |
|||
|
|||
// Now apply all filter actions and return the result. |
|||
for(auto action : actions) { |
|||
result = action->evaluate(result); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
AbstractPrctlFormula* child; |
|||
}; |
|||
|
|||
} //namespace prctl |
|||
} //namespace property |
|||
} //namespace storm |
|||
|
|||
|
|||
|
|||
#endif /* STORM_FORMULA_PRCTL_PRCTLFILTER_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue