#pragma once

#include "storm/models/sparse/Dtmc.h"
#include "storm/models/symbolic/Dtmc.h"
#include "storm/models/sparse/Mdp.h"
#include "storm/models/symbolic/Mdp.h"
#include "storm/models/sparse/Ctmc.h"
#include "storm/models/symbolic/Ctmc.h"

#include "storm/storage/dd/Odd.h"

namespace storm {
    namespace transformer {

        template<storm::dd::DdType Type, typename ValueType>
        class SymbolicDtmcToSparseDtmcTransformer {
        public:
            std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> translate(storm::models::symbolic::Dtmc<Type, ValueType> const& symbolicDtmc);
            storm::dd::Odd const& getOdd() const;
            
        private:
            storm::dd::Odd odd;
        };
        
        template<storm::dd::DdType Type, typename ValueType>
        class SymbolicMdpToSparseMdpTransformer {
        public:
            static std::shared_ptr<storm::models::sparse::Mdp<ValueType>> translate(storm::models::symbolic::Mdp<Type, ValueType> const& symbolicMdp);
        };
        
        template<storm::dd::DdType Type, typename ValueType>
        class SymbolicCtmcToSparseCtmcTransformer {
        public:
            static std::shared_ptr<storm::models::sparse::Ctmc<ValueType>> translate(storm::models::symbolic::Ctmc<Type, ValueType> const& symbolicCtmc);
        };
    }
}