37#include <boost/core/ignore_unused.hpp>
45 unsigned int totalRows,
unsigned int totalColumns,
unsigned int subDiags,
46 unsigned int superDiags)
55 if (diags != std::numeric_limits<unsigned int>::max())
59 else if (totalRows > 0)
70 unsigned int subDiags,
71 unsigned int superDiags)
78 unsigned int totalRows,
unsigned int totalColumns,
unsigned int row,
79 unsigned int column,
unsigned int sub,
unsigned int super)
81 boost::ignore_unused(totalColumns);
87 unsigned int elementRow =
89 unsigned int elementColumn = column;
96 return std::numeric_limits<unsigned int>::max();
101 const unsigned int totalRows,
const unsigned int totalColumns,
102 const unsigned int curRow,
const unsigned int curColumn)
104 boost::ignore_unused(totalRows, totalColumns);
105 unsigned int nextRow = curRow;
106 unsigned int nextColumn = curColumn;
108 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
112 unsigned int columns)
114 return rows * columns;
118 unsigned int totalColumns,
120 unsigned int curColumn)
122 boost::ignore_unused(totalColumns);
123 return curColumn * totalRows + curRow;
127 const unsigned int totalRows,
const unsigned int totalColumns,
128 const unsigned int curRow,
const unsigned int curColumn)
130 unsigned int nextRow = curRow;
131 unsigned int nextColumn = curColumn;
133 if (nextRow < totalRows)
138 if (nextRow >= totalRows)
144 if (nextColumn >= totalColumns)
146 nextRow = std::numeric_limits<unsigned int>::max();
147 nextColumn = std::numeric_limits<unsigned int>::max();
150 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
154 unsigned int columns)
156 ASSERTL0(rows == columns,
"Triangular matrices must be square.");
157 return rows * (rows + 1) / 2;
161 unsigned int curColumn)
163 if (curRow <= curColumn)
165 return curRow + curColumn * (curColumn + 1) / 2;
169 return std::numeric_limits<unsigned int>::max();
174 const unsigned int totalRows,
const unsigned int totalColumns,
175 const unsigned int curRow,
const unsigned int curColumn)
177 boost::ignore_unused(totalRows);
179 ASSERTL1(totalRows == totalColumns,
"Triangular matrices must be square.");
181 "Attemping to iterate through an element on row " +
182 std::to_string(curRow) +
" of a (" +
183 std::to_string(totalRows) +
", " +
184 std::to_string(totalColumns) +
" upper triangular matrix.");
186 "Attemping to iterate through an element on row " +
187 std::to_string(curColumn) +
" of a (" +
188 std::to_string(totalRows) +
", " +
189 std::to_string(totalColumns) +
" upper triangular matrix.");
191 "Attemping to iterate through element (" + std::to_string(curRow) +
192 ", " + std::to_string(curColumn) +
") of a (" +
193 std::to_string(totalRows) +
", " +
194 std::to_string(totalColumns) +
" upper triangular matrix.");
196 unsigned int nextRow = curRow;
197 unsigned int nextColumn = curColumn;
199 if (nextRow <= nextColumn)
204 if (nextRow > nextColumn)
210 if (nextColumn >= totalColumns)
212 nextRow = std::numeric_limits<unsigned int>::max();
213 nextColumn = std::numeric_limits<unsigned int>::max();
216 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
220 unsigned int totalColumns,
unsigned int curRow,
unsigned int curColumn)
222 if (curRow >= curColumn)
224 return curRow + (2 * totalColumns - curColumn - 1) * (curColumn) / 2;
228 return std::numeric_limits<unsigned int>::max();
233 const unsigned int totalRows,
const unsigned int totalColumns,
234 const unsigned int curRow,
const unsigned int curColumn,
char transpose)
236 ASSERTL1(totalRows == totalColumns,
"Triangular matrices must be square.");
238 "Attemping to iterate through an element on row " +
239 std::to_string(curRow) +
" of a (" +
240 std::to_string(totalRows) +
", " +
241 std::to_string(totalColumns) +
" lower triangular matrix.");
243 "Attemping to iterate through an element on row " +
244 std::to_string(curColumn) +
" of a (" +
245 std::to_string(totalRows) +
", " +
246 std::to_string(totalColumns) +
" lower triangular matrix.");
248 "Attemping to iterate through element (" + std::to_string(curRow) +
249 ", " + std::to_string(curColumn) +
") of a (" +
250 std::to_string(totalRows) +
", " +
251 std::to_string(totalColumns) +
" lower triangular matrix.");
253 if (transpose ==
'T')
259 unsigned int nextRow = curRow;
260 unsigned int nextColumn = curColumn;
262 if (nextRow < totalRows)
267 if (nextRow >= totalRows)
270 nextRow = nextColumn;
273 if (nextColumn >= totalColumns)
275 nextRow = std::numeric_limits<unsigned int>::max();
276 nextColumn = std::numeric_limits<unsigned int>::max();
279 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
283 unsigned int curColumn)
285 if (curRow <= curColumn)
287 return curRow + curColumn * (curColumn + 1) / 2;
291 return curColumn + curRow * (curRow + 1) / 2;
296 const unsigned int totalRows,
const unsigned int totalColumns,
297 const unsigned int curRow,
const unsigned int curColumn)
299 ASSERTL1(totalRows == totalColumns,
"Symmetric matrices must be square.");
301 "Attemping to iterate through an element on row " +
302 std::to_string(curRow) +
" of a (" +
303 std::to_string(totalRows) +
", " +
304 std::to_string(totalColumns) +
" symmetric matrix.");
306 "Attemping to iterate through an element on row " +
307 std::to_string(curColumn) +
" of a (" +
308 std::to_string(totalRows) +
", " +
309 std::to_string(totalColumns) +
" symmetric matrix.");
311 unsigned int nextRow = curRow;
312 unsigned int nextColumn = curColumn;
314 if (nextRow < totalRows)
319 if (nextRow >= totalRows)
325 if (nextColumn >= totalColumns)
327 nextRow = std::numeric_limits<unsigned int>::max();
328 nextColumn = std::numeric_limits<unsigned int>::max();
331 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
335 const unsigned int totalRows,
const unsigned int totalColumns,
336 const unsigned int curRow,
const unsigned int curColumn)
338 boost::ignore_unused(totalColumns);
342 "Iteration of a diagonal matrix is only valid along the diagonal.");
344 unsigned int nextRow = curRow;
345 unsigned int nextColumn = curColumn;
347 if (nextRow < totalRows)
353 if (nextRow >= totalRows)
355 nextRow = std::numeric_limits<unsigned int>::max();
356 nextColumn = std::numeric_limits<unsigned int>::max();
359 return std::tuple<unsigned int, unsigned int>(nextRow, nextColumn);
363 unsigned int columns)
365 ASSERTL0(rows == columns,
"Diagonal matrices must be square.");
378 return std::numeric_limits<unsigned int>::max();
383 unsigned int rows,
unsigned int columns,
unsigned int nSubSuperDiags)
385 ASSERTL0(rows == columns,
"Triangular matrices must be square.");
386 return (nSubSuperDiags + 1) * columns;
390 unsigned int curRow,
unsigned int curColumn,
unsigned int nSuperDiags)
392 if (curRow <= curColumn)
394 if ((curColumn - curRow) <= nSuperDiags)
396 unsigned int elementRow = nSuperDiags - (curColumn - curRow);
397 unsigned int elementColumn = curColumn;
399 return elementRow + elementColumn * (nSuperDiags + 1);
403 return std::numeric_limits<unsigned int>::max();
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
The above copyright notice and this permission notice shall be included.
static unsigned int CalculateNumberOfRows(unsigned int totalRows, unsigned int subDiags, unsigned int superDiags)
static unsigned int CalculateIndex(unsigned int totalRows, unsigned int totalColumns, unsigned int row, unsigned int column, unsigned int sub, unsigned int super)
static unsigned int CalculateNumberOfDiags(unsigned int totalRows, unsigned int diags)
static unsigned int GetRequiredStorageSize(unsigned int totalRows, unsigned int totalColumns, unsigned int subDiags, unsigned int superDiags)
Calculates and returns the storage size required.
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn)
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn)
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns)
static unsigned int CalculateIndex(unsigned int row, unsigned int col)
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns)
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn)
static unsigned int CalculateIndex(unsigned int totalRows, unsigned int totalColumns, unsigned int curRow, unsigned int curColumn)
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn, char transpose='N')
static unsigned int CalculateIndex(unsigned int totalColumns, unsigned int curRow, unsigned int curColumn)
static unsigned int CalculateIndex(unsigned int curRow, unsigned int curColumn, unsigned int nSuperDiags)
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn)
static unsigned int CalculateIndex(unsigned int curRow, unsigned int curColumn)
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns, unsigned int nSubSuperDiags)
static unsigned int GetRequiredStorageSize(unsigned int rows, unsigned int columns)
static std::tuple< unsigned int, unsigned int > Advance(const unsigned int totalRows, const unsigned int totalColumns, const unsigned int curRow, const unsigned int curColumn)
static unsigned int CalculateIndex(unsigned int curRow, unsigned int curColumn)