/* * GmmxxAdapter.h * * Created on: 24.12.2012 * Author: Christian Dehnert */ #ifndef STORM_ADAPTERS_GMMXXADAPTER_H_ #define STORM_ADAPTERS_GMMXXADAPTER_H_ #include #include #include "gmm/gmm_matrix.h" #include "src/storage/SparseMatrix.h" #include "src/utility/ConversionHelper.h" #include "log4cplus/logger.h" #include "log4cplus/loggingmacros.h" extern log4cplus::Logger logger; namespace storm { namespace adapters { class GmmxxAdapter { public: /*! * Converts a sparse matrix into a sparse matrix in the gmm++ format. * @return A pointer to a row-major sparse matrix in gmm++ format. */ template static std::unique_ptr> toGmmxxSparseMatrix(storm::storage::SparseMatrix const& matrix) { uint_fast64_t realNonZeros = matrix.getEntryCount(); LOG4CPLUS_DEBUG(logger, "Converting matrix with " << realNonZeros << " non-zeros to gmm++ format."); // Prepare the resulting matrix. std::unique_ptr> result(new gmm::csr_matrix(matrix.getRowCount(), matrix.getColumnCount())); // Copy Row Indications std::copy(matrix.rowIndications.begin(), matrix.rowIndications.end(), result->jc.begin()); // Copy columns and values. std::vector values; values.reserve(matrix.getEntryCount()); // To match the correct vector type for gmm, we create the vector with the exact same type. decltype(result->ir) columns; columns.reserve(matrix.getEntryCount()); for (auto const& entry : matrix) { columns.emplace_back(entry.getColumn()); values.emplace_back(entry.getValue()); } std::swap(result->ir, columns); std::swap(result->pr, values); LOG4CPLUS_DEBUG(logger, "Done converting matrix to gmm++ format."); return result; } }; } //namespace adapters } //namespace storm #endif /* STORM_ADAPTERS_GMMXXADAPTER_H_ */