overhauled physics engine

This commit is contained in:
Dynamitos
2023-01-21 18:43:21 +01:00
parent 3c7346cf7b
commit 2208ab438a
164 changed files with 22606 additions and 928 deletions
+256
View File
@@ -0,0 +1,256 @@
/* -------------------------------------------------------------
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
------------------------------------------------------------- */
/*--------------------------------------------------
sdpa_call.h
--------------------------------------------------*/
/***************************************************
In this header file,
Do NOT use 'using namespace sdpa;'.
Otherwise, if users define their OWN 'sdpa' namespace,
it would be trouble.
***************************************************/
#ifndef __sdpa_call_h__
#define __sdpa_call_h__
#include <sdpa_right.h>
#include <sdpa_newton.h>
#include <sdpa_chordal.h>
#include <sdpa_parts.h>
#include <sdpa_struct.h>
#include <cstdio>
#include <vector>
#include <algorithm>
/* The class list is generated by the following command
$ grep class *.h | grep -v \; | grep -v SDPA | tr ':' ' ' | \
awk '{print $2 " " $3 ";"}'
*/
namespace sdpa {
class BlockStruct;
class Chordal;
class Solutions;
class InputData;
class Residuals;
class IO;
class Lal;
class Newton;
class ComputeTime;
class Parameter;
class StepLength;
class DirectionParameter;
class Switch;
class AverageComplementarity;
class RatioInitResCurrentRes;
class SolveInfo;
class Phase;
class Vector;
class BlockVector;
class SparseMatrix;
class DenseMatrix;
class SparseLinearSpace;
class DenseLinearSpace;
class Time;
class LIJV
{
public:
int SDPl,LPl,i,j;
double value;
};
};
class SDPA
{
public:
enum PhaseType {noINFO, pFEAS,dFEAS,pdFEAS,pdINF,
pFEAS_dINF,pINF_dFEAS,pdOPT,pUNBD,dUNBD};
enum ParameterType {PARAMETER_DEFAULT,
PARAMETER_UNSTABLE_BUT_FAST,
PARAMETER_STABLE_BUT_SLOW};
enum ConeType {SDP, SOCP, LP};
// SOCP is not implemented in the current version.
enum SparseType {AUTO, SPARSE, DENSE};
// SparseType is only for compatiblity with SDPA7
// In SDPA-C, this always must be SPARSE.
// enum SparseType {AUTO, SPARSE, DENSE};
// when AUTO is set, the type is analyzed by the file extenstion.
SDPA();
~SDPA();
void setParameterType(ParameterType type = PARAMETER_DEFAULT);
void setParameterMaxIteration(int maxIteration);
void setParameterEpsilonStar (double epsilonStar);
void setParameterLambdaStar (double lambdaStar);
void setParameterOmegaStar (double omegaStar);
void setParameterLowerBound (double lowerBound);
void setParameterUpperBound (double upperBound);
void setParameterBetaStar (double betaStar);
void setParameterBetaBar (double betaBar);
void setParameterGammaStar (double gammaStar);
void setParameterEpsilonDash (double epsilonDash);
void setParameterPrintXVec(char* xPrint);
void setParameterPrintXMat(char* XPrint);
void setParameterPrintYMat(char* YPrint);
void setParameterPrintInformation(char* infPrint);
void setDisplay(FILE* Display = stdout);
void setResultFile(FILE* fpout = stdout);
void setNumThreads(int NumThreads=0);
ParameterType getParameterType();
int getParameterMaxIteration();
double getParameterEpsilonStar ();
double getParameterLambdaStar ();
double getParameterOmegaStar ();
double getParameterLowerBound ();
double getParameterUpperBound ();
double getParameterBetaStar ();
double getParameterBetaBar ();
double getParameterGammaStar ();
double getParameterEpsilonDash ();
char* getParameterPrintXVec();
char* getParameterPrintXMat();
char* getParameterPrintYMat();
char* getParameterPrintInformation();
FILE* getDisplay();
FILE* getResultFile();
bool getInitPoint();
int getNumThreads();
void inputConstraintNumber(int m);
void inputBlockNumber(int nBlock);
void inputBlockSize(int l, int size);
void inputBlockType(int l, ConeType coneType);
void inputCVec(int k, double value);
void inputElement(int k, int l, int i, int j, double value,
bool inputCheck = false);
void inputInitXVec(int k, double value);
void inputInitXMat(int l, int i, int j, double value);
void inputInitYMat(int l, int i, int j, double value);
void initializeUpperTriangleSpace();
void initializeUpperTriangle(bool inputTwiceCheck = false);
void initializeSolve();
void solve();
double* getResultXVec();
double* getResultXMat(int l);
double* getResultYMat(int l);
double getPrimalObj();
double getDualObj();
double getPrimalError();
double getDualError();
double getDigits();
int getIteration();
double getMu();
double getDualityGap();
PhaseType getPhaseValue();
void getPhaseString(char* str);
double getSolveTime();
int getConstraintNumber();
int getBlockNumber();
int getBlockSize(int l);
ConeType getBlockType(int l);
void getDimacsError(double* DimacsError);
void printDimacsError(double* DimacsError, char* printFormat,
FILE* fp = stdout);
void printResultXVec(FILE* fp = stdout);
void printResultXMat(FILE* fp = stdout);
void printResultYMat(FILE* fp = stdout);
void printComputationTime(FILE* fp = stdout);
void printParameters(FILE* fp = stdout);
bool judgeDimacsAvailability(); // for only SDPA-C
static void printSDPAVersion(FILE* fp = stdout);
void readInput(char* filename, FILE* fpout = NULL);
void readParameter(char* filename, FILE* fpout = NULL);
void writeInputSparse(char* filename, char* printFormat);
void writeInitSparse(char* filename, char* printFormat);
void finalize();
void copyCurrentToInit();
// setKappa is for only SDPA developers
void setKappa(double KAPPA);
// // for debugging, private is replaced by public
// public:
private:
double KAPPA;
int m;
int nBlock;
FILE* Display;
FILE* fpout;
bool isInitPoint;
ParameterType typeParameter;
int pIteration;
sdpa::ComputeTime com;
sdpa::Parameter param;
sdpa::BlockStruct bs;
sdpa::InputData inputData;
sdpa::Newton newton;
sdpa::Chordal chordal;
sdpa::Solutions currentPt;
sdpa::DenseLinearSpace initPt_xMat;
sdpa::DenseLinearSpace initPt_zMat;
sdpa::Residuals currentRes;
sdpa::StepLength alpha;
sdpa::DirectionParameter beta;
sdpa::Switch reduction;
sdpa::AverageComplementarity mu;
sdpa::RatioInitResCurrentRes theta;
sdpa::SolveInfo solveInfo;
sdpa::Phase phase;
// temporary space to store
// upper trianguler part non-zeros.
vector<sdpa::LIJV*> * NonZeroElements;
void printNonZeroElements(FILE* fpout = stdout);
void checkNonZeroElements();
void setNonZeroBlockStruct();
void setNonZeroElements();
void printDimacsEasy(FILE* fpout = stdout); // heavy but for each iteration
};
#endif // __sdpa_call_h__