From 37f6337fa5d22852346ab3b51b8de0f54de4d89e Mon Sep 17 00:00:00 2001
From: gereon <gereon.kremer@rwth-aachen.de>
Date: Sun, 23 Dec 2012 00:13:33 +0100
Subject: [PATCH] using new iterator for checking matrix

SquareSparseMatrix now has a new iterator over elements in a row.
Dtmc uses this iterator to check the probability matrix.
---
 src/models/Dtmc.h                |  4 ++--
 src/storage/SquareSparseMatrix.h | 25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/models/Dtmc.h b/src/models/Dtmc.h
index 626091f4b..c024779ba 100644
--- a/src/models/Dtmc.h
+++ b/src/models/Dtmc.h
@@ -155,8 +155,8 @@ private:
 	bool checkValidityProbabilityMatrix() {
 		for (uint_fast64_t row = 0; row < this->probabilityMatrix->getRowCount(); row++) {
 			T sum = this->probabilityMatrix->getDiagonalStoragePointer()[row];
-			for (uint_fast64_t id = this->probabilityMatrix->getRowIndicationsPointer()[row]; id < this->probabilityMatrix->getRowIndicationsPointer()[row+1]; id++) {
-				sum += this->probabilityMatrix->getStoragePointer()[id];
+			for (auto it = this->probabilityMatrix->beginConstNoDiagIterator(row); it != this->probabilityMatrix->endConstNoDiagIterator(row); it++) {
+				sum += *it;
 			}
 			if (sum == 0) continue;
 			if (std::abs(sum - 1) > 1e-10) return false;
diff --git a/src/storage/SquareSparseMatrix.h b/src/storage/SquareSparseMatrix.h
index cbb56f196..e111115b9 100644
--- a/src/storage/SquareSparseMatrix.h
+++ b/src/storage/SquareSparseMatrix.h
@@ -42,6 +42,11 @@ public:
 	 * a row, we can simply iterate over the array (part) itself.
 	 */
 	typedef const uint_fast64_t * const constIndexIterator;
+	
+	/*!
+	 *	Iterator type if we want to iterate over elements.
+	 */
+	typedef const T* const constIterator;
 
 	/*!
 	 * An enum representing the internal state of the Matrix.
@@ -930,6 +935,26 @@ public:
 	constIndexIterator endConstColumnNoDiagIterator(uint_fast64_t row) const {
 		return this->columnIndications + this->rowIndications[row + 1];
 	}
+	
+	/*!
+	 *	Returns an iterator over the elements of the given row. The iterator
+	 *	will include neither the diagonal element nor zero entries.
+	 *	@param row The row whose elements the iterator will return.
+	 *	@return An iterator over the elements of the given row.
+	 */
+	constIterator beginConstNoDiagIterator(uint_fast64_t row) const {
+		return this->valueStorage + this->rowIndications[row];
+	}
+	/*!
+	 *	Returns an iterator pointing to the first element after the given
+	 *	row.
+	 *	@param row The row for which the iterator should point to the
+	 *	past-the-end element.
+	 *	@return An iterator to the element after the given row.
+	 */
+	constIterator endConstNoDiagIterator(uint_fast64_t row) const {
+		return this->valueStorage + this->rowIndications[row + 1];
+	}
 
 	void print() const {
 		std::cout << "diag: --------------------------------" << std::endl;