7 #include <boost/type_traits/is_const.hpp>
30 template <
typename MatrixType>
31 bool find_nonzero_column(MatrixType& matrix,
size_t column_first,
size_t column_beyond,
size_t row_first,
size_t row_beyond,
size_t target_column)
33 for (
size_t column = column_first; column < column_beyond; ++column)
35 for (
size_t row = row_first; row < row_beyond; ++row)
37 if (matrix(row, column) != 0)
60 template <
typename MatrixType>
62 const std::set <size_t>& nodes,
size_t current_index,
size_t column, std::map <size_t, bool>& changes)
65 if (spanning_tree[current_index].predecessor == current_index)
72 int value = matrix(dim.
index_to_row(current_index), column);
73 size_t last, index = current_index;
77 index = spanning_tree[index].predecessor;
79 value += matrix(coords.first, coords.second);
81 while (nodes.find(index) == nodes.end());
84 if (changes.find(dim.
index_to_row(index)) == changes.end())
86 check_sign(matrix, spanning_tree, dim, nodes, index, column, changes);
95 value = (value >= 0 ? value : -value) % 4;
99 if (value != 0 && value != 2)
101 throw std::logic_error(
"Signing procedure: modulo-sum of cycle was neither 0, nor 2!");
109 template <
typename T>
122 T abs_first = first >= 0 ? first : -first;
123 T abs_second = second >= 0 ? second : -second;
124 return abs_first > abs_second;
137 template <
typename M>
142 size_t handled_rows = 0;
145 for (
size_t handled_columns = 0; handled_columns < permuted.
size2(); ++handled_columns)
151 std::set <size_t> start_nodes;
152 std::set <size_t> end_nodes;
153 std::set <size_t> all_nodes;
156 for (
size_t row = 0; row < handled_rows; ++row)
158 if (permuted(row, handled_columns) != 0)
161 if (start_nodes.empty())
162 start_nodes.insert(index);
164 end_nodes.insert(index);
165 all_nodes.insert(index);
171 std::vector <bipartite_graph_bfs_node> bfs_result;
173 throw std::logic_error(
"Signing procedure: Did not reach all nodes via bfs!");
176 std::map <size_t, bool> changes;
177 for (
typename std::set <size_t>::const_iterator iter = end_nodes.begin(); iter != end_nodes.end(); ++iter)
179 check_sign(permuted, bfs_result, dim, all_nodes, *iter, handled_columns, changes);
183 for (std::map <size_t, bool>::iterator iter = changes.begin(); iter != changes.end(); ++iter)
188 if (boost::is_const <M>::value)
193 std::set <size_t> violator_rows, violator_columns;
195 size_t index = iter->first;
203 index = bfs_result[index].predecessor;
205 while (all_nodes.find(index) == all_nodes.end());
207 violator_columns.insert(permuted.
perm2()(handled_columns));
213 for (std::set <size_t>::const_iterator iter = violator_rows.begin(); iter != violator_rows.end(); ++iter)
214 violator->
rows[i++] = *iter;
216 for (std::set <size_t>::const_iterator iter = violator_columns.begin(); iter != violator_columns.end(); ++iter)
217 violator->
columns[i++] = *iter;
225 size_t real_column = permuted.
perm2()(handled_columns);
226 matrix_set_value(matrix, real_row, real_column, -matrix(real_row, real_column));
235 while (handled_rows < permuted.
size1())
237 if (permuted(handled_rows, handled_columns) == 0)
246 for (
size_t column = handled_columns; column < permuted.
size2(); ++column)
249 for (
size_t row = handled_rows; row < permuted.
size1(); ++row)
251 if (permuted(row, column) != 0)
260 while (handled_rows < permuted.
size1())
262 if (permuted(handled_rows, handled_columns) == 0)
Definition: matrix_permuted.hpp:17
const permutation_type & perm2() const
Definition: matrix_permuted.hpp:92
const permutation_type & perm1() const
Definition: matrix_permuted.hpp:74
size_type size2() const
Definition: matrix_permuted.hpp:65
size_type size1() const
Definition: matrix_permuted.hpp:56
Definition: algorithm.hpp:14
bool bipartite_graph_bfs(const MatrixType &matrix, const bipartite_graph_dimensions &dimensions, const StartNodesContainerType &start_nodes, const EndNodesContainerType &end_nodes, bool reach_all, std::vector< bipartite_graph_bfs_node > &result)
Definition: bipartite_graph_bfs.hpp:182
void check_sign(const MatrixType &matrix, const std::vector< bipartite_graph_bfs_node > &spanning_tree, const bipartite_graph_dimensions &dim, const std::set< size_t > &nodes, size_t current_index, size_t column, std::map< size_t, bool > &changes)
Definition: signing.hpp:61
void matrix_reorder_rows(const MatrixType &matrix, size_t row_first, size_t row_beyond, size_t column_first, size_t column_beyond, ElementLess element_less, permutation &result_permutation)
Definition: matrix_reorder.hpp:110
void matrix_set_value(matrix_permuted< MatrixType > &matrix, size_t row, size_t column, typename MatrixType::value_type value)
Definition: matrix_permuted.hpp:168
bool sign_matrix(M &matrix, submatrix_indices *violator)
Definition: signing.hpp:138
bool find_nonzero_column(MatrixType &matrix, size_t column_first, size_t column_beyond, size_t row_first, size_t row_beyond, size_t target_column)
Definition: signing.hpp:31
void matrix_permute2(MatrixType &matrix, size_t index1, size_t index2)
Definition: matrix.hpp:1740
Definition: signing.hpp:111
bool operator()(const T &first, const T &second)
Definition: signing.hpp:120
Definition: bipartite_graph_bfs.hpp:39
bool is_row(index_type index) const
Definition: bipartite_graph_bfs.hpp:88
std::pair< size_t, size_t > indexes_to_coordinates(index_type first, index_type second) const
Definition: bipartite_graph_bfs.hpp:155
size_t index_to_column(index_type index) const
Definition: bipartite_graph_bfs.hpp:119
index_type row_to_index(size_t row) const
Definition: bipartite_graph_bfs.hpp:130
size_t index_to_row(index_type index) const
Definition: bipartite_graph_bfs.hpp:108
Definition: common.hpp:15
indirect_array_type columns
Definition: common.hpp:20
boost::numeric::ublas::indirect_array< vector_type > indirect_array_type
Definition: common.hpp:17
indirect_array_type rows
Definition: common.hpp:19