Browse Source
			
			
			Fixed MDP Parser, removed parsing of STATES/TRANSITIONS, see #10
			
				
		Fixed MDP Parser, removed parsing of STATES/TRANSITIONS, see #10
	
		
	
			
				Refactored the Sparse Adapters, see #17main
				 9 changed files with 452 additions and 293 deletions
			
			
		- 
					6src/adapters/EigenAdapter.h
- 
					220src/adapters/StormAdapter.h
- 
					20src/parser/NondeterministicSparseTransitionParser.cpp
- 
					247src/storage/SparseMatrix.h
- 
					4test/parser/ParseMdpTest.cpp
- 
					33test/storage/SparseMatrixTest.cpp
- 
					0test/storage/adapters/EigenAdapterTest.cpp
- 
					111test/storage/adapters/GmmAdapterTest.cpp
- 
					104test/storage/adapters/StormAdapterTest.cpp
| @ -0,0 +1,220 @@ | |||||
|  | /* | ||||
|  |  * StormAdapter.h | ||||
|  |  * | ||||
|  |  *  Created on: 02.03.2013 | ||||
|  |  *      Author: Philipp Berger | ||||
|  |  */ | ||||
|  | 
 | ||||
|  | #ifndef STORM_ADAPTERS_STORMADAPTER_H_ | ||||
|  | #define STORM_ADAPTERS_STORMADAPTER_H_ | ||||
|  | 
 | ||||
|  | #include "src/storage/SparseMatrix.h" | ||||
|  | 
 | ||||
|  | #include "log4cplus/logger.h" | ||||
|  | #include "log4cplus/loggingmacros.h" | ||||
|  | 
 | ||||
|  | extern log4cplus::Logger logger; | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  | 
 | ||||
