PIPS
plreal.c
Go to the documentation of this file.
1 /*
2 
3  $Id: plreal.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  /* package plint */
26 
27 #ifdef HAVE_CONFIG_H
28  #include "config.h"
29 #endif
30 
31 #include <stdio.h>
32 #include "boolean.h"
33 #include "arithmetique.h"
34 #include "vecteur.h"
35 #include "contrainte.h"
36 #include "sc.h"
37 
38 #include "sommet.h"
39 
40 /* pour recuperer les declarations des fonctions de conversion de
41  * sc en liste de sommets et reciproquement, bien que ca casse le
42  * DAG des types de donnees
43  */
44 #include "ray_dte.h"
45 #include "polyedre.h"
46 #include "matrix.h"
47 
48 #include "plint.h"
49 
50 /* Psysteme plreal(Psysteme first_sys, Psommet fonct):
51  * Resolution d'un systeme lineaire en nombres reels positifs
52  *
53  *
54  * resultat retourne par la fonction :
55  *
56  * Psysteme : systeme lineaire
57  *
58  * Les parametres de la fonction :
59  *
60  * Psysteme first_syst : systeme lineaire initial
61  * Psommet fonct : fonction economique du programme lineaire
62  */
63 Psysteme plreal(first_sys,fonct)
64 Psysteme first_sys;
65 Psommet fonct;
66 {
67  Psommet sys1 = NULL;
68  Psysteme syst_res = NULL;
69  Pvecteur lvbase = NULL;
70  int nb_som = 0;
71  int nbvars;
72  Pbase b =BASE_NULLE;
73 
74  if (first_sys) {
75  nbvars = first_sys->dimension;
76  b = base_dup(first_sys->base);
77 
78  if ((first_sys->egalites != NULL)
79  || (first_sys->inegalites != NULL)) {
80  /* conversion du systeme lineaire en sommet */
81  sys1 = sys_som_conv(first_sys,&nb_som);
82  /* ajout des variables d'ecart */
83  if ((sys1 = eq_in_ineq(&sys1,&nb_som,&lvbase)) != NULL) {
84  sys1 = var_ecart_sup(sys1,nb_som,&lvbase,&nbvars,&b);
85  sys1 = primal_pivot(sys1,&lvbase,nb_som,fonct);
86  }
87 
88  /* calcul de la solution reelle positive */
89  while ((sys1 != NULL) &&
90  (dual_pivot_pas(&sys1,&lvbase,nb_som,fonct,&nbvars,&b) == true));
91 
92  /* si le systeme est non faisable,
93  liberation de l'espace memoire ocupe par la fonction
94  economique */
95  if (sys1 == NULL && fonct != NULL) {
96  vect_rm(fonct->vecteur);
97  fonct->vecteur = NULL;
98  }
99  /* conversion du sommet en systeme lineaire */
100  syst_res = som_sys_conv(sys1);
101  /* si le systeme est non faisable,
102  liberation de l'espace memoire occupe par les variables */
103  if (syst_res != NULL) {
104  syst_res->base = b;
105  syst_res->dimension = nbvars;
106  }
107  }
108  }
109  sommets_rm(sys1);
110  vect_rm(lvbase);
111 
112  return(syst_res);
113 }
bool dual_pivot_pas(Psommet *sys, Pvecteur *lvbase, int nb_som, Psommet fonct, int *nbvars, Pbase *b)
bool dual_pivot_pas(Psommet * sys, Pvecteur * lvbase, int nb_som, Psommet fonct, int * nbvars,...
Definition: pldual.c:213
Psysteme plreal(Psysteme first_sys, Psommet fonct)
package plint
Definition: plreal.c:63
Psommet primal_pivot(Psommet sys, Pvecteur *lvbase, int nb_som, Psommet fonct)
Psommet primal_pivot(Psommet sys, Pvecteur * lvbase, int nb_som, Psommet fonct): algorithme primal du...
Definition: plsimplexe.c:209
Psommet eq_in_ineq(Psommet *sys, int *nb_som, Pvecteur *lvbase)
Psommet eq_in_ineq(Psommet * sys, int * nb_som, Pvecteur * lvbase): Transformation des egalites du sy...
Definition: plvar-ecart.c:68
Psommet var_ecart_sup(Psommet sys, int nb_som, Pvecteur *lvbase, int *nbvars, Pbase *b)
Psommet var_ecart_sup(Psommet sys, int nb_som, Pvecteur * lvbase, int * nbvars, Pbase *b): ajout des ...
Definition: plvar-ecart.c:156
void sommets_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
Pbase base
Definition: sc-local.h:75
int dimension
Definition: sc-local.h:74
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
structure de donnees Sommet
Definition: sommet-local.h:64
Pvecteur vecteur
Definition: sommet-local.h:66
#define BASE_NULLE
MACROS SUR LES BASES.
Pbase base_dup(Pbase b)
Pbase base_dup(Pbase b) Note: this function changes the value of the pointer.
Definition: alloc.c:268
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78