1 # ifndef CPPAD_LOCAL_COLOR_SYMMETRIC_HPP
2 # define CPPAD_LOCAL_COLOR_SYMMETRIC_HPP
4 # include <cppad/configure.hpp>
18 namespace CppAD {
namespace local {
80 template <
class VectorSet>
82 const VectorSet& pattern ,
87 size_t K = row.
size();
88 size_t m = pattern.n_set();
95 std::set<size_t>::iterator itr1, itr2;
96 for(
size_t k1 = 0; k1 < K; k1++)
98 pair_needed[ row[k1] ].insert( col[k1] );
99 pair_needed[ col[k1] ].insert( row[k1] );
104 for(
size_t i1 = 0; i1 < m; i1++)
106 key[i1] = m - pair_needed[i1].size();
112 for(
size_t o1 = 0; o1 < m; o1++)
113 row2order[ order2row[o1] ] = o1;
118 for(
size_t o1 = 0; o1 < m; o1++)
119 {
size_t i1 = order2row[o1];
120 if( pair_needed[i1].empty() )
130 for(
size_t o1 = 0; o1 < m; o1++)
131 if( color[ order2row[o1] ] < m )
132 {
size_t i1 = order2row[o1];
137 for(
size_t c2 = 0; c2 <= c1; c2++)
138 forbidden[c2] =
false;
143 itr1 = pair_needed[i1].begin();
144 while( itr1 != pair_needed[i1].end() )
150 typename VectorSet::const_iterator pattern_itr(pattern, j1);
151 size_t i2 = *pattern_itr;
152 while( i2 != pattern.end() )
153 {
size_t c2 = color[i2];
155 forbidden[c2] =
true;
156 i2 = *(++pattern_itr);
162 for(
size_t o2 = 0; o2 < o1; o2++)
163 {
size_t i2 = order2row[o2];
164 size_t c2 = color[i2];
165 itr2 = pair_needed[i2].begin();
166 while( itr2 != pair_needed[i2].end() )
170 if( pattern.is_element(i1, j2) )
171 forbidden[c2] =
true;
178 while( forbidden[c2] )
185 itr1 = pair_needed[i1].begin();
186 while( itr1 != pair_needed[i1].end() )
188 if( row2order[j1] > o1 )
189 { itr2 = pair_needed[j1].find(i1);
190 if( itr2 != pair_needed[j1].end() )
191 { pair_needed[j1].erase(itr2);
192 if( pair_needed[j1].empty() )
201 for(
size_t k1 = 0; k1 < row.
size(); k1++)
202 {
size_t i1 = row[k1];
204 itr1 = pair_needed[i1].find(j1);
205 if( itr1 == pair_needed[i1].end() )
209 itr1 = pair_needed[j1].find(i1);
224 template <
class VectorSet>
226 const VectorSet& pattern ,
231 # if ! CPPAD_HAS_COLPACK
236 size_t m = pattern.n_set();
242 size_t n_nonzero_total = 0;
243 for(i = 0; i < m; i++)
245 typename VectorSet::const_iterator pattern_itr(pattern, i);
247 while( j != pattern.end() )
249 j = *(++pattern_itr);
251 n_nonzero_total += n_nonzero[i];
258 for(i = 0; i < m; i++)
259 { adolc_pattern[i] = adolc_memory.
data() + i_memory;
261 std::numeric_limits<unsigned int>::max() >= n_nonzero[i],
262 "Matrix is too large for colpack"
264 adolc_pattern[i][0] =
static_cast<unsigned int>( n_nonzero[i] );
265 typename VectorSet::const_iterator pattern_itr(pattern, i);
268 while(j != pattern.end() )
271 std::numeric_limits<unsigned int>::max() >= j,
272 "Matrix is too large for colpack"
274 adolc_pattern[i][k++] =
static_cast<unsigned int>( j );
275 j = *(++pattern_itr);
284 cppad_colpack_symmetric(color, m, adolc_pattern);
287 for(
size_t k1 = 0; k1 < row.
size(); k1++)
288 {
size_t i1 = row[k1];
290 bool reflect =
false;
291 for(
size_t i2 = 0; i2 < m; i2++)
292 if( (i1 != i2) & (color[i1]==color[i2]) )
293 {
for(
size_t k2 = 1; k2 <= adolc_pattern[i2][0]; k2++)
294 {
size_t j2 = adolc_pattern[i2][k2];
295 reflect |= (j1 == j2);
304 # endif // CPPAD_HAS_COLPACK
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
Type * data(void)
raw pointer to the data
void resize(size_t n)
change the number of elements in this vector.
size_t size(void) const
number of elements currently in this vector.
void index_sort(const VectorKey &keys, VectorSize &ind)
Compute the indices that sort a vector of keys.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
void color_symmetric_cppad(const VectorSet &pattern, CppAD::vector< size_t > &row, CppAD::vector< size_t > &col, CppAD::vector< size_t > &color)
CppAD algorithm for determining which rows of a symmetric sparse matrix can be computed together...
void color_symmetric_colpack(const VectorSet &pattern, CppAD::vector< size_t > &row, CppAD::vector< size_t > &col, CppAD::vector< size_t > &color)
Colpack algorithm for determining which rows of a symmetric sparse matrix can be computed together...