|  | namespace adapters { | ||||
|  | 
 | ||||
|  | class StormAdapter { | ||||
|  | public: | ||||
|  | 	/*! | ||||
|  | 	 * Converts a sparse matrix into a sparse matrix in the storm format. | ||||
|  | 	 * @return A pointer to a row-major sparse matrix in storm format. | ||||
|  | 	 */ | ||||
|  | 	template<class T> | ||||
|  | 	static storm::storage::SparseMatrix<T>* toStormSparseMatrix(gmm::csr_matrix<T> const& matrix) { | ||||
|  | 		uint_fast64_t realNonZeros = gmm::nnz(matrix); | ||||
|  | 		LOG4CPLUS_DEBUG(logger, "Converting matrix with " << realNonZeros << " non-zeros from gmm++ format into Storm."); | ||||
|  | 
 | ||||
|  | 		// Prepare the resulting matrix. | ||||
|  | 		storm::storage::SparseMatrix<T>* result = new storm::storage::SparseMatrix<T>(matrix.nrows(), matrix.ncols()); | ||||
|  | 		 | ||||
|  | 		// Set internal NonZero Counter | ||||
|  | 		result->nonZeroEntryCount = realNonZeros; | ||||
|  | 		result->setState(result->Initialized); | ||||
|  | 
 | ||||
|  | 		if (!result->prepareInternalStorage(false)) { | ||||
|  | 			LOG4CPLUS_ERROR(logger, "Unable to allocate internal storage while converting GMM++ Matrix to Storm."); | ||||
|  | 			delete result; | ||||
|  | 			return nullptr; | ||||
|  | 		} else { | ||||
|  | 			 | ||||
|  | 			// Copy Row Indications | ||||
|  | 			std::copy(matrix.jc.begin(), matrix.jc.end(), std::back_inserter(result->rowIndications)); | ||||
|  | 			// Copy Columns Indications | ||||
|  | 			std::copy(matrix.ir.begin(), matrix.ir.end(), std::back_inserter(result->columnIndications)); | ||||
|  | 			// And do the same thing with the actual values. | ||||
|  | 			std::copy(matrix.pr.begin(), matrix.pr.end(), std::back_inserter(result->valueStorage)); | ||||
|  | 
 | ||||
|  | 			result->currentSize = realNonZeros; | ||||
|  | 			result->lastRow = matrix.nrows() - 1; | ||||
|  | 		} | ||||
|  | 
 | ||||
|  | 		result->finalize(); | ||||
|  | 
 | ||||
|  | 		LOG4CPLUS_DEBUG(logger, "Done converting matrix to storm format."); | ||||
|  | 
 | ||||
|  | 		return result; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	/*! | ||||
|  | 	 * Helper function to determine whether the given Eigen matrix is in RowMajor | ||||
|  | 	 * format. Always returns true, but is overloaded, so the compiler will | ||||
|  | 	 * only call it in case the Eigen matrix is in RowMajor format. | ||||
|  | 	 * @return True. | ||||
|  | 	 */ | ||||
|  | 	template<typename _Scalar, typename _Index> | ||||
|  | 	static bool isEigenRowMajor(Eigen::SparseMatrix<_Scalar, Eigen::RowMajor, _Index>) { | ||||
|  | 		return true; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	/*! | ||||
|  | 	 * Helper function to determine whether the given Eigen matrix is in RowMajor | ||||
|  | 	 * format. Always returns false, but is overloaded, so the compiler will | ||||
|  | 	 * only call it in case the Eigen matrix is in ColMajor format. | ||||
|  | 	 * @return False. | ||||
|  | 	 */ | ||||
|  | 	template<typename _Scalar, typename _Index> | ||||
|  | 	static bool isEigenRowMajor( | ||||
|  | 			Eigen::SparseMatrix<_Scalar, Eigen::ColMajor, _Index>) { | ||||
|  | 		return false; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	/*! | ||||
|  | 	 * Converts a sparse matrix in the eigen format to Storm Sparse Matrix format. | ||||
|  | 	 * @return A pointer to a row-major sparse matrix in our format. | ||||
|  | 	 */ | ||||
|  | 	template<class T, int _Options, typename _Index> | ||||
|  | 	static storm::storage::SparseMatrix<T>* toStormSparseMatrix(Eigen::SparseMatrix<T, _Options, _Index> const& matrix) { | ||||
|  | 		uint_fast64_t realNonZeros = matrix.nonZeros(); | ||||
|  | 		LOG4CPLUS_DEBUG(logger, "Converting matrix with " << realNonZeros << " non-zeros from Eigen3 format into Storm."); | ||||
|  | 
 | ||||
|  | 		// Throw an error in case the matrix is not in compressed format. | ||||
|  | 		if (!matrix.isCompressed()) { | ||||
|  | 			LOG4CPLUS_ERROR(logger, "Trying to convert from an Eigen matrix that is not in compressed form."); | ||||
|  | 			return nullptr; | ||||
|  | 		} | ||||
|  | 
 | ||||
|  | 		/* | ||||
|  | 		 * Try to prepare the internal storage and throw an error in case of | ||||
|  | 		 * failure. | ||||
|  | 		 */ | ||||
|  | 
 | ||||
|  | 		// Get necessary pointers to the contents of the Eigen matrix. | ||||
|  | 		const T* valuePtr = matrix.valuePtr(); | ||||
|  | 		const _Index* indexPtr = matrix.innerIndexPtr(); | ||||
|  | 		const _Index* outerPtr = matrix.outerIndexPtr(); | ||||
|  | 
 | ||||
|  | 		const uint_fast64_t outerSize = matrix.outerSize(); | ||||
|  | 
 | ||||
|  | 		storm::storage::SparseMatrix<T>* result = nullptr; | ||||
|  | 
 | ||||
|  | 		// If the given matrix is in RowMajor format, copying can simply | ||||
|  | 		// be done by adding all values in order. | ||||
|  | 		// Direct copying is, however, prevented because we have to | ||||
|  | 		// separate the diagonal entries from others. | ||||
|  | 		if (isEigenRowMajor(matrix)) { | ||||
|  | 			/* Because of the RowMajor format outerSize evaluates to the | ||||
|  | 			 * number of rows. | ||||
|  | 			 * Prepare the resulting matrix. | ||||
|  | 			 */ | ||||
|  | 			result = new storm::storage::SparseMatrix<T>(matrix.outerSize(), matrix.innerSize()); | ||||
|  | 		 | ||||
|  | 			// Set internal NonZero Counter | ||||
|  | 			result->nonZeroEntryCount = realNonZeros; | ||||
|  | 			result->setState(result->Initialized); | ||||
|  | 
 | ||||
|  | 			if (!result->prepareInternalStorage(false)) { | ||||
|  | 				LOG4CPLUS_ERROR(logger, "Unable to allocate internal storage while converting Eigen3 RM Matrix to Storm."); | ||||
|  | 				delete result; | ||||
|  | 				return nullptr; | ||||
|  | 			} else { | ||||
|  | 			 | ||||
|  | 				// Copy Row Indications | ||||
|  | 				std::copy(outerPtr, outerPtr + outerSize, std::back_inserter(result->rowIndications)); | ||||
|  | 				// Copy Columns Indications | ||||
|  | 				std::copy(indexPtr, indexPtr + realNonZeros, std::back_inserter(result->columnIndications)); | ||||
|  | 				// And do the same thing with the actual values. | ||||
|  | 				std::copy(valuePtr, valuePtr + realNonZeros, std::back_inserter(result->valueStorage)); | ||||
|  | 
 | ||||
|  | 				// This is our Sentinel Element. | ||||
|  | 				result->rowIndications.push_back(realNonZeros); | ||||
|  | 
 | ||||
|  | 				result->currentSize = realNonZeros; | ||||
|  | 				result->lastRow = outerSize - 1; | ||||
|  | 			} | ||||
|  | 		} else { | ||||
|  | 			/* Because of the RowMajor format outerSize evaluates to the | ||||
|  | 			 * number of columns. | ||||
|  | 			 * Prepare the resulting matrix. | ||||
|  | 			 */ | ||||
|  | 			const uint_fast64_t colCount = matrix.outerSize(); | ||||
|  | 			result = new storm::storage::SparseMatrix<T>(matrix.innerSize(), colCount); | ||||
|  | 		 | ||||
|  | 			// Set internal NonZero Counter | ||||
|  | 			result->nonZeroEntryCount = realNonZeros; | ||||
|  | 			result->setState(result->Initialized); | ||||
|  | 			if (!result->prepareInternalStorage()) { | ||||
|  | 				LOG4CPLUS_ERROR(logger, "Unable to allocate internal storage while converting Eigen3 CM Matrix to Storm."); | ||||
|  | 				delete result; | ||||
|  | 				return nullptr; | ||||
|  | 			} else { | ||||
|  | 				// Set internal NonZero Counter | ||||
|  | 				result->nonZeroEntryCount = realNonZeros; | ||||
|  | 				result->setState(result->Initialized); | ||||
|  | 
 | ||||
|  | 				// Create an array to remember which elements have to still | ||||
|  | 				// be searched in each column and initialize it with the starting | ||||
|  | 				// index for every column. | ||||
|  | 				_Index* positions = new _Index[colCount](); | ||||
|  | 				for (_Index i = 0; i < colCount; ++i) { | ||||
|  | 					positions[i] = outerPtr[i]; | ||||
|  | 				} | ||||
|  | 
 | ||||
|  | 				// Now copy the elements. As the matrix is in ColMajor format, | ||||
|  | 				// we need to iterate over the columns to find the next non-zero | ||||
|  | 				// entry. | ||||
|  | 				uint_fast64_t i = 0; | ||||
|  | 				int currentRow = 0; | ||||
|  | 				int currentColumn = 0; | ||||
|  | 				while (i < realNonZeros) { | ||||
|  | 					// If the current element belongs the the current column, | ||||
|  | 					// add it in case it is also in the current row. | ||||
|  | 					if ((positions[currentColumn] < outerPtr[currentColumn + 1]) | ||||
|  | 							&& (indexPtr[positions[currentColumn]] == currentRow)) { | ||||
|  | 						result->addNextValue(currentRow, currentColumn,	valuePtr[positions[currentColumn]]); | ||||
|  | 						// Remember that we found one more non-zero element. | ||||
|  | 						++i; | ||||
|  | 						// Mark this position as "used". | ||||
|  | 						++positions[currentColumn]; | ||||
|  | 					} | ||||
|  | 
 | ||||
|  | 					// Now we can advance to the next column and also row, | ||||
|  | 					// in case we just iterated through the last column. | ||||
|  | 					++currentColumn; | ||||
|  | 					if (currentColumn == colCount) { | ||||
|  | 						currentColumn = 0; | ||||
|  | 						++currentRow; | ||||
|  | 					} | ||||
|  | 				} | ||||
|  | 				delete[] positions; | ||||
|  | 			} | ||||
|  | 		} | ||||
|  | 		result->setState(result->Initialized); | ||||
|  | 		result->finalize(); | ||||
|  | 
 | ||||
|  | 		LOG4CPLUS_DEBUG(logger, "Done converting matrix to storm format."); | ||||
|  | 
 | ||||
|  | 		return result; | ||||
|  | 	} | ||||
|  | }; | ||||
|  | 
 | ||||
|  | } //namespace adapters | ||||
|  | 
 | ||||
|  | } //namespace storm | ||||
|  | 
 | ||||
|  | #endif /* STORM_ADAPTERS_STORMADAPTER_H_ */ | ||||
| @ -0,0 +1,111 @@ | |||||
|  | #include "gtest/gtest.h"
 | ||||
|  | 
 | ||||
|  | #include "gmm/gmm_matrix.h"
 | ||||
|  | #include "src/adapters/GmmxxAdapter.h"
 | ||||
|  | #include "src/exceptions/InvalidArgumentException.h"
 | ||||
|  | #include "boost/integer/integer_mask.hpp"
 | ||||
|  | 
 | ||||
|  | #define STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE 5
 | ||||
|  | #define STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE 5
 | ||||
|  | 
 | ||||
|  | double getValue(gmm::csr_matrix<double> const& gmmSparseMatrix, uint_fast64_t row, uint_fast64_t col) { | ||||
|  | 	uint_fast64_t rowStart = gmmSparseMatrix.jc.at(row); | ||||
|  | 	uint_fast64_t rowEnd = gmmSparseMatrix.jc.at(row + 1); | ||||
|  | 	while (rowStart < rowEnd) { | ||||
|  | 		if (gmmSparseMatrix.ir.at(rowStart) == col) { | ||||
|  | 			return gmmSparseMatrix.pr.at(rowStart); | ||||
|  | 		} | ||||
|  | 		if (gmmSparseMatrix.ir.at(rowStart) > col) { | ||||
|  | 			break; | ||||
|  | 		} | ||||
|  | 		++rowStart; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	return 0.0; | ||||
|  | } | ||||
|  | 
 | ||||
|  | TEST(GmmAdapterTest, SimpleDenseSquareCopy) { | ||||
|  | 	// 5 rows
 | ||||
|  | 	storm::storage::SparseMatrix<double> sm(STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	 | ||||
|  | 	double values[STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE]; | ||||
|  | 	sm.initialize(STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 
 | ||||
|  | 	int row = 0; | ||||
|  | 	int col = 0; | ||||
|  | 	for (int i = 0; i < STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		values[i] = static_cast<double>(i + 1); | ||||
|  | 		 | ||||
|  | 		sm.addNextValue(row, col, values[i]); | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 	sm.finalize(); | ||||
|  | 
 | ||||
|  | 	auto gsm = storm::adapters::GmmxxAdapter::toGmmxxSparseMatrix(sm); | ||||
|  | 
 | ||||
|  | 	ASSERT_EQ(gsm->nrows(), STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(gsm->ncols(), STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(gmm::nnz(*gsm), STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	row = 0; | ||||
|  | 	col = 0; | ||||
|  | 	for (int i = 0; i < STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		ASSERT_EQ(values[i], getValue(*gsm, row, col)); | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_GMMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | TEST(GmmAdapterTest, SimpleSparseSquareCopy) { | ||||
|  | 	// 5 rows
 | ||||
|  | 	storm::storage::SparseMatrix<double> sm(STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	 | ||||
|  | 	double values[STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE]; | ||||
|  | 	sm.initialize((STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE + 1) / 2); | ||||
|  | 
 | ||||
|  | 	int row = 0; | ||||
|  | 	int col = 0; | ||||
|  | 
 | ||||
|  | 	bool everySecondElement = true; | ||||
|  | 
 | ||||
|  | 	for (int i = 0; i < STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		values[i] = static_cast<double>(i + 1); | ||||
|  | 		if (everySecondElement) { | ||||
|  | 			sm.addNextValue(row, col, values[i]); | ||||
|  | 		} | ||||
|  | 		everySecondElement = !everySecondElement; | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 	sm.finalize(); | ||||
|  | 
 | ||||
|  | 	auto gsm = storm::adapters::GmmxxAdapter::toGmmxxSparseMatrix(sm); | ||||
|  | 
 | ||||
|  | 	ASSERT_EQ(gsm->nrows(), STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(gsm->ncols(), STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(gmm::nnz(*gsm), (STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE + 1) / 2); | ||||
|  | 
 | ||||
|  | 	row = 0; | ||||
|  | 	col = 0; | ||||
|  | 	everySecondElement = true; | ||||
|  | 	for (int i = 0; i < STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		if (everySecondElement) { | ||||
|  | 			ASSERT_EQ(values[i], getValue(*gsm, row, col)); | ||||
|  | 		} | ||||
|  | 		everySecondElement = !everySecondElement; | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_GMMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
| @ -0,0 +1,104 @@ | |||||
|  | #include "gtest/gtest.h"
 | ||||
|  | 
 | ||||
|  | #include "gmm/gmm_matrix.h"
 | ||||
|  | #include "src/adapters/StormAdapter.h"
 | ||||
|  | #include "src/exceptions/InvalidArgumentException.h"
 | ||||
|  | #include "boost/integer/integer_mask.hpp"
 | ||||
|  | 
 | ||||
|  | #define STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE 5
 | ||||
|  | #define STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE 5
 | ||||
|  | 
 | ||||
|  | TEST(StormAdapterTest, SimpleDenseSquareCopy) { | ||||
|  | 	// 5 rows
 | ||||
|  | 	gmm::csr_matrix<double> gmmSparseMatrix; | ||||
|  | 
 | ||||
|  | 	/*
 | ||||
|  | 	 * As CSR_Matrix is read-only we have to prepare the data in this row_matrix and then do a copy. | ||||
|  | 	 */ | ||||
|  | 	gmm::row_matrix<gmm::wsvector<double>> gmmPreMatrix(STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE, STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	 | ||||
|  | 	double values[STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE]; | ||||
|  | 	 | ||||
|  | 	int row = 0; | ||||
|  | 	int col = 0; | ||||
|  | 	for (int i = 0; i < STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		values[i] = static_cast<double>(i + 1); | ||||
|  | 		 | ||||
|  | 		gmmPreMatrix(row, col) = values[i]; | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 	gmm::copy(gmmPreMatrix, gmmSparseMatrix); | ||||
|  | 
 | ||||
|  | 	auto stormSparseMatrix = storm::adapters::StormAdapter::toStormSparseMatrix(gmmSparseMatrix); | ||||
|  | 
 | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getRowCount(), STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getColumnCount(), STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getNonZeroEntryCount(), STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE); | ||||
|  | 	row = 0; | ||||
|  | 	col = 0; | ||||
|  | 	for (int i = 0; i < STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		ASSERT_EQ(values[i], stormSparseMatrix->getValue(row, col)); | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_STORMADAPTERTEST_SIMPLEDENSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0;  | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | TEST(StormAdapterTest, SimpleSparseSquareCopy) { | ||||
|  | 	// 5 rows
 | ||||
|  | 	gmm::csr_matrix<double> gmmSparseMatrix; | ||||
|  | 
 | ||||
|  | 	/*
 | ||||
|  | 	 * As CSR_Matrix is read-only we have to prepare the data in this row_matrix and then do a copy. | ||||
|  | 	 */ | ||||
|  | 	gmm::row_matrix<gmm::wsvector<double>> gmmPreMatrix(STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE, STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	 | ||||
|  | 	double values[STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE]; | ||||
|  | 
 | ||||
|  | 	int row = 0; | ||||
|  | 	int col = 0; | ||||
|  | 
 | ||||
|  | 	bool everySecondElement = true; | ||||
|  | 
 | ||||
|  | 	for (int i = 0; i < STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		values[i] = static_cast<double>(i + 1); | ||||
|  | 		if (everySecondElement) { | ||||
|  | 			gmmPreMatrix(row, col) = values[i]; | ||||
|  | 		} | ||||
|  | 		everySecondElement = !everySecondElement; | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 	gmm::copy(gmmPreMatrix, gmmSparseMatrix); | ||||
|  | 
 | ||||
|  | 	auto stormSparseMatrix = storm::adapters::StormAdapter::toStormSparseMatrix(gmmSparseMatrix); | ||||
|  | 
 | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getRowCount(), STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getColumnCount(), STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE); | ||||
|  | 	ASSERT_EQ(stormSparseMatrix->getNonZeroEntryCount(), (STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE + 1) / 2); | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 	row = 0; | ||||
|  | 	col = 0; | ||||
|  | 	everySecondElement = true; | ||||
|  | 	for (int i = 0; i < STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE * STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE; ++i) { | ||||
|  | 		if (everySecondElement) { | ||||
|  | 			ASSERT_EQ(values[i], stormSparseMatrix->getValue(row, col)); | ||||
|  | 		} | ||||
|  | 		everySecondElement = !everySecondElement; | ||||
|  | 		++col; | ||||
|  | 		if (col == STORM_STORMADAPTERTEST_SIMPLESPARSESQUARECOPY_SIZE) { | ||||
|  | 			++row; | ||||
|  | 			col = 0; | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue