Files
Seele/external/sdpa/sdpa_parts.h
T

270 lines
6.2 KiB
C++
Raw Normal View History

2023-01-21 18:43:21 +01:00
/* -------------------------------------------------------------
This file is a component of SDPA
Copyright (C) 2004-2013 SDPA Project
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
------------------------------------------------------------- */
#ifndef __sdpa_parts_h__
#define __sdpa_parts_h__
#include "sdpa_include.h"
#include "sdpa_dataset.h"
namespace sdpa {
class Newton;
class Solutions;
class InputData;
class Residuals;
class ComputeTime;
class Parameter;
class StepLength;
class DirectionParameter;
class Switch;
class RatioInitResCurrentRes;
class SolveInfo;
class Phase;
class AverageComplementarity;
class ComputeTime
{
public:
double Predictor;
double Corrector;
double StepPredictor;
double StepCorrector;
double xMatTime;
double zMatTime;
double invzMatTime;
double xMatzMatTime;
double EigxMatTime;
double EigzMatTime;
double EigxMatzMatTime;
double makerMat;
double makebMat;
double B_DIAG;
double B_F1;
double B_F2;
double B_F3;
double B_PRE;
double makebMatgVec;
double choleskybMat;
double solve;
double sumDz;
double makedX;
double symmetriseDx;
double makedXdZ;
double updateRes;
double MainLoop;
double FileRead;
double FileCheck;
double FileChange;
double TotalTime;
ComputeTime();
~ComputeTime();
void display(FILE* fpout=stdout);
};
class Parameter
{
public:
enum parameterType {PARAMETER_DEFAULT,
PARAMETER_UNSTABLE_BUT_FAST,
PARAMETER_STABLE_BUT_SLOW};
int maxIteration;
double epsilonStar;
double lambdaStar;
double omegaStar;
double lowerBound;
double upperBound;
double betaStar;
double betaBar;
double gammaStar;
double epsilonDash;
#define PRINT_DEFAULT_LENGTH 30
static char xPRINT_DEFAULT[PRINT_DEFAULT_LENGTH];
static char XPRINT_DEFAULT[PRINT_DEFAULT_LENGTH];
static char YPRINT_DEFAULT[PRINT_DEFAULT_LENGTH];
static char infPRINT_DEFAULT[PRINT_DEFAULT_LENGTH];
char xPrint[PRINT_DEFAULT_LENGTH];
char XPrint[PRINT_DEFAULT_LENGTH];
char YPrint[PRINT_DEFAULT_LENGTH];
char infPrint[PRINT_DEFAULT_LENGTH];
Parameter();
Parameter(FILE* parameterFile);
~Parameter();
void setDefaultParameter(parameterType type
= PARAMETER_DEFAULT);
void readFile(FILE* parameterFile);
void display(FILE* fpout=stdout, char* printFormat=infPRINT_DEFAULT);
};
class StepLength
{
public:
double primal;
double dual;
StepLength();
StepLength(double alphaP, double alphaD, int nBlock,
int* blockStruct);
~StepLength();
void initialize(double alphaP, double alphaD);
void finalize();
static double minBlockVector(BlockVector& aVec);
void computeStepLength(Solutions& currentPt,
ComputeTime& com);
void MehrotraPredictor(InputData& inputData,
Solutions& currentPt,
Phase& phase,
Switch& reduction,
AverageComplementarity& mu,
RatioInitResCurrentRes& theta,
Parameter& param,
ComputeTime& com);
void Centering(Solutions& currentPt,
Parameter& param,
ComputeTime& com);
void display(FILE* fpout = stdout);
};
class DirectionParameter
{
public:
double value;
DirectionParameter(double betaStar=0.0);
~DirectionParameter();
void initialize(double betaStar=0.0);
void Predictor(Phase& phase, Switch& reduction,
Parameter& param);
void Centering();
void MehrotraCorrector(Phase& phase, StepLength& alpha,
Solutions& currentPt,
AverageComplementarity& mu,
Parameter& param);
void display(FILE* fpout = stdout);
};
class Switch
{
public:
enum SwitchType {CENTERING,AFFINE}; // {ON,OFF}
SwitchType switchType;
Switch(SwitchType switchType=CENTERING);
~Switch();
void initialize(SwitchType switchType=CENTERING);
void MehrotraPredictor(Phase& phase);
void display(FILE* fpout = stdout);
};
class AverageComplementarity
{
public:
double initial;
double current;
AverageComplementarity(double lambdaStar = 0.0);
~AverageComplementarity();
void initialize(double lambdaStar = 0.0);
void update(Solutions& currentPt);
void display(FILE* fpout = stdout);
};
class RatioInitResCurrentRes
{
public:
double primal;
double dual;
RatioInitResCurrentRes();
~RatioInitResCurrentRes();
void initialize(Parameter& param, Residuals& currentRes);
void update(Switch& reduction, StepLength& alpha);
void update_exact(Residuals& currentRes, Parameter& param);
void display(FILE* fpout = stdout);
};
class SolveInfo
{
public:
enum phaseType { noINFO,pFEAS,dFEAS,pdFEAS,pdINF,pFEAS_dINF,
pINF_dFEAS,pdOPT,pUNBD,dUNBD};
double rho;
double etaPrimal;
double etaDual;
double objValPrimal;
double objValDual;
SolveInfo();
SolveInfo(InputData& inputData, Solutions& currentPt,
double mu0, double omegaStar);
~SolveInfo();
void initialize(InputData& inputData, Solutions& currentPt,
double mu0, double omegaStar);
void update(InputData& inputData,
Solutions& currentPt,
Residuals& currentRes,
AverageComplementarity& mu,
RatioInitResCurrentRes& theta,
Parameter& param);
// check mu, gap, feasibility 2007/09/13
void check(InputData& inputData,
Solutions& currentPt,
Residuals& currentRes,
AverageComplementarity& mu,
RatioInitResCurrentRes& theta,
Parameter& param);
void display(FILE* fpout = stdout);
};
class Phase
{
public:
int nDim;
SolveInfo::phaseType value;
Phase();
~Phase();
bool initialize(Residuals& currentRes,
SolveInfo& solveInfo,
Parameter& param, int nDim);
bool updateCheck(Residuals& currentRes,
SolveInfo& solveInfo,
Parameter& param);
void reverse();
void display(FILE* fpout = stdout);
};
} // end of namespace 'sdpa'
#endif // __sdpa_parts_h__