PIPS
sous-matrice.c File Reference
#include <stdio.h>
#include "boolean.h"
#include "arithmetique.h"
#include "matrice.h"
+ Include dependency graph for sous-matrice.c:

Go to the source code of this file.

Macros

#define MALLOC(s, t, f)   malloc(s)
 package matrice More...
 
#define FREE(s, t, f)   free(s)
 

Functions

int mat_lig_nnul (matrice MAT, int n, int m, int level)
 int mat_lig_nnul(matrice MAT, int n, int m, int level): Recherche de la premiere ligne non nulle de la la sous-matrice MAT(level+1 ..n, level+1 ..m) More...
 
void mat_perm_col (matrice MAT, int n __attribute__((unused)), int m __attribute__((unused)), int k, int level)
 void mat_perm_col(matrice MAT, int n, int m, int k, int level): Calcul de la matrice de permutation permettant d'amener la k-ieme ligne de la matrice MAT(1..n,1..m) a la ligne (level + 1). More...
 
void mat_perm_lig (matrice MAT, int n __attribute__((unused)), int m __attribute__((unused)), int k, int level)
 void mat_perm_lig(matrice MAT, int n, int m, int k, int level): Calcul de la matrice de permutation permettant d'amener la k-ieme colonne de la sous-matrice MAT(1..n,1..m) a la colonne 'level + 1' (premiere colonne de la sous matrice MAT(level+1 ..n,level+1 ..m)). More...
 
void mat_min (matrice MAT, int n, int m, int *i_min, int *j_min, int level)
 void mat_min(matrice MAT, int n, int m, int * i_min, int * j_min, int level): Recherche des coordonnees (*i_min, *j_min) de l'element de la sous-matrice MAT(level+1 ..n, level+1 ..m) dont la valeur absolue est la plus petite et non nulle. More...
 
void mat_maj_col (matrice A, int n __attribute__((unused)), int m __attribute__((unused)), matrice P, int level)
 void mat_maj_col(matrice A, int n, int m, matrice P, int level): Calcul de la matrice permettant de remplacer chaque terme de la premiere ligne de la sous-matrice A(level+1 ..n, level+1 ..m) autre que le premier terme A11=A(level+1,level+1) par le reste de sa division entiere par A11 More...
 
void mat_maj_lig (matrice A, int n, int m, matrice Q, int level)
 void mat_maj_lig(matrice A, int n, int m, matrice Q, int level): Calcul de la matrice permettant de remplacer chaque terme de la premiere ligne autre que le premier terme A11=A(level+1,level+1) par le reste de sa division entiere par A11 More...
 
void matrice_identite (matrice ID, int n, int level)
 void matrice_identite(matrice ID, int n, int level) Construction d'une sous-matrice identite dans ID(level+1..n, level+1..n) More...
 
bool matrice_identite_p (matrice ID, int n, int level)
 bool matrice_identite_p(matrice ID, int n, int level) test d'une sous-matrice dans ID(level+1..n, level+1..n) pour savoir si c'est une matrice identite. More...
 
int mat_lig_el (matrice MAT, int n, int m, int level)
 int mat_lig_el(matrice MAT, int n, int m, int level) renvoie le numero de colonne absolu du premier element non nul de la sous-ligne MAT(level+1,level+2..m); renvoie 0 si la sous-ligne est vide. More...
 
int mat_col_el (matrice MAT, int n, int m __attribute__((unused)), int level)
 int mat_col_el(matrice MAT, int n, int m, int level) renvoie le numero de ligne absolu du premier element non nul de la sous-colonne MAT(level+2..n,level+1); renvoie 0 si la sous-colonne est vide. More...
 
void mat_coeff_nnul (matrice MAT, int n, int m, int *lg_nnul, int *cl_nnul, int level)
 void mat_coeff_nnul(matrice MAT, int n, int m, int * lg_nnul, int * cl_nnul, int level) renvoie les coordonnees du plus petit element non-nul de la premiere sous-ligne non nulle 'lg_nnul' de la sous-matrice MAT(level+1..n, level+1..m) More...
 

Macro Definition Documentation

◆ FREE

#define FREE (   s,
  t,
  f 
)    free(s)

Definition at line 45 of file sous-matrice.c.

◆ MALLOC

#define MALLOC (   s,
  t,
  f 
)    malloc(s)

package matrice

