PIPS
pnome-private.c
Go to the documentation of this file.
1 /*
2 
3  $Id: pnome-private.c 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 /************************************************************ pnome-private.c
26  *
27  * PRIVATE ROUTINES (MONOMIAL MANIPULATIONS)
28  *
29  */
30 
31 #ifdef HAVE_CONFIG_H
32  #include "config.h"
33 #endif
34 #include <stdio.h>
35 #include <string.h>
36 
37 #include "boolean.h"
38 #include "arithmetique.h"
39 #include "vecteur.h"
40 #include "polynome.h"
41 
42 
43 /* Pmonome monome_del_var(Pmonome pm, Variable var)
44  * PRIVATE
45  * returns a copy of monomial pm, where variable var is deleted
46  */
48 Pmonome pm;
49 Variable var;
50 {
51  if (MONOME_UNDEFINED_P(pm))
52  return (MONOME_UNDEFINED);
53  else if (MONOME_NUL_P(pm))
54  return (MONOME_NUL);
55  else {
56  Pmonome newpm = new_monome();
57 
58  monome_coeff(newpm) = monome_coeff(pm);
59  monome_term(newpm) = vect_del_var(monome_term(pm), var);
60  if (VECTEUR_NUL_P(monome_term(newpm))) {
61  /* is it the only variable */
62  monome_term(newpm) = vect_new(TCST, VALUE_ONE);
63  /* now it is a constant term */
64  }
65 
66  return(newpm);
67  }
68 }
69 
70 
71 /* bool monome_colin(Pmonome pm1, Pmonome pm2)
72  * PRIVATE
73  * returns true if the two monomials are "colinear":
74  * same variables, same exponents.
75  * We consider that MONOME_UNDEFINED is only colinear to MONOME_UNDEFINED. [???]
76  */
77 bool monome_colin(pm1, pm2)
78 Pmonome pm1, pm2;
79 {
80  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
81  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
82  return(pm1 == pm2);
83  else
84  return(vect_equal(monome_term(pm1), monome_term(pm2)));
85 }
86 
87 
88 /* bool monome_equal(Pmonome pm1, Pmonome pm2)
89  * PRIVATE
90  * returns true if the two monomials are equal
91  * same coeff., same variables, same exponents.
92  */
93 bool monome_equal(pm1, pm2)
94 Pmonome pm1, pm2;
95 {
96  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
97  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
98  return(pm1 == pm2);
99  else
100  return(vect_equal(monome_term(pm1), monome_term(pm2))
101  && ((monome_coeff(pm1) == monome_coeff(pm2))));
102 }
103 
104 /* float Bernouilli(int i)
105  * PRIVATE
106  * returns Bi = i-th Bernouilli number
107  */
108 float Bernouilli(i)
109 int i;
110 {
111  switch (i) {
112  case 1: return((float) 1/6);
113  case 2: return((float) 1/30);
114  case 3: return((float) 1/42);
115  case 4: return((float) 1/30);
116  case 5: return((float) 5/66);
117  case 6: return((float) 691/2730);
118  case 7: return((float) 7/6);
119  case 8: return((float) 3617/510);
120  case 9: return((float) 43867/798);
121  case 10: return((float) 174611/330);
122  case 11: return((float) 854513/138);
123  case 12: return((float) 236364091/2730);
124  default: polynome_error("Bernouilli(i)", "i=%d illegal\n", i);
125  /* later, we could compute bigger Bernouilli(i) with the recurrence */
126  }
127  /* To please the gcc compiler */
128  return 0.;
129 }
130 
131 
132 /* int factorielle (int n)
133  * PRIVATE
134  * returns n!
135  */
137 int n;
138 {
139  int fact = -1;
140 
141  if (n<0)
142  polynome_error("factorielle", "n=%d", n);
143  else if (n<2)
144  fact = 1;
145  else
146  fact = factorielle(n-1) * n;
147 
148  return fact;
149 }
150 
151 
152 /* double intpower(double d, int n)
153  * returns d^n for all integers n
154  */
155 double intpower(d, n)
156 double d;
157 int n;
158 {
159  if (n>0)
160  return (intpower(d, n-1) * d);
161  else if (n==0)
162  return((double) 1);
163  else
164  return (intpower(d, n+1) / d);
165 }
166 
167 
168 /* bool is_inferior_monome(Pmonome pm1, pm2, int (*is_inferior_var)())
169  * returns the qsort comparison (pm1<pm2)
170  * we follow the "lexicographic" order: decreasing powers of the main variable,
171  * (according to the variable order relation passed in is_inferior_var)
172  * the decreasing powers of the next main variable, ...
173  * When pm1=pm2 we return false.
174  * When pm1 or pm2 is MONOME_NUL or MONOME_UNDEFINED we return false.
175  *
176  * is_inferior_var is indeed to be understood as the qsort comparator
177  * method and so is ill-defined here. RK
178  */
180 Pmonome pm1, pm2;
182 {
183  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
184  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
185  return (false);
186  else {
187  /* Initial version:
188  Pvecteur pv1 = vect_tri(monome_term(pm1), is_inferior_var);
189  Pvecteur pv2 = vect_tri(monome_term(pm2), is_inferior_var);
190  */
191  /* Fabien's version:
192  Pvecteur pv1 = vect_sort(monome_term(pm1), vect_compare);
193  Pvecteur pv2 = vect_sort(monome_term(pm2), vect_compare);
194  */
197  Pbase pb = base_union((Pbase) pv1, (Pbase) pv2);
198  /* Pbase pbsorted = (Pbase) vect_tri(pb, is_inferior_var); */
199  /* Pbase pbsorted = (Pbase) vect_sort(pb, vect_compare); */
200  Pbase pbsorted = (Pbase) vect_sort(pb, is_inferior_var);
201  bool result = false;
202 
203  /* The following test is added by L.Zhou .
204  We want the constant term at the end . Jul.15, 91 */
205  if ( term_cst(pv1) )
206  return(true);
207  else if ( term_cst(pv2) )
208  return(false);
209 
210  /* The following test is added by L.Zhou . Mar.26, 91 */
211  if ( vect_coeff_sum(pv1) < vect_coeff_sum(pv2) )
212  result = true;
213  else if ( vect_coeff_sum(pv1) > vect_coeff_sum(pv2) )
214  ;
215  else {
216  while (!BASE_NULLE_P(pbsorted)) {
217  Variable var = vect_first_var((Pvecteur) pbsorted);
218  Value power1 = vect_coeff(var, pv1);
219  Value power2 = vect_coeff(var, pv2);
220 
221  if ( power1 < power2 ) {
222  result = true;
223  break;
224  }
225  else if ( power2 < power1 )
226  break;
227  vect_erase_var((Pvecteur *) &pbsorted, var);
228  }
229  }
230 
231  vect_rm((Pvecteur) pbsorted);
232  vect_rm((Pvecteur) pb);
233  vect_rm(pv2);
234  vect_rm(pv1);
235 
236  return (result);
237  }
238 }
void const char const char const int
int Value
#define VALUE_ONE
Pbase base_union(Pbase b1, Pbase b2)
Pbase base_union(Pbase b1, Pbase b2): compute a new basis containing all elements of b1 and all eleme...
Definition: base.c:428
bool is_inferior_var(Variable, Variable)
Definition: polynome_ri.c:118
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
Pmonome new_monome()
INTLIBRARY.
Definition: pnome-alloc.c:48
void polynome_error(const char *name, char *fmt,...)
INTLIBRARY.
Definition: pnome-error.c:62
Pmonome monome_del_var(Pmonome pm, Variable var)
Pmonome monome_del_var(Pmonome pm, Variable var) PRIVATE returns a copy of monomial pm,...
Definition: pnome-private.c:47
float Bernouilli(int i)
float Bernouilli(int i) PRIVATE returns Bi = i-th Bernouilli number
bool monome_equal(Pmonome pm1, Pmonome pm2)
bool monome_equal(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are equal same ...
Definition: pnome-private.c:93
bool is_inferior_monome(Pmonome pm1, Pmonome pm2, int *is_inferior_var)
bool is_inferior_monome(Pmonome pm1, pm2, int (*is_inferior_var)()) returns the qsort comparison (pm1...
int factorielle(int n)
int factorielle (int n) PRIVATE returns n!
double intpower(double d, int n)
double intpower(double d, int n) returns d^n for all integers n
bool monome_colin(Pmonome pm1, Pmonome pm2)
bool monome_colin(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are "colinear":...
Definition: pnome-private.c:77
#define monome_term(pm)
#define MONOME_UNDEFINED_P(pm)
#define monome_coeff(pm)
Macros definitions.
#define MONOME_NUL_P(pm)
#define MONOME_UNDEFINED
#define MONOME_NUL
Null/undefined, monomial/polynomial definitions.
Variable vect_first_var(Pvecteur pvec)
PRIVATE: marquage du couple var_val comme visite par remplacement de var par -var dans le couple (OBS...
Definition: private.c:227
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
struct Svecteur * Pbase
#define VECTEUR_NUL_P(v)
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60
#define term_cst(varval)
#define BASE_NULLE_P(b)
Pvecteur vect_new(Variable var, Value coeff)
Pvecteur vect_new(Variable var,Value coeff): allocation d'un vecteur colineaire au vecteur de base va...
Definition: alloc.c:110
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
void vect_erase_var(Pvecteur *ppv, Variable v)
void vect_erase_var(Pvecteur * ppv, Variable v): projection du vecteur *ppv selon la direction v (i....
Definition: unaires.c:106
Pvecteur vect_del_var(Pvecteur v_in, Variable var)
Pvecteur vect_del_var(Pvecteur v_in, Variable var): allocation d'un nouveau vecteur egal a la project...
Definition: unaires.c:206
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...
Definition: unaires.c:228
Pvecteur vect_sort(Pvecteur v, int *compare)
Pvecteur vect_sort(v, compare) Pvecteur v; int (*compare)();.
Definition: unaires.c:335
Value vect_coeff_sum(Pvecteur vect)
Value vect_coeff_sum(Pvecteur vect): coefficient sum de tout les val de ce vecteur (devrait etre dans...
Definition: unaires.c:246