// // This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

// This file is modified from the colamd/symamd library. The copyright is below

//   The authors of the code itself are Stefan I. Larimore and Timothy A.
//   Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
//   developed in collaboration with John Gilbert, Xerox PARC, and Esmond
//   Ng, Oak Ridge National Laboratory.
//
//     Date:
//
//   September 8, 2003.  Version 2.3.
//
//     Acknowledgements:
//
//   This work was supported by the National Science Foundation, under
//   grants DMS-9504974 and DMS-9803599.
//
//     Notice:
//
//   Copyright (c) 1998-2003 by the University of Florida.
//   All Rights Reserved.
//
//   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
//   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
//
//   Permission is hereby granted to use, copy, modify, and/or distribute
//   this program, provided that the Copyright, this License, and the
//   Availability of the original version is retained on all copies and made
//   accessible to the end-user of any code or package that includes COLAMD
//   or any modified version of COLAMD.
//
//     Availability:
//
//   The colamd/symamd library is available at
//
//       http://www.suitesparse.com

#ifndef EIGEN_COLAMD_H
#define EIGEN_COLAMD_H

namespace Eigen {
namespace internal {
namespace Colamd {

/* Ensure that debugging is turned off: */
#ifndef COLAMD_NDEBUG
#define COLAMD_NDEBUG
#endif /* NDEBUG */

/* ========================================================================== */
/* === Knob and statistics definitions ====================================== */
/* ========================================================================== */

/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */
const int NKnobs = 20;

/* number of output statistics.  Only stats [0..6] are currently used. */
const int NStats = 20;

/* Indices into knobs and stats array. */
enum KnobsStatsIndex {
  /* knobs [0] and stats [0]: dense row knob and output statistic. */
  DenseRow = 0,

  /* knobs [1] and stats [1]: dense column knob and output statistic. */
  DenseCol = 1,

  /* stats [2]: memory defragmentation count output statistic */
  DefragCount = 2,

  /* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */
  Status = 3,

  /* stats [4..6]: error info, or info on jumbled columns */
  Info1 = 4,
  Info2 = 5,
  Info3 = 6
};

/* error codes returned in stats [3]: */
enum Status {
  Ok = 0,
  OkButJumbled = 1,
  ErrorANotPresent = -1,
  ErrorPNotPresent = -2,
  ErrorNrowNegative = -3,
  ErrorNcolNegative = -4,
  ErrorNnzNegative = -5,
  ErrorP0Nonzero = -6,
  ErrorATooSmall = -7,
  ErrorColLengthNegative = -8,
  ErrorRowIndexOutOfBounds = -9,
  ErrorOutOfMemory = -10,
  ErrorInternalError = -999
};
/* ========================================================================== */
/* === Definitions ========================================================== */
/* ========================================================================== */

template <typename IndexType>
IndexType ones_complement(const IndexType r) {
  return (-(r)-1);
}

/* -------------------------------------------------------------------------- */
const int Empty = -1;

/* Row and column status */
enum RowColumnStatus { Alive = 0, Dead = -1 };

/* Column status */
enum ColumnStatus { DeadPrincipal = -1, DeadNonPrincipal = -2 };

/* ========================================================================== */
/* === Colamd reporting mechanism =========================================== */
/* ========================================================================== */

// == Row and Column structures ==
template <typename IndexType>
struct ColStructure {
  IndexType start; /* index for A of first row in this column, or Dead */
  /* if column is dead */
  IndexType length; /* number of rows in this column */
  union {
    IndexType thickness; /* number of original columns represented by this */
    /* col, if the column is alive */
    IndexType parent; /* parent in parent tree super-column structure, if */
    /* the column is dead */
  } shared1;
  union {
    IndexType score; /* the score used to maintain heap, if col is alive */
    IndexType order; /* pivot ordering of this column, if col is dead */
  } shared2;
  union {
    IndexType headhash; /* head of a hash bucket, if col is at the head of */
    /* a degree list */
    IndexType hash; /* hash value, if col is not in a degree list */
    IndexType prev; /* previous column in degree list, if col is in a */
    /* degree list (but not at the head of a degree list) */
  } shared3;
  union {
    IndexType degree_next; /* next column, if col is in a degree list */
    IndexType hash_next;   /* next column, if col is in a hash list */
  } shared4;

  inline bool is_dead() const { return start < Alive; }

  inline bool is_alive() const { return start >= Alive; }

  inline bool is_dead_principal() const { return start == DeadPrincipal; }

  inline void kill_principal() { start = DeadPrincipal; }

  inline void kill_non_principal() { start = DeadNonPrincipal; }
};

template <typename IndexType>
struct RowStructure {
  IndexType start;  /* index for A of first col in this row */
  IndexType length; /* number of principal columns in this row */
  union {
    IndexType degree; /* number of principal & non-principal columns in row */
    IndexType p;      /* used as a row pointer in init_rows_cols () */
  } shared1;
  union {
    IndexType mark;         /* for computing set differences and marking dead rows*/
    IndexType first_column; /* first column in row (used in garbage collection) */
  } shared2;

  inline bool is_dead() const { return shared2.mark < Alive; }

  inline bool is_alive() const { return shared2.mark >= Alive; }

