-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathspx_define.h
More file actions
453 lines (383 loc) · 19.3 KB
/
spx_define.h
File metadata and controls
453 lines (383 loc) · 19.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
/*
** Copyright 2007-2018 RTE
** Author: Robert Gonzalez
**
** This file is part of Sirius_Solver.
** This program and the accompanying materials are made available under the
** terms of the Eclipse Public License 2.0 which is available at
** http://www.eclipse.org/legal/epl-2.0.
**
** This Source Code may also be made available under the following Secondary
** Licenses when the conditions for such availability set forth in the Eclipse
** Public License, v. 2.0 are satisfied: GNU General Public License, version 3
** or later, which is available at <http://www.gnu.org/licenses/>.
**
** SPDX-License-Identifier: EPL-2.0 OR GPL-3.0
*/
# ifdef __cplusplus
extern "C"
{
# endif
# ifndef DEFINITIONS_SPX_FAITES
/*******************************************************************************************/
# include "spx_sys.h"
# include "spx_constantes_externes.h"
# include "spx_constantes_internes.h"
/* Pour les coupes d'intersection */
typedef struct{
int NombreDeTermes;
int * NumeroDeVariableMatrice;
double * ProduitScalaire;
} LIGNE_DE_PRODUITS_SCALAIRES;
typedef struct{
/* Les variables continues */
int NombreDeTermes;
int * NumeroDeVariableSpx;
double * Coefficient;
double SecondMembre;
} LIGNE_DE_MATRICE;
typedef struct{
double * Vecteur;
char * LaVariableSpxEstEntiere; /* OUI_SPX ou NON_SPX */
double * B;
LIGNE_DE_PRODUITS_SCALAIRES ** LigneDeProduitScalaire;
LIGNE_DE_MATRICE ** LigneDeMatrice;
double * NormeAvantReduction;
int NombreDeVariables;
double * XmaxSv;
double AlphaI0;
char * TSpx;
double * CoeffSpx;
} DONNEES_POUR_COUPES_DINTERSECTION;
/* Pour les Gomory */
typedef struct{
char * T;
double * Coeff;
double * B;
char * LaVariableSpxEstEntiere; /* OUI_SPX ou NON_SPX */
double * XmaxSv;
} DONNEES_POUR_COUPES_DE_GOMORY;
/* Pour la mini exploration */
typedef struct{
char * PositionDeLaVariable;
char * InDualFramework;
int * ContrainteDeLaVariableEnBase;
double * DualPoids;
int * VariableEnBaseDeLaContrainte;
} BASE_INSTANCIATION;
typedef struct{
void * NoeudPere;
void * Fils_0;
void * Fils_1;
BASE_INSTANCIATION * BaseDuNoeud;
int VariableSortieDeLaBase;
char TypeDeSortieDeLaBase;
int Profondeur;
} NOEUD_INSTANCIATION;
/* Pour le probleme Spx */
typedef struct {
/* Pour les outils de gestion memoire */
void * Tas;
/*------------------------------------------------------------------------*/
int NbCycles;
char AffichageDesTraces;
char TypeDePricing; /* PRICING_DANTZIG ou PRICING_STEEPEST_EDGE */
char FaireDuScalingSPX;
char StrategieAntiDegenerescence; /* AGRESSIF ou PEU_AGRESSIF */
int CycleDeControleDeDegenerescence;
char EcrireLegendePhase1;
char EcrireLegendePhase2;
int Contexte;
int AlgorithmeChoisi;
int LaBaseDeDepartEstFournie;
int YaUneSolution;
int NombreMaxDIterations;
double DureeMaxDuCalcul;
int CycleDeRefactorisation;
double UnSurRAND_MAX;
int FaireDuRaffinementIteratif;
char ChoixDeVariableSortanteAuHasard;
char BaseInversibleDisponible;
int NombreMaxDeChoixAuHasard;
int NombreDeChoixFaitsAuHasard;
char AdmissibilitePossible;
char InverseProbablementDense;
char ToleranceSurLesVariablesEntieresAjustees; /* OUI_SPX ou NON_SPX */
/*---------------------- Tailles allouees -----------------------*/
int NombreDeVariablesAllouees;
int NombreDeContraintesAllouees;
int NbTermesAlloues;
/*---------------------- Les variables du probleme ------------------------*/
char PresenceDeVariablesDeBornesIdentiques;
int NombreDeVariables;
int NombreDeVariablesACoutNonNul;
int NombreDeVariablesNatives;
int NombreDeVariablesDuProblemeSansCoupes;
int * NumeroDesVariablesACoutNonNul;
double * C; /* Dimension nombre de variables */
double * Csv; /* Dimension nombre de variables */
double * X; /* Dimension nombre de variables */
double * Xmin; /* Dimension nombre de variables */
double * Xmax; /* Dimension nombre de variables */
char * TypeDeVariable; /* 3 valeurs possibles:
BORNEE , BORNEE_INFERIEUREMENT , NON_BORNEE */
char * OrigineDeLaVariable; /* 3 valeurs possibles:
NATIVE , ECART , BASIQUE_ARTIFICIELLE */
/* Bornes auxiliaires:
1- Pour l'instant seul la borne sup est utilisee.
2- Pour l'instant seul le type BORNE_AUXILIAIRE_PRESOLVE est utilise.
3- Elles ne s'appliquent pas aux variables non bornees. */
int NombreDeBornesAuxiliairesUtilisees;
int IterationPourBornesAuxiliaires;
double CoeffMultiplicateurDesBornesAuxiliaires;
char * StatutBorneSupCourante; /* BORNE_NATIVE, BORNE_AUXILIAIRE_PRESOLVE, BORNE_AUXILIAIRE_FICTIVE */
double * BorneSupAuxiliaire;
char * StatutBorneSupAuxiliaire; /* BORNE_AUXILIAIRE_PRESOLVE, BORNE_AUXILIAIRE_FICTIVE, BORNE_AUXILIAIRE_INVALIDE */
/* Fin bornes auxilaires */
int * CntVarEcartOuArtif;
double * XEntree; /* Dimension nombre de variables */
double * XminEntree; /* Dimension nombre de variables */
double * XmaxEntree; /* Dimension nombre de variables */
double * SeuilDeViolationDeBorne; /* Dimension nombre de variables */
double * SeuilDAmissibiliteDuale1; /* Une valeur par variable pour tenir compte du scaling */
double * SeuilDAmissibiliteDuale2; /* Une valeur par variable pour tenir compte du scaling */
double * ScaleX; /* Dimension nombre de variables */
double ScaleLigneDesCouts;
int * CorrespondanceVarEntreeVarSimplexe; /* Dimension nombre de variables d'entree */
int * CorrespondanceVarSimplexeVarEntree; /* Dimension nombre de variables d'entree + Nombre de contraintes d'entree */
/*------------------------------------------------------------------------*/
/*---------------------- Matrice des contraintes -------------------------*/
int NombreDeContraintes;
int NombreDeContraintesDuProblemeSansCoupes;
double * B; /* Dimension nombre de contraintes */
double * BAvantTranslationEtApresScaling; /* Dimension nombre de contraintes */
double * ScaleB; /* Dimension nombre de contraintes */
int * Mdeb; /* Dimension nombre de contraintes */
int * NbTerm; /* Dimension nombre de contraintes */
double * A; /* Dimension nombre de termes */
int * Indcol; /* Dimension nombre de termes */
int * CorrespondanceCntSimplexeCntEntree; /* Dimension nombre de contraintes */
int * CorrespondanceCntEntreeCntSimplexe; /* Dimension nombre de contraintes */
/*-------------------------------------------------------------------------*/
/*---- Matrice des contraintes avec uniquement les variables hors base ----*/
int * IndexDansLaMatriceHorsBase;
int * MdebHorsBase;
int * NbTermHorsBase;
double * AHorsBase;
int * IndcolHorsBase;
int * InverseIndexDansLaMatriceHorsBase;
/*------------------------------------------------------------------------*/
double ValeurMoyenneDuSecondMembre; /* Pour construire des bornes sup artificielles */
double PlusGrandTermeDeLaMatrice;
double PlusPetitTermeDeLaMatrice;
double RapportDeScaling;
double CoutMoyen;
double EcartDeBornesMoyen;
double PerturbationMax;
/*---------------- Transposee de la matrice des contraintes --------------*/
char StockageParColonneSauvegarde;
int * Cdeb ; /* Dimension nombre de variables */
int * Csui ; /* Dimension nombre de termes */
int * CNbTerm; /* Dimension nombre de variables */
int * CNbTermSansCoupes; /* Dimension nombre de variables */
int * CNbTermesDeCoupes; /* Dimension nombre de variables */
double * ACol; /* Dimension nombre de termes */
int * NumeroDeContrainte; /* Dimension nombre de termes */
int * CdebBase; /* Dimension nombre de contraintes */
int * NbTermesDesColonnesDeLaBase; /* Dimension nombre de contraintes */
/*-------------------------- Eta matrices ---------------------------------*/
int LastEta;
int RemplissageMaxDeLaFPI;
int * EtaDeb; /* Nombre de changements de base avant refactorisation */
int * EtaNbTerm; /* Nombre de changements de base avant refactorisation */
int * EtaColonne; /* Nombre de changements de base avant refactorisation */
int * EtaIndiceLigne; /* Nombre de chgt de base avant refactorisation * nb contraintes */
double * EtaMoins1Valeur; /* Nombre de chgt de base avant refactorisation * nb contraintes */
/*------------------------------------------------------------------------*/
/*------------------- Zone des donnees de travail ------------------------*/
int Iteration;
time_t HeureDeCalendrierDebut;
int NbCyclesSansControleDeDegenerescence;
int PhaseEnCours; /* PHASE_1 ou PHASE_2 */
int ChangementDeBase;
int VariableEntrante;
double DeltaXSurLaVariableHorsBase;
int VariableSortante;
int SortSurXmaxOuSurXmin;
int NombreDeChangementsDeBase;
char StrongBranchingEnCours;
char PremierSimplexe;
char BBarreAEteCalculeParMiseAJour; /* Vaut OUI_SPX ou NON_SPX */
char CBarreAEteCalculeParMiseAJour; /* Vaut OUI_SPX ou NON_SPX */
/* Tableau de travail */
int * T; /* dimensionne au nombre de variables (i.e. toujours > au nombre de contraintes, toujours -1 quand on en a besoin */
/* Tableaux de travail */
int NbABarreSNonNuls; /* Utile que dans le cas TypeDeStockageDeABarreS = COMPACT_SPX */
int * CntDeABarreSNonNuls; /* Utile que dans le cas TypeDeStockageDeABarreS = COMPACT_SPX */
double * ABarreS; /* Dimension nombre de contraintes */
double * Bs; /* Dimension nombre de contraintes */
double * BBarre; /* Dimension nombre de contraintes */
char CalculerBBarre;
char FaireMiseAJourDeBBarre;
int BuffNbBoundFlip;
int NbItBoundFlip;
int NbBoundFlipIterationPrecedente;
int NbBoundFlip;
int * BoundFlip; /* Dimension nombre de variables: (Numero de variable + 1) si passe Xmin vers Xmax
-(Numero de variable + 1) si passe Xmax vers Xmin */
double ABarreSCntBase;
/* Donnees concernant la base */
double * Pi; /* Dimension nombre de contraintes */
double * CBarre; /* Dimension nombre de variables */
char * PositionDeLaVariable; /* Dimension nombre de variables */
int * ContrainteDeLaVariableEnBase; /* Dimension nombre de variables */
int * VariableEnBaseDeLaContrainte; /* Dimension nombre de contraintes */
int * NombreDeVariablesHorsBaseDeLaContrainte; /* Dimension nombre de contraintes */
/* Tableaux pour le pricing */
int NombreDeContraintesASurveiller;
int * IndexDansContrainteASurveiller; /* Dimensionne au nombre de contraintes */
int * NumerosDesContraintesASurveiller; /* Dimensionne au nombre de contraintes */
double * ValeurDeViolationDeBorne; /* Au carre. Dimensionne au nombre de contraintes */
/* Variables hors base */
int NombreDeVariablesHorsBase;
int * NumerosDesVariablesHorsBase; /* Dimension: variables - nombre de contraintes */
double * NBarreR; /* Dimension: variables */
int * IndexDeLaVariableDansLesVariablesHorsBase; /* Dimension: nombre de variables */
/* Cas hyper creux */
int NombreDeValeursNonNullesDeNBarreR;
int * NumVarNBarreRNonNul; /* Dimension: variables - nombre de contraintes */
/* */
/* Donnees specifiques a l'algorithme dual */
double SeuilDePivotDual;
int NombreDeVariablesATester;
char PremierPassage;
char FaireTriRapide;
int * NumeroDesVariableATester;
double * CBarreSurNBarreR;
double * CBarreSurNBarreRAvecTolerance;
char TypeDeStockageDeErBMoinsUn;
int NbTermesNonNulsDeErBMoinsUn;
int * IndexTermesNonNulsDeErBMoinsUn;
double * ErBMoinsUn;
double DeltaPiSurLaVariableEnBase;
char CalculerCBarre;
double SommeDesInfaisabilitesPrimales;
double Cout; /* Valeur du cout de la solution */
double CoutMax; /* Valeur du cout au dessus de laquelle on arrete les calculs (utilite: branch and bound) */
int UtiliserCoutMax; /* Vaut OUI_SPX si on desire faire le test par rapport a CoutMax, et NON_SPX si on ne veut
pas utiliser cette possibilite */
double PartieFixeDuCout; /* Partie du cout qui est due aux variables dont la valeur est fixe. C'est calcul� en
entree du solveur */
char LeSteepestEdgeEstInitilise;
char * InDualFramework; /* Pour la methode dual devex ou steepest edge: dimension nombre de variables */
double * DualPoids ; /* Pour la methode dual devex ou steepest edge: dimension nombre de contraintes */
double * Tau ; /* Pour la methode dual devex ou steepest edge: dimension nombre de contraintes */
char LesCoutsOntEteModifies;
char ModifCoutsAutorisee;
double CoefficientPourLaValeurDePerturbationDeCoutAPosteriori;
char * CorrectionDuale;
/* Les zones memoire ci-dessous peuvent etre liberees des la fin de phase 1 de l'algorithme dual mais
on ne le fait pas afin de pouvoir utiliser ces zones comme tableaux temporaires si necessaire */
char LaBaseEstDualeAdmissible;
int NbInfaisabilitesDualesALaPremiereIteration;
int NbInfaisabilitesDuales;
double SommeDesInfaisabilitesDuales;
double * V; /* Dimension nombre de contraintes */
char * FaisabiliteDeLaVariable; /* Dimension nombre de variables */
/* Fin des zones memoires specifiques a la fin de phase 1 de l'algorithme dual */
/* Sauvegardes pour le branch and bound (utile pour le choix de la variable a instancier) */
double * XSV; /* Dimension nombre de variables */
double ValeurDuPivotMarkowitzSV; /* Le seuil Markowitz qui a servi a factoriser la derniere base
inversible */
char * PositionDeLaVariableSV; /* Dimension nombre de variables */
double * CBarreSV; /* Dimension nombre de variables */
char * InDualFrameworkSV; /* Dimension nombre de variables */
int * ContrainteDeLaVariableEnBaseSV; /* Dimension nombre de variables */
double * BBarreSV; /* Dimension nombre de contraintes */
double * DualPoidsSV; /* Dimension nombre de contraintes */
int * VariableEnBaseDeLaContrainteSV; /* Dimension nombre de contraintes */
int * CdebBaseSV; /* Dimension nombre de contraintes */
int * NbTermesDesColonnesDeLaBaseSV; /* Dimension nombre de contraintes */
/*-------------------------------------------------------------------------*/
char UtiliserLaLuUpdate;
int FaireScalingLU;
char FactoriserLaBase; /* Indicateur positionne a OUI_SPX en cas de derive de la forme produit de l'inverse */
char FaireChangementDeBase;
/* Precaution pour la stabilite des calculs. Lorsqu'un probleme de stabilite des calculs est detecte et
qu'on demande une factorisation, on augmente le seuil du pivot de Markowitz. On le decremente
ensuite tant qu'on ne rencontre pas de probleme de stabilite numerique */
char ProblemeDeStabiliteDeLaFactorisation; /* Vaut OUI_SPX ou NON_SPX */
char FlagStabiliteDeLaFactorisation; /* Vaut 0 ou 1 */
double ValeurDuPivotMarkowitz;
/*-------------------------------------------------------------------------*/
/* Pour le pilotage de l'hyper creux */
char TypeDeStockageDeABarreS; /* Vaut COMPACT_SPX ou VECTEUR_SPX */
char TypeDeStockageDeNBarreR; /* Vaut COMPACT_SPX ou VECTEUR_SPX */
char TypeDeCreuxDeLaBase; /* Vaut BASE_HYPER_CREUSE ou BASE_CREUSE ou BASE_PLEINE */
char CalculErBMoinsUnEnHyperCreux; /* OUI_SPX au depart */
char CalculErBMoinsEnHyperCreuxPossible; /* OUI_SPX au depart */
int CountEchecsErBMoins; /* 0 au depart */
int AvertissementsEchecsErBMoins; /* 0 au depart */
int NbEchecsErBMoins; /* 0 au depart */
char CalculABarreSEnHyperCreux; /* OUI_SPX au depart */
char CalculABarreSEnHyperCreuxPossible; /* OUI_SPX au depart */
int CountEchecsABarreS; /* 0 au depart */
int AvertissementsEchecsABarreS; /* 0 au depart */
int NbEchecsABarreS; /* 0 au depart */
char CalculTauEnHyperCreux; /* OUI_SPX au depart */
char CalculTauEnHyperCreuxPossible; /* OUI_SPX au depart */
int CountEchecsTau; /* 0 au depart */
int AvertissementsEchecsTau; /* 0 au depart */
int NbEchecsTau; /* 0 au depart */
/*-------------------------------------------------------------------------*/
void * MatriceFactorisee;
int RangDeLaMatriceFactorisee;
int NombreDeFactorisationsDeBaseReduite;
int ForcerUtilisationDeLaBaseComplete; /* OUI_SPX ou NON_SPX */
int NombreDeReactivationsDeLaBaseReduite;
int NombreDeBasesReduitesSuccessives;
int NombreDeBasesCompletesSuccessives;
int NombreDinfaisabilitesSiBaseReduite;
int NbEchecsReductionNombreDinfaisabilitesSiBaseReduite;
char InitBaseReduite;
char * PositionHorsBaseReduiteAutorisee; /* OUI_SPX ou NON_SPX */
char UtiliserLaBaseReduite; /* OUI_SPX ou NON_SPX */
int IterationDeConstructionDeLaBaseReduite;
int ProchaineIterationDeReinitDesCouts;
int * OrdreColonneDeLaBaseFactorisee; /* Dimension nombre de contraintes */
int * ColonneDeLaBaseFactorisee; /* Dimension nombre de contraintes */
int * OrdreLigneDeLaBaseFactorisee; /* Dimension nombre de contraintes */
int * LigneDeLaBaseFactorisee; /* Dimension nombre de contraintes */
int * CdebProblemeReduit; /* Dimension nombre de variables */
int * CNbTermProblemeReduit; /* Dimension nombre de variables */
double * ValeurDesTermesDesColonnesDuProblemeReduit;
int * IndicesDeLigneDesTermesDuProblemeReduit;
int NbElementsAllouesPourLeProblemeReduit;
double * AReduit; /* Dimension nombre de contraintes toujours a 0 quand on en a besoin */
int * IndexAReduit; /* Dimension nombre de contraintes */
int * Marqueur; /* Dimension nombre de contraintes toujours a -1 quand on en a besoin */
/*-------------------------------------------------------------------------*/
int AnomalieDetectee;
jmp_buf EnvSpx;
/*-------------------------------------------------------------------------*/
/* Pour les coupes d'intersection */
DONNEES_POUR_COUPES_DINTERSECTION * DonneesPourCoupesDIntersection;
char CoupesDintersectionAllouees; /* Vaut OUI_SPX ou NON_SPX */
/* Pour les coupes coupes de Gomory */
DONNEES_POUR_COUPES_DE_GOMORY * DonneesPourCoupesDeGomory;
/*---------------------------------*/
/* Pour la PNE */
void * ProblemePneDeSpx; /* Mis a jour par la PNE */
char ExplorationRapideEnCours; /* OUI_SPX ou NON_SPX */
/*------------------------------------------*/
/* Pour utiliser le tirage aleatoire de pne */
double A1;
/*------------------------------------------*/
void *callback;
} PROBLEME_SPX;
/*******************************************************************************************/
# define DEFINITIONS_SPX_FAITES
# endif
# ifdef __cplusplus
}
# endif