/home/coin/SVN-release/CoinAll-1.1.0/OS/src/OSCommonInterfaces/OSInstance.h

Go to the documentation of this file.
00001 
00033 #ifndef OSINSTANCE_H
00034 #define OSINSTANCE_H
00035 #include "OSParameters.h"
00036 #include "OSDataStructures.h"
00037 #include "OSnLNode.h"
00038 #include "OSExpressionTree.h"
00039 #include <string>
00040 #include <map>
00041 #include<cppad/cppad.hpp>
00042 
00043 
00044 
00049 class InstanceHeader{
00050 public:
00051 
00053         InstanceHeader();
00054         
00056         ~InstanceHeader();
00057         
00059         std::string description;
00060         
00062         std::string name;
00063         
00065         std::string source;             
00066 };//class InstanceHeader
00067 
00068 
00069 
00073 class Variable{
00074 public:
00076         Variable();
00077         
00079         ~Variable();
00080 
00084         double lb;
00085 
00089         double ub;
00090         
00094         double init;
00095         
00099         char type;
00100         
00104         std::string name;
00105         
00107         std::string initString;
00108 }; // class Variable
00109 
00110 
00114 class Variables{
00115 public:
00116 
00118         Variables();
00119         
00121         ~Variables();
00122         
00124         int numberOfVariables;
00125         
00127         Variable **var;
00128 }; // class Variables
00129 
00130 
00135 class ObjCoef{
00136 public:
00137 
00139         ObjCoef();
00140         
00142         ~ObjCoef();
00143         
00147         int idx;
00148         
00152         double value;
00153 };//class Coef
00154 
00159 class Constraint{
00160 public:
00161 
00163         Constraint();
00164         
00166         ~Constraint();
00167         
00169         std::string name;
00170         
00172         double constant;
00173         
00175         double lb;
00176         
00178         double ub;
00179 };//class Constraint
00180 
00181 
00186 class Constraints{
00187 public:
00188 
00190         Constraints();
00191         
00193         ~Constraints();
00194         
00198         int numberOfConstraints;
00199         
00202         Constraint **con;
00203 };//class Constraints
00204 
00205 
00206 
00211 class Objective{
00212 public:
00213 
00215         Objective();
00216         
00218         ~Objective();
00219         
00221         std::string name;
00222         
00226         std::string maxOrMin;
00227         
00231         double constant;
00232         
00236         double weight;
00237         
00241         int numberOfObjCoef;
00242         
00245         ObjCoef **coef;
00246 };//class Objective
00247 
00252 class Objectives{
00253 public:
00254 
00256         Objectives();
00257         
00259         ~Objectives();
00260         
00264         int numberOfObjectives;
00265         
00268         Objective **obj;
00269 };//class Objectives
00270 
00282 class LinearConstraintCoefficients{
00283 public:
00284 
00286         LinearConstraintCoefficients();
00287         
00289         ~LinearConstraintCoefficients();
00290         
00294         int numberOfValues;
00295         
00299         IntVector *start;
00300         
00302         IntVector *rowIdx;
00303         
00305         IntVector *colIdx;
00306         
00308         DoubleVector *value;
00315         int iNumberOfStartElements;
00316 };//class LinearConstraintCoefficients
00317 
00318 
00328 class QuadraticTerm{
00329     public:
00330     
00332         QuadraticTerm();
00333         
00335         ~QuadraticTerm();
00336         
00340         int idx;
00341         
00345     int idxOne;
00346     
00350     int idxTwo;
00351     
00353     double coef;
00354 }; // QuadraticTerm
00355 
00356 
00357 
00358 
00364 class QuadraticCoefficients {
00365     public:
00366     
00368         QuadraticCoefficients();
00369         
00371         ~QuadraticCoefficients();
00372         
00376         int numberOfQuadraticTerms;
00377         
00380     QuadraticTerm** qTerm;
00381 }; // QuadraticCoefficients
00382 
00383 
00388 class Nl{  
00389 public: 
00391         int idx;
00392 
00398         bool m_bDeleteExpressionTree;
00399         
00401         OSExpressionTree *osExpressionTree;
00402         
00406         Nl();
00407 
00411         ~Nl();
00412 };//end Nl
00413 
00418 class NonlinearExpressions {
00419     public:
00420     
00422         NonlinearExpressions();
00423         
00425         ~NonlinearExpressions();
00426         
00431         int numberOfNonlinearExpressions;
00432         
00435     Nl **nl;
00436 }; // NonlinearExpression
00437  
00442 class TimeDomainStage {
00443     public:
00444     
00446         TimeDomainStage();
00447         
00449         ~TimeDomainStage();
00450         
00454         std::string name;
00455         
00458         int nvar;
00459         
00462         int ncon;
00463         
00466         int nobj;
00467 
00471         int *variables;
00472 
00476         int *constraints;
00477 
00481         int *objectives;
00482 }; // Stage
00483  
00488 class TimeDomainStages {
00489     public:
00490     
00492         TimeDomainStages();
00493         
00495         ~TimeDomainStages();
00496         
00500         int numberOfStages;
00501         
00503     TimeDomainStage **stage;
00504 }; // Stages
00505  
00510 class TimeDomainInterval {
00511     public:
00512     
00514         TimeDomainInterval();
00515         
00517         ~TimeDomainInterval();
00518         
00522         double intervalHorizon;
00523         
00527         double intervalStart;
00528 }; // Interval
00529  
00534 class TimeDomain {
00535     public:
00536     
00538         TimeDomain();
00539         
00541         ~TimeDomain();
00542 
00545         TimeDomainStages *stages;
00546 
00549         TimeDomainInterval *interval;
00550 }; // TimeDomain
00551 
00568 class InstanceData{
00569 public:
00570 
00572         InstanceData();
00573         
00575         ~InstanceData();
00576         
00578         Variables *variables;
00579         
00581         Objectives *objectives;
00582         
00584         Constraints *constraints;
00585         
00589         LinearConstraintCoefficients *linearConstraintCoefficients;
00590         
00594         QuadraticCoefficients* quadraticCoefficients;
00595         
00599         NonlinearExpressions* nonlinearExpressions;
00600         
00604         TimeDomain* timeDomain;
00605 }; // class InstanceData
00606 
00607 
00634 class OSInstance {
00635 public:
00636 
00638         OSInstance(); 
00639         
00641         ~OSInstance();
00642         
00644         InstanceHeader *instanceHeader;
00645         
00647         InstanceData *instanceData;
00648 
00649 private:
00653         std::string m_sInstanceName;
00657         std::string m_sInstanceSource;  
00661         std::string m_sInstanceDescription;
00662         
00666         bool m_bProcessVariables ;
00667         
00671         int m_iVariableNumber;
00672         
00676         int m_iNumberOfIntegerVariables;
00677         
00681         int m_iNumberOfBinaryVariables;
00682         
00686         int m_iNumberOfQuadraticRowIndexes;
00687         
00691         bool m_bQuadraticRowIndexesProcessed;
00692 
00696         int *m_miQuadRowIndexes;
00697         
00701         int m_iNumberOfNonlinearExpressionTreeIndexes;
00702         
00706         bool m_bNonlinearExpressionTreeIndexesProcessed;
00707 
00712         int *m_miNonlinearExpressionTreeIndexes;
00713         
00718         int m_iNumberOfNonlinearExpressionTreeModIndexes;
00719         
00723         bool m_bNonlinearExpressionTreeModIndexesProcessed;
00724 
00729         int *m_miNonlinearExpressionTreeModIndexes;
00730         
00734         std::string* m_msVariableNames;
00735         
00739         double* m_mdVariableInitialValues ;
00740 
00744         std::string* m_msVariableInitialStringValues;
00745 
00750         char* m_mcVariableTypes;
00751 
00755         double* m_mdVariableLowerBounds;
00756 
00760         double* m_mdVariableUpperBounds;
00761 
00765         bool m_bProcessObjectives;
00766 
00770         int m_iObjectiveNumber;
00771         
00775         int m_iObjectiveNumberNonlinear;
00776         
00780         std::string* m_msObjectiveNames;
00781         
00785         std::string* m_msMaxOrMins;
00786         
00790         int* m_miNumberOfObjCoef;
00791         
00795         double* m_mdObjectiveConstants;
00796         
00800         double* m_mdObjectiveWeights;
00801         
00806         SparseVector** m_mObjectiveCoefficients;
00807         
00811         bool m_bGetDenseObjectives;
00812         
00817         double** m_mmdDenseObjectiveCoefficients;
00818 
00822         bool m_bProcessConstraints;
00823         
00827         int m_iConstraintNumber;
00828         
00832         int m_iConstraintNumberNonlinear;
00833 
00837         std::string* m_msConstraintNames;
00838         
00842         double* m_mdConstraintLowerBounds;
00843 
00847         double* m_mdConstraintUpperBounds;
00848         
00853         double* m_mdConstraintConstants;
00854 
00859         char* m_mcConstraintTypes;
00860         
00864         bool m_bProcessLinearConstraintCoefficients;
00865         
00870         int m_iLinearConstraintCoefficientNumber;
00871 
00875         bool m_bColumnMajor;
00876         
00880         bool m_binitForAlgDiff;
00881 
00882 
00887         SparseMatrix* m_linearConstraintCoefficientsInColumnMajor ;
00888 
00893         SparseMatrix* m_linearConstraintCoefficientsInRowMajor ;
00894 
00895         
00899         bool m_bProcessQuadraticTerms ;
00900 
00905         int m_iQuadraticTermNumber ;
00906 
00910     double *m_mdConstraintFunctionValues;
00911     
00915     double *m_mdObjectiveFunctionValues;
00916 
00920         int m_iJacValueSize;
00921     
00925         int *m_miJacStart;
00926         
00930         int *m_miJacIndex;
00931         
00935         double *m_mdJacValue;
00936         
00937         
00942         int *m_miJacNumConTerms;
00943  
00947         SparseJacobianMatrix *m_sparseJacMatrix;
00948         
00953          int m_iHighestTaylorCoeffOrder;
00954         
00959          QuadraticTerms* m_quadraticTerms;
00960          
00963          bool m_bQTermsAdded;
00964          
00969         unsigned int m_iNumberOfNonlinearVariables ;
00970          
00974         bool m_bProcessNonlinearExpressions ;
00975         
00979         int m_iNonlinearExpressionNumber;
00980 
00985         int* m_miNonlinearExpressionIndexes ;
00986         
00990         bool m_bProcessExpressionTrees;
00991         
00995         bool m_bProcessExpressionTreesMod;
00996         
01001         std::map<int, OSExpressionTree*> m_mapExpressionTrees ;
01002         
01003         
01004         
01005         std::map<int, int> m_mapCppADFunRangeIndex ;
01006         
01011         OSExpressionTree *m_LagrangianExpTree ;
01012         
01016         bool m_bLagrangianExpTreeCreated ;
01017         
01021         SparseHessianMatrix* m_LagrangianSparseHessian;
01022         
01027         bool m_bLagrangianSparseHessianCreated;
01028         
01032          std::map<int, int> m_mapAllNonlinearVariablesIndex;
01033 
01037         int *m_miNonLinearVarsReverseMap;
01038          
01043          bool m_bAllNonlinearVariablesIndex;
01044         
01051         std::map<int, OSExpressionTree*> m_mapExpressionTreesMod ;
01052         
01057          bool m_bCppADFunIsCreated;
01058         
01063         bool m_bCppADTapesBuilt;
01064         
01069         bool m_bCppADMustReTape;
01070         
01074         bool m_bDuplicateExpressionTreesMap;
01075         
01079         bool m_bNonLinearStructuresInitialized;
01080 
01084         bool m_bSparseJacobianCalculated;
01085         
01090         std::map<int, std::vector<OSnLNode*> > m_mapExpressionTreesInPostfix ;
01091          
01092         
01097          int m_iHighestOrderEvaluated;
01098          
01103         double **m_mmdObjGradient;
01104         
01105         //define the vectors
01106                 
01110         CppAD::vector< AD<double> > m_vX;       
01111 
01116         std::vector<double> m_vdX;
01117         
01122         std::vector<double> m_vdYval;
01123         
01129         std::vector<bool> m_vbLagHessNonz;
01130         
01135         std::vector<double> m_vdYjacval;
01136 
01141         std::vector<double> m_vdw;
01142         
01147         std::vector<double> m_vdLambda;
01148         
01149         
01154         std::vector<double> m_vdDomainUnitVec;
01155         
01160         std::vector<double> m_vdRangeUnitVec;
01161         
01162 
01166         bool m_bProcessTimeDomain;
01167 
01171         bool m_bProcessTimeStages;
01172 
01176         bool m_bProcessTimeInterval;
01177 
01181         bool m_bFiniteTimeStages;
01182 
01186         int m_iNumberOfTimeStages;
01187 
01194         bool processVariables() ;
01195         
01202         bool processObjectives();
01203         
01204         
01211         bool processConstraints();
01212         
01213         
01220         bool processLinearConstraintCoefficients();
01221         
01222         
01223 public:
01224 
01225         
01230         std::string getInstanceName();
01231                 
01232 
01237         std::string getInstanceSource();
01238         
01239         
01245         std::string getInstanceDescription();
01246         
01252         int getVariableNumber();
01253         
01260         std::string* getVariableNames();
01261         
01268         double* getVariableInitialValues();
01269         
01276         std::string* getVariableInitialStringValues();
01277         
01289         char* getVariableTypes();
01290         
01295         int getNumberOfIntegerVariables();
01296         
01301         int getNumberOfBinaryVariables();
01302         
01309         double* getVariableLowerBounds();
01310         
01317         double* getVariableUpperBounds();
01318         
01324         int getObjectiveNumber();
01325         
01326         
01333         std::string* getObjectiveNames();
01334 
01341         std::string* getObjectiveMaxOrMins();
01342         
01351         int* getObjectiveCoefficientNumbers();
01352         
01359         double* getObjectiveConstants();
01360         
01367         double* getObjectiveWeights();
01368         
01379         SparseVector** getObjectiveCoefficients();
01380         
01387         double** getDenseObjectiveCoefficients();
01388         
01394         int getConstraintNumber();
01395         
01402         std::string* getConstraintNames();
01403         
01410         double* getConstraintLowerBounds();
01411         
01418         double *getConstraintUpperBounds();
01419         
01432         char* getConstraintTypes();
01433         
01439         int getLinearConstraintCoefficientNumber();
01440         
01441 
01448         bool getLinearConstraintCoefficientMajor();
01449         
01450         
01457         SparseMatrix* getLinearConstraintCoefficientsInColumnMajor();
01458         
01465         SparseMatrix* getLinearConstraintCoefficientsInRowMajor();
01466         
01472         int getNumberOfQuadraticTerms();
01473         
01482         QuadraticTerms* getQuadraticTerms();
01483         
01491         int* getQuadraticRowIndexes();
01492         
01498         int getNumberOfQuadraticRowIndexes();
01499         
01505         int getNumberOfNonlinearExpressions();
01506         
01507         
01513         OSExpressionTree* getNonlinearExpressionTree(int rowIdx);
01514         
01521         OSExpressionTree* getNonlinearExpressionTreeMod(int rowIdx);
01522         
01529         std::vector<OSnLNode*> getNonlinearExpressionTreeInPostfix( int rowIdx); 
01530         
01538         std::vector<OSnLNode*> getNonlinearExpressionTreeModInPostfix( int rowIdx);  
01539         
01546         std::vector<OSnLNode*> getNonlinearExpressionTreeInPrefix( int rowIdx);  
01547         
01555         std::vector<OSnLNode*> getNonlinearExpressionTreeModInPrefix( int rowIdx);      
01556 
01557         
01561         int getNumberOfNonlinearObjectives();
01562 
01566         int getNumberOfNonlinearConstraints();
01567         
01571         std::map<int, OSExpressionTree* > getAllNonlinearExpressionTrees();
01572         
01573         
01577         std::map<int, OSExpressionTree* > getAllNonlinearExpressionTreesMod();
01578         
01584         int* getNonlinearExpressionTreeIndexes(); 
01585         
01586         
01592         int getNumberOfNonlinearExpressionTreeIndexes(); 
01593         
01594         
01601         int* getNonlinearExpressionTreeModIndexes(); 
01602         
01603         
01610         int getNumberOfNonlinearExpressionTreeModIndexes(); 
01611         
01612         
01613         // the set() methods
01614         
01615         
01622         bool setInstanceSource(std::string source);
01623         
01630         bool setInstanceDescription(std::string description);
01631         
01632                                         
01639         bool setInstanceName(std::string name);
01640         
01647         bool setVariableNumber(int number);
01648         
01665         bool addVariable(int index, std::string name, double lowerBound, double upperBound, char type, double init, std::string initString);
01666         
01684         bool setVariables(int number, std::string* names, double* lowerBounds, 
01685                 double* upperBounds, char* types, double* inits, std::string* initsString);
01686 
01693         bool setObjectiveNumber(int number);
01694         
01712         bool addObjective(int index, std::string name, std::string maxOrMin, double constant, double weight, SparseVector* objectiveCoefficients);
01713 
01729         bool setObjectives(int number, std::string *names, std::string *maxOrMins, double *constants, double *weights, SparseVector **objectitiveCoefficients);
01730                                         
01737         bool setConstraintNumber(int number);
01738 
01752 bool addConstraint(int index, std::string name, double lowerBound, double upperBound, double constant);
01753 
01765 bool setConstraints(int number, std::string* names, double* lowerBounds, double* upperBounds, double* constants);
01766 
01785 bool setLinearConstraintCoefficients(int numberOfValues, bool isColumnMajor, 
01786         double* values, int valuesBegin, int valuesEnd, 
01787         int* indexes, int indexesBegin, int indexesEnd,                         
01788         int* starts, int startsBegin, int startsEnd);
01789         
01805         bool setQuadraticTerms(int number, 
01806                 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients,
01807                 int begin, int end);
01808                 
01822         bool setQuadraticTermsInNonlinearExpressions(int number, 
01823                 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients);
01824                 
01825                 
01826                 
01827         // nonlinear API methods
01828         
01829         
01835         bool initializeNonLinearStructures( );
01836         
01850         double calculateFunctionValue(int idx, double* x, bool new_x);
01851         
01866         double *calculateAllConstraintFunctionValues(double* x, double *objLambda, double *conLambda,
01867                 bool new_x, int highestOrder);
01868                 
01882         double *calculateAllConstraintFunctionValues(double* x, bool new_x);
01883         
01899         double *calculateAllObjectiveFunctionValues(double* x, double *objLambda, double *conLambda,
01900                 bool new_x, int highestOrder);
01901         
01915         double *calculateAllObjectiveFunctionValues(double* x, bool new_x);     
01916                 
01917         
01932         SparseJacobianMatrix *calculateAllConstraintFunctionGradients(double* x, double *objLambda, 
01933                 double *conLambda, bool new_x, int highestOrder);               
01934                 
01935 
01951         SparseVector *calculateConstraintFunctionGradient(double* x, double *objLambda, double *conLambda,
01952                 int idx, bool new_x, int highestOrder);
01953                 
01967         SparseVector *calculateConstraintFunctionGradient(double* x, int idx, bool new_x );
01968         
01983         double **calculateAllObjectiveFunctionGradients(double* x, double *objLambda, double *conLambda,
01984                 bool new_x, int highestOrder);          
01985 
02001         double *calculateObjectiveFunctionGradient(double* x, double *objLambda, double *conLambda,
02002                 int objIdx, bool new_x, int highestOrder);
02003                 
02017         double *calculateObjectiveFunctionGradient(double* x, int objIdx, bool new_x );
02018 
02036         SparseHessianMatrix *calculateLagrangianHessian( double* x, double *objLambda, double *conLambda,
02037                 bool new_x, int highestOrder);
02038                 
02051         SparseHessianMatrix *calculateHessian( double* x, int idx, bool new_x);
02052         
02053                                 
02058         bool getSparseJacobianFromColumnMajor();
02059         
02064         bool getSparseJacobianFromRowMajor();
02065         
02070         OSExpressionTree* getLagrangianExpTree( );
02071 
02076         std::map<int, int> getAllNonlinearVariablesIndexMap( ); 
02077         
02082         SparseHessianMatrix* getLagrangianHessianSparsityPattern();
02083         
02088         bool addQTermsToExressionTree();
02089         
02094         SparseJacobianMatrix *getJacobianSparsityPattern();
02095         
02100         void duplicateExpressionTreesMap();
02101         
02102          
02107         CppAD::ADFun<double> *Fad;
02108 
02120         bool createCppADFun(std::vector<double> vdX );
02121         
02132         std::vector<double> forwardAD(int p, std::vector<double> vdX);
02133 
02144         std::vector<double> reverseAD(int p, std::vector<double> vdlambda);
02145          
02165         bool getIterateResults(double *x, double *objLambda, double *conLambda,  
02166                         bool new_x, int highestOrder);
02167                         
02168                         
02169                         
02182         bool getZeroOrderResults(double *x, double *objLambda, double *conLambda);
02183                         
02196         bool getFirstOrderResults(double *x, double *objLambda, double *conLambda );
02197                         
02210         bool getSecondOrderResults(double *x, double *objLambda, double *conLambda );
02211                         
02212 
02222         bool initForAlgDiff();
02223         
02233         bool initObjGradients();
02234         
02235         
02240         bool bUseExpTreeForFunEval;
02241         
02242                                                                                                                                                                                                                                                                                                                                                                                                                         
02243 }; //class OSInstance
02244 
02245 #endif
02246 

Generated on Sun Nov 14 14:06:36 2010 for Coin-All by  doxygen 1.4.7