ce fichier comporte les routines traitant des sous-matrices inferieures droites; ces routines traitent la matrice toute entiere si le parametre level vaut 0; les routines sur les matrices completes se trouvent dans le fichier matrice.c

Definition at line 44 of file sous-matrice.c.

Function Documentation

◆ mat_coeff_nnul()

void mat_coeff_nnul ( matrice  MAT,
int  n,
int  m,
int lg_nnul,
int cl_nnul,
int  level 
)

void mat_coeff_nnul(matrice MAT, int n, int m, int * lg_nnul, int * cl_nnul, int level) renvoie les coordonnees du plus petit element non-nul de la premiere sous-ligne non nulle 'lg_nnul' de la sous-matrice MAT(level+1..n, level+1..m)

recherche de la premiere ligne non nulle de la sous-matrice MAT(level+1 .. n,level+1 .. m)

recherche du plus petit (en valeur absolue) element non nul de cette ligne

Parameters
MATAT
lg_nnulg_nnul
cl_nnull_nnul
levelevel

Definition at line 426 of file sous-matrice.c.

431 {
432  bool trouve = false;
433  int j;
434  register Value min=VALUE_ZERO,val;
435 
436  *lg_nnul = 0;
437  *cl_nnul = 0;
438 
439  /* recherche de la premiere ligne non nulle de la
440  sous-matrice MAT(level+1 .. n,level+1 .. m) */
441 
442  *lg_nnul= mat_lig_nnul(MAT,n,m,level);
443 
444  /* recherche du plus petit (en valeur absolue)
445  * element non nul de cette ligne */
446  if (*lg_nnul) {
447  for (j=1+level;j<=m && !trouve; j++) {
448  min = ACCESS(MAT,n,*lg_nnul,j);
450  if (value_notzero_p(min)) {
451  trouve = true;
452  *cl_nnul=j;
453  }
454  }
455  for (j=1+level;j<=m && value_gt(min,VALUE_ONE); j++) {
456  val = ACCESS(MAT,n,*lg_nnul,j);
457  value_absolute(val);
458  if (value_notzero_p(val) && value_lt(val,min)) {
459  min = val;
460  *cl_nnul =j;
461  }
462  }
463  }
464 }
#define VALUE_ZERO
#define value_absolute(ref)
#define value_gt(v1, v2)
#define value_notzero_p(val)
int Value
#define VALUE_ONE
#define value_lt(v1, v2)
#define min(a, b)
#define ACCESS(matrix, column, i, j)
Macros d'acces aux elements d'une matrice.
Definition: matrice-local.h:86
#define level
int mat_lig_nnul(matrice MAT, int n, int m, int level)
int mat_lig_nnul(matrice MAT, int n, int m, int level): Recherche de la premiere ligne non nulle de l...
Definition: sous-matrice.c:65

References ACCESS, level, mat_lig_nnul(), min, value_absolute, value_gt, value_lt, value_notzero_p, VALUE_ONE, and VALUE_ZERO.

Referenced by matrice_hermite().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mat_col_el()

int mat_col_el ( matrice  MAT,
int  n,
int m   __attribute__(unused),
int  level 
)

int mat_col_el(matrice MAT, int n, int m, int level) renvoie le numero de ligne absolu du premier element non nul de la sous-colonne MAT(level+2..n,level+1); renvoie 0 si la sous-colonne est vide.

RGSUSED

Definition at line 404 of file sous-matrice.c.

408 {
409  int i;
410  int i_min=0;
411 
412  for(i = level+2; i <= n && value_zero_p(ACCESS(MAT,n,i,level+1)); i++);
413  if (i<n+1)
414  i_min = i-1;
415  return (i_min);
416 }
#define value_zero_p(val)

References ACCESS, level, and value_zero_p.

◆ mat_lig_el()

int mat_lig_el ( matrice  MAT,
int  n,
int  m,
int  level 
)

int mat_lig_el(matrice MAT, int n, int m, int level) renvoie le numero de colonne absolu du premier element non nul de la sous-ligne MAT(level+1,level+2..m); renvoie 0 si la sous-ligne est vide.

RGUSED

recherche du premier element non nul de la sous-ligne MAT(level+1,level+2..m)

Parameters
MATAT
levelevel

Definition at line 381 of file sous-matrice.c.

