py::class_<storm::models::ModelBase,std::shared_ptr<storm::models::ModelBase>>(m,"ModelBase","Base class for all models")
.def("nr_states",&storm::models::ModelBase::getNumberOfStates,"Get number of states")
.def("nr_transitions",&storm::models::ModelBase::getNumberOfTransitions,"Get number of transitions")
.def("model_type",&storm::models::ModelBase::getType,"Get model type")
.def("parametric",&storm::models::ModelBase::isParametric,"Check if model is parametric")
.def("as_dtmc",&storm::models::ModelBase::as<storm::models::sparse::Dtmc<double>>,"Get model as DTMC")
.def("as_pdtmc",&storm::models::ModelBase::as<storm::models::sparse::Dtmc<storm::RationalFunction>>,"Get model as pDTMC")
.def("as_mdp",&storm::models::ModelBase::as<storm::models::sparse::Mdp<double>>,"Get model as MDP")
.def("as_pmdp",&storm::models::ModelBase::as<storm::models::sparse::Mdp<storm::RationalFunction>>,"Get model as pMDP")
;
py::class_<storm::models::sparse::Model<double>,std::shared_ptr<storm::models::sparse::Model<double>>>(m,"SparseModel","A probabilistic model where transitions are represented by doubles and saved in a sparse matrix",py::base<storm::models::ModelBase>())
py::class_<storm::models::sparse::Dtmc<double>,std::shared_ptr<storm::models::sparse::Dtmc<double>>>(m,"SparseDtmc","DTMC in sparse representation",py::base<storm::models::sparse::Model<double>>())
py::class_<storm::models::sparse::Mdp<double>,std::shared_ptr<storm::models::sparse::Mdp<double>>>(m,"SparseMdp","MDP in sparse representation",py::base<storm::models::sparse::Model<double>>())
py::class_<storm::models::sparse::Model<storm::RationalFunction>,std::shared_ptr<storm::models::sparse::Model<storm::RationalFunction>>>(m,"SparseParametricModel","A probabilistic model where transitions are represented by rational functions and saved in a sparse matrix",py::base<storm::models::ModelBase>())
py::class_<storm::models::sparse::Dtmc<storm::RationalFunction>,std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>>>(m,"SparseParametricDtmc","pDTMC in sparse representation",py::base<storm::models::sparse::Model<storm::RationalFunction>>())
py::class_<storm::models::sparse::Mdp<storm::RationalFunction>,std::shared_ptr<storm::models::sparse::Mdp<storm::RationalFunction>>>(m,"SparseParametricMdp","pMDP in sparse representation",py::base<storm::models::sparse::Model<storm::RationalFunction>>())
py::class_<std::shared_ptr<storm::logic::PathFormula>>(m,"PathFormula","Formula about the probability of a set of paths in an automaton",py::base<std::shared_ptr<storm::logic::Formula>>());
//py::class_<storm::logic::UnaryPathFormula, storm::logic::PathFormula>(m, "UnaryPathFormula", "Path formula with one operand");
//py::class_<storm::logic::EventuallyFormula, storm::logic::UnaryPathFormula>(m, "EventuallyFormula", "Formula for eventually");
//py::class_<storm::logic::GloballyFormula, storm::logic::UnaryPathFormula>(m, "GloballyFormula", "Formula for globally");
//py::class_<storm::logic::BinaryPathFormula, storm::logic::PathFormula>(m, "BinaryPathFormula", "Path formula with two operands");
//py::class_<storm::logic::BoundedUntilFormula, storm::logic::BinaryPathFormula>(m, "BoundedUntilFormula", "Until Formula with either a step or a time bound.");
//py::class_<storm::logic::ConditionalPathFormula, storm::logic::BinaryPathFormula>(m, "ConditionalPathFormula", "Path Formula with the right hand side being a condition.");
//py::class_<storm::logic::UntilFormula, storm::logic::BinaryPathFormula>(m, "UntilFormula", "Path Formula for unbounded until");
py::class_<storm::logic::PathFormula,std::shared_ptr<storm::logic::PathFormulaconst>>(m,"PathFormula","Formula about the probability of a set of paths in an automaton",py::base<storm::logic::Formula>());
py::class_<storm::logic::UnaryPathFormula,std::shared_ptr<storm::logic::UnaryPathFormulaconst>>(m,"UnaryPathFormula","Path formula with one operand",py::base<storm::logic::PathFormula>());
py::class_<storm::logic::EventuallyFormula,std::shared_ptr<storm::logic::EventuallyFormulaconst>>(m,"EventuallyFormula","Formula for eventually",py::base<storm::logic::UnaryPathFormula>());
py::class_<storm::logic::GloballyFormula,std::shared_ptr<storm::logic::GloballyFormulaconst>>(m,"GloballyFormula","Formula for globally",py::base<storm::logic::UnaryPathFormula>());
py::class_<storm::logic::BinaryPathFormula,std::shared_ptr<storm::logic::BinaryPathFormulaconst>>(m,"BinaryPathFormula","Path formula with two operands",py::base<storm::logic::PathFormula>());
py::class_<storm::logic::BoundedUntilFormula,std::shared_ptr<storm::logic::BoundedUntilFormulaconst>>(m,"BoundedUntilFormula","Until Formula with either a step or a time bound.",py::base<storm::logic::BinaryPathFormula>());
py::class_<storm::logic::ConditionalFormula,std::shared_ptr<storm::logic::ConditionalFormulaconst>>(m,"ConditionalFormula","Formula with the right hand side being a condition.",py::base<storm::logic::Formula>());
py::class_<storm::logic::UntilFormula,std::shared_ptr<storm::logic::UntilFormulaconst>>(m,"UntilFormula","Path Formula for unbounded until",py::base<storm::logic::BinaryPathFormula>());
//py::class_<storm::logic::RewardPathFormula, std::shared_ptr<storm::logic::RewardPathFormula>(m, "RewardPathFormula", "Formula about the rewards of a set of paths in an automaton", py::base<storm::logic::Formula>());
py::class_<storm::logic::CumulativeRewardFormula,std::shared_ptr<storm::logic::CumulativeRewardFormulaconst>>(m,"CumulativeRewardFormula","Summed rewards over a the paths",py::base<storm::logic::PathFormula>());
py::class_<storm::logic::LongRunAverageRewardFormula,std::shared_ptr<storm::logic::LongRunAverageRewardFormulaconst>>(m,"LongRunAverageRewardFormula","Long run average reward",py::base<storm::logic::PathFormula>());
py::class_<storm::logic::StateFormula,std::shared_ptr<storm::logic::StateFormulaconst>>(m,"StateFormula","Formula about a state of an automaton",py::base<storm::logic::Formula>());
py::class_<storm::logic::AtomicExpressionFormula,std::shared_ptr<storm::logic::AtomicExpressionFormulaconst>>(m,"AtomicExpressionFormula","Formula with an atomic expression",py::base<storm::logic::StateFormula>());
py::class_<storm::logic::AtomicLabelFormula,std::shared_ptr<storm::logic::AtomicLabelFormulaconst>>(m,"AtomicLabelFormula","Formula with an atomic label",py::base<storm::logic::StateFormula>());
py::class_<storm::logic::BooleanLiteralFormula,std::shared_ptr<storm::logic::BooleanLiteralFormulaconst>>(m,"BooleanLiteralFormula","Formula with a boolean literal",py::base<storm::logic::StateFormula>());
py::class_<storm::logic::UnaryStateFormula,std::shared_ptr<storm::logic::UnaryStateFormulaconst>>(m,"UnaryStateFormula","State formula with one operand",py::base<storm::logic::StateFormula>());
py::class_<storm::logic::UnaryBooleanStateFormula,std::shared_ptr<storm::logic::UnaryBooleanStateFormulaconst>>(m,"UnaryBooleanStateFormula","Unary boolean state formula",py::base<storm::logic::UnaryStateFormula>());
py::class_<storm::logic::TimeOperatorFormula,std::shared_ptr<storm::logic::TimeOperatorFormulaconst>>(m,"TimeOperator","The time operator",py::base<storm::logic::OperatorFormula>());
py::class_<storm::logic::LongRunAverageOperatorFormula,std::shared_ptr<storm::logic::LongRunAverageOperatorFormulaconst>>(m,"LongRunAvarageOperator","Long run average operator",py::base<storm::logic::OperatorFormula>());
py::class_<storm::logic::BinaryStateFormula,std::shared_ptr<storm::logic::BinaryStateFormulaconst>>(m,"BinaryStateFormula","State formula with two operands",py::base<storm::logic::StateFormula>());
py::class_<storm::logic::BinaryBooleanStateFormula,std::shared_ptr<storm::logic::BinaryBooleanStateFormulaconst>>(m,"BooleanBinaryStateFormula","Boolean binary state formula",py::base<storm::logic::BinaryStateFormula>());