  inline void kill() { shared2.mark = Dead; }
};

/* ========================================================================== */
/* === Colamd recommended memory size ======================================= */
/* ========================================================================== */

/*
  The recommended length Alen of the array A passed to colamd is given by
  the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any
  argument is negative.  2*nnz space is required for the row and column
  indices of the matrix. colamd_c (n_col) + colamd_r (n_row) space is
  required for the Col and Row arrays, respectively, which are internal to
  colamd.  An additional n_col space is the minimal amount of "elbow room",
  and nnz/5 more space is recommended for run time efficiency.

  This macro is not needed when using symamd.

  Explicit typecast to IndexType added Sept. 23, 2002, COLAMD version 2.2, to avoid
  gcc -pedantic warning messages.
*/
template <typename IndexType>
inline IndexType colamd_c(IndexType n_col) {
  return IndexType(((n_col) + 1) * sizeof(ColStructure<IndexType>) / sizeof(IndexType));
}

template <typename IndexType>
inline IndexType colamd_r(IndexType n_row) {
  return IndexType(((n_row) + 1) * sizeof(RowStructure<IndexType>) / sizeof(IndexType));
}

// Prototypes of non-user callable routines
template <typename IndexType>
static IndexType init_rows_cols(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[],
                                ColStructure<IndexType> col[], IndexType A[], IndexType p[], IndexType stats[NStats]);

template <typename IndexType>
static void init_scoring(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[], ColStructure<IndexType> Col[],
                         IndexType A[], IndexType head[], double knobs[NKnobs], IndexType *p_n_row2,
                         IndexType *p_n_col2, IndexType *p_max_deg);

template <typename IndexType>
static IndexType find_ordering(IndexType n_row, IndexType n_col, IndexType Alen, RowStructure<IndexType> Row[],
                               ColStructure<IndexType> Col[], IndexType A[], IndexType head[], IndexType n_col2,
                               IndexType max_deg, IndexType pfree);

template <typename IndexType>
static void order_children(IndexType n_col, ColStructure<IndexType> Col[], IndexType p[]);

template <typename IndexType>
static void detect_super_cols(ColStructure<IndexType> Col[], IndexType A[], IndexType head[], IndexType row_start,
                              IndexType row_length);

template <typename IndexType>
static IndexType garbage_collection(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[],
                                    ColStructure<IndexType> Col[], IndexType A[], IndexType *pfree);

template <typename IndexType>
static inline IndexType clear_mark(IndexType n_row, RowStructure<IndexType> Row[]);

/* === No debugging ========================================================= */

#define COLAMD_DEBUG0(params) ;
#define COLAMD_DEBUG1(params) ;
#define COLAMD_DEBUG2(params) ;
#define COLAMD_DEBUG3(params) ;
#define COLAMD_DEBUG4(params) ;

#define COLAMD_ASSERT(expression) ((void)0)

/**
 * \brief Returns the recommended value of Alen
 *
 * Returns recommended value of Alen for use by colamd.
 * Returns -1 if any input argument is negative.
 * The use of this routine or macro is optional.
 * Note that the macro uses its arguments   more than once,
 * so be careful for side effects, if you pass expressions as arguments to COLAMD_RECOMMENDED.
 *
 * \param nnz nonzeros in A
 * \param n_row number of rows in A
 * \param n_col number of columns in A
 * \return recommended value of Alen for use by colamd
 */
template <typename IndexType>
inline IndexType recommended(IndexType nnz, IndexType n_row, IndexType n_col) {
  if ((nnz) < 0 || (n_row) < 0 || (n_col) < 0)
    return (-1);
  else
    return (2 * (nnz) + colamd_c(n_col) + colamd_r(n_row) + (n_col) + ((nnz) / 5));
}

/**
 * \brief set default parameters  The use of this routine is optional.
 *
 * Colamd: rows with more than (knobs [DenseRow] * n_col)
 * entries are removed prior to ordering.  Columns with more than
 * (knobs [DenseCol] * n_row) entries are removed prior to
 * ordering, and placed last in the output column ordering.
 *
 * DenseRow and DenseCol are defined as 0 and 1,
 * respectively, in colamd.h.  Default values of these two knobs
 * are both 0.5.  Currently, only knobs [0] and knobs [1] are
 * used, but future versions may use more knobs.  If so, they will
 * be properly set to their defaults by the future version of
 * colamd_set_defaults, so that the code that calls colamd will
 * not need to change, assuming that you either use
 * colamd_set_defaults, or pass a (double *) NULL pointer as the
 * knobs array to colamd or symamd.
 *
 * \param knobs parameter settings for colamd
 */

static inline void set_defaults(double knobs[NKnobs]) {
  /* === Local variables ================================================== */

  int i;

  if (!knobs) {
    return; /* no knobs to initialize */
  }
  for (i = 0; i < NKnobs; i++) {
    knobs[i] = 0;
  }
  knobs[Colamd::DenseRow] = 0.5; /* ignore rows over 50% dense */
  knobs[Colamd::DenseCol] = 0.5; /* ignore columns over 50% dense */
}

/**
 * \brief  Computes a column ordering using the column approximate minimum degree ordering
 *
 * Computes a column ordering (Q) of A such that P(AQ)=LU or
 * (AQ)'AQ=LL' have less fill-in and require fewer floating point
 * operations than factorizing the unpermuted matrix A or A'A,
 * respectively.
 *
 *
 * \param n_row number of rows in A
 * \param n_col number of columns in A
 * \param Alen size of the array A
 * \param A row indices of the matrix, of size ALen
 * \param p column pointers of A, of size n_col+1
 * \param knobs parameter settings for colamd
 * \param stats colamd output statistics and error codes
 */
template <typename IndexType>
static bool compute_ordering(IndexType n_row, IndexType n_col, IndexType Alen, IndexType *A, IndexType *p,
                             double knobs[NKnobs], IndexType stats[NStats]) {
  /* === Local variables ================================================== */

  IndexType i;                          /* loop index */
  IndexType nnz;                        /* nonzeros in A */
  IndexType Row_size;                   /* size of Row [], in integers */
  IndexType Col_size;                   /* size of Col [], in integers */
  IndexType need;                       /* minimum required length of A */
  Colamd::RowStructure<IndexType> *Row; /* pointer into A of Row [0..n_row] array */
  Colamd::ColStructure<IndexType> *Col; /* pointer into A of Col [0..n_col] array */
  IndexType n_col2;                     /* number of non-dense, non-empty columns */
  IndexType n_row2;                     /* number of non-dense, non-empty rows */
  IndexType ngarbage;                   /* number of garbage collections performed */
  IndexType max_deg;                    /* maximum row degree */
  double default_knobs[NKnobs];         /* default knobs array */

  /* === Check the input arguments ======================================== */

  if (!stats) {
    COLAMD_DEBUG0(("colamd: stats not present\n"));
    return (false);
  }
  for (i = 0; i < NStats; i++) {
    stats[i] = 0;
  }
  stats[Colamd::Status] = Colamd::Ok;
  stats[Colamd::Info1] = -1;
  stats[Colamd::Info2] = -1;

  if (!A) /* A is not present */
  {
    stats[Colamd::Status] = Colamd::ErrorANotPresent;
    COLAMD_DEBUG0(("colamd: A not present\n"));
    return (false);
  }

  if (!p) /* p is not present */
  {
    stats[Colamd::Status] = Colamd::ErrorPNotPresent;
    COLAMD_DEBUG0(("colamd: p not present\n"));
    return (false);
  }

  if (n_row < 0) /* n_row must be >= 0 */
  {
    stats[Colamd::Status] = Colamd::ErrorNrowNegative;
    stats[Colamd::Info1] = n_row;
    COLAMD_DEBUG0(("colamd: nrow negative %d\n", n_row));
    return (false);
  }

  if (n_col < 0) /* n_col must be >= 0 */
  {
    stats[Colamd::Status] = Colamd::ErrorNcolNegative;
    stats[Colamd::Info1] = n_col;
    COLAMD_DEBUG0(("colamd: ncol negative %d\n", n_col));
    return (false);
  }

  nnz = p[n_col];
  if (nnz < 0) /* nnz must be >= 0 */
  {
    stats[Colamd::Status] = Colamd::ErrorNnzNegative;
    stats[Colamd::Info1] = nnz;
    COLAMD_DEBUG0(("colamd: number of entries negative %d\n", nnz));
    return (false);
  }

  if (p[0] != 0) {
    stats[Colamd::Status] = Colamd::ErrorP0Nonzero;
    stats[Colamd::Info1] = p[0];
    COLAMD_DEBUG0(("colamd: p[0] not zero %d\n", p[0]));
    return (false);
  }

  /* === If no knobs, set default knobs =================================== */

  if (!knobs) {
    set_defaults(default_knobs);
    knobs = default_knobs;
  }

  /* === Allocate the Row and Col arrays from array A ===================== */

  Col_size = colamd_c(n_col);
  Row_size = colamd_r(n_row);
  need = 2 * nnz + n_col + Col_size + Row_size;

  if (need > Alen) {
    /* not enough space in array A to perform the ordering */
    stats[Colamd::Status] = Colamd::ErrorATooSmall;
    stats[Colamd::Info1] = need;
    stats[Colamd::Info2] = Alen;
    COLAMD_DEBUG0(("colamd: Need Alen >= %d, given only Alen = %d\n", need, Alen));
    return (false);
  }

  Alen -= Col_size + Row_size;
  Col = (ColStructure<IndexType> *)&A[Alen];
  Row = (RowStructure<IndexType> *)&A[Alen + Col_size];

  /* === Construct the row and column data structures ===================== */

  if (!Colamd::init_rows_cols(n_row, n_col, Row, Col, A, p, stats)) {
    /* input matrix is invalid */
    COLAMD_DEBUG0(("colamd: Matrix invalid\n"));
    return (false);
  }

  /* === Initialize scores, kill dense rows/columns ======================= */

  Colamd::init_scoring(n_row, n_col, Row, Col, A, p, knobs, &n_row2, &n_col2, &max_deg);

  /* === Order the supercolumns =========================================== */

  ngarbage = Colamd::find_ordering(n_row, n_col, Alen, Row, Col, A, p, n_col2, max_deg, 2 * nnz);

  /* === Order the non-principal columns ================================== */

  Colamd::order_children(n_col, Col, p);

  /* === Return statistics in stats ======================================= */

  stats[Colamd::DenseRow] = n_row - n_row2;
  stats[Colamd::DenseCol] = n_col - n_col2;
  stats[Colamd::DefragCount] = ngarbage;
  COLAMD_DEBUG0(("colamd: done.\n"));
  return (true);
}

/* ========================================================================== */
/* === NON-USER-CALLABLE ROUTINES: ========================================== */
/* ========================================================================== */

/* There are no user-callable routines beyond this point in the file */

/* ========================================================================== */
/* === init_rows_cols ======================================================= */
/* ========================================================================== */

/*
  Takes the column form of the matrix in A and creates the row form of the
  matrix.  Also, row and column attributes are stored in the Col and Row
  structs.  If the columns are un-sorted or contain duplicate row indices,
  this routine will also sort and remove duplicate row indices from the
  column form of the matrix.  Returns false if the matrix is invalid,
  true otherwise.  Not user-callable.
*/
template <typename IndexType>
static IndexType init_rows_cols /* returns true if OK, or false otherwise */
    (
        /* === Parameters ======================================================= */

        IndexType n_row,               /* number of rows of A */
        IndexType n_col,               /* number of columns of A */
        RowStructure<IndexType> Row[], /* of size n_row+1 */
        ColStructure<IndexType> Col[], /* of size n_col+1 */
        IndexType A[],                 /* row indices of A, of size Alen */
        IndexType p[],                 /* pointers to columns in A, of size n_col+1 */
        IndexType stats[NStats]        /* colamd statistics */
    ) {
  /* === Local variables ================================================== */

  IndexType col;      /* a column index */
  IndexType row;      /* a row index */
  IndexType *cp;      /* a column pointer */
  IndexType *cp_end;  /* a pointer to the end of a column */
  IndexType *rp;      /* a row pointer */
  IndexType *rp_end;  /* a pointer to the end of a row */
  IndexType last_row; /* previous row */

  /* === Initialize columns, and check column pointers ==================== */

  for (col = 0; col < n_col; col++) {
    Col[col].start = p[col];
    Col[col].length = p[col + 1] - p[col];

    if ((Col[col].length) < 0)  // extra parentheses to work-around gcc bug 10200
    {
      /* column pointers must be non-decreasing */
      stats[Colamd::Status] = Colamd::ErrorColLengthNegative;
      stats[Colamd::Info1] = col;
      stats[Colamd::Info2] = Col[col].length;
      COLAMD_DEBUG0(("colamd: col %d length %d < 0\n", col, Col[col].length));
      return (false);
    }

    Col[col].shared1.thickness = 1;
    Col[col].shared2.score = 0;
    Col[col].shared3.prev = Empty;
    Col[col].shared4.degree_next = Empty;
  }

  /* p [0..n_col] no longer needed, used as "head" in subsequent routines */

  /* === Scan columns, compute row degrees, and check row indices ========= */

  stats[Info3] = 0; /* number of duplicate or unsorted row indices*/

  for (row = 0; row < n_row; row++) {
    Row[row].length = 0;
    Row[row].shared2.mark = -1;
  }

  for (col = 0; col < n_col; col++) {
    last_row = -1;

    cp = &A[p[col]];
    cp_end = &A[p[col + 1]];

    while (cp < cp_end) {
      row = *cp++;

      /* make sure row indices within range */
      if (row < 0 || row >= n_row) {
        stats[Colamd::Status] = Colamd::ErrorRowIndexOutOfBounds;
        stats[Colamd::Info1] = col;
        stats[Colamd::Info2] = row;
        stats[Colamd::Info3] = n_row;
        COLAMD_DEBUG0(("colamd: row %d col %d out of bounds\n", row, col));
        return (false);
      }

      if (row <= last_row || Row[row].shared2.mark == col) {
        /* row index are unsorted or repeated (or both), thus col */
        /* is jumbled.  This is a notice, not an error condition. */
        stats[Colamd::Status] = Colamd::OkButJumbled;
        stats[Colamd::Info1] = col;
        stats[Colamd::Info2] = row;
        (stats[Colamd::Info3])++;
        COLAMD_DEBUG1(("colamd: row %d col %d unsorted/duplicate\n", row, col));
      }

      if (Row[row].shared2.mark != col) {
        Row[row].length++;
      } else {
        /* this is a repeated entry in the column, */
        /* it will be removed */
        Col[col].length--;
      }

      /* mark the row as having been seen in this column */
      Row[row].shared2.mark = col;

      last_row = row;
    }
  }

  /* === Compute row pointers ============================================= */

  /* row form of the matrix starts directly after the column */
  /* form of matrix in A */
  Row[0].start = p[n_col];
  Row[0].shared1.p = Row[0].start;
  Row[0].shared2.mark = -1;
  for (row = 1; row < n_row; row++) {
    Row[row].start = Row[row - 1].start + Row[row - 1].length;
    Row[row].shared1.p = Row[row].start;
    Row[row].shared2.mark = -1;
  }

  /* === Create row form ================================================== */

  if (stats[Status] == OkButJumbled) {
    /* if cols jumbled, watch for repeated row indices */
    for (col = 0; col < n_col; col++) {
      cp = &A[p[col]];
      cp_end = &A[p[col + 1]];
      while (cp < cp_end) {
        row = *cp++;
        if (Row[row].shared2.mark != col) {
          A[(Row[row].shared1.p)++] = col;
          Row[row].shared2.mark = col;
        }
      }
    }
  } else {
    /* if cols not jumbled, we don't need the mark (this is faster) */
    for (col = 0; col < n_col; col++) {
      cp = &A[p[col]];
      cp_end = &A[p[col + 1]];
      while (cp < cp_end) {
        A[(Row[*cp++].shared1.p)++] = col;
      }
    }
  }

  /* === Clear the row marks and set row degrees ========================== */

  for (row = 0; row < n_row; row++) {
    Row[row].shared2.mark = 0;
    Row[row].shared1.degree = Row[row].length;
  }

  /* === See if we need to re-create columns ============================== */

  if (stats[Status] == OkButJumbled) {
    COLAMD_DEBUG0(("colamd: reconstructing column form, matrix jumbled\n"));

    /* === Compute col pointers ========================================= */

    /* col form of the matrix starts at A [0]. */
    /* Note, we may have a gap between the col form and the row */
    /* form if there were duplicate entries, if so, it will be */
    /* removed upon the first garbage collection */
    Col[0].start = 0;
    p[0] = Col[0].start;
    for (col = 1; col < n_col; col++) {
      /* note that the lengths here are for pruned columns, i.e. */
      /* no duplicate row indices will exist for these columns */
      Col[col].start = Col[col - 1].start + Col[col - 1].length;
      p[col] = Col[col].start;
    }

    /* === Re-create col form =========================================== */

    for (row = 0; row < n_row; row++) {
      rp = &A[Row[row].start];
      rp_end = rp + Row[row].length;
      while (rp < rp_end) {
        A[(p[*rp++])++] = row;
      }
    }
  }

  /* === Done.  Matrix is not (or no longer) jumbled ====================== */

  return (true);
}

/* ========================================================================== */
/* === init_scoring ========================================================= */
/* ========================================================================== */

/*
  Kills dense or empty columns and rows, calculates an initial score for
  each column, and places all columns in the degree lists.  Not user-callable.
*/
template <typename IndexType>
static void init_scoring(
    /* === Parameters ======================================================= */

    IndexType n_row,               /* number of rows of A */
    IndexType n_col,               /* number of columns of A */
    RowStructure<IndexType> Row[], /* of size n_row+1 */
    ColStructure<IndexType> Col[], /* of size n_col+1 */
    IndexType A[],                 /* column form and row form of A */
    IndexType head[],              /* of size n_col+1 */
    double knobs[NKnobs],          /* parameters */
    IndexType *p_n_row2,           /* number of non-dense, non-empty rows */
    IndexType *p_n_col2,           /* number of non-dense, non-empty columns */
    IndexType *p_max_deg           /* maximum row degree */
) {
  /* === Local variables ================================================== */

  IndexType c;               /* a column index */
  IndexType r, row;          /* a row index */
  IndexType *cp;             /* a column pointer */
  IndexType deg;             /* degree of a row or column */
  IndexType *cp_end;         /* a pointer to the end of a column */
  IndexType *new_cp;         /* new column pointer */
  IndexType col_length;      /* length of pruned column */
  IndexType score;           /* current column score */
  IndexType n_col2;          /* number of non-dense, non-empty columns */
  IndexType n_row2;          /* number of non-dense, non-empty rows */
  IndexType dense_row_count; /* remove rows with more entries than this */
  IndexType dense_col_count; /* remove cols with more entries than this */
  IndexType min_score;       /* smallest column score */
  IndexType max_deg;         /* maximum row degree */
  IndexType next_col;        /* Used to add to degree list.*/

  /* === Extract knobs ==================================================== */

  dense_row_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs[Colamd::DenseRow] * n_col), n_col));
  dense_col_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs[Colamd::DenseCol] * n_row), n_row));
  COLAMD_DEBUG1(("colamd: densecount: %d %d\n", dense_row_count, dense_col_count));
  max_deg = 0;
  n_col2 = n_col;
  n_row2 = n_row;

  /* === Kill empty columns =============================================== */

  /* Put the empty columns at the end in their natural order, so that LU */
  /* factorization can proceed as far as possible. */
  for (c = n_col - 1; c >= 0; c--) {
    deg = Col[c].length;
    if (deg == 0) {
      /* this is a empty column, kill and order it last */
      Col[c].shared2.order = --n_col2;
      Col[c].kill_principal();
    }
  }
  COLAMD_DEBUG1(("colamd: null columns killed: %d\n", n_col - n_col2));

  /* === Kill dense columns =============================================== */

  /* Put the dense columns at the end, in their natural order */
  for (c = n_col - 1; c >= 0; c--) {
    /* skip any dead columns */
    if (Col[c].is_dead()) {
      continue;
    }
    deg = Col[c].length;
    if (deg > dense_col_count) {
      /* this is a dense column, kill and order it last */
      Col[c].shared2.order = --n_col2;
      /* decrement the row degrees */
      cp = &A[Col[c].start];
      cp_end = cp + Col[c].length;
      while (cp < cp_end) {
        Row[*cp++].shared1.degree--;
      }
      Col[c].kill_principal();
    }
  }
  COLAMD_DEBUG1(("colamd: Dense and null columns killed: %d\n", n_col - n_col2));

  /* === Kill dense and empty rows ======================================== */

  for (r = 0; r < n_row; r++) {
    deg = Row[r].shared1.degree;
    COLAMD_ASSERT(deg >= 0 && deg <= n_col);
    if (deg > dense_row_count || deg == 0) {
      /* kill a dense or empty row */
      Row[r].kill();
      --n_row2;
    } else {
      /* keep track of max degree of remaining rows */
      max_deg = numext::maxi(max_deg, deg);
    }
  }
  COLAMD_DEBUG1(("colamd: Dense and null rows killed: %d\n", n_row - n_row2));

  /* === Compute initial column scores ==================================== */

  /* At this point the row degrees are accurate.  They reflect the number */
  /* of "live" (non-dense) columns in each row.  No empty rows exist. */
  /* Some "live" columns may contain only dead rows, however.  These are */
  /* pruned in the code below. */

  /* now find the initial matlab score for each column */
  for (c = n_col - 1; c >= 0; c--) {
    /* skip dead column */
    if (Col[c].is_dead()) {
      continue;
    }
    score = 0;
    cp = &A[Col[c].start];
    new_cp = cp;
    cp_end = cp + Col[c].length;
    while (cp < cp_end) {
      /* get a row */
      row = *cp++;
      /* skip if dead */
      if (Row[row].is_dead()) {
        continue;
      }
      /* compact the column */
      *new_cp++ = row;
      /* add row's external degree */
      score += Row[row].shared1.degree - 1;
      /* guard against integer overflow */
      score = numext::mini(score, n_col);
    }
    /* determine pruned column length */
    col_length = (IndexType)(new_cp - &A[Col[c].start]);
    if (col_length == 0) {
      /* a newly-made null column (all rows in this col are "dense" */
      /* and have already been killed) */
      COLAMD_DEBUG2(("Newly null killed: %d\n", c));
      Col[c].shared2.order = --n_col2;
      Col[c].kill_principal();
    } else {
      /* set column length and set score */
      COLAMD_ASSERT(score >= 0);
      COLAMD_ASSERT(score <= n_col);
      Col[c].length = col_length;
      Col[c].shared2.score = score;
    }
  }
  COLAMD_DEBUG1(("colamd: Dense, null, and newly-null columns killed: %d\n", n_col - n_col2));

  /* At this point, all empty rows and columns are dead.  All live columns */
  /* are "clean" (containing no dead rows) and simplicial (no supercolumns */
  /* yet).  Rows may contain dead columns, but all live rows contain at */
  /* least one live column. */

  /* === Initialize degree lists ========================================== */

  /* clear the hash buckets */
  for (c = 0; c <= n_col; c++) {
    head[c] = Empty;
  }
  min_score = n_col;
  /* place in reverse order, so low column indices are at the front */
  /* of the lists.  This is to encourage natural tie-breaking */
  for (c = n_col - 1; c >= 0; c--) {
    /* only add principal columns to degree lists */
    if (Col[c].is_alive()) {
      COLAMD_DEBUG4(("place %d score %d minscore %d ncol %d\n", c, Col[c].shared2.score, min_score, n_col));

      /* === Add columns score to DList =============================== */

      score = Col[c].shared2.score;

      COLAMD_ASSERT(min_score >= 0);
      COLAMD_ASSERT(min_score <= n_col);
      COLAMD_ASSERT(score >= 0);
      COLAMD_ASSERT(score <= n_col);
      COLAMD_ASSERT(head[score] >= Empty);

      /* now add this column to dList at proper score location */
      next_col = head[score];
      Col[c].shared3.prev = Empty;
      Col[c].shared4.degree_next = next_col;

      /* if there already was a column with the same score, set its */
      /* previous pointer to this new column */
      if (next_col != Empty) {
        Col[next_col].shared3.prev = c;
      }
      head[score] = c;

      /* see if this score is less than current min */
      min_score = numext::mini(min_score, score);
    }
  }

  /* === Return number of remaining columns, and max row degree =========== */

  *p_n_col2 = n_col2;
  *p_n_row2 = n_row2;
  *p_max_deg = max_deg;
}

