1 /* 2 * Revision Control Information 3 * 4 * $Source$ 5 * $Author$ 6 * $Revision$ 7 * $Date$ 8 * 9 */ 10 #ifndef ABC__misc__espresso__sparse_h 11 #define ABC__misc__espresso__sparse_h 12 13 14 ABC_NAMESPACE_HEADER_START 15 16 17 /* 18 * sparse.h -- sparse matrix package header file 19 */ 20 21 typedef struct sm_element_struct sm_element; 22 typedef struct sm_row_struct sm_row; 23 typedef struct sm_col_struct sm_col; 24 typedef struct sm_matrix_struct sm_matrix; 25 26 27 /* 28 * sparse matrix element 29 */ 30 struct sm_element_struct { 31 int row_num; /* row number of this element */ 32 int col_num; /* column number of this element */ 33 sm_element *next_row; /* next row in this column */ 34 sm_element *prev_row; /* previous row in this column */ 35 sm_element *next_col; /* next column in this row */ 36 sm_element *prev_col; /* previous column in this row */ 37 char *user_word; /* user-defined word */ 38 }; 39 40 41 /* 42 * row header 43 */ 44 struct sm_row_struct { 45 int row_num; /* the row number */ 46 int length; /* number of elements in this row */ 47 int flag; /* user-defined word */ 48 sm_element *first_col; /* first element in this row */ 49 sm_element *last_col; /* last element in this row */ 50 sm_row *next_row; /* next row (in sm_matrix linked list) */ 51 sm_row *prev_row; /* previous row (in sm_matrix linked list) */ 52 char *user_word; /* user-defined word */ 53 }; 54 55 56 /* 57 * column header 58 */ 59 struct sm_col_struct { 60 int col_num; /* the column number */ 61 int length; /* number of elements in this column */ 62 int flag; /* user-defined word */ 63 sm_element *first_row; /* first element in this column */ 64 sm_element *last_row; /* last element in this column */ 65 sm_col *next_col; /* next column (in sm_matrix linked list) */ 66 sm_col *prev_col; /* prev column (in sm_matrix linked list) */ 67 char *user_word; /* user-defined word */ 68 }; 69 70 71 /* 72 * A sparse matrix 73 */ 74 struct sm_matrix_struct { 75 sm_row **rows; /* pointer to row headers (by row #) */ 76 int rows_size; /* alloc'ed size of above array */ 77 sm_col **cols; /* pointer to column headers (by col #) */ 78 int cols_size; /* alloc'ed size of above array */ 79 sm_row *first_row; /* first row (linked list of all rows) */ 80 sm_row *last_row; /* last row (linked list of all rows) */ 81 int nrows; /* number of rows */ 82 sm_col *first_col; /* first column (linked list of columns) */ 83 sm_col *last_col; /* last column (linked list of columns) */ 84 int ncols; /* number of columns */ 85 char *user_word; /* user-defined word */ 86 }; 87 88 89 #define sm_get_col(A, colnum) \ 90 (((colnum) >= 0 && (colnum) < (A)->cols_size) ? \ 91 (A)->cols[colnum] : (sm_col *) 0) 92 93 #define sm_get_row(A, rownum) \ 94 (((rownum) >= 0 && (rownum) < (A)->rows_size) ? \ 95 (A)->rows[rownum] : (sm_row *) 0) 96 97 #define sm_foreach_row(A, prow) \ 98 for(prow = A->first_row; prow != 0; prow = prow->next_row) 99 100 #define sm_foreach_col(A, pcol) \ 101 for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) 102 103 #define sm_foreach_row_element(prow, p) \ 104 for(p = prow->first_col; p != 0; p = p->next_col) 105 106 #define sm_foreach_col_element(pcol, p) \ 107 for(p = pcol->first_row; p != 0; p = p->next_row) 108 109 #define sm_put(x, val) \ 110 (x->user_word = (char *) val) 111 112 #define sm_get(type, x) \ 113 ((type) (x->user_word)) 114 115 extern sm_matrix *sm_alloc(), *sm_alloc_size(), *sm_dup(); 116 extern void sm_free(), sm_delrow(), sm_delcol(), sm_resize(); 117 extern void sm_write(), sm_print(), sm_dump(), sm_cleanup(); 118 extern void sm_copy_row(), sm_copy_col(); 119 extern void sm_remove(), sm_remove_element(); 120 extern sm_element *sm_insert(), *sm_find(); 121 extern sm_row *sm_longest_row(); 122 extern sm_col *sm_longest_col(); 123 extern int sm_read(), sm_read_compressed(); 124 125 extern sm_row *sm_row_alloc(), *sm_row_dup(), *sm_row_and(); 126 extern void sm_row_free(), sm_row_remove(), sm_row_print(); 127 extern sm_element *sm_row_insert(), *sm_row_find(); 128 extern int sm_row_contains(), sm_row_intersects(); 129 extern int sm_row_compare(), sm_row_hash(); 130 131 extern sm_col *sm_col_alloc(), *sm_col_dup(), *sm_col_and(); 132 extern void sm_col_free(), sm_col_remove(), sm_col_print(); 133 extern sm_element *sm_col_insert(), *sm_col_find(); 134 extern int sm_col_contains(), sm_col_intersects(); 135 extern int sm_col_compare(), sm_col_hash(); 136 137 extern int sm_row_dominance(), sm_col_dominance(), sm_block_partition(); 138 139 140 141 ABC_NAMESPACE_HEADER_END 142 143 #endif 144