/* ------------------------------------------------------------- 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__