Browse Source
Scheisse... hab anscheinend vergessen das zu pushen
Scheisse... hab anscheinend vergessen das zu pushen
Enthalten ist: - Unit "Utility" zum parsen und ausgeben von DTMCs - Klasse Formula und Subclasses für PCTL-Formeln - Interface für den Model Checkertempestpy_adaptions
Lanchid
12 years ago
17 changed files with 882 additions and 41 deletions
-
46src/formula/AP.h
-
66src/formula/And.h
-
81src/formula/BoundedUntil.h
-
56src/formula/Next.h
-
56src/formula/Not.h
-
65src/formula/Or.h
-
28src/formula/PCTLPathFormula.h
-
30src/formula/PCTLStateFormula.h
-
28src/formula/PCTLformula.h
-
75src/formula/ProbabilisticOperator.h
-
67src/formula/Until.h
-
27src/formula/formulaTypes.h
-
27src/modelChecker/DtmcPrctlModelChecker.cpp
-
93src/modelChecker/DtmcPrctlModelChecker.h
-
41src/sparse/static_sparse_matrix.h
-
92src/utility/utility.cpp
-
45src/utility/utility.h
@ -0,0 +1,46 @@ |
|||
/* |
|||
* AP.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef AP_H_ |
|||
#define AP_H_ |
|||
|
|||
#include "PCTLStateFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
class AP : public PCTLStateFormula { |
|||
private: |
|||
std::string ap; |
|||
public: |
|||
AP(std::string ap) { |
|||
this->ap = ap; |
|||
} |
|||
|
|||
AP(char* ap) { |
|||
this->ap = ap; |
|||
} |
|||
|
|||
std::string getAP() { |
|||
return ap; |
|||
} |
|||
|
|||
std::string toString() { |
|||
return getAP(); |
|||
} |
|||
|
|||
virtual enum stateFormulaTypes type() { |
|||
return stateFormulaTypes::AP; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* AP_H_ */ |
@ -0,0 +1,66 @@ |
|||
/* |
|||
* And.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef AND_H_ |
|||
#define AND_H_ |
|||
|
|||
#include "PCTLStateFormula.h" |
|||
#include <string> |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
class And : public PCTLStateFormula { |
|||
private: |
|||
PCTLStateFormula* left; |
|||
PCTLStateFormula* right; |
|||
public: |
|||
And() { |
|||
left = NULL; |
|||
right = NULL; |
|||
} |
|||
And(PCTLStateFormula* left, PCTLStateFormula* right) { |
|||
this->left = left; |
|||
this->right = right; |
|||
} |
|||
|
|||
void setLeft(PCTLStateFormula* newLeft) { |
|||
left = newLeft; |
|||
} |
|||
|
|||
void setRight(PCTLStateFormula* newRight) { |
|||
right = newRight; |
|||
} |
|||
|
|||
PCTLStateFormula* getLeft() { |
|||
return left; |
|||
} |
|||
|
|||
PCTLStateFormula* getRight() { |
|||
return right; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += left->toString(); |
|||
result += " && "; |
|||
result += right->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum stateFormulaTypes type() { |
|||
return AND; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* AND_H_ */ |
@ -0,0 +1,81 @@ |
|||
/* |
|||
* BoundedUntil.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef BOUNDEDUNTIL_H_ |
|||
#define BOUNDEDUNTIL_H_ |
|||
|
|||
#include "PCTLPathFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
class BoundedUntil : public PCTLPathFormula { |
|||
PCTLStateFormula* left; |
|||
PCTLStateFormula* right; |
|||
uint_fast64_t bound; |
|||
public: |
|||
BoundedUntil() { |
|||
this->left = NULL; |
|||
this->right = NULL; |
|||
bound = 0; |
|||
} |
|||
|
|||
BoundedUntil(PCTLStateFormula* left, PCTLStateFormula* right, |
|||
uint_fast64_t bound) { |
|||
this->left = left; |
|||
this->right = right; |
|||
this->bound = bound; |
|||
} |
|||
|
|||
virtual ~BoundedUntil(); |
|||
|
|||
void setLeft(PCTLStateFormula* newLeft) { |
|||
left = newLeft; |
|||
} |
|||
|
|||
void setRight(PCTLStateFormula* newRight) { |
|||
right = newRight; |
|||
} |
|||
|
|||
PCTLStateFormula* getLeft() { |
|||
return left; |
|||
} |
|||
|
|||
PCTLStateFormula* getRight() { |
|||
return right; |
|||
} |
|||
|
|||
uint_fast64_t getBound() { |
|||
return bound; |
|||
} |
|||
|
|||
void setBound(uint_fast64_t bound) { |
|||
this->bound = bound; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += left->toString(); |
|||
result += " U<="; |
|||
result += bound; |
|||
result += " "; |
|||
result += right->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum pathFormulaTypes type() { |
|||
return BOUNDED_UNTIL; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* BOUNDEDUNTIL_H_ */ |
@ -0,0 +1,56 @@ |
|||
/* |
|||
* Next.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef NEXT_H_ |
|||
#define NEXT_H_ |
|||
|
|||
#include "PCTLPathFormula.h" |
|||
#include "PCTLStateFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
|
|||
class Next : public PCTLPathFormula { |
|||
private: |
|||
PCTLStateFormula* child; |
|||
public: |
|||
Next() { |
|||
this->child = NULL; |
|||
} |
|||
|
|||
Next(PCTLStateFormula* child) { |
|||
this->child = child; |
|||
} |
|||
|
|||
PCTLStateFormula* getChild() { |
|||
return child; |
|||
} |
|||
|
|||
void setChild(PCTLStateFormula* child) { |
|||
this->child = child; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += " X "; |
|||
result += child->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum pathFormulaTypes type() { |
|||
return NEXT; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* NEXT_H_ */ |
@ -0,0 +1,56 @@ |
|||
/* |
|||
* Not.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef NOT_H_ |
|||
#define NOT_H_ |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
#include "PCTLStateFormula.h" |
|||
|
|||
class Not : public PCTLStateFormula { |
|||
private: |
|||
PCTLStateFormula* child; |
|||
public: |
|||
Not() { |
|||
this->child = NULL; |
|||
} |
|||
|
|||
Not(PCTLStateFormula* child) { |
|||
this->child = child; |
|||
} |
|||
|
|||
virtual ~Not() { |
|||
|
|||
} |
|||
|
|||
PCTLStateFormula* getChild() { |
|||
return child; |
|||
} |
|||
|
|||
void setChild(PCTLStateFormula* child) { |
|||
this->child = child; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "!"; |
|||
result += child->toString(); |
|||
return result; |
|||
} |
|||
|
|||
virtual enum stateFormulaTypes type() { |
|||
return NOT; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace MRMC |
|||
|
|||
#endif /* NOT_H_ */ |
@ -0,0 +1,65 @@ |
|||
/* |
|||
* Or.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef OR_H_ |
|||
#define OR_H_ |
|||
|
|||
#include "PCTLStateFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
class Or : public PCTLStateFormula { |
|||
private: |
|||
PCTLStateFormula* left; |
|||
PCTLStateFormula* right; |
|||
public: |
|||
Or() { |
|||
left = NULL; |
|||
right = NULL; |
|||
} |
|||
Or(PCTLStateFormula* left, PCTLStateFormula* right) { |
|||
this->left = left; |
|||
this->right = right; |
|||
} |
|||
|
|||
void setLeft(PCTLStateFormula* newLeft) { |
|||
left = newLeft; |
|||
} |
|||
|
|||
void setRight(PCTLStateFormula* newRight) { |
|||
right = newRight; |
|||
} |
|||
|
|||
PCTLStateFormula* getLeft() { |
|||
return left; |
|||
} |
|||
|
|||
PCTLStateFormula* getRight() { |
|||
return right; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += left->toString(); |
|||
result += " || "; |
|||
result += right->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum stateFormulaTypes type() { |
|||
return OR; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* OR_H_ */ |
@ -0,0 +1,28 @@ |
|||
/* |
|||
* PCTLPathFormula.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef PCTLPATHFORMULA_H_ |
|||
#define PCTLPATHFORMULA_H_ |
|||
|
|||
#include "PCTLformula.h" |
|||
#include "formulaTypes.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
//abstract |
|||
class PCTLPathFormula : public PCTLFormula { |
|||
public: |
|||
virtual enum pathFormulaTypes type() = 0; |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* PCTLPATHFORMULA_H_ */ |
@ -0,0 +1,30 @@ |
|||
/* |
|||
* PCTLStateFormula.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef PCTLSTATEFORMULA_H_ |
|||
#define PCTLSTATEFORMULA_H_ |
|||
|
|||
#include "PCTLformula.h" |
|||
#include "formulaTypes.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
//abstract |
|||
class PCTLStateFormula : public PCTLFormula { |
|||
public: |
|||
virtual enum stateFormulaTypes type() = 0; |
|||
|
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
|
|||
#endif /* PCTLSTATEFORMULA_H_ */ |
@ -0,0 +1,28 @@ |
|||
/* |
|||
* PCTLformula.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef PCTLFORMULA_H_ |
|||
#define PCTLFORMULA_H_ |
|||
|
|||
#include <string> |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
|
|||
//abstract |
|||
class PCTLFormula { |
|||
public: |
|||
virtual std::string toString() = 0; |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* PCTLFORMULA_H_ */ |
@ -0,0 +1,75 @@ |
|||
/* |
|||
* ProbabilisticOperator.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef PROBABILISTICOPERATOR_H_ |
|||
#define PROBABILISTICOPERATOR_H_ |
|||
|
|||
#include "PCTLStateFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
template<class T> |
|||
class ProbabilisticOperator : public PCTLStateFormula { |
|||
T lower; |
|||
T upper; |
|||
PCTLPathFormula* pathFormula; |
|||
public: |
|||
ProbabilisticOperator(T lowerBound, T upperBound, PCTLPathFormula* pathFormula=NULL) { |
|||
this->lower = lowerBound; |
|||
this->upper = upperBound; |
|||
this->pathFormula = pathFormula; |
|||
} |
|||
|
|||
virtual ~ProbabilisticOperator() { |
|||
delete pathFormula; |
|||
} |
|||
|
|||
PCTLPathFormula* getPathFormula () { |
|||
return pathFormula; |
|||
} |
|||
|
|||
T getLowerBound() { |
|||
return lower; |
|||
} |
|||
|
|||
T getUpperBound() { |
|||
return upper; |
|||
} |
|||
|
|||
void setPathFormula(PCTLPathFormula* pathFormula) { |
|||
this->pathFormula = pathFormula; |
|||
} |
|||
|
|||
void setInterval(T lowerBound, T upperBound) { |
|||
this->lower = lowerBound; |
|||
this->upper = upperBound; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += " P["; |
|||
result += lower; |
|||
result += ";"; |
|||
result += upper; |
|||
result += "] "; |
|||
result += pathFormula->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum stateFormulaTypes type() { |
|||
return PROBABILISTIC; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* PROBABILISTICOPERATOR_H_ */ |
@ -0,0 +1,67 @@ |
|||
/* |
|||
* Until.h |
|||
* |
|||
* Created on: 19.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef UNTIL_H_ |
|||
#define UNTIL_H_ |
|||
|
|||
#include "PCTLPathFormula.h" |
|||
#include "PCTLStateFormula.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace formula { |
|||
|
|||
class Until : public PCTLPathFormula { |
|||
PCTLStateFormula* left; |
|||
PCTLStateFormula* right; |
|||
public: |
|||
Until() { |
|||
this->left = NULL; |
|||
this->right = NULL; |
|||
} |
|||
|
|||
Until(PCTLStateFormula* left, PCTLStateFormula* right) { |
|||
this->left = left; |
|||
this->right = right; |
|||
} |
|||
virtual ~Until(); |
|||
|
|||
void setLeft(PCTLStateFormula* newLeft) { |
|||
left = newLeft; |
|||
} |
|||
|
|||
void setRight(PCTLStateFormula* newRight) { |
|||
right = newRight; |
|||
} |
|||
|
|||
PCTLStateFormula* getLeft() { |
|||
return left; |
|||
} |
|||
|
|||
PCTLStateFormula* getRight() { |
|||
return right; |
|||
} |
|||
|
|||
std::string toString() { |
|||
std::string result = "("; |
|||
result += left->toString(); |
|||
result += " U "; |
|||
result += right->toString(); |
|||
result += ")"; |
|||
return result; |
|||
} |
|||
|
|||
virtual enum pathFormulaTypes type() { |
|||
return UNTIL; |
|||
} |
|||
}; |
|||
|
|||
} //namespace formula |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* UNTIL_H_ */ |
@ -0,0 +1,27 @@ |
|||
/* |
|||
* formulaTypes.h |
|||
* |
|||
* Created on: 21.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef FORMULATYPES_H_ |
|||
#define FORMULATYPES_H_ |
|||
|
|||
enum stateFormulaTypes { |
|||
AND, |
|||
AP, |
|||
NOT, |
|||
OR, |
|||
PROBABILISTIC |
|||
}; |
|||
|
|||
enum pathFormulaTypes { |
|||
NEXT, |
|||
UNTIL, |
|||
BOUNDED_UNTIL, |
|||
EVENTUALLY, |
|||
ALWAYS |
|||
}; |
|||
|
|||
#endif /* FORMULATYPES_H_ */ |
@ -0,0 +1,27 @@ |
|||
/*
|
|||
* DtmcPrctlModelChecker.cpp |
|||
* |
|||
* Created on: 22.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#include "DtmcPrctlModelChecker.h"
|
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace modelChecker { |
|||
|
|||
template<class T> |
|||
DtmcPrctlModelChecker<T>::DtmcPrctlModelChecker(mrmc::models::Dtmc<T>* DTMC) { |
|||
this->DTMC = DTMC; |
|||
} |
|||
|
|||
template<class T> |
|||
DtmcPrctlModelChecker<T>::~DtmcPrctlModelChecker() { |
|||
delete this->dtmc; |
|||
} |
|||
|
|||
|
|||
} //namespace modelChecker
|
|||
|
|||
} //namespace mrmc
|
@ -0,0 +1,93 @@ |
|||
/* |
|||
* DtmcPrctlModelChecker.h |
|||
* |
|||
* Created on: 22.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef DTMCPRCTLMODELCHECKER_H_ |
|||
#define DTMCPRCTLMODELCHECKER_H_ |
|||
|
|||
#include "src/formula/And.h" |
|||
#include "src/formula/AP.h" |
|||
#include "src/formula/BoundedUntil.h" |
|||
#include "src/formula/Next.h" |
|||
#include "src/formula/Not.h" |
|||
#include "src/formula/Or.h" |
|||
#include "src/formula/ProbabilisticOperator.h" |
|||
#include "src/formula/Until.h" |
|||
|
|||
#include "src/models/dtmc.h" |
|||
#include "src/vector/bitvector.h" |
|||
#include <vector> |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace modelChecker { |
|||
|
|||
template<class T> |
|||
class DtmcPrctlModelChecker { |
|||
private: |
|||
mrmc::models::Dtmc<T>* dtmc; |
|||
|
|||
protected: |
|||
mrmc::models::Dtmc<T>* getDtmc() const { |
|||
return this->dtmc; |
|||
} |
|||
|
|||
public: |
|||
explicit DtmcPrctlModelChecker(mrmc::models::Dtmc<T>* DTMC); |
|||
~DtmcPrctlModelChecker(); |
|||
|
|||
virtual void makeAbsorbing(mrmc::vector::BitVector*) = 0; |
|||
virtual mrmc::vector::BitVector getStatesSatisying(mrmc::models::SingleAtomicPropositionLabeling*) = 0; |
|||
virtual std::vector<T> multiplyMatrixVector(std::vector<T>*) = 0; |
|||
|
|||
virtual mrmc::vector::BitVector checkStateFormula(mrmc::formula::PCTLStateFormula* formula) { |
|||
if (formula->type() == AND) { |
|||
return checkAnd(static_cast<mrmc::formula::And*>(formula)); |
|||
} |
|||
if (formula->type() == stateFormulaTypes::AP) { |
|||
return checkAP(static_cast<mrmc::formula::AP*>(formula)); |
|||
} |
|||
if (formula->type() == NOT) { |
|||
return checkNot(static_cast<mrmc::formula::Not*>(formula)); |
|||
} |
|||
if (formula->type() == OR) { |
|||
return checkOr(static_cast<mrmc::formula::Or*>(formula)); |
|||
} |
|||
if (formula->type() == PROBABILISTIC) { |
|||
return checkProbabilisticOperator( |
|||
static_cast<mrmc::formula::ProbabilisticOperator<T>*>(formula)); |
|||
} |
|||
} |
|||
|
|||
|
|||
virtual mrmc::vector::BitVector checkAnd(mrmc::formula::And*) = 0; |
|||
virtual mrmc::vector::BitVector checkAP(mrmc::formula::AP*) = 0; |
|||
virtual mrmc::vector::BitVector checkNot(mrmc::formula::Not*) = 0; |
|||
virtual mrmc::vector::BitVector checkOr(mrmc::formula::Or*) = 0; |
|||
virtual mrmc::vector::BitVector checkProbabilisticOperator(mrmc::formula::ProbabilisticOperator<T>*) = 0; |
|||
|
|||
virtual std::vector<T> checkPathFormula(mrmc::formula::PCTLPathFormula* formula) { |
|||
if (formula->type() == NEXT) { |
|||
return checkNext(static_cast<mrmc::formula::Next*>(formula)); |
|||
} |
|||
if (formula->type() == UNTIL) { |
|||
return checkUntil(static_cast<mrmc::formula::Until*>(formula)); |
|||
} |
|||
if (formula->type() == BOUNDED_UNTIL) { |
|||
return checkBoundedUntil(static_cast<mrmc::formula::BoundedUntil*>(formula)); |
|||
} |
|||
} |
|||
|
|||
virtual std::vector<T> checkBoundedUntil(mrmc::formula::BoundedUntil*) = 0; |
|||
virtual std::vector<T> checkNext(mrmc::formula::Next*) = 0; |
|||
virtual std::vector<T> checkUntil(mrmc::formula::Until*) = 0; |
|||
}; |
|||
|
|||
} //namespace modelChecker |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* DTMCPRCTLMODELCHECKER_H_ */ |
@ -0,0 +1,92 @@ |
|||
/*
|
|||
* utility.cpp |
|||
* |
|||
* Created on: 17.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#include "src/utility/utility.h"
|
|||
#include "src/parser/read_tra_file.h"
|
|||
#include "src/parser/read_lab_file.h"
|
|||
|
|||
#include "src/sparse/static_sparse_matrix.h"
|
|||
#include "src/models/dtmc.h"
|
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace utility { |
|||
|
|||
void dtmcToDot(mrmc::models::DTMC<double>* dtmc, const char* filename) { |
|||
FILE *P; |
|||
mrmc::sparse::StaticSparseMatrix<double>* matrix = dtmc->getTransitions(); |
|||
mrmc::dtmc::Labeling* labels = dtmc->getLabels(); |
|||
|
|||
uint_fast64_t* row_indications = matrix->getRowIndications(); |
|||
uint_fast64_t* column_indications = matrix->getColumnIndications(); |
|||
double* value_storage = matrix->getStoragePointer(); |
|||
double* diagonal_storage = matrix->getDiagonalStorage(); |
|||
|
|||
P = fopen(filename, "w"); |
|||
|
|||
if (P == NULL) { |
|||
pantheios::log_ERROR("File could not be opened."); |
|||
throw mrmc::exceptions::file_IO_exception(); |
|||
} |
|||
|
|||
fprintf(P, "digraph dtmc {\n"); |
|||
|
|||
//Specify the nodes and their labels
|
|||
for (uint_fast64_t i = 1; i <= dtmc->getNodeCount(); i++) { |
|||
fprintf(P, "\t%Lu[label=\"%Lu\\n{", i, i); |
|||
char komma=' '; |
|||
for(auto it = labels->getPropositionMap()->begin(); |
|||
it != labels->getPropositionMap()->end(); |
|||
it++) { |
|||
if(labels->nodeHasProposition(it->first, i)) { |
|||
fprintf(P, "%c%s", komma, (it->first).c_str()); |
|||
} |
|||
char komma=','; |
|||
} |
|||
|
|||
fprintf(P, " }\"];\n"); |
|||
} |
|||
|
|||
uint_fast64_t row = 0; |
|||
|
|||
for (uint_fast64_t i = 0; i < matrix->getNonZeroEntryCount(); i++ ) { |
|||
//Check whether we have to switch to the new row
|
|||
while (row_indications[row] <= i) { |
|||
++row; |
|||
//write diagonal entry/self loop first
|
|||
if (diagonal_storage[row] != 0) { |
|||
fprintf(P, "\t%Lu -> %Lu [label=%f]\n", |
|||
row, row, diagonal_storage[row]); |
|||
} |
|||
} |
|||
fprintf(P, "\t%Lu -> %Lu [label=%f]\n", |
|||
row, column_indications[i], value_storage[i]); |
|||
} |
|||
|
|||
|
|||
|
|||
fprintf(P, "}\n"); |
|||
|
|||
fclose(P); |
|||
} |
|||
|
|||
mrmc::models::Dtmc<double>* parseDTMC(const char* tra_file, const char* lab_file) { |
|||
mrmc::sparse::StaticSparseMatrix<double>* transition_matrix = |
|||
mrmc::parser::read_tra_file(tra_file); |
|||
uint_fast64_t node_count = transition_matrix->getRowCount(); |
|||
|
|||
mrmc::dtmc::Labeling* labeling = |
|||
mrmc::parser::read_lab_file(node_count, lab_file); |
|||
|
|||
mrmc::models::Dtmc<double>* result = |
|||
new mrmc::models::Dtmc<double>(transition_matrix, labeling); |
|||
return result; |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,45 @@ |
|||
/* |
|||
* utility.h |
|||
* |
|||
* Created on: 17.10.2012 |
|||
* Author: Thomas Heinemann |
|||
*/ |
|||
|
|||
#ifndef UTILITY_H_ |
|||
#define UTILITY_H_ |
|||
|
|||
#include "src/models/dtmc.h" |
|||
|
|||
namespace mrmc { |
|||
|
|||
namespace utility { |
|||
|
|||
/*! |
|||
Creates a DOT file which provides the graph of the DTMC. |
|||
|
|||
Currently, only a version for DTMCs using probabilities of type double is provided. |
|||
Adaptions for other types may be included later. |
|||
|
|||
@param dtmc The DTMC to output |
|||
@param filename The Name of the file to write in. If the file already exists, |
|||
it will be overwritten. |
|||
|
|||
*/ |
|||
void dtmcToDot(mrmc::models::Dtmc<double>* dtmc, const char* filename); |
|||
|
|||
/*! |
|||
Parses a transition file and a labeling file and produces a DTMC out of them. |
|||
Note that the labeling file may have at most as many nodes as the transition file! |
|||
|
|||
@param tra_file String containing the location of the transition file (....tra) |
|||
@param lab_file String containing the location of the labeling file (....lab) |
|||
@returns The DTMC described by the two files. |
|||
|
|||
*/ |
|||
mrmc::models::Dtmc<double>* parseDTMC(const char* tra_file, const char* lab_file); |
|||
|
|||
} //namespace utility |
|||
|
|||
} //namespace mrmc |
|||
|
|||
#endif /* UTILITY_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue