256 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			256 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								/* === colamd/symamd prototypes and definitions ============================= */
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* COLAMD / SYMAMD include file
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    You must include this file (colamd.h) in any routine that uses colamd,
							 | 
						||
| 
								 | 
							
								    symamd, or the related macros and definitions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Authors:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									The authors of the code itself are Stefan I. Larimore and Timothy A.
							 | 
						||
| 
								 | 
							
									Davis (davis at cise.ufl.edu), University of Florida.  The algorithm was
							 | 
						||
| 
								 | 
							
									developed in collaboration with John Gilbert, Xerox PARC, and Esmond
							 | 
						||
| 
								 | 
							
									Ng, Oak Ridge National Laboratory.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Acknowledgements:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									This work was supported by the National Science Foundation, under
							 | 
						||
| 
								 | 
							
									grants DMS-9504974 and DMS-9803599.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Notice:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Copyright (c) 1998-2007, Timothy A. Davis, 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.cise.ufl.edu/research/sparse/colamd/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.h
							 | 
						||
| 
								 | 
							
									file.  It is required by the colamd.c, colamdmex.c, and symamdmex.c
							 | 
						||
| 
								 | 
							
									files, and by any C code that calls the routines whose prototypes are
							 | 
						||
| 
								 | 
							
									listed below, or that uses the colamd/symamd definitions listed below.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef COLAMD_H
							 | 
						||
| 
								 | 
							
								#define COLAMD_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* make it easy for C++ programs to include COLAMD */
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								/* === Include files ======================================================== */
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								/* === COLAMD version ======================================================= */
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* COLAMD Version 2.4 and later will include the following definitions.
							 | 
						||
| 
								 | 
							
								 * As an example, to test if the version you are using is 2.4 or later:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * #ifdef COLAMD_VERSION
							 | 
						||
| 
								 | 
							
								 *	if (COLAMD_VERSION >= COLAMD_VERSION_CODE (2,4)) ...
							 | 
						||
| 
								 | 
							
								 * #endif
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This also works during compile-time:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  #if defined(COLAMD_VERSION) && (COLAMD_VERSION >= COLAMD_VERSION_CODE (2,4))
							 | 
						||
| 
								 | 
							
								 *    printf ("This is version 2.4 or later\n") ;
							 | 
						||
| 
								 | 
							
								 *  #else
							 | 
						||
| 
								 | 
							
								 *    printf ("This is an early version\n") ;
							 | 
						||
| 
								 | 
							
								 *  #endif
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Versions 2.3 and earlier of COLAMD do not include a #define'd version number.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define COLAMD_DATE "Nov 1, 2007"
							 | 
						||
| 
								 | 
							
								#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub))
							 | 
						||
| 
								 | 
							
								#define COLAMD_MAIN_VERSION 2
							 | 
						||
| 
								 | 
							
								#define COLAMD_SUB_VERSION 7
							 | 
						||
| 
								 | 
							
								#define COLAMD_SUBSUB_VERSION 1
							 | 
						||
| 
								 | 
							
								#define COLAMD_VERSION \
							 | 
						||
| 
								 | 
							
									COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								/* === Knob and statistics definitions ====================================== */
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */
							 | 
						||
| 
								 | 
							
								#define COLAMD_KNOBS 20
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* number of output statistics.  Only stats [0..6] are currently used. */
							 | 
						||
| 
								 | 
							
								#define COLAMD_STATS 20
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* knobs [0] and stats [0]: dense row knob and output statistic. */
							 | 
						||
| 
								 | 
							
								#define COLAMD_DENSE_ROW 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* knobs [1] and stats [1]: dense column knob and output statistic. */
							 | 
						||
| 
								 | 
							
								#define COLAMD_DENSE_COL 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* knobs [2]: aggressive absorption */
							 | 
						||
| 
								 | 
							
								#define COLAMD_AGGRESSIVE 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* stats [2]: memory defragmentation count output statistic */
							 | 
						||
| 
								 | 
							
								#define COLAMD_DEFRAG_COUNT 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */
							 | 
						||
| 
								 | 
							
								#define COLAMD_STATUS 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* stats [4..6]: error info, or info on jumbled columns */ 
							 | 
						||
| 
								 | 
							
								#define COLAMD_INFO1 4
							 | 
						||
| 
								 | 
							
								#define COLAMD_INFO2 5
							 | 
						||
| 
								 | 
							
								#define COLAMD_INFO3 6
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* error codes returned in stats [3]: */
							 | 
						||
| 
								 | 
							
								#define COLAMD_OK				(0)
							 | 
						||
| 
								 | 
							
								#define COLAMD_OK_BUT_JUMBLED			(1)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_A_not_present		(-1)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_p_not_present		(-2)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_nrow_negative		(-3)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_ncol_negative		(-4)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_nnz_negative		(-5)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_p0_nonzero			(-6)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_A_too_small		(-7)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_col_length_negative	(-8)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_row_index_out_of_bounds	(-9)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_out_of_memory		(-10)
							 | 
						||
| 
								 | 
							
								#define COLAMD_ERROR_internal_error		(-999)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								/* === Prototypes of user-callable routines ================================= */
							 | 
						||
| 
								 | 
							
								/* ========================================================================== */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define UF_long */
							 | 
						||
| 
								 | 
							
								#include "UFconfig.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								size_t colamd_recommended	/* returns recommended value of Alen, */
							 | 
						||
| 
								 | 
							
												/* or 0 if input arguments are erroneous */
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    int nnz,			/* nonzeros in A */
							 | 
						||