385 {
386  int j;
387  int j_min = 0;
388 
389  /* recherche du premier element non nul de la sous-ligne
390  MAT(level+1,level+2..m) */
391  for(j = level+2; j<=m && value_zero_p(ACCESS(MAT,n,1+level,j)) ; j++);
392  if(j < m+1)
393  j_min = j-1;
394  return (j_min);
395 }

References ACCESS, level, and value_zero_p.

Referenced by matrice_hermite(), and matrice_smith().

+ Here is the caller graph for this function:

◆ mat_lig_nnul()

int mat_lig_nnul ( matrice  MAT,
int  n,
int  m,
int  level 
)

int mat_lig_nnul(matrice MAT, int n, int m, int level): Recherche de la premiere ligne non nulle de la la sous-matrice MAT(level+1 ..n, level+1 ..m)

sous-matrice.c

resultat retourne par la fonction :

int : numero de la premiere ligne non nulle de la matrice MAT; ou 0 si la sous-matrice MAT(level+1 ..n,level+1 ..m) est identiquement nulle;

parametres de la fonction :

int MAT[] : matrice int n : nombre de lignes de la matrice int m : nombre de colonnes de la matrice int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice

recherche du premier element non nul de la sous-matrice

on dumpe la colonne J...

Parameters
MATAT
levelevel

Definition at line 65 of file sous-matrice.c.

69 {
70  int i,j;
71  int I = 0;
72  bool trouve = false;
73 
74  /* recherche du premier element non nul de la sous-matrice */
75  for (i = level+1; i<=n && !trouve ; i++) {
76  for (j = level+1; j<= m && value_zero_p(ACCESS(MAT,n,i,j)); j++);
77  if(j <= m) {
78  /* on dumpe la colonne J... */
79  trouve = true;
80  I = i;
81  }
82  }
83  return (I);
84 }

References ACCESS, level, and value_zero_p.

Referenced by mat_coeff_nnul().

+ Here is the caller graph for this function:

◆ mat_maj_col()

void mat_maj_col ( matrice  A,
int n   __attribute__(unused),
int m   __attribute__(unused),
matrice  P,
int  level 
)

void mat_maj_col(matrice A, int n, int m, matrice P, int level): Calcul de la matrice permettant de remplacer chaque terme de la premiere ligne de la sous-matrice A(level+1 ..n, level+1 ..m) autre que le premier terme A11=A(level+1,level+1) par le reste de sa division entiere par A11

La matrice P est modifiee.

Les parametres de la fonction :

int A[1..n,1..m] : matrice int n : nombre de lignes de la matrice int m : nombre de colonnes de la matrice (unused) !int P[] : matrice de dimension au moins P[1..n, 1..n] int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice RGSUSED

Definition at line 252 of file sous-matrice.c.

257 {
258  register Value A11;
259  register Value x;
260  int i;
261 
262  matrice_identite(P,n,0);
263 
264  A11 = ACC_ELEM(A,n,1,1,level);
265  for (i=2+level; i<=n; i++) {
266  x = ACCESS(A,n,i,1+level);
267  value_division(x,A11);
268  ACCESS(P,n,i,1+level) = value_uminus(x);
269  }
270 }
#define value_uminus(val)
unary operators on values
#define value_division(ref, val)
#define ACC_ELEM(matrix, column, i, j, level)
FI: Corinne, peux-tu expliquer la raison d'etre de cette macro?
void matrice_identite(matrice ID, int n, int level)
void matrice_identite(matrice ID, int n, int level) Construction d'une sous-matrice identite dans ID(...
Definition: sous-matrice.c:322
static char * x
Definition: split_file.c:159
Definition: pip__tab.h:25

References ACC_ELEM, ACCESS, level, matrice_identite(), value_division, value_uminus, and x.

+ Here is the call graph for this function:

◆ mat_maj_lig()

void mat_maj_lig ( matrice  A,
int  n,
int  m,
matrice  Q,
int  level 
)

void mat_maj_lig(matrice A, int n, int m, matrice Q, int level): Calcul de la matrice permettant de remplacer chaque terme de la premiere ligne autre que le premier terme A11=A(level+1,level+1) par le reste de sa division entiere par A11

La matrice Q est modifiee.

Les parametres de la fonction :

int A[] : matrice int n : nombre de lignes de la matrice int m : nombre de colonnes de la matrice !int Q[] : matrice int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice

Parameters
levelevel

Definition at line 292 of file sous-matrice.c.

