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...