// // 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 an 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