297 {
298  register Value A11;
299  int j;
300  register Value x;
301 
302  matrice_identite(Q,m,0);
303  A11 = ACC_ELEM(A,n,1,1,level);
304  for (j=2+level; j<=m; j++) {
305  x = ACCESS(A,n,1+level,j);
306  value_division(x,A11);
307  ACCESS(Q,m,1+level,j) = value_uminus(x);
308  }
309 }
#define Q
Definition: pip__type.h:39

References ACC_ELEM, ACCESS, level, matrice_identite(), Q, value_division, value_uminus, and x.

+ Here is the call graph for this function:

◆ mat_min()

void mat_min ( matrice  MAT,
int  n,
int  m,
int i_min,
int j_min,
int  level 
)

void mat_min(matrice MAT, int n, int m, int * i_min, int * j_min, int level): Recherche des coordonnees (*i_min, *j_min) de l'element de la sous-matrice MAT(level+1 ..n, level+1 ..m) dont la valeur absolue est la plus petite et non nulle.

QQ i dans [level+1 ..n] QQ j dans [level+1 ..m] | MAT[*i_min, *j_min] | <= | MAT[i, j]

resultat retourne par la fonction :

les parametres i_min et j_min sont modifies.

parametres de la fonction :

int MAT[] : matrice int n : nombre de lignes de la matrice int m : nombre de colonnes de la matrice !int i_min : numero de la ligne a laquelle se trouve le plus petit element !int j_min : numero de la colonne a laquelle se trouve le plus petit int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice element

initialisation du minimum car recherche d'un minimum non nul

Parameters
MATAT
i_min_min
j_min_min
levelevel

Definition at line 193 of file sous-matrice.c.

198 {
199  int i,j;
200  int vali= 0;
201  int valj=0;
202  register Value min=VALUE_ZERO, val;
203  bool trouve = false;
204 
205 
206  /* initialisation du minimum car recherche d'un minimum non nul*/
207  for (i=1+level;i<=n && !trouve;i++)
208  for(j = level+1; j <= m && !trouve; j++) {
209  min = ACCESS(MAT,n,i,j);
211  if(min != 0) {
212  trouve = true;
213  vali = i;
214  valj = j;
215  }
216  }
217 
218  for (i=1+level;i<=n;i++)
219  for (j=1+level;j<=m && value_gt(min,VALUE_ONE); j++) {
220  val = ACCESS(MAT,n,i,j);
221  value_absolute(val);
222  if (value_notzero_p(val) && value_lt(val,min)) {
223  min = val;
224  vali= i;
225  valj =j;
226  }
227  }
228  *i_min = vali;
229  *j_min = valj;
230 }

References ACCESS, level, min, value_absolute, value_gt, value_lt, value_notzero_p, VALUE_ONE, and VALUE_ZERO.

Referenced by matrice_smith().

+ Here is the caller graph for this function:

◆ mat_perm_col()

void mat_perm_col ( matrice  MAT,
int n   __attribute__(unused),
int m   __attribute__(unused),
int  k,
int  level 
)

void mat_perm_col(matrice MAT, int n, int m, int k, int level): Calcul de la matrice de permutation permettant d'amener la k-ieme ligne de la matrice MAT(1..n,1..m) a la ligne (level + 1).

Si l'on veut amener la k-ieme ligne de la matrice en premiere ligne 'level' doit avoir la valeur 0

parametres de la fonction :

!int MAT[] : matrice int n : nombre de lignes de la matrice int m : nombre de colonnes de la matrice (unused) int k : numero de la ligne a remonter a la premiere ligne int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice

Note: pour eviter une multiplication de matrice en O(n**3), il vaudrait mieux programmer directement la permutation en O(n**2) sans multiplications Il est inutile de faire souffrir notre chip SPARC! (FI) RGSUSED

Definition at line 108 of file sous-matrice.c.

113 {
114  int i,j;
115 
116  matrice_nulle(MAT,n,n);
117  if (level > 0) {
118  for (i=1;i<=level; i++)
119  ACCESS(MAT,n,i,i) = VALUE_ONE;
120  }
121 
122  for (i=1+level,j=k; i<=n; i++,j++)
123  {
124  if (j == n+1) j = 1 + level;
125  ACCESS(MAT,n,i,j)=VALUE_ONE;
126  }
127 }
void matrice_nulle(matrice Z, int n, int m)
void matrice_nulle(matrice Z, int n, int m): Initialisation de la matrice Z a la valeur matrice nulle
Definition: matrice.c:311

References ACCESS, level, matrice_nulle(), and VALUE_ONE.

+ Here is the call graph for this function:

◆ mat_perm_lig()

void mat_perm_lig ( matrice  MAT,
int n   __attribute__(unused),
int m   __attribute__(unused),
int  k,
int  level 
)

void mat_perm_lig(matrice MAT, int n, int m, int k, int level): Calcul de la matrice de permutation permettant d'amener la k-ieme colonne de la sous-matrice MAT(1..n,1..m) a la colonne 'level + 1' (premiere colonne de la sous matrice MAT(level+1 ..n,level+1 ..m)).

parametres de la fonction :

!int MAT[] : matrice int n : nombre de lignes de la matrice (unused) int m : nombre de colonnes de la matrice int k : numero de la colonne a placer a la premiere colonne int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice RGSUSED

Definition at line 145 of file sous-matrice.c.

150 {
151  int i,j;
152 
153  matrice_nulle(MAT,m,m);
154  if(level > 0) {
155  for (i = 1; i <= level;i++)
156  ACCESS(MAT,m,i,i) = VALUE_ONE;
157  }
158 
159  for(j=1,i=k-level; j <= m - level; j++,i++) {
160  if(i == m-level+1)
161  i = 1;
162  ACC_ELEM(MAT,m,i,j,level) = VALUE_ONE;
163  }
164 }

References ACC_ELEM, ACCESS, level, matrice_nulle(), and VALUE_ONE.

+ Here is the call graph for this function:

◆ matrice_identite()

void matrice_identite ( matrice  ID,
int  n,
int  level 
)

void matrice_identite(matrice ID, int n, int level) Construction d'une sous-matrice identite dans ID(level+1..n, level+1..n)

Les parametres de la fonction :

!int ID[] : matrice int n : nombre de lignes de la matrice int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice

Parameters
IDD
levelevel

Definition at line 322 of file sous-matrice.c.

326 {
327  int i,j;
328 
329  for(i = level+1; i <= n; i++) {
330  for(j = level+1; j <= n; j++)
331  ACCESS(ID,n,i,j) = VALUE_ZERO;
332  ACCESS(ID,n,i,i) = VALUE_ONE;
333  }
334 
335  DENOMINATOR(ID) = VALUE_ONE;
336 }
#define DENOMINATOR(matrix)
int DENOMINATEUR(matrix): acces au denominateur global d'une matrice matrix La combinaison *(&()) est...
Definition: matrice-local.h:93

References ACCESS, DENOMINATOR, level, VALUE_ONE, and VALUE_ZERO.

Referenced by check_tiling_legality(), local_tile_constraints(), mat_maj_col(), mat_maj_lig(), matrice_hermite(), matrice_smith(), matrice_unimodulaire_triangulaire_inversion(), sc_image_computation(), tile_hyperplane_constraints(), tiling_transformation(), and unstructured_to_complexity().

+ Here is the caller graph for this function:

◆ matrice_identite_p()

bool matrice_identite_p ( matrice  ID,
int  n,
int  level 
)

bool matrice_identite_p(matrice ID, int n, int level) test d'une sous-matrice dans ID(level+1..n, level+1..n) pour savoir si c'est une matrice identite.

Le test n'est correct que si la matrice ID passee en argument est normalisee (cf. matrice_normalize())

Pour tester toute la matrice ID, appeler avec level==0

Les parametres de la fonction :

int ID[] : matrice int n : nombre de lignes (et de colonnes) de la matrice ID int level : niveau de la matrice i.e. numero de la premiere ligne et de la premiere colonne a partir duquel on commence a prendre en compte les elements de la matrice

i!=j

Parameters
IDD
levelevel

Definition at line 353 of file sous-matrice.c.

357 {
358  int i,j;
359 
360  for(i = level+1; i <= n; i++) {
361  for(j = level+1; j <= n; j++) {
362  if(i==j) {
363  if(value_notone_p(ACCESS(ID,n,i,i)))
364  return(false);
365  }
366  else /* i!=j */
367  if(value_notzero_p(ACCESS(ID,n,i,j)))
368  return(false);
369  }
370  }
371  return(true);
372 }
#define value_notone_p(val)

References ACCESS, level, value_notone_p, and value_notzero_p.