Skip to content
Snippets Groups Projects
cs_dupl.c 1.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lubomir Riha's avatar
    Lubomir Riha committed
    #include "cs.h"
    /* remove duplicate entries from A */
    CS_INT cs_dupl (cs *A)
    {
        CS_INT i, j, p, q, nz = 0, n, m, *Ap, *Ai, *w ;
        CS_ENTRY *Ax ;
        if (!CS_CSC (A)) return (0) ;               /* check inputs */
        m = A->m ; n = A->n ; Ap = A->p ; Ai = A->i ; Ax = A->x ;
        w = cs_malloc (m, sizeof (CS_INT)) ;           /* get workspace */
        if (!w) return (0) ;                        /* out of memory */
        for (i = 0 ; i < m ; i++) w [i] = -1 ;      /* row i not yet seen */
        for (j = 0 ; j < n ; j++)
        {
            q = nz ;                                /* column j will start at q */
            for (p = Ap [j] ; p < Ap [j+1] ; p++)
            {
                i = Ai [p] ;                        /* A(i,j) is nonzero */
                if (w [i] >= q)
                {
                    Ax [w [i]] += Ax [p] ;          /* A(i,j) is a duplicate */
                }
                else
                {
                    w [i] = nz ;                    /* record where row i occurs */
                    Ai [nz] = i ;                   /* keep A(i,j) */
                    Ax [nz++] = Ax [p] ;
                }
            }
            Ap [j] = q ;                            /* record start of column j */
        }
        Ap [n] = nz ;                               /* finalize A */
        cs_free (w) ;                               /* free workspace */
        return (cs_sprealloc (A, 0)) ;              /* remove extra space from A */
    }