/* ========================================================================== */
/* === find_ordering ======================================================== */
/* ========================================================================== */

/*
  Order the principal columns of the supercolumn form of the matrix
  (no supercolumns on input).  Uses a minimum approximate column minimum
  degree ordering method.  Not user-callable.
*/
template <typename IndexType>
static IndexType find_ordering /* return the number of garbage collections */
    (
        /* === Parameters ======================================================= */

        IndexType n_row,               /* number of rows of A */
        IndexType n_col,               /* number of columns of A */
        IndexType Alen,                /* size of A, 2*nnz + n_col or larger */
        RowStructure<IndexType> Row[], /* of size n_row+1 */
        ColStructure<IndexType> Col[], /* of size n_col+1 */
        IndexType A[],                 /* column form and row form of A */
        IndexType head[],              /* of size n_col+1 */
        IndexType n_col2,              /* Remaining columns to order */
        IndexType max_deg,             /* Maximum row degree */
        IndexType pfree                /* index of first free slot (2*nnz on entry) */
    ) {
  /* === Local variables ================================================== */

  IndexType k;                   /* current pivot ordering step */
  IndexType pivot_col;           /* current pivot column */
  IndexType *cp;                 /* a column pointer */
  IndexType *rp;                 /* a row pointer */
  IndexType pivot_row;           /* current pivot row */
  IndexType *new_cp;             /* modified column pointer */
  IndexType *new_rp;             /* modified row pointer */
  IndexType pivot_row_start;     /* pointer to start of pivot row */
  IndexType pivot_row_degree;    /* number of columns in pivot row */
  IndexType pivot_row_length;    /* number of supercolumns in pivot row */
  IndexType pivot_col_score;     /* score of pivot column */
  IndexType needed_memory;       /* free space needed for pivot row */
  IndexType *cp_end;             /* pointer to the end of a column */
  IndexType *rp_end;             /* pointer to the end of a row */
  IndexType row;                 /* a row index */
  IndexType col;                 /* a column index */
  IndexType max_score;           /* maximum possible score */
  IndexType cur_score;           /* score of current column */
  unsigned int hash;             /* hash value for supernode detection */
  IndexType head_column;         /* head of hash bucket */
  IndexType first_col;           /* first column in hash bucket */
  IndexType tag_mark;            /* marker value for mark array */
  IndexType row_mark;            /* Row [row].shared2.mark */
  IndexType set_difference;      /* set difference size of row with pivot row */
  IndexType min_score;           /* smallest column score */
  IndexType col_thickness;       /* "thickness" (no. of columns in a supercol) */
  IndexType max_mark;            /* maximum value of tag_mark */
  IndexType pivot_col_thickness; /* number of columns represented by pivot col */
  IndexType prev_col;            /* Used by Dlist operations. */
  IndexType next_col;            /* Used by Dlist operations. */
  IndexType ngarbage;            /* number of garbage collections performed */

  /* === Initialization and clear mark ==================================== */

  max_mark = INT_MAX - n_col; /* INT_MAX defined in <limits.h> */
  tag_mark = Colamd::clear_mark(n_row, Row);
  min_score = 0;
  ngarbage = 0;
  COLAMD_DEBUG1(("colamd: Ordering, n_col2=%d\n", n_col2));

  /* === Order the columns ================================================ */

  for (k = 0; k < n_col2; /* 'k' is incremented below */) {
    /* === Select pivot column, and order it ============================ */

    /* make sure degree list isn't empty */
    COLAMD_ASSERT(min_score >= 0);
    COLAMD_ASSERT(min_score <= n_col);
    COLAMD_ASSERT(head[min_score] >= Empty);

    /* get pivot column from head of minimum degree list */
    while (min_score < n_col && head[min_score] == Empty) {
      min_score++;
    }
    pivot_col = head[min_score];
    COLAMD_ASSERT(pivot_col >= 0 && pivot_col <= n_col);
    next_col = Col[pivot_col].shared4.degree_next;
    head[min_score] = next_col;
    if (next_col != Empty) {
      Col[next_col].shared3.prev = Empty;
    }

    COLAMD_ASSERT(Col[pivot_col].is_alive());
    COLAMD_DEBUG3(("Pivot col: %d\n", pivot_col));

    /* remember score for defrag check */
    pivot_col_score = Col[pivot_col].shared2.score;

    /* the pivot column is the kth column in the pivot order */
    Col[pivot_col].shared2.order = k;

    /* increment order count by column thickness */
    pivot_col_thickness = Col[pivot_col].shared1.thickness;
    k += pivot_col_thickness;
    COLAMD_ASSERT(pivot_col_thickness > 0);

    /* === Garbage_collection, if necessary ============================= */

    needed_memory = numext::mini(pivot_col_score, n_col - k);
    if (pfree + needed_memory >= Alen) {
      pfree = Colamd::garbage_collection(n_row, n_col, Row, Col, A, &A[pfree]);
      ngarbage++;
      /* after garbage collection we will have enough */
      COLAMD_ASSERT(pfree + needed_memory < Alen);
      /* garbage collection has wiped out the Row[].shared2.mark array */
      tag_mark = Colamd::clear_mark(n_row, Row);
    }

    /* === Compute pivot row pattern ==================================== */

    /* get starting location for this new merged row */
    pivot_row_start = pfree;

    /* initialize new row counts to zero */
    pivot_row_degree = 0;

    /* tag pivot column as having been visited so it isn't included */
    /* in merged pivot row */
    Col[pivot_col].shared1.thickness = -pivot_col_thickness;

    /* pivot row is the union of all rows in the pivot column pattern */
    cp = &A[Col[pivot_col].start];
    cp_end = cp + Col[pivot_col].length;
    while (cp < cp_end) {
      /* get a row */
      row = *cp++;
      COLAMD_DEBUG4(("Pivot col pattern %d %d\n", Row[row].is_alive(), row));
      /* skip if row is dead */
      if (Row[row].is_dead()) {
        continue;
      }
      rp = &A[Row[row].start];
      rp_end = rp + Row[row].length;
      while (rp < rp_end) {
        /* get a column */
        col = *rp++;
        /* add the column, if alive and untagged */
        col_thickness = Col[col].shared1.thickness;
        if (col_thickness > 0 && Col[col].is_alive()) {
          /* tag column in pivot row */
          Col[col].shared1.thickness = -col_thickness;
          COLAMD_ASSERT(pfree < Alen);
          /* place column in pivot row */
          A[pfree++] = col;
          pivot_row_degree += col_thickness;
        }
      }
    }

    /* clear tag on pivot column */
    Col[pivot_col].shared1.thickness = pivot_col_thickness;
    max_deg = numext::maxi(max_deg, pivot_row_degree);

    /* === Kill all rows used to construct pivot row ==================== */

    /* also kill pivot row, temporarily */
    cp = &A[Col[pivot_col].start];
    cp_end = cp + Col[pivot_col].length;
    while (cp < cp_end) {
      /* may be killing an already dead row */
      row = *cp++;
      COLAMD_DEBUG3(("Kill row in pivot col: %d\n", row));
      Row[row].kill();
    }

    /* === Select a row index to use as the new pivot row =============== */

    pivot_row_length = pfree - pivot_row_start;
    if (pivot_row_length > 0) {
      /* pick the "pivot" row arbitrarily (first row in col) */
      pivot_row = A[Col[pivot_col].start];
      COLAMD_DEBUG3(("Pivotal row is %d\n", pivot_row));
    } else {
      /* there is no pivot row, since it is of zero length */
      pivot_row = Empty;
      COLAMD_ASSERT(pivot_row_length == 0);
    }
    COLAMD_ASSERT(Col[pivot_col].length > 0 || pivot_row_length == 0);

    /* === Approximate degree computation =============================== */

    /* Here begins the computation of the approximate degree.  The column */
    /* score is the sum of the pivot row "length", plus the size of the */
    /* set differences of each row in the column minus the pattern of the */
    /* pivot row itself.  The column ("thickness") itself is also */
    /* excluded from the column score (we thus use an approximate */
    /* external degree). */

    /* The time taken by the following code (compute set differences, and */
    /* add them up) is proportional to the size of the data structure */
    /* being scanned - that is, the sum of the sizes of each column in */
    /* the pivot row.  Thus, the amortized time to compute a column score */
    /* is proportional to the size of that column (where size, in this */
    /* context, is the column "length", or the number of row indices */
    /* in that column).  The number of row indices in a column is */
    /* monotonically non-decreasing, from the length of the original */
    /* column on input to colamd. */

    /* === Compute set differences ====================================== */

    COLAMD_DEBUG3(("** Computing set differences phase. **\n"));

    /* pivot row is currently dead - it will be revived later. */

    COLAMD_DEBUG3(("Pivot row: "));
    /* for each column in pivot row */
    rp = &A[pivot_row_start];
    rp_end = rp + pivot_row_length;
    while (rp < rp_end) {
      col = *rp++;
      COLAMD_ASSERT(Col[col].is_alive() && col != pivot_col);
      COLAMD_DEBUG3(("Col: %d\n", col));

      /* clear tags used to construct pivot row pattern */
      col_thickness = -Col[col].shared1.thickness;
      COLAMD_ASSERT(col_thickness > 0);
      Col[col].shared1.thickness = col_thickness;

      /* === Remove column from degree list =========================== */

      cur_score = Col[col].shared2.score;
      prev_col = Col[col].shared3.prev;
      next_col = Col[col].shared4.degree_next;
      COLAMD_ASSERT(cur_score >= 0);
      COLAMD_ASSERT(cur_score <= n_col);
      COLAMD_ASSERT(cur_score >= Empty);
      if (prev_col == Empty) {
        head[cur_score] = next_col;
      } else {
        Col[prev_col].shared4.degree_next = next_col;
      }
      if (next_col != Empty) {
        Col[next_col].shared3.prev = prev_col;
      }

      /* === Scan the column ========================================== */

      cp = &A[Col[col].start];
      cp_end = cp + Col[col].length;
      while (cp < cp_end) {
        /* get a row */
        row = *cp++;
        /* skip if dead */
        if (Row[row].is_dead()) {
          continue;
        }
        row_mark = Row[row].shared2.mark;
        COLAMD_ASSERT(row != pivot_row);
        set_difference = row_mark - tag_mark;
        /* check if the row has been seen yet */
        if (set_difference < 0) {
          COLAMD_ASSERT(Row[row].shared1.degree <= max_deg);
          set_difference = Row[row].shared1.degree;
        }
        /* subtract column thickness from this row's set difference */
        set_difference -= col_thickness;
        COLAMD_ASSERT(set_difference >= 0);
        /* absorb this row if the set difference becomes zero */
        if (set_difference == 0) {
          COLAMD_DEBUG3(("aggressive absorption. Row: %d\n", row));
          Row[row].kill();
        } else {
          /* save the new mark */
          Row[row].shared2.mark = set_difference + tag_mark;
        }
      }
    }

    /* === Add up set differences for each column ======================= */

    COLAMD_DEBUG3(("** Adding set differences phase. **\n"));

    /* for each column in pivot row */
    rp = &A[pivot_row_start];
    rp_end = rp + pivot_row_length;
    while (rp < rp_end) {
      /* get a column */
      col = *rp++;
      COLAMD_ASSERT(Col[col].is_alive() && col != pivot_col);
      hash = 0;
      cur_score = 0;
      cp = &A[Col[col].start];
      /* compact the column */
      new_cp = cp;
      cp_end = cp + Col[col].length;

      COLAMD_DEBUG4(("Adding set diffs for Col: %d.\n", col));

      while (cp < cp_end) {
        /* get a row */
        row = *cp++;
        COLAMD_ASSERT(row >= 0 && row < n_row);
        /* skip if dead */
        if (Row[row].is_dead()) {
          continue;
        }
        row_mark = Row[row].shared2.mark;
        COLAMD_ASSERT(row_mark > tag_mark);
        /* compact the column */
        *new_cp++ = row;
        /* compute hash function */
        hash += row;
        /* add set difference */
        cur_score += row_mark - tag_mark;
        /* integer overflow... */
        cur_score = numext::mini(cur_score, n_col);
      }

      /* recompute the column's length */
      Col[col].length = (IndexType)(new_cp - &A[Col[col].start]);

      /* === Further mass elimination ================================= */

      if (Col[col].length == 0) {
        COLAMD_DEBUG4(("further mass elimination. Col: %d\n", col));
        /* nothing left but the pivot row in this column */
        Col[col].kill_principal();
        pivot_row_degree -= Col[col].shared1.thickness;
        COLAMD_ASSERT(pivot_row_degree >= 0);
        /* order it */
        Col[col].shared2.order = k;
        /* increment order count by column thickness */
        k += Col[col].shared1.thickness;
      } else {
        /* === Prepare for supercolumn detection ==================== */

        COLAMD_DEBUG4(("Preparing supercol detection for Col: %d.\n", col));

        /* save score so far */
        Col[col].shared2.score = cur_score;

        /* add column to hash table, for supercolumn detection */
        hash %= n_col + 1;

        COLAMD_DEBUG4((" Hash = %d, n_col = %d.\n", hash, n_col));
        COLAMD_ASSERT(hash <= n_col);

        head_column = head[hash];
        if (head_column > Empty) {
          /* degree list "hash" is non-empty, use prev (shared3) of */
          /* first column in degree list as head of hash bucket */
          first_col = Col[head_column].shared3.headhash;
          Col[head_column].shared3.headhash = col;
        } else {
          /* degree list "hash" is empty, use head as hash bucket */
          first_col = -(head_column + 2);
          head[hash] = -(col + 2);
        }
        Col[col].shared4.hash_next = first_col;

        /* save hash function in Col [col].shared3.hash */
        Col[col].shared3.hash = (IndexType)hash;
        COLAMD_ASSERT(Col[col].is_alive());
      }
    }

    /* The approximate external column degree is now computed.  */

    /* === Supercolumn detection ======================================== */

    COLAMD_DEBUG3(("** Supercolumn detection phase. **\n"));

    Colamd::detect_super_cols(Col, A, head, pivot_row_start, pivot_row_length);

    /* === Kill the pivotal column ====================================== */

    Col[pivot_col].kill_principal();

    /* === Clear mark =================================================== */

    tag_mark += (max_deg + 1);
    if (tag_mark >= max_mark) {
      COLAMD_DEBUG2(("clearing tag_mark\n"));
      tag_mark = Colamd::clear_mark(n_row, Row);
    }

    /* === Finalize the new pivot row, and column scores ================ */

    COLAMD_DEBUG3(("** Finalize scores phase. **\n"));

    /* for each column in pivot row */
    rp = &A[pivot_row_start];
    /* compact the pivot row */
    new_rp = rp;
    rp_end = rp + pivot_row_length;
    while (rp < rp_end) {
      col = *rp++;
      /* skip dead columns */
      if (Col[col].is_dead()) {
        continue;
      }
      *new_rp++ = col;
      /* add new pivot row to column */
      A[Col[col].start + (Col[col].length++)] = pivot_row;

      /* retrieve score so far and add on pivot row's degree. */
      /* (we wait until here for this in case the pivot */
      /* row's degree was reduced due to mass elimination). */
      cur_score = Col[col].shared2.score + pivot_row_degree;

      /* calculate the max possible score as the number of */
      /* external columns minus the 'k' value minus the */
      /* columns thickness */
      max_score = n_col - k - Col[col].shared1.thickness;

      /* make the score the external degree of the union-of-rows */
      cur_score -= Col[col].shared1.thickness;

      /* make sure score is less or equal than the max score */
      cur_score = numext::mini(cur_score, max_score);
      COLAMD_ASSERT(cur_score >= 0);

      /* store updated score */
      Col[col].shared2.score = cur_score;

      /* === Place column back in degree list ========================= */

      COLAMD_ASSERT(min_score >= 0);
      COLAMD_ASSERT(min_score <= n_col);
      COLAMD_ASSERT(cur_score >= 0);
      COLAMD_ASSERT(cur_score <= n_col);
      COLAMD_ASSERT(head[cur_score] >= Empty);
      next_col = head[cur_score];
      Col[col].shared4.degree_next = next_col;
      Col[col].shared3.prev = Empty;
      if (next_col != Empty) {
        Col[next_col].shared3.prev = col;
      }
      head[cur_score] = col;

      /* see if this score is less than current min */
      min_score = numext::mini(min_score, cur_score);
    }

    /* === Resurrect the new pivot row ================================== */

    if (pivot_row_degree > 0) {
      /* update pivot row length to reflect any cols that were killed */
      /* during super-col detection and mass elimination */
      Row[pivot_row].start = pivot_row_start;
      Row[pivot_row].length = (IndexType)(new_rp - &A[pivot_row_start]);
      Row[pivot_row].shared1.degree = pivot_row_degree;
      Row[pivot_row].shared2.mark = 0;
      /* pivot row is no longer dead */
    }
  }

  /* === All principal columns have now been ordered ====================== */

  return (ngarbage);
}

