#ifndef STORM_MODELS_SYMBOLIC_CTMC_H_
#define STORM_MODELS_SYMBOLIC_CTMC_H_

#include "src/models/symbolic/DeterministicModel.h"
#include "src/utility/OsDetection.h"

namespace storm {
    namespace models {
        namespace symbolic {
            
            /*!
             * This class represents a continuous-time Markov chain.
             */
            template<storm::dd::DdType Type>
            class Ctmc : public DeterministicModel<Type> {
            public:
                Ctmc(Ctmc<Type> const& other) = default;
                Ctmc& operator=(Ctmc<Type> const& other) = default;
                
#ifndef WINDOWS
                Ctmc(Ctmc<Type>&& other) = default;
                Ctmc& operator=(Ctmc<Type>&& other) = default;
#endif
                
                /*!
                 * Constructs a model from the given data.
                 *
                 * @param manager The manager responsible for the decision diagrams.
                 * @param reachableStates A DD representing the reachable states.
                 * @param initialStates A DD representing the initial states of the model.
                 * @param transitionMatrix The matrix representing the transitions in the model.
                 * @param rowVariables The set of row meta variables used in the DDs.
                 * @param rowExpressionAdapter An object that can be used to translate expressions in terms of the row
                 * meta variables.
                 * @param columVariables The set of column meta variables used in the DDs.
                 * @param columnExpressionAdapter An object that can be used to translate expressions in terms of the
                 * column meta variables.
                 * @param rowColumnMetaVariablePairs All pairs of row/column meta variables.
                 * @param labelToExpressionMap A mapping from label names to their defining expressions.
                 * @param optionalStateRewardVector The reward values associated with the states.
                 * @param optionalTransitionRewardMatrix The reward values associated with the transitions of the model.
                 */
                Ctmc(std::shared_ptr<storm::dd::DdManager<Type>> manager,
                     storm::dd::Bdd<Type> reachableStates,
                     storm::dd::Bdd<Type> initialStates,
                     storm::dd::Add<Type> transitionMatrix,
                     std::set<storm::expressions::Variable> const& rowVariables,
                     std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> rowExpressionAdapter,
                     std::set<storm::expressions::Variable> const& columnVariables,
                     std::shared_ptr<storm::adapters::AddExpressionAdapter<Type>> columnExpressionAdapter,
                     std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
                     std::map<std::string, storm::expressions::Expression> labelToExpressionMap = std::map<std::string, storm::expressions::Expression>(),
                     boost::optional<storm::dd::Add<Type>> const& optionalStateRewardVector = boost::optional<storm::dd::Dd<Type>>(),
                     boost::optional<storm::dd::Add<Type>> const& optionalTransitionRewardMatrix = boost::optional<storm::dd::Dd<Type>>());
                
                /*!
                 * Retrieves the exit rate vector of the CTMC.
                 *
                 * @return The exit rate vector.
                 */
                storm::dd::Add<Type> const& getExitRateVector() const;
                
            private:
                storm::dd::Add<Type> exitRates;
            };
            
        } // namespace symbolic
    } // namespace models
} // namespace storm

#endif /* STORM_MODELS_SYMBOLIC_CTMC_H_ */