Sparsity CSparseCholeskyInterface::linsol_cholesky_sparsity(void* mem, bool tr) const {
    auto m = static_cast<CsparseCholMemory*>(mem);

    casadi_assert(m->S);
    int n = m->A.n;
    int nzmax = m->S->cp[n];
    std::vector< int > row(n+1);
    std::copy(m->S->cp, m->S->cp+n+1, row.begin());
    std::vector< int > colind(nzmax);
    int *Li = &colind.front();
    int *Lp = &row.front();
    const cs* C;
    C = m->S->pinv ? cs_symperm(&m->A, m->S->pinv, 1) : &m->A;
    std::vector< int > temp(2*n);
    int *c = &temp.front();
    int *s = c+n;
    for (int k = 0 ; k < n ; k++) c[k] = m->S->cp[k] ;
    for (int k = 0 ; k < n ; k++) {       /* compute L(k, :) for L*L' = C */
      int top = cs_ereach(C, k, m->S->parent, s, c) ;
      for ( ; top < n ; top++) {  /* solve L(0:k-1, 0:k-1) * x = C(:, k) */
          int i = s[top] ;               /* s[top..n-1] is pattern of L(k, :) */
          int p = c[i]++ ;
          Li[p] = k ;                /* store L(k, i) in row i */
      }
      int p = c[k]++ ;
      Li[p] = k ;
    }
    Lp[n] = m->S->cp[n] ;
    Sparsity ret(n, n, row, colind); // BUG?

    return tr ? ret.T() : ret;

  }
Exemplo n.º 2
0
  Sparsity CSparseCholeskyInternal::getFactorizationSparsity(bool transpose) const {
    casadi_assert(S_);
    int n = AT_.n;
    int nzmax = S_->cp[n];
    std::vector< int > row(n+1);
    std::copy(S_->cp, S_->cp+n+1, row.begin());
    std::vector< int > colind(nzmax);
    int *Li = &colind.front();
    int *Lp = &row.front();
    const cs* C;
    C = S_->pinv ? cs_symperm(&AT_, S_->pinv, 1) : &AT_;
    std::vector< int > temp(2*n);
    int *c = & temp.front();
    int *s = c+n;
    for (int k = 0 ; k < n ; k++) c[k] = S_->cp[k] ;
    for (int k = 0 ; k < n ; k++) {       /* compute L(k, :) for L*L' = C */
      int top = cs_ereach(C, k, S_->parent, s, c) ;
      for ( ; top < n ; top++) {  /* solve L(0:k-1, 0:k-1) * x = C(:, k) */
          int i = s[top] ;               /* s[top..n-1] is pattern of L(k, :) */
          int p = c[i]++ ;
          Li[p] = k ;                /* store L(k, i) in row i */
      }
      int p = c[k]++ ;
      Li[p] = k ;
    }
    Lp[n] = S_->cp[n] ;
    Sparsity ret(n, n, row, colind); // BUG?

    return transpose? ret.T() : ret;

  }
  DM CSparseCholeskyInterface::linsol_cholesky(void* mem, bool tr) const {
    auto m = static_cast<CsparseCholMemory*>(mem);

    casadi_assert(m->L);
    cs *L = m->L->L;
    int nz = L->nzmax;
    std::vector< int > colind(L->m+1);
    std::copy(L->p, L->p+L->m+1, colind.begin());
    std::vector< int > row(nz);
    std::copy(L->i, L->i+nz, row.begin());
    std::vector< double > data(nz);
    std::copy(L->x, L->x+nz, data.begin());
    DM ret(Sparsity(L->n, L->m, colind, row), data, false);

    return tr ? ret.T() : ret;
  }
Exemplo n.º 4
0
  DMatrix CSparseCholeskyInternal::getFactorization(bool transpose) const {
    casadi_assert(L_);
    cs *L = L_->L;
    int nz = L->nzmax;
    int m = L->m; // number of cols
    int n = L->n; // number of rows
    std::vector< int > colind(m+1);
    std::copy(L->p, L->p+m+1, colind.begin());
    std::vector< int > row(nz);
    std::copy(L->i, L->i+nz, row.begin());
    std::vector< double > data(nz);
    std::copy(L->x, L->x+nz, data.begin());
    DMatrix ret(Sparsity(n, m, colind, row), data, false);

    return transpose? ret.T() : ret;
  }
  void CSparseCholeskyInterface::reset(void* mem, const int* sp) const {
    LinsolInternal::reset(mem, sp);
    auto m = static_cast<CsparseCholMemory*>(mem);

    m->L = 0;
    m->S = 0;
    m->A.nzmax = m->nnz();  // maximum number of entries
    m->A.m = m->nrow(); // number of columns
    m->A.n = m->ncol(); // number of rows
    m->A.p = const_cast<int*>(m->colind()); // row pointers (size n+1)
    // or row indices (size nzmax)
    m->A.i = const_cast<int*>(m->row()); // column indices, size nzmax
    m->A.x = 0; // numerical values, size nzmax
    m->A.nz = -1; // of entries in triplet matrix, -1 for compressed-row

    // Temporary
    m->temp.resize(m->A.n);
  }
Exemplo n.º 6
0
 Sparsity blkdiag(const std::vector< Sparsity > &v) {
   int n = 0;
   int m = 0;
   
   std::vector<int> colind(1,0);
   std::vector<int> row;
   
   int nz = 0;
   for (int i=0;i<v.size();++i) {
     const std::vector<int> &colind_ = v[i].colind();
     const std::vector<int> &row_ = v[i].row();
     for (int k=1;k<colind_.size();++k) {
       colind.push_back(colind_[k]+nz);
     }
     for (int k=0;k<row_.size();++k) {
       row.push_back(row_[k]+m);
     }
     n+= v[i].size2();
     m+= v[i].size1();
     nz+= v[i].size();
   }
   
   return Sparsity(m,n,colind,row);
 }
Exemplo n.º 7
0
 /// Number of structural non-zeros
 inline int nnz() const { return colind()[size2()];}
Exemplo n.º 8
0
 /** \brief Get row indices (see public class) */
 inline const int* row() const { return colind()+size2()+1;}