/* ========================================================================== */
/* === order_children ======================================================= */
/* ========================================================================== */

/*
  The find_ordering routine has ordered all of the principal columns (the
  representatives of the supercolumns).  The non-principal columns have not
  yet been ordered.  This routine orders those columns by walking up the
  parent tree (a column is a child of the column which absorbed it).  The
  final permutation vector is then placed in p [0 ... n_col-1], with p [0]
  being the first column, and p [n_col-1] being the last.  It doesn't look
  like it at first glance, but be assured that this routine takes time linear
  in the number of columns.  Although not immediately obvious, the time
  taken by this routine is O (n_col), that is, linear in the number of
  columns.  Not user-callable.
*/
template <typename IndexType>
static inline void order_children(
    /* === Parameters ======================================================= */

    IndexType n_col,               /* number of columns of A */
    ColStructure<IndexType> Col[], /* of size n_col+1 */
    IndexType p[]                  /* p [0 ... n_col-1] is the column permutation*/
) {
  /* === Local variables ================================================== */

  IndexType i;      /* loop counter for all columns */
  IndexType c;      /* column index */
  IndexType parent; /* index of column's parent */
  IndexType order;  /* column's order */

  /* === Order each non-principal column ================================== */

  for (i = 0; i < n_col; i++) {
    /* find an un-ordered non-principal column */
    COLAMD_ASSERT(col_is_dead(Col, i));
    if (!Col[i].is_dead_principal() && Col[i].shared2.order == Empty) {
      parent = i;
      /* once found, find its principal parent */
      do {
        parent = Col[parent].shared1.parent;
      } while (!Col[parent].is_dead_principal());

      /* now, order all un-ordered non-principal columns along path */
      /* to this parent.  collapse tree at the same time */
      c = i;
      /* get order of parent */
      order = Col[parent].shared2.order;

      do {
        COLAMD_ASSERT(Col[c].shared2.order == Empty);

        /* order this column */
        Col[c].shared2.order = order++;
        /* collapse tree */
        Col[c].shared1.parent = parent;

        /* get immediate parent of this column */
        c = Col[c].shared1.parent;

        /* continue until we hit an ordered column.  There are */
        /* guaranteed not to be anymore unordered columns */
        /* above an ordered column */
      } while (Col[c].shared2.order == Empty);

      /* re-order the super_col parent to largest order for this group */
      Col[parent].shared2.order = order;
    }
  }

  /* === Generate the permutation ========================================= */

  for (c = 0; c < n_col; c++) {
    p[Col[c].shared2.order] = c;
  }
}