| 
								 | 
							
								    int n_row,			/* number of rows in A */
							 | 
						||
| 
								 | 
							
								    int n_col			/* number of columns in A */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								size_t colamd_l_recommended	/* returns recommended value of Alen, */
							 | 
						||
| 
								 | 
							
												/* or 0 if input arguments are erroneous */
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    UF_long nnz,		/* nonzeros in A */
							 | 
						||
| 
								 | 
							
								    UF_long n_row,		/* number of rows in A */
							 | 
						||
| 
								 | 
							
								    UF_long n_col		/* number of columns in A */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void colamd_set_defaults	/* sets default parameters */
							 | 
						||
| 
								 | 
							
								(				/* knobs argument is modified on output */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS]	/* parameter settings for colamd */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void colamd_l_set_defaults	/* sets default parameters */
							 | 
						||
| 
								 | 
							
								(				/* knobs argument is modified on output */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS]	/* parameter settings for colamd */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int colamd			/* returns (1) if successful, (0) otherwise*/
							 | 
						||
| 
								 | 
							
								(				/* A and p arguments are modified on output */
							 | 
						||
| 
								 | 
							
								    int n_row,			/* number of rows in A */
							 | 
						||
| 
								 | 
							
								    int n_col,			/* number of columns in A */
							 | 
						||
| 
								 | 
							
								    int Alen,			/* size of the array A */
							 | 
						||
| 
								 | 
							
								    int A [],			/* row indices of A, of size Alen */
							 | 
						||
| 
								 | 
							
								    int p [],			/* column pointers of A, of size n_col+1 */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */
							 | 
						||
| 
								 | 
							
								    int stats [COLAMD_STATS]	/* colamd output statistics and error codes */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								UF_long colamd_l		/* returns (1) if successful, (0) otherwise*/
							 | 
						||
| 
								 | 
							
								(				/* A and p arguments are modified on output */
							 | 
						||
| 
								 | 
							
								    UF_long n_row,		/* number of rows in A */
							 | 
						||
| 
								 | 
							
								    UF_long n_col,		/* number of columns in A */
							 | 
						||
| 
								 | 
							
								    UF_long Alen,		/* size of the array A */
							 | 
						||
| 
								 | 
							
								    UF_long A [],		/* row indices of A, of size Alen */
							 | 
						||
| 
								 | 
							
								    UF_long p [],		/* column pointers of A, of size n_col+1 */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */
							 | 
						||
| 
								 | 
							
								    UF_long stats [COLAMD_STATS]/* colamd output statistics and error codes */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int symamd				/* return (1) if OK, (0) otherwise */
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    int n,				/* number of rows and columns of A */
							 | 
						||
| 
								 | 
							
								    int A [],				/* row indices of A */
							 | 
						||
| 
								 | 
							
								    int p [],				/* column pointers of A */
							 | 
						||
| 
								 | 
							
								    int perm [],			/* output permutation, size n_col+1 */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS],	/* parameters (uses defaults if NULL) */
							 | 
						||
| 
								 | 
							
								    int stats [COLAMD_STATS],		/* output statistics and error codes */
							 | 
						||
| 
								 | 
							
								    void * (*allocate) (size_t, size_t),
							 | 
						||
| 
								 | 
							
								    					/* pointer to calloc (ANSI C) or */
							 | 
						||
| 
								 | 
							
													/* mxCalloc (for MATLAB mexFunction) */
							 | 
						||
| 
								 | 
							
								    void (*release) (void *)
							 | 
						||
| 
								 | 
							
								    					/* pointer to free (ANSI C) or */
							 | 
						||
| 
								 | 
							
								    					/* mxFree (for MATLAB mexFunction) */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								UF_long symamd_l			/* return (1) if OK, (0) otherwise */
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    UF_long n,				/* number of rows and columns of A */
							 | 
						||
| 
								 | 
							
								    UF_long A [],			/* row indices of A */
							 | 
						||
| 
								 | 
							
								    UF_long p [],			/* column pointers of A */
							 | 
						||
| 
								 | 
							
								    UF_long perm [],			/* output permutation, size n_col+1 */
							 | 
						||
| 
								 | 
							
								    double knobs [COLAMD_KNOBS],	/* parameters (uses defaults if NULL) */
							 | 
						||
| 
								 | 
							
								    UF_long stats [COLAMD_STATS],	/* output statistics and error codes */
							 | 
						||
| 
								 | 
							
								    void * (*allocate) (size_t, size_t),
							 | 
						||
| 
								 | 
							
								    					/* pointer to calloc (ANSI C) or */
							 | 
						||
| 
								 | 
							
													/* mxCalloc (for MATLAB mexFunction) */
							 | 
						||
| 
								 | 
							
								    void (*release) (void *)
							 | 
						||
| 
								 | 
							
								    					/* pointer to free (ANSI C) or */
							 | 
						||
| 
								 | 
							
								    					/* mxFree (for MATLAB mexFunction) */
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void colamd_report
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    int stats [COLAMD_STATS]
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void colamd_l_report
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    UF_long stats [COLAMD_STATS]
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void symamd_report
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    int stats [COLAMD_STATS]
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void symamd_l_report
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
								    UF_long stats [COLAMD_STATS]
							 | 
						||
| 
								 | 
							
								) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef EXTERN
							 | 
						||
| 
								 | 
							
								#define EXTERN extern
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EXTERN int (*colamd_printf) (const char *, ...) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* COLAMD_H */
							 |