/* ========================================================================== */
/* === maxtrans mexFunction ================================================= */
/* ========================================================================== */

#define MIN(a,b) (((a) < (b)) ?  (a) : (b))

/* MAXTRANS: Find a column permutation for a zero-free diagonal.
 *
 * Usage:
 *
 * p = maxtrans (A) ;
 *
 * A (:,p) has a zero-free diagonal unless A is structurally singular.
 * If the matrix is structurally singular, the p will contain zeros.  Similar
 * to p = dmperm (A), except that dmperm returns a row permutation.
 */

/* ========================================================================== */

#include "mex.h"
#include "btf.h"

void mexFunction
(
    int	nargout,
    mxArray *pargout [ ],
    int	nargin,
    const mxArray *pargin [ ]
)
{
    int nrow, ncol, i, *Ap, *Ai, *Match, nfound, *Work ;
    double *Matchx ;

    /* ---------------------------------------------------------------------- */
    /* get inputs and allocate workspace */
    /* ---------------------------------------------------------------------- */

    if (nargin != 1 || nargout > 1)
    {
	mexErrMsgTxt ("Usage: p = maxtrans (A)") ;
    }
    nrow = mxGetM (pargin [0]) ;
    ncol = mxGetN (pargin [0]) ;
    if (!mxIsSparse (pargin [0]))
    {
    	mexErrMsgTxt ("maxtrans: A must be sparse, and non-empty") ;
    }

    /* get sparse matrix A */
    Ap = mxGetJc (pargin [0]) ;
    Ai = mxGetIr (pargin [0]) ;

    /* get output array */
    Match = mxMalloc (nrow * sizeof (int)) ;

    /* get workspace of size 5n (recursive version needs only 2n) */
    Work = mxMalloc (5*ncol * sizeof (int)) ;

    /* ---------------------------------------------------------------------- */
    /* perform the maximum transversal */
    /* ---------------------------------------------------------------------- */

    nfound = maxtrans (nrow, ncol, Ap, Ai, Match, Work) ;
    if (nfound < MIN (nrow, ncol))
    {
	printf ("maxtrans: A is structurally rank deficient\n") ;
    }

    /* ---------------------------------------------------------------------- */
    /* create outputs and free workspace */
    /* ---------------------------------------------------------------------- */

    pargout [0] = mxCreateDoubleMatrix (1, nrow, mxREAL) ;
    Matchx = mxGetPr (pargout [0]) ;
    for (i = 0 ; i < nrow ; i++)
    {
	Matchx [i] = Match [i] + 1 ;	/* convert to 1-based */
    }

    mxFree (Work) ;
    mxFree (Match) ;
}


syntax highlighted by Code2HTML, v. 0.9.1