PIPS
matrice-local.h
Go to the documentation of this file.
1 /*
2 
3  $Id: matrice-local.h 1641 2016-03-02 08:20:19Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of Linear/C3 Library.
8 
9  Linear/C3 Library is free software: you can redistribute it and/or modify it
10  under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  Linear/C3 Library is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 /* package matrice
26  *
27  * Neil Butler, Corinne Ancourt, Francois Irigoin, Yi-qing Yang
28  *
29  */
30 
31 #if defined(__GNUC__)
32 // Comment this warning since no one has fixed this issue since the 90's...
33 //#warning matrice is obsolete, use matrix instead.
34 #endif
35 
36 /* Les matrices sont des matrices pleines, a coefficients rationnels.
37  *
38  * Les matrices sont representes par des tableaux d'entiers mono-dimensionnels
39  * dont l'element 0 represente le denominateur global. Elles sont
40  * stockees par colonne ("column-major"), comme en Fortran. Les indices
41  * commencent a 1, toujours comme en Fortran et non comme en C.
42  * Les deux dimensions sont implicites et doivent etre passees en
43  * parametre avec la matrice dans les appels de procedures.
44  *
45  * Le denominateur doit etre strictement positif, i.e. plus grand ou egal
46  * a un. Un denominateur nul n'aurait pas de sens. Un denominateur negatif
47  * doublerait le nombre de representations possibles d'une matrice.
48  *
49  * Les matrices renvoyees par certaines routines, comme matrice_multiply(),
50  * ne sont pas normalisees par le pgcd des coefficients et du denominateur
51  * pour des raisons d'efficacite. Mais les routines de test, comme
52  * matrice_identite_p(), supposent leurs arguments normalises.
53  *
54  * Il faudrait sans doute introduire deux niveaux de procedure, un niveau
55  * externe sur garantissant la normalisation, et un niveau interne efficace
56  * sans normalisation automatique.
57  *
58  * La bibliotheque utilise une notion de sous-matrice, definie systematiquement
59  * par un parametre appele "level". Seuls les elements dont les indices
60  * de lignes et de colonnes sont superieurs a level+1 (ou level? FI->CA)
61  * sont pris en consideration. Il s'agit donc de sous-matrice dont le
62  * premier element se trouve sur la diagonale de la matrice complete et
63  * dont le dernier element et le dernier element de la matrice complete.
64  *
65  * Note: en cas detection d'incoherence, Neil Butler renvoyait un code
66  * d'erreur particulier; Francois Irigoin a supprime ces codes de retour
67  * et a traite les exceptions par des appels a assert(), et indirectement
68  * a abort()
69  */
70 
71 typedef Value * matrice;
72 
73 #define MATRICE_UNDEFINED ((matrice) NULL)
74 #define MATRICE_NULLE ((matrice) NULL)
75 
76 /* Allocation et desallocation d'une matrice */
77 #define matrice_new(n,m) ((matrice) malloc(sizeof(Value)*((n*m)+1)))
78 #define matrice_free(m) (free((char *) (m)))
79 
80 /* Macros d'acces aux elements d'une matrice */
81 
82 /* int ACCESS(int * matrix, int column, int i, int j): acces a l'element (i,j)
83  * de la matrice matrix, dont la taille des colonnes, i.e. le nombre de
84  * lignes, est column.
85  */
86 #define ACCESS(matrix,column,i,j) ((matrix)[(((j)-1)*(column))+(i)])
87 
88 /* int DENOMINATEUR(matrix): acces au denominateur global d'une matrice matrix
89  * La combinaison *(&()) est necessaire pour avoir des parentheses autour
90  * de matrix[0] et pour pouvoir simultanement utiliser cette macro comme lhs.
91  */
92 /* #define DENOMINATOR(matrix) *(&((matrix)[0])) */
93 #define DENOMINATOR(matrix) ((matrix)[0])
94 
95 /* bool matrice_triangulaire_inferieure_p(matrice a, int n, int m):
96  * test de triangularite de la matrice a
97  */
98 #define matrice_triangulaire_inferieure_p(a,n,m) \
99  matrice_triangulaire_p(a,n,m,true)
100 
101 /* bool matrice_triangulaire_superieure_p(matrice a, int n, int m):
102  * test de triangularite de la matrice a
103  */
104 #define matrice_triangulaire_superieure_p(a,n,m) \
105  matrice_triangulaire_p(a,n,m,false)
106 
107 /* FI: Corinne, peux-tu expliquer la raison d'etre de cette macro? */
108 /* d'apres ce que je comprends de la suite, ca permet de definir
109  * des sous-matrices dont le coin superieur droit (i.e. le premier
110  * element) se trouve sur la diagonal?
111  */
112 #define ACC_ELEM(matrix,column,i,j,level) \
113  (matrix[((j)-1+(level))*(column) + (i) + (level)])
114 
115 /* FI: Corinne, pourrais-tu nous eclairer sur la signification de ces
116  * constantes?
117  */
118 #define VALIDATION 0
119 /* FI #define NULL 0 */
120 #define MATRIX 0
121 
122 /* definition temporaire d'une vraie fonction pour dbx */
123 /* #define matrice_print(a,n,m) matrice_fprint(stdout,a,n,m) */
int Value
Value * matrice
package matrice
Definition: matrice-local.h:71