#include "src/solver/stateelimination/StateEliminator.h"

#include "src/adapters/CarlAdapter.h"

#include "src/storage/BitVector.h"

#include "src/utility/stateelimination.h"
#include "src/utility/macros.h"
#include "src/utility/constants.h"
#include "src/utility/macros.h"
#include "src/exceptions/InvalidStateException.h"

namespace storm {
    namespace solver {
        namespace stateelimination {
            
            using namespace storm::utility::stateelimination;
            
            template<typename ValueType>
            StateEliminator<ValueType>::StateEliminator(storm::storage::FlexibleSparseMatrix<ValueType>& transitionMatrix, storm::storage::FlexibleSparseMatrix<ValueType>& backwardTransitions) : EliminatorBase<ValueType, ScalingMode::DivideOneMinus>(transitionMatrix, backwardTransitions) {
                // Intentionally left empty.
            }
            
            template<typename ValueType>
            void StateEliminator<ValueType>::eliminateState(storm::storage::sparse::state_type state, bool removeForwardTransitions) {
                STORM_LOG_TRACE("Eliminating state " << state << ".");
                this->eliminate(state, state, removeForwardTransitions);
            }
            
            template class StateEliminator<double>;
            template class StateEliminator<storm::RationalNumber>;
            template class StateEliminator<storm::RationalFunction>;
            
        } // namespace stateelimination
    } // namespace storage
} // namespace storm