/* ========================================================================== */
/* === detect_super_cols ==================================================== */
/* ========================================================================== */

/*
  Detects supercolumns by finding matches between columns in the hash buckets.
  Check amongst columns in the set A [row_start ... row_start + row_length-1].
  The columns under consideration are currently *not* in the degree lists,
  and have already been placed in the hash buckets.

  The hash bucket for columns whose hash function is equal to h is stored
  as follows:

  if head [h] is >= 0, then head [h] contains a degree list, so:

  head [h] is the first column in degree bucket h.
  Col [head [h]].headhash gives the first column in hash bucket h.

  otherwise, the degree list is empty, and:

  -(head [h] + 2) is the first column in hash bucket h.

  For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous
  column" pointer.  Col [c].shared3.hash is used instead as the hash number
  for that column.  The value of Col [c].shared4.hash_next is the next column
  in the same hash bucket.

  Assuming no, or "few" hash collisions, the time taken by this routine is
  linear in the sum of the sizes (lengths) of each column whose score has
  just been computed in the approximate degree computation.
  Not user-callable.
*/
template <typename IndexType>
static void detect_super_cols(
    /* === Parameters ======================================================= */

    ColStructure<IndexType> Col[], /* of size n_col+1 */
    IndexType A[],                 /* row indices of A */
    IndexType head[],              /* head of degree lists and hash buckets */
    IndexType row_start,           /* pointer to set of columns to check */
    IndexType row_length           /* number of columns to check */
) {
  /* === Local variables ================================================== */

  IndexType hash;        /* hash value for a column */
  IndexType *rp;         /* pointer to a row */
  IndexType c;           /* a column index */
  IndexType super_c;     /* column index of the column to absorb into */
  IndexType *cp1;        /* column pointer for column super_c */
  IndexType *cp2;        /* column pointer for column c */
  IndexType length;      /* length of column super_c */
  IndexType prev_c;      /* column preceding c in hash bucket */
  IndexType i;           /* loop counter */
  IndexType *rp_end;     /* pointer to the end of the row */
  IndexType col;         /* a column index in the row to check */
  IndexType head_column; /* first column in hash bucket or degree list */
  IndexType first_col;   /* first column in hash bucket */

  /* === Consider each column in the row ================================== */

  rp = &A[row_start];
  rp_end = rp + row_length;
  while (rp < rp_end) {
    col = *rp++;
    if (Col[col].is_dead()) {
      continue;
    }

    /* get hash number for this column */
    hash = Col[col].shared3.hash;
    COLAMD_ASSERT(hash <= n_col);

    /* === Get the first column in this hash bucket ===================== */

    head_column = head[hash];
    if (head_column > Empty) {
      first_col = Col[head_column].shared3.headhash;
    } else {
      first_col = -(head_column + 2);
    }

    /* === Consider each column in the hash bucket ====================== */

    for (super_c = first_col; super_c != Empty; super_c = Col[super_c].shared4.hash_next) {
      COLAMD_ASSERT(Col[super_c].is_alive());
      COLAMD_ASSERT(Col[super_c].shared3.hash == hash);
      length = Col[super_c].length;

      /* prev_c is the column preceding column c in the hash bucket */
      prev_c = super_c;

      /* === Compare super_c with all columns after it ================ */

      for (c = Col[super_c].shared4.hash_next; c != Empty; c = Col[c].shared4.hash_next) {
        COLAMD_ASSERT(c != super_c);
        COLAMD_ASSERT(Col[c].is_alive());
        COLAMD_ASSERT(Col[c].shared3.hash == hash);

        /* not identical if lengths or scores are different */
        if (Col[c].length != length || Col[c].shared2.score != Col[super_c].shared2.score) {
          prev_c = c;
          continue;
        }

        /* compare the two columns */
        cp1 = &A[Col[super_c].start];
        cp2 = &A[Col[c].start];

        for (i = 0; i < length; i++) {
          /* the columns are "clean" (no dead rows) */
          COLAMD_ASSERT(cp1->is_alive());
          COLAMD_ASSERT(cp2->is_alive());
          /* row indices will same order for both supercols, */
          /* no gather scatter necessary */
          if (*cp1++ != *cp2++) {
            break;
          }
        }

        /* the two columns are different if the for-loop "broke" */
        if (i != length) {
          prev_c = c;
          continue;
        }

        /* === Got it!  two columns are identical =================== */

        COLAMD_ASSERT(Col[c].shared2.score == Col[super_c].shared2.score);

        Col[super_c].shared1.thickness += Col[c].shared1.thickness;
        Col[c].shared1.parent = super_c;
        Col[c].kill_non_principal();
        /* order c later, in order_children() */
        Col[c].shared2.order = Empty;
        /* remove c from hash bucket */
        Col[prev_c].shared4.hash_next = Col[c].shared4.hash_next;
      }
    }

    /* === Empty this hash bucket ======================================= */

    if (head_column > Empty) {
      /* corresponding degree list "hash" is not empty */
      Col[head_column].shared3.headhash = Empty;
    } else {
      /* corresponding degree list "hash" is empty */
      head[hash] = Empty;
    }
  }
}

