mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
119 lines
No EOL
2.8 KiB
C++
119 lines
No EOL
2.8 KiB
C++
#include <algorithm>
|
|
#include <sstream>
|
|
|
|
// #include "Tools/Exception/exception.hpp"
|
|
#include "matrix.h"
|
|
|
|
using namespace codings;
|
|
using namespace codings::ldpc;
|
|
|
|
Matrix ::Matrix(const size_t n_rows, const size_t n_cols)
|
|
: n_rows(n_rows),
|
|
n_cols(n_cols),
|
|
rows_max_degree(0),
|
|
cols_max_degree(0),
|
|
n_connections(0)
|
|
{
|
|
}
|
|
|
|
void Matrix ::self_transpose()
|
|
{
|
|
std::swap(n_rows, n_cols);
|
|
std::swap(rows_max_degree, cols_max_degree);
|
|
}
|
|
|
|
void Matrix ::self_turn(Way w)
|
|
{
|
|
if (w == Way::VERTICAL)
|
|
{
|
|
if (get_n_cols() > get_n_rows())
|
|
this->self_transpose();
|
|
}
|
|
else if (w == Way::HORIZONTAL)
|
|
{
|
|
if (get_n_cols() < get_n_rows())
|
|
this->self_transpose();
|
|
}
|
|
}
|
|
|
|
Matrix::Way Matrix ::get_way() const
|
|
{
|
|
return (get_n_cols() >= get_n_rows()) ? Way::HORIZONTAL : Way::VERTICAL;
|
|
}
|
|
|
|
float Matrix ::compute_density() const
|
|
{
|
|
return ((float)n_connections / (float)(n_rows * n_cols));
|
|
}
|
|
|
|
void Matrix ::check_indexes(const size_t row_index, const size_t col_index) const
|
|
{
|
|
if (col_index >= get_n_cols())
|
|
{
|
|
std::stringstream message;
|
|
message << "'col_index' has to be smaller than 'n_cols' ('col_index' = " << col_index
|
|
<< ", 'n_cols' = " << get_n_cols() << ").";
|
|
throw std::runtime_error(message.str()); // invalid_argument(__FILE__, __LINE__, __func__, message.str());
|
|
}
|
|
|
|
if (row_index >= get_n_rows())
|
|
{
|
|
std::stringstream message;
|
|
message << "'row_index' has to be smaller than 'n_rows' ('row_index' = " << row_index
|
|
<< ", 'n_rows' = " << get_n_rows() << ").";
|
|
throw std::runtime_error(message.str()); // invalid_argument(__FILE__, __LINE__, __func__, message.str());
|
|
}
|
|
}
|
|
|
|
void Matrix ::self_resize(const size_t _n_rows, const size_t _n_cols)
|
|
{
|
|
n_rows = _n_rows;
|
|
n_cols = _n_cols;
|
|
}
|
|
|
|
bool Matrix ::is_of_way(Way w) const noexcept
|
|
{
|
|
return get_way() == w;
|
|
}
|
|
|
|
void Matrix ::is_of_way_throw(Way w) const
|
|
{
|
|
if (!is_of_way(w))
|
|
{
|
|
std::stringstream message;
|
|
message << "This matrix way ('" << way_to_str(get_way()) << "') is not same as the given checked one ('"
|
|
<< way_to_str(w) << "').";
|
|
throw std::runtime_error(message.str()); // tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
|
|
}
|
|
}
|
|
|
|
std::string Matrix ::way_to_str(Way w)
|
|
{
|
|
std::string str;
|
|
|
|
switch (w)
|
|
{
|
|
case Way::HORIZONTAL:
|
|
str = "HORIZONTAL";
|
|
break;
|
|
case Way::VERTICAL:
|
|
str = "VERTICAL";
|
|
break;
|
|
}
|
|
|
|
if (str.empty()) // this 'if' is a test outside the switch case (instead of default) to keep the compiler check that all
|
|
// cases of 'Way' are well represented.
|
|
{
|
|
std::stringstream message;
|
|
message << "The way 'w' does not represent a matrix way ('w' = " << (short)w << ").";
|
|
throw std::runtime_error(message.str()); // tools::invalid_argument(__FILE__, __LINE__, __func__, message.str());
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
std::ostream &operator<<(std::ostream &os, const Matrix &sm)
|
|
{
|
|
sm.print(0, os);
|
|
return os;
|
|
} |