4 changed files with 689 additions and 548 deletions
			
			
		- 
					719src/storm-dft/modelchecker/dft/DFTASFChecker.cpp
 - 
					87src/storm-dft/modelchecker/dft/DFTASFChecker.h
 - 
					407src/storm-dft/modelchecker/dft/SmtConstraint.cpp
 - 
					24src/storm-dft/modelchecker/dft/SmtConstraint.h
 
@ -0,0 +1,407 @@ | 
				
			|||
#include "DFTASFChecker.h"
 | 
				
			|||
#include <string>
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
 | 
				
			|||
    namespace modelchecker { | 
				
			|||
 | 
				
			|||
        /*
 | 
				
			|||
         * Variable[VarIndex] is the maximum of the others | 
				
			|||
         */ | 
				
			|||
        class IsMaximum : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsMaximum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), | 
				
			|||
                                                                                    varIndices(varIndices) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsMaximum() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(and "; | 
				
			|||
                // assert it is largereq than all values.
 | 
				
			|||
                for (auto const &ovi : varIndices) { | 
				
			|||
                    sstr << "(>= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; | 
				
			|||
                } | 
				
			|||
                // assert it is one of the values.
 | 
				
			|||
                sstr << "(or "; | 
				
			|||
                for (auto const &ovi : varIndices) { | 
				
			|||
                    sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; | 
				
			|||
                } | 
				
			|||
                sstr << ")"; // end of the or
 | 
				
			|||
                sstr << ")"; // end outer and.
 | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            std::vector<uint64_t> varIndices; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        /*
 | 
				
			|||
         * First is the minimum of the others | 
				
			|||
         */ | 
				
			|||
        class IsMinimum : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsMinimum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), | 
				
			|||
                                                                                    varIndices(varIndices) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsMinimum() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(and "; | 
				
			|||
                // assert it is smallereq than all values.
 | 
				
			|||
                for (auto const &ovi : varIndices) { | 
				
			|||
                    sstr << "(<= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; | 
				
			|||
                } | 
				
			|||
                // assert it is one of the values.
 | 
				
			|||
                sstr << "(or "; | 
				
			|||
                for (auto const &ovi : varIndices) { | 
				
			|||
                    sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") "; | 
				
			|||
                } | 
				
			|||
                sstr << ")"; // end of the or
 | 
				
			|||
                sstr << ")"; // end outer and.
 | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            std::vector<uint64_t> varIndices; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class BetweenValues : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            BetweenValues(uint64_t varIndex, uint64_t lower, uint64_t upper) : varIndex(varIndex), upperBound(upper), | 
				
			|||
                                                                               lowerBound(lower) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~BetweenValues() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(and "; | 
				
			|||
                sstr << "(>= " << varNames.at(varIndex) << " " << lowerBound << ")"; | 
				
			|||
                sstr << "(<= " << varNames.at(varIndex) << " " << upperBound << ")"; | 
				
			|||
                sstr << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            uint64_t upperBound; | 
				
			|||
            uint64_t lowerBound; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class And : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            And(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~And() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                if (constraints.empty()) { | 
				
			|||
                    sstr << "true"; | 
				
			|||
                } else { | 
				
			|||
                    sstr << "(and"; | 
				
			|||
                    for (auto const &c : constraints) { | 
				
			|||
                        sstr << " " << c->toSmtlib2(varNames); | 
				
			|||
                    } | 
				
			|||
                    sstr << ")"; | 
				
			|||
                } | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::vector<std::shared_ptr<SmtConstraint>> constraints; | 
				
			|||
 | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class Or : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            Or(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~Or() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                if (constraints.empty()) { | 
				
			|||
                    sstr << "false"; | 
				
			|||
                } else { | 
				
			|||
                    sstr << "(or"; | 
				
			|||
                    for (auto const &c : constraints) { | 
				
			|||
                        sstr << " " << c->toSmtlib2(varNames); | 
				
			|||
                    } | 
				
			|||
                    sstr << ")"; | 
				
			|||
                } | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::vector<std::shared_ptr<SmtConstraint>> constraints; | 
				
			|||
 | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class Implies : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            Implies(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(=> " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::shared_ptr<SmtConstraint> lhs; | 
				
			|||
            std::shared_ptr<SmtConstraint> rhs; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class Iff : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            Iff(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(= " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::shared_ptr<SmtConstraint> lhs; | 
				
			|||
            std::shared_ptr<SmtConstraint> rhs; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsTrue : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsTrue(bool val) : value(val) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsTrue() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << (value ? "true" : "false"); | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            bool value; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsBoolValue : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsBoolValue(uint64_t varIndex, bool val) : varIndex(varIndex), value(val) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsBoolValue() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                assert(varIndex < varNames.size()); | 
				
			|||
                if (value) { | 
				
			|||
                    sstr << varNames.at(varIndex); | 
				
			|||
                } else { | 
				
			|||
                    sstr << "(not " << varNames.at(varIndex) << ")"; | 
				
			|||
                } | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            bool value; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsConstantValue : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsConstantValue(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsConstantValue() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                assert(varIndex < varNames.size()); | 
				
			|||
                sstr << "(= " << varNames.at(varIndex) << " " << value << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            uint64_t value; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsLessConstant : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsLessConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsLessConstant() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                assert(varIndex < varNames.size()); | 
				
			|||
                sstr << "(< " << varNames.at(varIndex) << " " << value << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            uint64_t value; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
        class IsLessEqualConstant : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsLessEqualConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsLessEqualConstant() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                assert(varIndex < varNames.size()); | 
				
			|||
                sstr << "(<= " << varNames.at(varIndex) << " " << value << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t varIndex; | 
				
			|||
            uint64_t value; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsEqual : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsEqual(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsEqual() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                return "(= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")"; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t var1Index; | 
				
			|||
            uint64_t var2Index; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IsLess : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IsLess(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~IsLess() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                return "(< " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")"; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            uint64_t var1Index; | 
				
			|||
            uint64_t var2Index; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class PairwiseDifferent : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            PairwiseDifferent(std::vector<uint64_t> const &indices) : varIndices(indices) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~PairwiseDifferent() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(distinct"; | 
				
			|||
                //                for(uint64_t i = 0; i < varIndices.size(); ++i) {
 | 
				
			|||
                //                    for(uint64_t j = i + 1; j < varIndices.size(); ++j) {
 | 
				
			|||
                //                        sstr << "()";
 | 
				
			|||
                //                    }
 | 
				
			|||
                //                }
 | 
				
			|||
                for (auto const &varIndex : varIndices) { | 
				
			|||
                    sstr << " " << varNames.at(varIndex); | 
				
			|||
                } | 
				
			|||
                sstr << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::vector<uint64_t> varIndices; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class Sorted : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            Sorted(std::vector<uint64_t> varIndices) : varIndices(varIndices) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~Sorted() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(and "; | 
				
			|||
                for (uint64_t i = 1; i < varIndices.size(); ++i) { | 
				
			|||
                    sstr << "(<= " << varNames.at(varIndices.at(i - 1)) << " " << varNames.at(varIndices.at(i)) << ")"; | 
				
			|||
                } | 
				
			|||
                sstr << ") "; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::vector<uint64_t> varIndices; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        class IfThenElse : public SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            IfThenElse(std::shared_ptr<SmtConstraint> ifC, std::shared_ptr<SmtConstraint> thenC, | 
				
			|||
                       std::shared_ptr<SmtConstraint> elseC) : ifConstraint(ifC), thenConstraint(thenC), | 
				
			|||
                                                               elseConstraint(elseC) { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            std::string toSmtlib2(std::vector<std::string> const &varNames) const override { | 
				
			|||
                std::stringstream sstr; | 
				
			|||
                sstr << "(ite " << ifConstraint->toSmtlib2(varNames) << " " << thenConstraint->toSmtlib2(varNames) | 
				
			|||
                     << " " << elseConstraint->toSmtlib2(varNames) << ")"; | 
				
			|||
                return sstr.str(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::shared_ptr<SmtConstraint> ifConstraint; | 
				
			|||
            std::shared_ptr<SmtConstraint> thenConstraint; | 
				
			|||
            std::shared_ptr<SmtConstraint> elseConstraint; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
@ -0,0 +1,24 @@ | 
				
			|||
#include <string> | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace modelchecker { | 
				
			|||
        class SmtConstraint { | 
				
			|||
        public: | 
				
			|||
            virtual ~SmtConstraint() { | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual std::string toSmtlib2(std::vector<std::string> const &varNames) const = 0; | 
				
			|||
 | 
				
			|||
            virtual std::string description() const { | 
				
			|||
                return descript; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            void setDescription(std::string const &descr) { | 
				
			|||
                descript = descr; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::string descript; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue