#include <DB_Matrix.defs.hh>
Public Member Functions | |
DB_Matrix () | |
Builds an empty matrix. | |
DB_Matrix (dimension_type n_rows) | |
Builds a square matrix having the specified dimension. | |
DB_Matrix (const DB_Matrix &y) | |
Copy-constructor. | |
template<typename U> | |
DB_Matrix (const DB_Matrix< U > &y) | |
Constructs a conservative approximation of y . | |
~DB_Matrix () | |
Destructor. | |
DB_Matrix & | operator= (const DB_Matrix &y) |
Assignment operator. | |
const_iterator | begin () const |
Returns the const_iterator pointing to the first row, if *this is not empty; otherwise, returns the past-the-end const_iterator. | |
const_iterator | end () const |
Returns the past-the-end const_iterator. | |
void | swap (DB_Matrix &y) |
Swaps *this with y . | |
void | grow (dimension_type new_n_rows) |
Makes the matrix grow by adding more rows and more columns. | |
void | resize_no_copy (dimension_type new_n_rows) |
Resizes the matrix without worrying about the old contents. | |
dimension_type | num_rows () const |
Returns the number of rows in the matrix. | |
void | ascii_dump () const |
Writes to std::cerr an ASCII representation of *this . | |
void | ascii_dump (std::ostream &s) const |
Writes to s an ASCII representation of *this . | |
void | print () const |
Prints *this to std::cerr using operator<< . | |
bool | ascii_load (std::istream &s) |
Loads from s an ASCII representation (as produced by ascii_dump(std::ostream&) const) and sets *this accordingly. Returns true if successful, false otherwise. | |
memory_size_type | total_memory_in_bytes () const |
Returns the total size in bytes of the memory occupied by *this . | |
memory_size_type | external_memory_in_bytes () const |
Returns the size in bytes of the memory managed by *this . | |
bool | OK () const |
Checks if all the invariants are satisfied. | |
Subscript operators. | |
DB_Row< T > & | operator[] (dimension_type k) |
Returns a reference to the k-th row of the matrix. | |
const DB_Row< T > & | operator[] (dimension_type k) const |
Returns a constant reference to the k-th row of the matrix. | |
Static Public Member Functions | |
static dimension_type | max_num_rows () |
Returns the maximum number of rows a DB_Matrix can handle. | |
static dimension_type | max_num_columns () |
Returns the maximum number of columns a DB_Matrix can handle. | |
Private Attributes | |
std::vector< DB_Row< T > > | rows |
The rows of the matrix. | |
dimension_type | row_size |
Size of the initialized part of each row. | |
dimension_type | row_capacity |
Capacity allocated for each row, i.e., number of long objects that each row can contain. | |
Friends | |
class | DB_Matrix |
Related Functions | |
(Note that these are not member functions.) | |
template<typename T> | |
std::ostream & | operator<< (std::ostream &s, const DB_Matrix< T > &c) |
Output operator. | |
template<typename T> | |
void | swap (Parma_Polyhedra_Library::DB_Matrix< T > &x, Parma_Polyhedra_Library::DB_Matrix< T > &y) |
Specializes std::swap . | |
template<typename T> | |
bool | operator== (const DB_Matrix< T > &x, const DB_Matrix< T > &y) |
Returns true if and only if x and y are identical. | |
template<typename T> | |
bool | operator!= (const DB_Matrix< T > &x, const DB_Matrix< T > &y) |
Returns true if and only if x and y are different. | |
template<typename Temp, typename To, typename T> | |
bool | rectilinear_distance_assign (Checked_Number< To, Extended_Number_Policy > &r, const DB_Matrix< T > &x, const DB_Matrix< T > &y, Rounding_Dir dir, Temp &tmp0, Temp &tmp1, Temp &tmp2) |
Computes the rectilinear (or Manhattan) distance between x and y . | |
template<typename Temp, typename To, typename T> | |
bool | euclidean_distance_assign (Checked_Number< To, Extended_Number_Policy > &r, const DB_Matrix< T > &x, const DB_Matrix< T > &y, Rounding_Dir dir, Temp &tmp0, Temp &tmp1, Temp &tmp2) |
Computes the euclidean distance between x and y . | |
template<typename Temp, typename To, typename T> | |
bool | l_infinity_distance_assign (Checked_Number< To, Extended_Number_Policy > &r, const DB_Matrix< T > &x, const DB_Matrix< T > &y, Rounding_Dir dir, Temp &tmp0, Temp &tmp1, Temp &tmp2) |
Computes the ![]() x and y . | |
template<typename Specialization, typename Temp, typename To, typename T> | |
bool | l_m_distance_assign (Checked_Number< To, Extended_Number_Policy > &r, const DB_Matrix< T > &x, const DB_Matrix< T > &y, const Rounding_Dir dir, Temp &tmp0, Temp &tmp1, Temp &tmp2) |
Classes | |
class | const_iterator |
A read-only iterator over the rows of the matrix. More... |
The template class DB_Matrix<T> allows for the representation of a square matrix of T objects. Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
Definition at line 61 of file DB_Matrix.defs.hh.
Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix | ( | ) |
Builds an empty matrix.
DB_Rows' size and capacity are initialized to .
Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix | ( | dimension_type | n_rows | ) | [inline, explicit] |
Builds a square matrix having the specified dimension.
Definition at line 29 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::construct(), Parma_Polyhedra_Library::DB_Matrix< T >::OK(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, and Parma_Polyhedra_Library::DB_Matrix< T >::rows.
00030 : rows(n_rows), 00031 row_size(n_rows), 00032 row_capacity(compute_capacity(n_rows, max_num_columns())) { 00033 // Construct in direct order: will destroy in reverse order. 00034 for (dimension_type i = 0; i < n_rows; ++i) 00035 rows[i].construct(n_rows, row_capacity); 00036 assert(OK()); 00037 }
Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix | ( | const DB_Matrix< T > & | y | ) | [inline] |
Copy-constructor.
Definition at line 178 of file DB_Matrix.inlines.hh.
00179 : rows(y.rows), 00180 row_size(y.row_size), 00181 row_capacity(compute_capacity(y.row_size, max_num_columns())) { 00182 }
Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix | ( | const DB_Matrix< U > & | y | ) | [inline, explicit] |
Constructs a conservative approximation of y
.
Definition at line 41 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::OK(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, and Parma_Polyhedra_Library::DB_Matrix< T >::rows.
00042 : rows(y.rows.size()), 00043 row_size(y.row_size), 00044 row_capacity(compute_capacity(y.row_size, max_num_columns())) { 00045 // Construct in direct order: will destroy in reverse order. 00046 for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i) 00047 rows[i].construct_upward_approximation(y[i], row_capacity); 00048 assert(OK()); 00049 }
Parma_Polyhedra_Library::DB_Matrix< T >::~DB_Matrix | ( | ) | [inline] |
dimension_type Parma_Polyhedra_Library::DB_Matrix< T >::max_num_rows | ( | ) | [inline, static] |
Returns the maximum number of rows a DB_Matrix can handle.
Definition at line 44 of file DB_Matrix.inlines.hh.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::grow(), and Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy().
dimension_type Parma_Polyhedra_Library::DB_Matrix< T >::max_num_columns | ( | ) | [inline, static] |
Returns the maximum number of columns a DB_Matrix can handle.
Definition at line 50 of file DB_Matrix.inlines.hh.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::grow(), Parma_Polyhedra_Library::DB_Matrix< T >::operator=(), and Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy().
DB_Matrix< T > & Parma_Polyhedra_Library::DB_Matrix< T >::operator= | ( | const DB_Matrix< T > & | y | ) | [inline] |
Assignment operator.
Definition at line 186 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::compute_capacity(), Parma_Polyhedra_Library::DB_Matrix< T >::max_num_columns(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, Parma_Polyhedra_Library::DB_Matrix< T >::row_size, and Parma_Polyhedra_Library::DB_Matrix< T >::rows.
00186 { 00187 // Without the following guard against auto-assignments we would 00188 // recompute the row capacity based on row size, possibly without 00189 // actually increasing the capacity of the rows. This would lead to 00190 // an inconsistent state. 00191 if (this != &y) { 00192 // The following assignment may do nothing on auto-assignments... 00193 rows = y.rows; 00194 row_size = y.row_size; 00195 // ... hence the following assignment must not be done on 00196 // auto-assignments. 00197 row_capacity = compute_capacity(y.row_size, max_num_columns()); 00198 } 00199 return *this; 00200 }
DB_Matrix< T >::const_iterator Parma_Polyhedra_Library::DB_Matrix< T >::begin | ( | ) | const [inline] |
Returns the const_iterator pointing to the first row, if *this
is not empty; otherwise, returns the past-the-end const_iterator.
Definition at line 124 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::rows.
00124 { 00125 return const_iterator(rows.begin()); 00126 }
DB_Matrix< T >::const_iterator Parma_Polyhedra_Library::DB_Matrix< T >::end | ( | ) | const [inline] |
Returns the past-the-end const_iterator.
Definition at line 130 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::rows.
00130 { 00131 return const_iterator(rows.end()); 00132 }
void Parma_Polyhedra_Library::DB_Matrix< T >::swap | ( | DB_Matrix< T > & | y | ) | [inline] |
Swaps *this
with y
.
Definition at line 36 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, Parma_Polyhedra_Library::DB_Matrix< T >::row_size, Parma_Polyhedra_Library::DB_Matrix< T >::rows, and Parma_Polyhedra_Library::swap().
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::grow(), Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy(), and Parma_Polyhedra_Library::DB_Matrix< T >::swap().
00036 { 00037 std::swap(rows, y.rows); 00038 std::swap(row_size, y.row_size); 00039 std::swap(row_capacity, y.row_capacity); 00040 }
void Parma_Polyhedra_Library::DB_Matrix< T >::grow | ( | dimension_type | new_n_rows | ) | [inline] |
Makes the matrix grow by adding more rows and more columns.
new_n_rows | The number of rows and columns of the resized matrix. |
*this
.
Definition at line 53 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::compute_capacity(), Parma_Polyhedra_Library::construct(), Parma_Polyhedra_Library::DB_Matrix< T >::max_num_columns(), Parma_Polyhedra_Library::DB_Matrix< T >::max_num_rows(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, Parma_Polyhedra_Library::DB_Matrix< T >::row_size, Parma_Polyhedra_Library::DB_Matrix< T >::rows, Parma_Polyhedra_Library::DB_Matrix< T >::swap(), and Parma_Polyhedra_Library::swap().
00053 { 00054 const dimension_type old_n_rows = rows.size(); 00055 assert(new_n_rows >= old_n_rows); 00056 00057 if (new_n_rows > old_n_rows) { 00058 if (new_n_rows <= row_capacity) { 00059 // We can recycle the old rows. 00060 if (rows.capacity() < new_n_rows) { 00061 // Reallocation will take place. 00062 std::vector<DB_Row<T> > new_rows; 00063 new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); 00064 new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>()); 00065 // Construct the new rows. 00066 dimension_type i = new_n_rows; 00067 while (i-- > old_n_rows) 00068 new_rows[i].construct(new_n_rows, row_capacity); 00069 // Steal the old rows. 00070 ++i; 00071 while (i-- > 0) 00072 new_rows[i].swap(rows[i]); 00073 // Put the new vector into place. 00074 std::swap(rows, new_rows); 00075 } 00076 else { 00077 // Reallocation will NOT take place. 00078 rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>()); 00079 for (dimension_type i = new_n_rows; i-- > old_n_rows; ) 00080 rows[i].construct(new_n_rows, row_capacity); 00081 } 00082 } 00083 else { 00084 // We cannot even recycle the old rows. 00085 DB_Matrix new_matrix; 00086 new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows())); 00087 new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>()); 00088 // Construct the new rows. 00089 new_matrix.row_size = new_n_rows; 00090 new_matrix.row_capacity = compute_capacity(new_n_rows, 00091 max_num_columns()); 00092 dimension_type i = new_n_rows; 00093 while (i-- > old_n_rows) 00094 new_matrix.rows[i].construct(new_matrix.row_size, 00095 new_matrix.row_capacity); 00096 // Copy the old rows. 00097 ++i; 00098 while (i-- > 0) { 00099 // FIXME: copying may be unnecessarily costly. 00100 DB_Row<T> new_row(rows[i], 00101 new_matrix.row_size, 00102 new_matrix.row_capacity); 00103 std::swap(new_matrix.rows[i], new_row); 00104 } 00105 // Put the new vector into place. 00106 swap(new_matrix); 00107 return; 00108 } 00109 } 00110 // Here we have the right number of rows. 00111 if (new_n_rows > row_size) { 00112 // We need more columns. 00113 if (new_n_rows <= row_capacity) 00114 // But we have enough capacity: we resize existing rows. 00115 for (dimension_type i = old_n_rows; i-- > 0; ) 00116 rows[i].expand_within_capacity(new_n_rows); 00117 else { 00118 // Capacity exhausted: we must reallocate the rows and 00119 // make sure all the rows have the same capacity. 00120 const dimension_type new_row_capacity 00121 = compute_capacity(new_n_rows, max_num_columns()); 00122 for (dimension_type i = old_n_rows; i-- > 0; ) { 00123 // FIXME: copying may be unnecessarily costly. 00124 DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity); 00125 std::swap(rows[i], new_row); 00126 } 00127 row_capacity = new_row_capacity; 00128 } 00129 // Rows have grown or shrunk. 00130 row_size = new_n_rows; 00131 } 00132 }
void Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy | ( | dimension_type | new_n_rows | ) | [inline] |
Resizes the matrix without worrying about the old contents.
new_n_rows | The number of rows and columns of the resized matrix. |
*this
.
Definition at line 136 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::compute_capacity(), Parma_Polyhedra_Library::construct(), Parma_Polyhedra_Library::DB_Matrix< T >::max_num_columns(), Parma_Polyhedra_Library::DB_Matrix< T >::max_num_rows(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, Parma_Polyhedra_Library::DB_Matrix< T >::row_size, Parma_Polyhedra_Library::DB_Matrix< T >::rows, Parma_Polyhedra_Library::DB_Matrix< T >::swap(), and Parma_Polyhedra_Library::swap().
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::ascii_load().
00136 { 00137 dimension_type old_n_rows = rows.size(); 00138 00139 if (new_n_rows > old_n_rows) { 00140 // Rows will be inserted. 00141 if (new_n_rows <= row_capacity) { 00142 // We can recycle the old rows. 00143 if (rows.capacity() < new_n_rows) { 00144 // Reallocation (of vector `rows') will take place. 00145 std::vector<DB_Row<T> > new_rows; 00146 new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); 00147 new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>()); 00148 // Construct the new rows (be careful: each new row must have 00149 // the same capacity as each one of the old rows). 00150 dimension_type i = new_n_rows; 00151 while (i-- > old_n_rows) 00152 new_rows[i].construct(new_n_rows, row_capacity); 00153 // Steal the old rows. 00154 ++i; 00155 while (i-- > 0) 00156 new_rows[i].swap(rows[i]); 00157 // Put the new vector into place. 00158 std::swap(rows, new_rows); 00159 } 00160 else { 00161 // Reallocation (of vector `rows') will NOT take place. 00162 rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>()); 00163 // Be careful: each new row must have 00164 // the same capacity as each one of the old rows. 00165 for (dimension_type i = new_n_rows; i-- > old_n_rows; ) 00166 rows[i].construct(new_n_rows, row_capacity); 00167 } 00168 } 00169 else { 00170 // We cannot even recycle the old rows: allocate a new matrix and swap. 00171 DB_Matrix new_matrix(new_n_rows); 00172 swap(new_matrix); 00173 return; 00174 } 00175 } 00176 else if (new_n_rows < old_n_rows) { 00177 // Drop some rows. 00178 rows.erase(rows.begin() + new_n_rows, rows.end()); 00179 // Shrink the existing rows. 00180 for (dimension_type i = new_n_rows; i-- > 0; ) 00181 rows[i].shrink(new_n_rows); 00182 old_n_rows = new_n_rows; 00183 } 00184 // Here we have the right number of rows. 00185 if (new_n_rows > row_size) { 00186 // We need more columns. 00187 if (new_n_rows <= row_capacity) 00188 // But we have enough capacity: we resize existing rows. 00189 for (dimension_type i = old_n_rows; i-- > 0; ) 00190 rows[i].expand_within_capacity(new_n_rows); 00191 else { 00192 // Capacity exhausted: we must reallocate the rows and 00193 // make sure all the rows have the same capacity. 00194 const dimension_type new_row_capacity 00195 = compute_capacity(new_n_rows, max_num_columns()); 00196 for (dimension_type i = old_n_rows; i-- > 0; ) { 00197 DB_Row<T> new_row(new_n_rows, new_row_capacity); 00198 std::swap(rows[i], new_row); 00199 } 00200 row_capacity = new_row_capacity; 00201 } 00202 } 00203 // DB_Rows have grown or shrunk. 00204 row_size = new_n_rows; 00205 }
dimension_type Parma_Polyhedra_Library::DB_Matrix< T >::num_rows | ( | ) | const [inline] |
Returns the number of rows in the matrix.
Definition at line 163 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::rows.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::ascii_dump(), Parma_Polyhedra_Library::DB_Matrix< T >::external_memory_in_bytes(), Parma_Polyhedra_Library::DB_Matrix< T >::l_m_distance_assign(), Parma_Polyhedra_Library::DB_Matrix< T >::OK(), and Parma_Polyhedra_Library::DB_Matrix< T >::operator==().
00163 { 00164 return rows.size(); 00165 }
DB_Row< T > & Parma_Polyhedra_Library::DB_Matrix< T >::operator[] | ( | dimension_type | k | ) | [inline] |
Returns a reference to the k-th
row of the matrix.
Definition at line 149 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::rows.
const DB_Row< T > & Parma_Polyhedra_Library::DB_Matrix< T >::operator[] | ( | dimension_type | k | ) | const [inline] |
Returns a constant reference to the k-th
row of the matrix.
Definition at line 156 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::rows.
void Parma_Polyhedra_Library::DB_Matrix< T >::ascii_dump | ( | ) | const |
Writes to std::cerr
an ASCII representation of *this
.
void Parma_Polyhedra_Library::DB_Matrix< T >::ascii_dump | ( | std::ostream & | s | ) | const [inline] |
Writes to s
an ASCII representation of *this
.
Definition at line 209 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::num_rows().
00209 { 00210 const DB_Matrix<T>& x = *this; 00211 const char separator = ' '; 00212 const dimension_type nrows = x.num_rows(); 00213 s << nrows << separator << "\n"; 00214 for (dimension_type i = 0; i < nrows; ++i) { 00215 for (dimension_type j = 0; j < nrows; ++j) { 00216 using namespace IO_Operators; 00217 s << x[i][j] << separator; 00218 } 00219 s << "\n"; 00220 } 00221 }
void Parma_Polyhedra_Library::DB_Matrix< T >::print | ( | ) | const |
Prints *this
to std::cerr
using operator<<
.
bool Parma_Polyhedra_Library::DB_Matrix< T >::ascii_load | ( | std::istream & | s | ) | [inline] |
Loads from s
an ASCII representation (as produced by ascii_dump(std::ostream&) const) and sets *this
accordingly. Returns true
if successful, false
otherwise.
Definition at line 227 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::OK(), and Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy().
00227 { 00228 dimension_type nrows; 00229 if (!(s >> nrows)) 00230 return false; 00231 resize_no_copy(nrows); 00232 DB_Matrix& x = *this; 00233 for (dimension_type i = 0; i < nrows; ++i) 00234 for (dimension_type j = 0; j < nrows; ++j) { 00235 Result r = input(x[i][j], s, ROUND_UP); 00236 // FIXME: V_CVT_STR_UNK is probably not the only possible error. 00237 if (!s || r == V_CVT_STR_UNK) 00238 return false; 00239 } 00240 00241 // Check invariants. 00242 assert(OK()); 00243 return true; 00244 }
memory_size_type Parma_Polyhedra_Library::DB_Matrix< T >::total_memory_in_bytes | ( | ) | const [inline] |
Returns the total size in bytes of the memory occupied by *this
.
Definition at line 56 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::external_memory_in_bytes().
00056 { 00057 return sizeof(*this) + external_memory_in_bytes(); 00058 }
memory_size_type Parma_Polyhedra_Library::DB_Matrix< T >::external_memory_in_bytes | ( | ) | const [inline] |
Returns the size in bytes of the memory managed by *this
.
Definition at line 263 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::num_rows(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, and Parma_Polyhedra_Library::DB_Matrix< T >::rows.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::total_memory_in_bytes().
00263 { 00264 memory_size_type n = rows.capacity() * sizeof(DB_Row<T>); 00265 for (dimension_type i = num_rows(); i-- > 0; ) 00266 n += rows[i].external_memory_in_bytes(row_capacity); 00267 return n; 00268 }
bool Parma_Polyhedra_Library::DB_Matrix< T >::OK | ( | ) | const [inline] |
Checks if all the invariants are satisfied.
Definition at line 272 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::num_rows(), Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity, and Parma_Polyhedra_Library::DB_Matrix< T >::row_size.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::ascii_load(), and Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix().
00272 { 00273 #ifndef NDEBUG 00274 using std::endl; 00275 using std::cerr; 00276 #endif 00277 00278 // The matrix must be square. 00279 if (num_rows() != row_size) { 00280 #ifndef NDEBUG 00281 cerr << "DB_Matrix has fewer columns than rows:\n" 00282 << "row_size is " << row_size 00283 << ", num_rows() is " << num_rows() << "!" 00284 << endl; 00285 #endif 00286 return false; 00287 } 00288 00289 const DB_Matrix& x = *this; 00290 const dimension_type n_rows = x.num_rows(); 00291 for (dimension_type i = 0; i < n_rows; ++i) { 00292 if (!x[i].OK(row_size, row_capacity)) 00293 return false; 00294 } 00295 00296 // All checks passed. 00297 return true; 00298 }
Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix [friend] |
Definition at line 160 of file DB_Matrix.defs.hh.
std::ostream & operator<< | ( | std::ostream & | s, | |
const DB_Matrix< T > & | c | |||
) | [related] |
Output operator.
Definition at line 305 of file DB_Matrix.templates.hh.
00305 { 00306 const dimension_type n = c.num_rows(); 00307 for (dimension_type i = 0; i < n; ++i) { 00308 for (dimension_type j = 0; j < n; ++j) 00309 s << c[i][j] << " "; 00310 s << "\n"; 00311 } 00312 return s; 00313 }
void swap | ( | Parma_Polyhedra_Library::DB_Matrix< T > & | x, | |
Parma_Polyhedra_Library::DB_Matrix< T > & | y | |||
) | [related] |
Specializes std::swap
.
Definition at line 326 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::swap().
00327 { 00328 x.swap(y); 00329 }
bool operator== | ( | const DB_Matrix< T > & | x, | |
const DB_Matrix< T > & | y | |||
) | [related] |
Returns true
if and only if x
and y
are identical.
Definition at line 251 of file DB_Matrix.templates.hh.
References Parma_Polyhedra_Library::DB_Matrix< T >::num_rows().
00251 { 00252 const dimension_type x_num_rows = x.num_rows(); 00253 if (x_num_rows != y.num_rows()) 00254 return false; 00255 for (dimension_type i = x_num_rows; i-- > 0; ) 00256 if (x[i] != y[i]) 00257 return false; 00258 return true; 00259 }
bool operator!= | ( | const DB_Matrix< T > & | x, | |
const DB_Matrix< T > & | y | |||
) | [related] |
Returns true
if and only if x
and y
are different.
Definition at line 172 of file DB_Matrix.inlines.hh.
bool rectilinear_distance_assign | ( | Checked_Number< To, Extended_Number_Policy > & | r, | |
const DB_Matrix< T > & | x, | |||
const DB_Matrix< T > & | y, | |||
Rounding_Dir | dir, | |||
Temp & | tmp0, | |||
Temp & | tmp1, | |||
Temp & | tmp2 | |||
) | [related] |
Computes the rectilinear (or Manhattan) distance between x
and y
.
If the rectilinear distance between x
and y
is defined, stores an approximation of it into to r
and returns true
; returns false
otherwise.
The direction of the approximation is specified by dir
.
All computations are performed using the temporary variables tmp0
, tmp1
and tmp2
.
Definition at line 261 of file DB_Matrix.inlines.hh.
00267 { 00268 return 00269 l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y, 00270 dir, 00271 tmp0, 00272 tmp1, 00273 tmp2); 00274 }
bool euclidean_distance_assign | ( | Checked_Number< To, Extended_Number_Policy > & | r, | |
const DB_Matrix< T > & | x, | |||
const DB_Matrix< T > & | y, | |||
Rounding_Dir | dir, | |||
Temp & | tmp0, | |||
Temp & | tmp1, | |||
Temp & | tmp2 | |||
) | [related] |
Computes the euclidean distance between x
and y
.
If the Euclidean distance between x
and y
is defined, stores an approximation of it into to r
and returns true
; returns false
otherwise.
The direction of the approximation is specified by dir
.
All computations are performed using the temporary variables tmp0
, tmp1
and tmp2
.
Definition at line 282 of file DB_Matrix.inlines.hh.
00288 { 00289 return 00290 l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y, 00291 dir, 00292 tmp0, 00293 tmp1, 00294 tmp2); 00295 }
bool l_infinity_distance_assign | ( | Checked_Number< To, Extended_Number_Policy > & | r, | |
const DB_Matrix< T > & | x, | |||
const DB_Matrix< T > & | y, | |||
Rounding_Dir | dir, | |||
Temp & | tmp0, | |||
Temp & | tmp1, | |||
Temp & | tmp2 | |||
) | [related] |
Computes the distance between
x
and y
.
If the distance between
x
and y
is defined, stores an approximation of it into to r
and returns true
; returns false
otherwise.
The direction of the approximation is specified by dir
.
All computations are performed using the temporary variables tmp0
, tmp1
and tmp2
.
Definition at line 302 of file DB_Matrix.inlines.hh.
00308 { 00309 return 00310 l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y, 00311 dir, 00312 tmp0, 00313 tmp1, 00314 tmp2); 00315 }
bool l_m_distance_assign | ( | Checked_Number< To, Extended_Number_Policy > & | r, | |
const DB_Matrix< T > & | x, | |||
const DB_Matrix< T > & | y, | |||
const Rounding_Dir | dir, | |||
Temp & | tmp0, | |||
Temp & | tmp1, | |||
Temp & | tmp2 | |||
) | [related] |
Definition at line 207 of file DB_Matrix.inlines.hh.
References Parma_Polyhedra_Library::assign_r(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::finalize(), Parma_Polyhedra_Library::is_plus_infinity(), Parma_Polyhedra_Library::maybe_assign(), Parma_Polyhedra_Library::DB_Matrix< T >::num_rows(), and PLUS_INFINITY.
00213 { 00214 const dimension_type x_num_rows = x.num_rows(); 00215 if (x_num_rows != y.num_rows()) 00216 return false; 00217 assign_r(tmp0, 0, ROUND_NOT_NEEDED); 00218 for (dimension_type i = x_num_rows; i-- > 0; ) { 00219 const DB_Row<T>& x_i = x[i]; 00220 const DB_Row<T>& y_i = y[i]; 00221 for (dimension_type j = x_num_rows; j-- > 0; ) { 00222 const T& x_i_j = x_i[j]; 00223 const T& y_i_j = y_i[j]; 00224 if (is_plus_infinity(x_i_j)) { 00225 if (is_plus_infinity(y_i_j)) 00226 continue; 00227 else { 00228 pinf: 00229 assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED); 00230 return true; 00231 } 00232 } 00233 else if (is_plus_infinity(y_i_j)) 00234 goto pinf; 00235 00236 const Temp* tmp1p; 00237 const Temp* tmp2p; 00238 if (x_i_j > y_i_j) { 00239 maybe_assign(tmp1p, tmp1, x_i_j, dir); 00240 maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir)); 00241 } 00242 else { 00243 maybe_assign(tmp1p, tmp1, y_i_j, dir); 00244 maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir)); 00245 } 00246 sub_assign_r(tmp1, *tmp1p, *tmp2p, dir); 00247 assert(sgn(tmp1) >= 0); 00248 Specialization::combine(tmp0, tmp1, dir); 00249 } 00250 } 00251 Specialization::finalize(tmp0, dir); 00252 assign_r(r, tmp0, dir); 00253 return true; 00254 }
std::vector<DB_Row<T> > Parma_Polyhedra_Library::DB_Matrix< T >::rows [private] |
The rows of the matrix.
Definition at line 163 of file DB_Matrix.defs.hh.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::begin(), Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix(), Parma_Polyhedra_Library::DB_Matrix< T >::end(), Parma_Polyhedra_Library::DB_Matrix< T >::external_memory_in_bytes(), Parma_Polyhedra_Library::DB_Matrix< T >::grow(), Parma_Polyhedra_Library::DB_Matrix< T >::num_rows(), Parma_Polyhedra_Library::DB_Matrix< T >::operator=(), Parma_Polyhedra_Library::DB_Matrix< T >::operator[](), Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy(), and Parma_Polyhedra_Library::DB_Matrix< T >::swap().
dimension_type Parma_Polyhedra_Library::DB_Matrix< T >::row_size [private] |
Size of the initialized part of each row.
Definition at line 166 of file DB_Matrix.defs.hh.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::grow(), Parma_Polyhedra_Library::DB_Matrix< T >::OK(), Parma_Polyhedra_Library::DB_Matrix< T >::operator=(), Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy(), and Parma_Polyhedra_Library::DB_Matrix< T >::swap().
dimension_type Parma_Polyhedra_Library::DB_Matrix< T >::row_capacity [private] |
Capacity allocated for each row, i.e., number of long
objects that each row can contain.
Definition at line 172 of file DB_Matrix.defs.hh.
Referenced by Parma_Polyhedra_Library::DB_Matrix< T >::DB_Matrix(), Parma_Polyhedra_Library::DB_Matrix< T >::external_memory_in_bytes(), Parma_Polyhedra_Library::DB_Matrix< T >::grow(), Parma_Polyhedra_Library::DB_Matrix< T >::OK(), Parma_Polyhedra_Library::DB_Matrix< T >::operator=(), Parma_Polyhedra_Library::DB_Matrix< T >::resize_no_copy(), and Parma_Polyhedra_Library::DB_Matrix< T >::swap().