From 0c29c27028b57691e1a348424e24f1551a18c528 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Mon, 30 Mar 2009 15:32:21 +0000 Subject: [PATCH] remove trash --- contrib/kbipack/Makefile~ | 75 --- contrib/kbipack/gmp_blas.o | Bin 10724 -> 0 bytes contrib/kbipack/gmp_matrix.c~ | 678 ------------------------- contrib/kbipack/gmp_matrix.h~ | 144 ------ contrib/kbipack/gmp_matrix.o | Bin 20660 -> 0 bytes contrib/kbipack/gmp_matrix_io.o | Bin 8060 -> 0 bytes contrib/kbipack/gmp_normal_form.c~ | 784 ----------------------------- contrib/kbipack/gmp_normal_form.o | Bin 16308 -> 0 bytes 8 files changed, 1681 deletions(-) delete mode 100755 contrib/kbipack/Makefile~ delete mode 100755 contrib/kbipack/gmp_blas.o delete mode 100755 contrib/kbipack/gmp_matrix.c~ delete mode 100755 contrib/kbipack/gmp_matrix.h~ delete mode 100755 contrib/kbipack/gmp_matrix.o delete mode 100755 contrib/kbipack/gmp_matrix_io.o delete mode 100755 contrib/kbipack/gmp_normal_form.c~ delete mode 100755 contrib/kbipack/gmp_normal_form.o diff --git a/contrib/kbipack/Makefile~ b/contrib/kbipack/Makefile~ deleted file mode 100755 index 3c361030c3..0000000000 --- a/contrib/kbipack/Makefile~ +++ /dev/null @@ -1,75 +0,0 @@ -#FLAGS = -O3 -funroll-all-loops -ansi -pedantic -Wall -U DEBUG -# Flags for different diagnostics: -#FLAGS = -g -ansi -pedantic -Wall -fprofile-arcs -ftest-coverage -pg -#FLAGS = -g -ansi -pedantic -Wall -pg - -# If gmp.h is not found de facto (e.g. when it is privately intalled), -# its path should be put here -#INCL = - -#LIBS = -lgmp -#LIBDIR = . -#SRC = gmp_normal_form.c gmp_matrix_io.c gmp_matrix.c gmp_blas.c - -# The compiler options are for gcc. If it is not available, -# suitable flags must be set for the compiler -#CC = gcc -#RM = rm -f -#RANLIB = ranlib - -#libkbi.a: $(SRC) -# $(RM) *.o -# $(CC) -c $(FLAGS) $(SRC) -# ar r libkbi.a *.o -# $(RM) *.o -# $(RANLIB) libkbi.a - -#compute_normal_form: libkbi compute_normal_form.c -# $(CC) $(FLAGS) -L $(LIBDIR) $(INCL) compute_normal_form.c -o compute_normal_form -lkbi $(LIBS) -#clean: -# $(RM) compute_normal_form -# $(RM) *.o - -## - -include ../../variables - -LIB = ../../lib/libGmshKbi${LIBEXT} - -INC = ${DASH}I. - -CFLAGS = ${OPTIM} ${FLAGS} ${INC} ${SYSINCLUDE} -lgmp - -SRC = gmp_normal_form.c gmp_matrix_io.c gmp_matrix.c gmp_blas.c - -OBJ = ${SRC:.c=${OBJEXT}} - -.SUFFIXES: ${OBJEXT} .c - -${LIB}: ${OBJ} - ${AR} ${ARFLAGS}${LIB} ${OBJ} - ${RANLIB} ${LIB} - -cpobj: ${OBJ} - cp -f ${OBJ} ../../lib/ - -.c${OBJEXT}: - ${CC} ${CFLAGS} ${DASH}c $< - -clean: - ${RM} *.o *.obj - -depend: - (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ - ${CXX} -MM ${CFLAGS} ${SRC} | sed 's/.o:/$${OBJEXT}:/g' \ - ) > Makefile.new - cp Makefile Makefile.bak - cp Makefile.new Makefile - rm -f Makefile.new - -# DO NOT DELETE THIS LINE -gmp_normal_form${OBJEXT}: gmp_normal_form.c gmp_blas.h gmp_matrix.h \ - gmp_normal_form.h -gmp_matrix_io${OBJEXT}: gmp_matrix_io.c gmp_matrix_io.h gmp_matrix.h gmp_blas.h -gmp_matrix${OBJEXT}: gmp_matrix.c gmp_matrix.h gmp_blas.h -gmp_blas${OBJEXT}: gmp_blas.c gmp_blas.h diff --git a/contrib/kbipack/gmp_blas.o b/contrib/kbipack/gmp_blas.o deleted file mode 100755 index 02064581725915c72fb204793a3f9436e14c5cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10724 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 Jk?&B-{}+rJd=dZv diff --git a/contrib/kbipack/gmp_matrix.c~ b/contrib/kbipack/gmp_matrix.c~ deleted file mode 100755 index 2afe8d1dd2..0000000000 --- a/contrib/kbipack/gmp_matrix.c~ +++ /dev/null @@ -1,678 +0,0 @@ -/* - Source file for integer-oriented matrix, relying on the arbitrary - precision integers from the GNU gmp package. - - Copyright (C) 28.10.2003 Saku Suuriniemi TUT/CEM - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Saku Suuriniemi, TUT/Electromagetics - P.O.Box 692, FIN-33101 Tampere, Finland - saku.suuriniemi@tut.fi - - $Id: gmp_matrix.c~,v 1.1 2009-03-30 14:10:57 matti Exp $ -*/ - - -#include<stdlib.h> -#include"gmp_matrix.h" - -int gmp_kaka(int laalaa){ - printf("kissa %d", laalaa); - return laalaa; -} - -gmp_matrix * -create_gmp_matrix(size_t r, size_t c, - const mpz_t * e) -{ - gmp_matrix * new_matrix; - size_t ind; - - new_matrix = (gmp_matrix * ) malloc(sizeof(gmp_matrix)); - if(new_matrix == NULL) - { - return NULL; - } - - new_matrix -> storage = (mpz_t *) calloc(r*c, sizeof(mpz_t)); - if(new_matrix -> storage == NULL) - { - free(new_matrix); - return NULL; - } - - new_matrix -> rows = r; - new_matrix -> cols = c; - - for(ind = 0; ind < r*c; ind ++) - { - mpz_init (new_matrix -> storage[ind]); - mpz_set (new_matrix -> storage[ind], e[ind]); - } - - return new_matrix; -} - - -gmp_matrix * -create_gmp_matrix_identity(size_t dim) -{ - gmp_matrix * new_matrix; - size_t ind; - - new_matrix = (gmp_matrix * ) malloc(sizeof(gmp_matrix)); - if(new_matrix == NULL) - { - return NULL; - } - - new_matrix -> storage = (mpz_t *) calloc(dim*dim, sizeof(mpz_t)); - if(new_matrix -> storage == NULL) - { - free(new_matrix); - return NULL; - } - - new_matrix -> rows = dim; - new_matrix -> cols = dim; - - for(ind = 0; ind < dim*dim; ind ++) - { - mpz_init_set_si (new_matrix -> storage[ind], 0); - } - - for(ind = 0; ind < dim; ind ++) - { - mpz_set_ui(new_matrix -> storage[ind*(dim+1)], 1); - } - - return new_matrix; -} - - -gmp_matrix * -create_gmp_matrix_zero(size_t rows, size_t cols) -{ - gmp_matrix * new_matrix; - size_t ind; - - new_matrix = (gmp_matrix * ) malloc(sizeof(gmp_matrix)); - if(new_matrix == NULL) - { - return NULL; - } - - new_matrix -> storage = (mpz_t *) calloc(rows*cols, sizeof(mpz_t)); - if(new_matrix -> storage == NULL) - { - free(new_matrix); - return NULL; - } - - new_matrix -> rows = rows; - new_matrix -> cols = cols; - - for(ind = 0; ind < rows*cols; ind ++) - { - mpz_init_set_si (new_matrix -> storage[ind], 0); - } - - return new_matrix; -} - -int -destroy_gmp_matrix(gmp_matrix * m) -{ - size_t ind, nmb_storage;; - - if(m == NULL) - { - return EXIT_FAILURE; - } - - if(m -> storage == NULL) - { - free(m); - return EXIT_FAILURE; - } - - nmb_storage = (m -> rows)*(m -> cols); - - for(ind = 0; ind < nmb_storage; ind++) - { - mpz_clear(m -> storage[ind]); - } - - free(m -> storage); - free(m); - return EXIT_SUCCESS; -} - - -size_t -gmp_matrix_rows(const gmp_matrix * m) -{ - if(m == NULL) - { - return 0; - } - - return m -> rows; -} - - -size_t -gmp_matrix_cols(const gmp_matrix * m) -{ - if(m == NULL) - { - return 0; - } - - return m -> cols; -} - -/* elem <- (matrix(row, col)) */ -int -gmp_matrix_get_elem(mpz_t elem, size_t row, size_t col, - const gmp_matrix * m) -{ -#ifdef DEBUG - - if(m == NULL) - { - return EXIT_FAILURE; - } - -#endif - - mpz_set(elem, m -> storage[(col-1)*(m -> rows)+row-1]); - return EXIT_SUCCESS; -} - -int -gmp_matrix_swap_rows(size_t row1, size_t row2, gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((row1 < 1) || (row1 > m->rows) || (row2 < 1) || (row2 > m->rows)) - { - return EXIT_FAILURE; - } - - /* printf("Swapping rows %i %i\n", row1, row2); */ - gmp_blas_swap(m -> cols, - &(m -> storage[row1-1]), m -> rows, - &(m -> storage[row2-1]), m -> rows); - - return EXIT_SUCCESS; -} - -int -gmp_matrix_swap_cols(size_t col1, size_t col2, gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((col1 < 1) || (col1 > m->cols) || (col2 < 1) || (col2 > m->cols)) - { - return EXIT_FAILURE; - } - - /* printf("Swapping cols %i %i\n", col1, col2); */ - gmp_blas_swap(m -> rows, - &(m -> storage[(m->rows)*(col1-1)]), 1, - &(m -> storage[(m->rows)*(col2-1)]), 1); - - return EXIT_SUCCESS; -} - -int -gmp_matrix_negate_row(size_t row, gmp_matrix * m) -{ - mpz_t minus_one; - - if(m == NULL) - { - return EXIT_FAILURE; - } - if((row < 1) || (row > m->rows)) - { - return EXIT_FAILURE; - } - - mpz_init(minus_one); - mpz_set_si(minus_one, -1); - gmp_blas_scal(m -> cols, minus_one, (&m -> storage[row-1]), m -> rows); - mpz_clear(minus_one); - return EXIT_SUCCESS; -} - -int -gmp_matrix_negate_col(size_t col, gmp_matrix * m) -{ - mpz_t minus_one; - if(m == NULL) - { - return EXIT_FAILURE; - } - if((col < 1) || (col > m->cols)) - { - return EXIT_FAILURE; - } - - mpz_init(minus_one); - mpz_set_si(minus_one, -1); - gmp_blas_scal(m -> rows, minus_one, - &(m -> storage[(m->rows)*(col-1)]), 1); - mpz_clear(minus_one); - return EXIT_SUCCESS; -} - -/* row2 <- a*row1 + row2*/ -int -gmp_matrix_add_row(mpz_t a, size_t row1, size_t row2, - gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((row1 < 1) || (row1 > m->rows) || (row2 < 1) || (row2 > m->rows)) - { - return EXIT_FAILURE; - } - - gmp_blas_axpy(m->cols, a, - (const mpz_t *) &(m->storage[row1-1]), m->rows, - &(m->storage[row2-1]), m->rows); - - return EXIT_SUCCESS; -} - -int -gmp_matrix_add_col(mpz_t a, size_t col1, size_t col2, - gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((col1 < 1) || (col1 > m->cols) || (col2 < 1) || (col2 > m->cols)) - { - return EXIT_FAILURE; - } - - gmp_blas_axpy(m->rows, a, - (const mpz_t *) &(m -> storage[(m->rows)*(col1-1)]), 1, - &(m -> storage[(m->rows)*(col2-1)]), 1); - - return EXIT_SUCCESS; -} - -/* row1 <- a*row1 + b*row2 - row2 <- c*row1 + d*row2 */ -int -gmp_matrix_row_rot(mpz_t a, mpz_t b, size_t row1, - mpz_t c, mpz_t d, size_t row2, - gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((row1 < 1) || (row1 > m->rows) || (row2 < 1) || (row2 > m->rows)) - { - return EXIT_FAILURE; - } - - gmp_blas_rot(m->cols, - a, b, &(m->storage[row1-1]), m->rows, - c, d, &(m->storage[row2-1]), m->rows); - - return EXIT_SUCCESS; -} -int -gmp_matrix_col_rot(mpz_t a, mpz_t b, size_t col1, - mpz_t c, mpz_t d, size_t col2, - gmp_matrix * m) -{ - if(m == NULL) - { - return EXIT_FAILURE; - } - if((col1 < 1) || (col1 > m->cols) || (col2 < 1) || (col2 > m->cols)) - { - return EXIT_FAILURE; - } - -/* printf("a: %i b: %i c: %i d:%i col1: %i col2: %i\n", */ -/* mpz_get_si(a), */ -/* mpz_get_si(b), */ -/* mpz_get_si(c), */ -/* mpz_get_si(d), */ -/* col1, col2); */ - - gmp_blas_rot(m->rows, - a, b, &(m -> storage[(m->rows)*(col1-1)]), 1, - c, d, &(m -> storage[(m->rows)*(col2-1)]), 1); - - return EXIT_SUCCESS; -} - -size_t -gmp_matrix_col_inz (size_t r1, size_t r2, size_t c, - gmp_matrix * m) -{ - size_t result; - - if(m == NULL) - { - return 0; - } - if((r1 < 1) || (r1 > m->rows) || - (r2 < 1) || (r2 > m->rows) || - (r2 < r1) || (c < 1) || (c > m->cols)) - { - return 0; - } - - result = gmp_blas_inz(r2-r1+1, - (const mpz_t *) &(m->storage[(c-1)*(m->rows)+r1-1]), - 1); - - if(result > r2-r1+1) - { - return 0; - } - - return result; -} - -size_t -gmp_matrix_row_inz (size_t r, size_t c1, size_t c2, - gmp_matrix * m) -{ - size_t result; - - if(m == NULL) - { - return 0; - } - if((r < 1) || (r > m->rows) || - (c1 < 1) || (c1 > m->cols) || - (c2 < c1) || (c2 < 1) || (c2 > m->cols)) - { - return 0; - } - - result = gmp_blas_inz(c2-c1+1, - (const mpz_t *) &(m->storage[(c1-1)*(m->rows)+r-1]), - m->rows); - - if(result > c2-c1+1) - { - return 0; - } - - return result; -} - - -int -gmp_matrix_is_diagonal(const gmp_matrix * M) -{ - size_t i,j; - size_t rows, cols; - - if(M == NULL) - { - return 0; - } - - rows = M->rows; - cols = M->cols; - - for(j = 1; j <= cols; j ++) - { - for(i = 1; i <= rows; i ++) - { - if((mpz_cmp_si(M->storage[(i-1)+(j-1)*rows], 0) != 0) && - (i != j)) - { - return 0; - } - } - } - - return 1; -} - - -int -gmp_matrix_transp(gmp_matrix * M) -{ - mpz_t * new_storage; - size_t i,j; - size_t rows, cols; - - if(M == NULL) - { - return EXIT_FAILURE; - } - - rows = M->rows; - cols = M->cols; - - new_storage = (mpz_t *) calloc(rows*cols, sizeof(mpz_t)); - if(new_storage == NULL) - { - return EXIT_FAILURE; - } - - for(i = 1; i <= rows; i++) - { - for(j = 1; j <= cols; j++) - { - mpz_init_set(new_storage[(j-1)+(i-1)*cols], - M-> storage[(i-1)+(j-1)*rows]); - mpz_clear(M-> storage[(i-1)+(j-1)*rows]); - } - } - free(M->storage); - - M -> storage = new_storage; - M -> rows = cols; - M -> cols = rows; - - return EXIT_SUCCESS; -} - - -int -gmp_matrix_right_mult(gmp_matrix * A, const gmp_matrix * B) -{ - mpz_t * new_storage; - size_t i,j; - size_t rows_A, cols_A, rows_B, cols_B; - - if((A == NULL) || (B == NULL)) - { - return EXIT_FAILURE; - } - - rows_A = A->rows; - cols_A = A->cols; - rows_B = B->rows; - cols_B = B->cols; - - if(cols_A != rows_B) - { - return EXIT_FAILURE; - } - - /* Create new storage for the product */ - new_storage = (mpz_t *) calloc(rows_A*cols_B, sizeof(mpz_t)); - if(new_storage == NULL) - { - return EXIT_FAILURE; - } - - /* Compute the product to the storage */ - for(j = 1; j <= cols_B; j++) - { - for(i = 1; i <= rows_A; i++) - { - mpz_init (new_storage[(i-1)+(j-1)*rows_A]); - gmp_blas_dot(&(new_storage[(i-1)+(j-1)*rows_A]), - cols_A, - (const mpz_t *) &(A->storage[i-1]), rows_A, - (const mpz_t *) &(B->storage[(j-1)*rows_B]), 1); - } - } - - /* Get rid of the old storage */ - for(i = 1; i <= rows_A*cols_A; i++) - { - mpz_clear (A->storage[i-1]); - } - free(A->storage); - - /* Update A */ - A -> storage = new_storage; - A -> cols = cols_B; - - return EXIT_SUCCESS; -} - -int -gmp_matrix_left_mult(const gmp_matrix * A, gmp_matrix * B) -{ - mpz_t * new_storage; - size_t i,j; - size_t rows_A, cols_A, rows_B, cols_B; - - if((A == NULL) || (B == NULL)) - { - return EXIT_FAILURE; - } - - rows_A = A->rows; - cols_A = A->cols; - rows_B = B->rows; - cols_B = B->cols; - - if(cols_A != rows_B) - { - return EXIT_FAILURE; - } - - /* Create new storage for the product */ - new_storage = (mpz_t *) calloc(rows_A*cols_B, sizeof(mpz_t)); - if(new_storage == NULL) - { - return EXIT_FAILURE; - } - - /* Compute the product to the storage */ - for(j = 1; j <= cols_B; j++) - { - for(i = 1; i <= rows_A; i++) - { - mpz_init (new_storage[(i-1)+(j-1)*rows_A]); - gmp_blas_dot(&(new_storage[(i-1)+(j-1)*rows_A]), - cols_A, - (const mpz_t *) &(A->storage[i-1]), rows_A, - (const mpz_t *) &(B->storage[(j-1)*rows_B]), 1); - } - } - - /* Get rid of the old storage */ - for(i = 1; i <= rows_B*cols_B; i++) - { - mpz_clear (B->storage[i-1]); - } - free(B->storage); - - /* Update A */ - B -> storage = new_storage; - B -> rows = rows_A; - - return EXIT_SUCCESS; -} - - -int gmp_matrix_printf(const gmp_matrix * m) -{ - - mpz_t outz; - size_t rows, cols, i, j; - - if(m == NULL) - { - return EXIT_FAILURE; - } - - rows = m->rows; - cols = m->cols; - mpz_init(outz); - for(i = 1; i <= rows ; i++) - { - for(j = 1; j <= cols ; j++) - { - gmp_matrix_get_elem(outz, i, j, m); - mpz_out_str (stdout, 10, outz); - printf(" "); - } - printf("\n"); - } - - mpz_clear(outz); - - return EXIT_SUCCESS; -} - -int gmp_matrix_fprintf(FILE* stream, const gmp_matrix * m) -{ - mpz_t outz; - size_t rows, cols, i, j; - - if(m == NULL) - { - return EXIT_FAILURE; - } - - rows = m->rows; - cols = m->cols; - mpz_init(outz); - for(i = 1; i <= rows ; i++) - { - for(j = 1; j <= cols ; j++) - { - gmp_matrix_get_elem(outz, i, j, m); - mpz_out_str (stream, 10, outz); - printf(" "); - } - printf("\n"); - } - - mpz_clear(outz); - - return EXIT_SUCCESS; -} diff --git a/contrib/kbipack/gmp_matrix.h~ b/contrib/kbipack/gmp_matrix.h~ deleted file mode 100755 index 217b5fe7e1..0000000000 --- a/contrib/kbipack/gmp_matrix.h~ +++ /dev/null @@ -1,144 +0,0 @@ -/* - Header file for integer-oriented matrix, relying on the arbitrary - precision integers from the GNU gmp package. - - Copyright (C) 28.10.2003 Saku Suuriniemi TUT/CEM - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Saku Suuriniemi, TUT/Electromagetics - P.O.Box 692, FIN-33101 Tampere, Finland - saku.suuriniemi@tut.fi - - $Id: gmp_matrix.h~,v 1.1 2009-03-30 14:10:57 matti Exp $ -*/ - -#ifndef __GMP_MATRIX_H__ -#define __GMP_MATRIX_H__ - -#include"gmp_blas.h" - -typedef struct -{ - size_t rows; - size_t cols; - mpz_t * storage; -} gmp_matrix; - -int gmp_kaka(int laalaa); - -/* Sets the values of "elems" column by column. The user is - responsible for sufficient supply. */ -gmp_matrix * -create_gmp_matrix(size_t rows, size_t cols, - const mpz_t * elems); - -gmp_matrix * -create_gmp_matrix_identity(size_t dim); - -gmp_matrix * -create_gmp_matrix_zero(size_t rows, size_t cols); - -int -destroy_gmp_matrix(gmp_matrix *); - -size_t -gmp_matrix_rows(const gmp_matrix *); - -size_t -gmp_matrix_cols(const gmp_matrix *); - -/* elem <- (matrix(row, col)) */ -int -gmp_matrix_get_elem(mpz_t elem, size_t row, size_t col, - const gmp_matrix *); - -int -gmp_matrix_swap_rows(size_t row1, size_t row2, gmp_matrix *); - -int -gmp_matrix_swap_cols(size_t col1, size_t col2, gmp_matrix *); - -int -gmp_matrix_negate_row(size_t row, gmp_matrix *); - -int -gmp_matrix_negate_col(size_t col, gmp_matrix *); - -/* row2 <- a*row1 + row2*/ -int -gmp_matrix_add_row(mpz_t a, size_t row1, size_t row2, - gmp_matrix *); -int -gmp_matrix_add_col(mpz_t a, size_t col1, size_t col2, - gmp_matrix *); - -/* row1 <- a*row1 + b*row2 - row2 <- c*row1 + d*row2 */ -int -gmp_matrix_row_rot(mpz_t a, mpz_t b, size_t row1, - mpz_t c, mpz_t d, size_t row2, - gmp_matrix *); -int -gmp_matrix_col_rot(mpz_t a, mpz_t b, size_t col1, - mpz_t c, mpz_t d, size_t col2, - gmp_matrix *); - -/* 0 for no, 1 for yes */ -int -gmp_matrix_is_diagonal(const gmp_matrix * M); - -/* Finds a nonzero in a subcolumn M(r1:r2,c). */ -/* Returns zero if no nonzeros found. */ -size_t -gmp_matrix_col_inz (size_t r1, size_t r2, size_t c, - gmp_matrix * M); - -/* Finds a nonzero in a subrow M(r,c1:c2). */ -/* Returns zero if no nonzeros found. */ -size_t -gmp_matrix_row_inz (size_t r, size_t c1, size_t c2, - gmp_matrix * M); - -int -gmp_matrix_transp(gmp_matrix * M); - -/* A <- A*B */ -int -gmp_matrix_right_mult(gmp_matrix * A, const gmp_matrix * B); - -/* B <- A*B */ -int -gmp_matrix_left_mult(const gmp_matrix * A, gmp_matrix * B); - -/* (TBD ?)Implement the BLAS style GEMM? Place it here at all? */ -/* (T) (T) */ -/* A <- B * C */ -/* Give 1 if the transpose of the matrix is to be used, else 0 */ -/* int */ -/* gmp_matrix_mult(gmp_matrix * A, */ -/* const gmp_matrix * B, int transpose_B, */ -/* const gmp_matrix * C, int transpose_C); */ - -/* - Mainly for diagnostics ... - -------------------------- -*/ - -int gmp_matrix_printf(const gmp_matrix *); -int gmp_matrix_fprintf(FILE*, const gmp_matrix *); - - -#endif diff --git a/contrib/kbipack/gmp_matrix.o b/contrib/kbipack/gmp_matrix.o deleted file mode 100755 index b151210c86fa837e700afce35afff9326bbec789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20660 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 diff --git a/contrib/kbipack/gmp_matrix_io.o b/contrib/kbipack/gmp_matrix_io.o deleted file mode 100755 index c7231192ab4007c70d68c083fb81cab8a3fddd0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8060 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 diff --git a/contrib/kbipack/gmp_normal_form.c~ b/contrib/kbipack/gmp_normal_form.c~ deleted file mode 100755 index 5f695a53d0..0000000000 --- a/contrib/kbipack/gmp_normal_form.c~ +++ /dev/null @@ -1,784 +0,0 @@ -/* - Implementation for integer computation of Hermite and Smith normal - forms of matrices of modest size. - - Implementation: Dense matrix with GMP-library's mpz_t elements to - hold huge integers. - - Algorithm: Kannan - Bachem algorithm with improvement by - Chou and Collins. Expects a large number of unit invariant - factors and takes advantage of them as they appear. - - References: - [1] Ravindran Kannan, Achim Bachem: - "Polynomial algorithms for computing the Smith and Hermite normal - forms of an integer matrix", - SIAM J. Comput., vol. 8, no. 5, pp. 499-507, 1979. - [2] Tsu-Wu J.Chou, George E. Collins: - "Algorithms for the solution of systems of linear Diophantine - equations", - SIAM J. Comput., vol. 11, no. 4, pp. 687-708, 1982. - [3] GMP homepage http://www.swox.com/gmp/ - [4] GNU gmp page http://www.gnu.org/software/gmp/ - - Copyright (C) 30.10.2003 Saku Suuriniemi TUT/CEM - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Saku Suuriniemi, TUT/Electromagetics - P.O.Box 692, FIN-33101 Tampere, Finland - saku.suuriniemi@tut.fi - - $Id: gmp_normal_form.c~,v 1.1 2009-03-30 14:10:57 matti Exp $ -*/ - -#include<stdlib.h> -#include"gmp_blas.h" -#include"gmp_matrix.h" -#include"gmp_normal_form.h" - - -/* The unaltered matrix and identity left and right factors */ -static gmp_normal_form * -create_gmp_trivial_normal_form(gmp_matrix * A, - inverted_flag left_inverted, - inverted_flag right_inverted) -{ - size_t rows, cols; - - gmp_normal_form * new_nf; - if(A == NULL) - { - return NULL; - } - - new_nf = (gmp_normal_form *) malloc(sizeof(gmp_normal_form)); - if(new_nf == NULL) - { - destroy_gmp_matrix(A); - return NULL; - } - - rows = A -> rows; - cols = A -> cols; - - if((rows == 0) || (cols == 0)) - { - destroy_gmp_matrix(A); - return NULL; - } - - new_nf->left = create_gmp_matrix_identity(rows); - if(new_nf->left == NULL) - { - destroy_gmp_matrix(A); - free(new_nf); - return NULL; - } - - new_nf->right = create_gmp_matrix_identity(cols); - if(new_nf->right == NULL) - { - destroy_gmp_matrix(A); - destroy_gmp_matrix(new_nf->left); - free(new_nf); - return NULL; - } - - new_nf -> canonical = A; - new_nf -> left_inverted = left_inverted; - new_nf -> right_inverted = right_inverted; - - return new_nf; -} - -static int -gmp_Hermite_eliminate_step(gmp_matrix * L, gmp_matrix * U, - size_t col, inverted_flag right_inverted) -{ - size_t ind, row_limit; - mpz_t pivot, elem; - mpz_t bez1, bez2, gc_div; - mpz_t cff1, cff2; - - mpz_init(pivot); - mpz_init(elem); - mpz_init(bez1); - mpz_init(bez2); - mpz_init(cff1); - mpz_init(cff2); - mpz_init(gc_div); - - row_limit = (L->rows >= col) ? - col-1 : - L->rows; - - for(ind = 1; ind <= row_limit; ind++) - { - gmp_matrix_get_elem(elem, ind, col, L); - - /* Eliminate only if nonzero */ - if(mpz_sgn (elem) != 0) - { - gmp_matrix_get_elem(pivot, ind, ind, L); - - /* Extended Euclid's: - bez1*pivot+bez2*elem = gc_div */ - gmp_blas_rotg(gc_div, bez1, bez2, pivot, elem); - - /* Make cff1 = -elem/gc_div */ - mpz_divexact(cff1, elem, gc_div); - mpz_neg (cff1, cff1); - /* Make cff2 = pivot/gc_div */ - mpz_divexact(cff2, pivot, gc_div); - - /* Update the HNF canonical matrix */ - gmp_matrix_col_rot(bez1, bez2, ind, - cff1, cff2, col, - L); - - /* Update the unimodular factor matrix */ - if(right_inverted == INVERTED) - { - gmp_matrix_col_rot(bez1, bez2, ind, - cff1, cff2, col, - U); - } - else - { - - /* [bez1, -elem/gc_div] [pivot/gc_div, elem/gc_div] - [bez2, pivot/gc_div] [-bez2, bez1 ] = I_2 */ - mpz_neg(cff1, cff1); - mpz_neg(bez2, bez2); - gmp_matrix_row_rot(cff2, cff1, ind, - bez2, bez1, col, - U); - } - } - } - mpz_clear(pivot); - mpz_clear(elem); - mpz_clear(bez1); - mpz_clear(bez2); - mpz_clear(cff1); - mpz_clear(cff2); - mpz_clear(gc_div); - - return EXIT_SUCCESS; -} - - - -static int -gmp_Hermite_reduce_step(gmp_matrix * L, gmp_matrix * U, - size_t col, inverted_flag right_inverted) -{ - - size_t i, j; - mpz_t pivot, elem; - mpz_t cff; - - mpz_init(pivot); - mpz_init(elem); - mpz_init(cff); - - if(col > (L->rows)) - { - return EXIT_FAILURE; - } - - /* printf("Col = %i\n", col); - printf("L before\n"); - gmp_matrix_printf(L);*/ - - for(j = col-1; j >= 1; j--) - { - for(i = j+1; i <= col; i++) - { - gmp_matrix_get_elem(pivot, i, i, L); - gmp_matrix_get_elem(elem, i, j, L); - /* printf(" i %i j %i\n",i,j); */ - - if((mpz_cmpabs(elem, pivot) >= 0) || (mpz_sgn(elem) < 0)) - { - /* The objective: - 0 <= elem + k*pivot < pivot - -elem <= k*pivot < pivot - elem - -elem/pivot <= k < - elem/pivot + 1 - - Solution: - k = ceil(-elem/pivot) - */ - - /* Make cff = -elem */ - mpz_neg (cff, elem); - mpz_cdiv_q (cff, cff, pivot); - - /* printf("col %i j %i\n", i, j); - printf("elem %i k %i pivot %i\n", - mpz_get_si(elem), - mpz_get_si(cff), - mpz_get_si(pivot));*/ - - - gmp_matrix_add_col(cff, i, j, L); - - /* Update the unimodular factor matrix */ - if(right_inverted == INVERTED) - { - gmp_matrix_add_col(cff, i, j, U); - } - - /* [1 0] [ 1 0] = [1 0] - [cff 1] [-cff 1] [0 1] */ - else - { - mpz_neg (cff, cff); - gmp_matrix_add_row(cff, j, i, U); - } - - /* printf("\n"); - gmp_matrix_printf(L);*/ - - } - } - } - -/* printf("L after\n"); */ -/* gmp_matrix_printf(L); */ - - mpz_clear(pivot); - mpz_clear(elem); - mpz_clear(cff); - return EXIT_SUCCESS; -} - - -static int -gmp_normal_form_make_Hermite(gmp_normal_form * nf) -{ - size_t rows, cols; - size_t pivot_ind; - size_t schur, colind; - mpz_t pivot; - gmp_matrix * canonical; - gmp_matrix * left; - gmp_matrix * right; - - if(nf == NULL) - { - return EXIT_FAILURE; - } - - /* OK, it's safe to get to business */ - canonical = nf->canonical; - left = nf->left; - right = nf->right; - rows = canonical -> rows; - cols = canonical -> cols; - - mpz_init(pivot); - - /* "schur" denotes where the present Schur complement starts */ - schur = 1; - - while((schur <= rows) && (schur <= cols)) - { - /* Eliminate a column */ - if (schur > 1) - { - gmp_Hermite_eliminate_step(canonical, right, - schur, nf->right_inverted); - } - - /* Find a pivot */ - pivot_ind = gmp_matrix_col_inz(schur, rows, schur, canonical); - - - /* If no nonzeros was found, the column is all zero, hence - settled with. Permute it to the end and decrement cols. */ - if(pivot_ind == 0) - { - gmp_matrix_swap_cols(schur, cols, canonical); - - if(nf -> right_inverted == INVERTED) - { - gmp_matrix_swap_cols(schur, cols, right); - } - else - { - gmp_matrix_swap_rows(schur, cols, right); - } - - cols--; - - /* When the whole column was zeroed, the diagonal - elements may have got reduced. Reduce the sub- - diagonals as well*/ - - if(schur > 1) - { - gmp_Hermite_reduce_step (canonical, right, schur-1, - nf -> right_inverted); - } - } - - /* A nonzero pivot was found. Permute it to the diagonal position, - make it positive, and reduce the off-diagonals. - The schur complement now starts from the next diagonal. */ - else - { - pivot_ind = schur+pivot_ind-1; - gmp_matrix_swap_rows(schur, pivot_ind, canonical); - - if(nf->left_inverted == INVERTED) - { - gmp_matrix_swap_rows(schur, pivot_ind, left); - } - else - { - gmp_matrix_swap_cols(schur, pivot_ind, left); - } - - /* Make the pivot positive */ - gmp_matrix_get_elem(pivot, schur, schur, canonical); - - if(mpz_cmp_si(pivot, 0) < 0) - { - gmp_matrix_negate_col(schur, canonical); - - if(nf->right_inverted == INVERTED) - { - gmp_matrix_negate_col(schur, right); - } - else - { - gmp_matrix_negate_row(schur, right); - } - } - - /* Reduce off-diagonals */ - gmp_Hermite_reduce_step (canonical, right, schur, nf -> right_inverted); - - schur++; - } - } - - /* The Schur complement is now empty. There may still be uneliminated - columns left (in case of a wide matrix) */ - - colind = schur; - while (colind <= cols) - { - gmp_Hermite_eliminate_step (canonical, right, colind, nf->right_inverted); - gmp_Hermite_reduce_step (canonical, right, schur-1, nf->right_inverted); - colind++; - } - - mpz_clear(pivot); - - return EXIT_SUCCESS; -} - - - -gmp_normal_form * -create_gmp_Hermite_normal_form(gmp_matrix * A, - inverted_flag left_inverted, - inverted_flag right_inverted) -{ - gmp_normal_form * new_nf; - - if(A == NULL) - { - return NULL; - } - - new_nf = - create_gmp_trivial_normal_form(A, left_inverted, right_inverted); - - if(new_nf == NULL) - { - /* A has been destroyed already */ - return NULL; - } - - if(gmp_normal_form_make_Hermite(new_nf) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - return NULL; - } - - return new_nf; -} - - -gmp_normal_form * -create_gmp_Smith_normal_form(gmp_matrix * A, - inverted_flag left_inverted, - inverted_flag right_inverted) -{ - - gmp_normal_form * new_nf; - gmp_matrix * canonical; - gmp_matrix * elbow; - inverted_flag elbow_flag; - size_t rows, cols; - size_t i, j; - size_t subd_ind, row_undivisible; - size_t last_ready_row, first_ready_col, ind; - mpz_t pivot; - mpz_t remainder; - - if(A == NULL) - { - return NULL; - } - - new_nf = - create_gmp_trivial_normal_form(A, left_inverted, right_inverted); - - if(new_nf == NULL) - { - /* A has been destroyed already */ - return NULL; - } - - canonical = new_nf -> canonical; - mpz_init(pivot); - mpz_init(remainder); - rows = canonical->rows; - cols = canonical->cols; - last_ready_row = 0; - first_ready_col = (cols < rows) ? (cols+1) : (rows+1); - - while(first_ready_col > last_ready_row + 1) - { - /*******/ - /* HNF */ - /*******/ - - if(gmp_normal_form_make_Hermite(new_nf) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - -#ifdef DEBUG - printf("HNF\n"); - gmp_matrix_printf (new_nf -> left); - gmp_matrix_printf (new_nf -> canonical); - gmp_matrix_printf (new_nf -> right); -#endif - - /**********************/ - /* Find ready columns */ - /**********************/ - - /* If a diagonal entry is zero, so is the corresponding - column. The zero diagonals always reside in the end. - Seek until zero diagonal encountered, but stay within the matrix! */ - ind = 1; - while ( (mpz_cmp_si(canonical -> storage[(ind-1)+(ind-1)*rows], 0) - != 0) - && - (ind < first_ready_col) ) - { - ind ++; - } - first_ready_col = ind; - - /* Note: The number of ready cols is settled after the first HNF, - but the check is cheap. */ - - /**********************************************/ - /* Permute unit diagonals such that they lead */ - /**********************************************/ - - /* If the recently computed HNF has ones on the diagonal, their - corresponding rows are all zero (except the diagonal). - They are then settled, because the next LHNF kills the elements - on their columns. */ - - ind = last_ready_row+1; - - /* Stay within the nonzero cols of the matrix */ - while (ind < first_ready_col) - { - /* Unit diagonal encountered */ - if(mpz_cmp_si ( canonical->storage[(ind-1) + (ind-1)*rows], - 1) == 0) - { - /* If not in the beginning, permute to extend the leading minor - with unit diagonals */ - if(ind != last_ready_row+1) - { - gmp_matrix_swap_rows(last_ready_row+1, ind, - new_nf -> canonical); - - if(left_inverted == INVERTED) - { - gmp_matrix_swap_rows(last_ready_row+1, ind, - new_nf -> left); - } - else - { - gmp_matrix_swap_cols(last_ready_row+1, ind, - new_nf -> left); - } - - gmp_matrix_swap_cols(last_ready_row+1, ind, - new_nf -> canonical); - - if(right_inverted == INVERTED) - { - gmp_matrix_swap_cols(last_ready_row+1, ind, - new_nf -> right); - } - else - { - gmp_matrix_swap_rows(last_ready_row+1, ind, - new_nf -> right); - } - } - last_ready_row ++; - } - ind++; - } - -#ifdef DEBUG - printf("Leading units\n"); - gmp_matrix_printf (new_nf -> left); - gmp_matrix_printf (new_nf -> canonical); - gmp_matrix_printf (new_nf -> right); -#endif - - /********/ - /* LHNF */ - /********/ - - /* Extravagant strategy: Compute HNF of an explicit tranpose. */ - - /* 1. Transpose everything in the normal form */ - if(gmp_matrix_transp(canonical) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - if(gmp_matrix_transp(new_nf->left) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - if(gmp_matrix_transp(new_nf->right) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - - elbow = new_nf ->left; - new_nf ->left = new_nf ->right; - new_nf ->right = elbow; - elbow_flag = new_nf ->left_inverted; - new_nf ->left_inverted = new_nf ->right_inverted; - new_nf ->right_inverted = elbow_flag; - - /* 2. Compute HNF of the transpose */ - if(gmp_normal_form_make_Hermite(new_nf) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - - /* 3. Transpose everything back */ - if(gmp_matrix_transp(canonical) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - if(gmp_matrix_transp(new_nf->left) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - if(gmp_matrix_transp(new_nf->right) != EXIT_SUCCESS) - { - destroy_gmp_normal_form(new_nf); - mpz_clear(pivot); - mpz_clear(remainder); - return NULL; - } - elbow = new_nf ->left; - new_nf ->left = new_nf ->right; - new_nf ->right = elbow; - elbow_flag = new_nf ->left_inverted; - new_nf ->left_inverted = new_nf ->right_inverted; - new_nf ->right_inverted = elbow_flag; - - -#ifdef DEBUG - printf("LHNF\n"); - gmp_matrix_printf (new_nf -> left); - gmp_matrix_printf (new_nf -> canonical); - gmp_matrix_printf (new_nf -> right); -#endif - - - /*****************************************************/ - /* Check if more of the leading normal form is ready */ - /*****************************************************/ - - /* The matrix is in LHNF, i.e. it is upper triangular. - If the row trailing the top left diagonal element is - zero, the diagonal element may be an invariant factor - on its final position, and the stage may be ready. - - The stage may not still be ready: The leading diagonal element - of D may not divide the rest of the Schur complement. */ - - subd_ind = 0; - row_undivisible = 0; - - /* Explanation of loop conditions: - 1.) No relative primes found from Schur complement - 2.) Stay within the Schur complement - 3.) If a nonzero is found from the trailing row, the stage is - definitely not ready */ - while (row_undivisible == 0 && - last_ready_row + 1 < first_ready_col && - subd_ind == 0) - { - subd_ind = - gmp_matrix_row_inz(last_ready_row+1, - last_ready_row+2, cols, - canonical); - - /* printf("subd_ind %i\n", subd_ind); - printf("last_ready_row %i\n", last_ready_row); */ - - /* No nonzeros found, the stage may be ready */ - if (subd_ind == 0) - { - mpz_set (pivot, - canonical->storage[(last_ready_row)+ - (last_ready_row)*rows]); - - /* Check whether the pivot divides all elements in the Schur - complement */ - row_undivisible = 0; - for(j = last_ready_row+2; j < first_ready_col; j++) - { - for(i = last_ready_row+2; i <= j; i++) - { - mpz_tdiv_r (remainder, - canonical->storage[(i-1)+ - (j-1)*rows], - pivot); - - if(mpz_cmp_si(remainder, 0) !=0) - { - row_undivisible = i; - /* col_undivisible = j; */ - } - } - } - - /* printf("Row undivisible %i\n", row_undivisible); */ - - /* If a relative prime was found from the Schur complement, - add that row to the first row of the Schur complement */ - if(row_undivisible != 0) - { - mpz_set_si (remainder, 1); - gmp_matrix_add_row(remainder, - row_undivisible, last_ready_row+1, - canonical); - - /* [ 1 0] [1 0] = [1 0] - [-1 1] [1 1] [0 1] */ - - if(left_inverted == INVERTED) - { - gmp_matrix_add_row(remainder, - row_undivisible, last_ready_row+1, - new_nf->left); - } - else - { - mpz_neg (remainder, remainder); - gmp_matrix_add_col(remainder, - last_ready_row+1, row_undivisible, - new_nf->left); - } - } - /* The Schur complement is smaller by one again */ - else - { - last_ready_row++; - } - } - } - } /* The main loop ends here */ - - mpz_clear(pivot); - mpz_clear(remainder); - return new_nf; -} - -int destroy_gmp_normal_form(gmp_normal_form * nf) -{ - int status; - - if(nf == NULL) - { - return EXIT_FAILURE; - } - - status = EXIT_SUCCESS; - if(destroy_gmp_matrix(nf -> left) == EXIT_FAILURE) - { - status = EXIT_FAILURE; - } - - if(destroy_gmp_matrix(nf -> canonical) == EXIT_FAILURE) - { - status = EXIT_FAILURE; - } - - if(destroy_gmp_matrix(nf -> right) == EXIT_FAILURE) - { - status = EXIT_FAILURE; - } - free(nf); - - return status; -} - - diff --git a/contrib/kbipack/gmp_normal_form.o b/contrib/kbipack/gmp_normal_form.o deleted file mode 100755 index f165a904233fc099325f1bb789f948c5207669de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16308 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 SLZ1~H<){o?T;w|r{r)Eq1>N}o -- GitLab