1 # ifndef CPPAD_LOCAL_COLOR_GENERAL_HPP
2 # define CPPAD_LOCAL_COLOR_GENERAL_HPP
15 # include <cppad/configure.hpp>
18 namespace CppAD {
namespace local {
71 template <
class VectorSet,
class VectorSize>
73 const VectorSet& pattern ,
74 const VectorSize& row ,
75 const VectorSize& col ,
78 size_t K = row.size();
79 size_t m = pattern.n_set();
80 size_t n = pattern.end();
90 for(
size_t i = 0; i < m; i++)
91 row_appear[i] =
false;
94 VectorSet c2r_appear, r2c_appear;
96 r2c_appear.resize(m, n);
97 for(
size_t k = 0; k < K; k++)
99 row_appear[ row[k] ] =
true;
100 c2r_appear.post_element(col[k], row[k]);
101 r2c_appear.post_element(row[k], col[k]);
104 for(
size_t j = 0; j < n; ++j)
105 c2r_appear.process_post(j);
106 for(
size_t i = 0; i < m; ++i)
107 r2c_appear.process_post(i);
110 VectorSet not_appear;
112 for(
size_t i = 0; i < m; i++)
113 {
typename VectorSet::const_iterator pattern_itr(pattern, i);
114 size_t j = *pattern_itr;
115 while( j != pattern.end() )
116 {
if( ! c2r_appear.is_element(j , i) )
117 not_appear.post_element(j, i);
118 j = *(++pattern_itr);
122 for(
size_t j = 0; j < n; ++j)
123 not_appear.process_post(j);
128 for(
size_t i = 0; i < m; i++)
129 {
if( row_appear[i] )
143 for(
size_t i = 1; i < m; i++)
148 for(ell = 0; ell <= color[i]; ell++)
149 forbidden[ell] =
false;
155 typename VectorSet::const_iterator pattern_itr(pattern, i);
156 size_t j = *pattern_itr;
157 while( j != pattern.end() )
159 typename VectorSet::const_iterator c2r_itr(c2r_appear, j);
161 while( r != c2r_appear.end() )
163 if( (r < i) & (color[r] < m) )
164 forbidden[ color[r] ] =
true;
167 j = *(++pattern_itr);
175 typename VectorSet::const_iterator r2c_itr(r2c_appear, i);
177 while( j != r2c_appear.end() )
180 typename VectorSet::const_iterator not_itr(not_appear, j);
182 while( r != not_appear.end() )
184 if( (r < i) & (color[r] < m) )
185 forbidden[ color[r] ] =
true;
193 while( forbidden[ell] )
202 # if CPPAD_HAS_COLPACK
209 template <
class VectorSet,
class VectorSize>
210 void color_general_colpack(
211 const VectorSet& pattern ,
212 const VectorSize& row ,
213 const VectorSize& col ,
216 size_t m = pattern.n_set();
217 size_t n = pattern.end();
221 size_t n_nonzero_total = 0;
222 for(
size_t i = 0; i < m; i++)
224 typename VectorSet::const_iterator pattern_itr(pattern, i);
225 size_t j = *pattern_itr;
226 while( j != pattern.end() )
228 j = *(++pattern_itr);
230 n_nonzero_total += n_nonzero[i];
237 for(
size_t i = 0; i < m; i++)
238 { adolc_pattern[i] = adolc_memory.data() + i_memory;
240 std::numeric_limits<unsigned int>::max() >= n_nonzero[i],
241 "Matrix is too large for colpack"
243 adolc_pattern[i][0] =
static_cast<unsigned int>( n_nonzero[i] );
244 typename VectorSet::const_iterator pattern_itr(pattern, i);
245 size_t j = *pattern_itr;
247 while(j != pattern.end() )
250 std::numeric_limits<unsigned int>::max() >= j,
251 "Matrix is too large for colpack"
253 adolc_pattern[i][k++] =
static_cast<unsigned int>( j );
254 j = *(++pattern_itr);
263 cppad_colpack_general(color, m, n, adolc_pattern);
267 # endif // CPPAD_HAS_COLPACK
#define CPPAD_ASSERT_KNOWN(exp, msg)
Check that exp is true, if not print msg and terminate execution.
void color_general_cppad(const VectorSet &pattern, const VectorSize &row, const VectorSize &col, CppAD::vector< size_t > &color)
Determine which rows of a general sparse matrix can be computed together; i.e., do not have non-zero ...
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.
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.