1 /* 2 * Copyright 2008-2009 Katholieke Universiteit Leuven 3 * 4 * Use of this software is governed by the MIT license 5 * 6 * Written by Sven Verdoolaege, K.U.Leuven, Departement 7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium 8 */ 9 10 #ifndef ISL_MAT_H 11 #define ISL_MAT_H 12 13 #include <stdio.h> 14 15 #include <isl/int.h> 16 #include <isl/ctx.h> 17 #include <isl/blk.h> 18 #include <isl/vec.h> 19 20 #if defined(__cplusplus) 21 extern "C" { 22 #endif 23 24 struct isl_mat; 25 typedef struct isl_mat isl_mat; 26 27 isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat); 28 29 __isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx, 30 unsigned n_row, unsigned n_col); 31 struct isl_mat *isl_mat_dup(struct isl_mat *mat); 32 struct isl_mat *isl_mat_extend(struct isl_mat *mat, 33 unsigned n_row, unsigned n_col); 34 struct isl_mat *isl_mat_identity(struct isl_ctx *ctx, unsigned n_row); 35 __isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat); 36 struct isl_mat *isl_mat_cow(struct isl_mat *mat); 37 void isl_mat_free(__isl_take isl_mat *mat); 38 39 int isl_mat_rows(__isl_keep isl_mat *mat); 40 int isl_mat_cols(__isl_keep isl_mat *mat); 41 int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v); 42 __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat, 43 int row, int col, isl_int v); 44 __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat, 45 int row, int col, int v); 46 47 struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j); 48 struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j); 49 50 struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec); 51 struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat); 52 __isl_give isl_vec *isl_mat_vec_inverse_product(__isl_take isl_mat *mat, 53 __isl_take isl_vec *vec); 54 struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left, 55 struct isl_mat *right); 56 __isl_give isl_mat *isl_mat_diagonal(__isl_take isl_mat *mat1, 57 __isl_take isl_mat *mat2); 58 struct isl_mat *isl_mat_left_hermite(struct isl_mat *M, 59 int neg, struct isl_mat **U, struct isl_mat **Q); 60 struct isl_mat *isl_mat_lin_to_aff(struct isl_mat *mat); 61 struct isl_mat *isl_mat_inverse_product(struct isl_mat *left, 62 struct isl_mat *right); 63 struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right); 64 struct isl_mat *isl_mat_transpose(struct isl_mat *mat); 65 __isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat); 66 __isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat); 67 68 __isl_give isl_mat *isl_mat_scale_down_row(__isl_take isl_mat *mat, int row, 69 isl_int m); 70 71 __isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat); 72 __isl_give isl_mat *isl_mat_normalize_row(__isl_take isl_mat *mat, int row); 73 74 struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat, 75 unsigned col, unsigned n); 76 struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat, 77 unsigned row, unsigned n); 78 __isl_give isl_mat *isl_mat_insert_cols(__isl_take isl_mat *mat, 79 unsigned col, unsigned n); 80 __isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat, 81 unsigned row, unsigned n); 82 __isl_give isl_mat *isl_mat_move_cols(__isl_take isl_mat *mat, 83 unsigned dst_col, unsigned src_col, unsigned n); 84 __isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n); 85 __isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat, 86 unsigned first, unsigned n); 87 __isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n); 88 __isl_give isl_mat *isl_mat_insert_zero_rows(__isl_take isl_mat *mat, 89 unsigned row, unsigned n); 90 __isl_give isl_mat *isl_mat_add_zero_rows(__isl_take isl_mat *mat, unsigned n); 91 92 void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col); 93 void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col); 94 void isl_mat_col_submul(struct isl_mat *mat, 95 int dst_col, isl_int f, int src_col); 96 97 struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row); 98 99 __isl_give isl_mat *isl_mat_from_row_vec(__isl_take isl_vec *vec); 100 __isl_give isl_mat *isl_mat_concat(__isl_take isl_mat *top, 101 __isl_take isl_mat *bot); 102 __isl_give isl_mat *isl_mat_vec_concat(__isl_take isl_mat *top, 103 __isl_take isl_vec *bot); 104 105 int isl_mat_is_equal(__isl_keep isl_mat *mat1, __isl_keep isl_mat *mat2); 106 107 int isl_mat_initial_non_zero_cols(__isl_keep isl_mat *mat); 108 109 void isl_mat_print_internal(__isl_keep isl_mat *mat, FILE *out, int indent); 110 void isl_mat_dump(__isl_keep isl_mat *mat); 111 112 #if defined(__cplusplus) 113 } 114 #endif 115 116 #endif 117