/* ========================================================================== */
/* === garbage_collection =================================================== */
/* ========================================================================== */

/*
  Defragments and compacts columns and rows in the workspace A.  Used when
  all available memory has been used while performing row merging.  Returns
  the index of the first free position in A, after garbage collection.  The
  time taken by this routine is linear is the size of the array A, which is
  itself linear in the number of nonzeros in the input matrix.
  Not user-callable.
*/
template <typename IndexType>
static IndexType garbage_collection /* returns the new value of pfree */
    (
        /* === Parameters ======================================================= */

        IndexType n_row,               /* number of rows */
        IndexType n_col,               /* number of columns */
        RowStructure<IndexType> Row[], /* row info */
        ColStructure<IndexType> Col[], /* column info */
        IndexType A[],                 /* A [0 ... Alen-1] holds the matrix */
        IndexType *pfree               /* &A [0] ... pfree is in use */
    ) {
  /* === Local variables ================================================== */

  IndexType *psrc;  /* source pointer */
  IndexType *pdest; /* destination pointer */
  IndexType j;      /* counter */
  IndexType r;      /* a row index */
  IndexType c;      /* a column index */
  IndexType length; /* length of a row or column */

  /* === Defragment the columns =========================================== */

  pdest = &A[0];
  for (c = 0; c < n_col; c++) {
    if (Col[c].is_alive()) {
      psrc = &A[Col[c].start];

      /* move and compact the column */
      COLAMD_ASSERT(pdest <= psrc);
      Col[c].start = (IndexType)(pdest - &A[0]);
      length = Col[c].length;
      for (j = 0; j < length; j++) {
        r = *psrc++;
        if (Row[r].is_alive()) {
          *pdest++ = r;
        }
      }
      Col[c].length = (IndexType)(pdest - &A[Col[c].start]);
    }
  }

  /* === Prepare to defragment the rows =================================== */

  for (r = 0; r < n_row; r++) {
    if (Row[r].is_alive()) {
      if (Row[r].length == 0) {
        /* this row is of zero length.  cannot compact it, so kill it */
        COLAMD_DEBUG3(("Defrag row kill\n"));
        Row[r].kill();
      } else {
        /* save first column index in Row [r].shared2.first_column */
        psrc = &A[Row[r].start];
        Row[r].shared2.first_column = *psrc;
        COLAMD_ASSERT(Row[r].is_alive());
        /* flag the start of the row with the one's complement of row */
        *psrc = ones_complement(r);
      }
    }
  }

  /* === Defragment the rows ============================================== */

  psrc = pdest;
  while (psrc < pfree) {
    /* find a negative number ... the start of a row */
    if (*psrc++ < 0) {
      psrc--;
      /* get the row index */
      r = ones_complement(*psrc);
      COLAMD_ASSERT(r >= 0 && r < n_row);
      /* restore first column index */
      *psrc = Row[r].shared2.first_column;
      COLAMD_ASSERT(Row[r].is_alive());

      /* move and compact the row */
      COLAMD_ASSERT(pdest <= psrc);
      Row[r].start = (IndexType)(pdest - &A[0]);
      length = Row[r].length;
      for (j = 0; j < length; j++) {
        c = *psrc++;
        if (Col[c].is_alive()) {
          *pdest++ = c;
        }
      }
      Row[r].length = (IndexType)(pdest - &A[Row[r].start]);
    }
  }
  /* ensure we found all the rows */
  COLAMD_ASSERT(debug_rows == 0);

  /* === Return the new value of pfree ==================================== */

  return ((IndexType)(pdest - &A[0]));
}

/* ========================================================================== */
/* === clear_mark =========================================================== */
/* ========================================================================== */

/*
  Clears the Row [].shared2.mark array, and returns the new tag_mark.
  Return value is the new tag_mark.  Not user-callable.
*/
template <typename IndexType>
static inline IndexType clear_mark /* return the new value for tag_mark */
    (
        /* === Parameters ======================================================= */

        IndexType n_row,              /* number of rows in A */
        RowStructure<IndexType> Row[] /* Row [0 ... n_row-1].shared2.mark is set to zero */
    ) {
  /* === Local variables ================================================== */

  IndexType r;

  for (r = 0; r < n_row; r++) {
    if (Row[r].is_alive()) {
      Row[r].shared2.mark = 0;
    }
  }
  return (1);
}

}  // namespace Colamd
}  // namespace internal
}  // namespace Eigen
#endif
