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