You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.6 KiB
135 lines
5.6 KiB
#pragma once
|
|
|
|
#include <vector>
|
|
#include <memory>
|
|
|
|
#include <boost/container/flat_set.hpp>
|
|
|
|
#include "storm/storage/expressions/Expression.h"
|
|
|
|
#include "storm/storage/jani/TemplateEdgeDestination.h"
|
|
|
|
namespace storm {
|
|
namespace jani {
|
|
class Model;
|
|
|
|
class TemplateEdge {
|
|
public:
|
|
TemplateEdge() = default;
|
|
TemplateEdge(TemplateEdge const&) = default;
|
|
TemplateEdge(storm::expressions::Expression const& guard);
|
|
TemplateEdge(storm::expressions::Expression const& guard, OrderedAssignments const& assignments, std::vector<TemplateEdgeDestination> const& destinations);
|
|
|
|
storm::expressions::Expression const& getGuard() const;
|
|
|
|
void addDestination(TemplateEdgeDestination const& destination);
|
|
|
|
/*!
|
|
* Finalizes the building of this edge. Subsequent changes to the edge require another call to this
|
|
* method. Note that this method is invoked by a call to <code>finalize</code> to the containing model.
|
|
*/
|
|
void finalize(Model const& containingModel);
|
|
|
|
std::size_t getNumberOfDestinations() const;
|
|
std::vector<TemplateEdgeDestination> const& getDestinations() const;
|
|
std::vector<TemplateEdgeDestination>& getDestinations();
|
|
TemplateEdgeDestination const& getDestination(uint64_t index) const;
|
|
|
|
OrderedAssignments const& getAssignments() const;
|
|
OrderedAssignments& getAssignments();
|
|
|
|
/*!
|
|
* Adds a transient assignment to this edge.
|
|
*
|
|
* @param assignment The transient assignment to add.
|
|
* @param addToExisting Determines if adding the assigned expression to an already existing assignment is
|
|
* allowed (if the assigned variable is quantitative).
|
|
* @return True if the assignment was added.
|
|
*/
|
|
bool addTransientAssignment(Assignment const& assignment, bool addToExisting = false);
|
|
|
|
/*!
|
|
* Retrieves a set of (global) variables that are written by at least one of the edge's destinations.
|
|
*/
|
|
boost::container::flat_set<storm::expressions::Variable> const& getWrittenGlobalVariables() const;
|
|
|
|
/*!
|
|
* Substitutes all variables in all expressions according to the given substitution.
|
|
*/
|
|
void substitute(std::map<storm::expressions::Variable, storm::expressions::Expression> const& substitution);
|
|
|
|
/*!
|
|
* Changes all variables in assignments based on the given mapping.
|
|
*/
|
|
void changeAssignmentVariables(std::map<Variable const*, std::reference_wrapper<Variable const>> const& remapping);
|
|
|
|
/*!
|
|
* Finds the transient assignments common to all destinations and lifts them to the edge. Afterwards, these
|
|
* assignments are no longer contained in the destination. Note that this may modify the semantics of the
|
|
* model if assignment levels are being used somewhere in the model.
|
|
*/
|
|
void liftTransientDestinationAssignments(uint64_t maxLevel = 0);
|
|
|
|
/**
|
|
* Shifts the assingments from the edges to the destinations.
|
|
*/
|
|
void pushAssignmentsToDestinations();
|
|
|
|
/*!
|
|
* Checks whether the provided variables appear on the right-hand side of non-transient assignments.
|
|
*/
|
|
bool usesVariablesInNonTransientAssignments(std::set<storm::expressions::Variable> const& variables) const;
|
|
|
|
/*!
|
|
* Retrieves whether there is any transient edge destination assignment in the edge.
|
|
*/
|
|
bool hasTransientEdgeDestinationAssignments() const;
|
|
|
|
/*!
|
|
* Retrieves whether the edge uses an assignment level other than zero.
|
|
*/
|
|
bool usesAssignmentLevels(bool onlyTransient = false) const;
|
|
|
|
/*!
|
|
* Retrieves the lowest assignment level occurring in each assignment.
|
|
* If no assignment exists, this value is the highest possible integer
|
|
*/
|
|
uint64_t const& getLowestAssignmentLevel() const;
|
|
|
|
/*!
|
|
* Retrieves the highest assignment level occurring in each assignment
|
|
* If no assignment exists, this value is always zero
|
|
*/
|
|
uint64_t const& getHighestAssignmentLevel() const;
|
|
|
|
/*!
|
|
* Checks the template edge for linearity.
|
|
*/
|
|
bool isLinear() const;
|
|
|
|
bool hasEdgeDestinationAssignments() const;
|
|
|
|
/*!
|
|
* Simplify Indexed Assignments
|
|
*/
|
|
TemplateEdge simplifyIndexedAssignments(bool syncronized, VariableSet const& localVars) const;
|
|
|
|
private:
|
|
// The guard of the template edge.
|
|
storm::expressions::Expression guard;
|
|
|
|
// The destinations of the template edge.
|
|
std::vector<TemplateEdgeDestination> destinations;
|
|
|
|
/// The assignments made when taking this edge.
|
|
OrderedAssignments assignments;
|
|
|
|
uint64_t lowestAssignmentLevel, highestAssignmentLevel;
|
|
|
|
/// A set of global variables that is written by at least one of the edge's destinations. This set is
|
|
/// initialized by the call to <code>finalize</code>.
|
|
boost::container::flat_set<storm::expressions::Variable> writtenGlobalVariables;
|
|
};
|
|
|
|
}
|
|
}
|