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 };
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 };
00109
00110
00114 class Variables{
00115 public:
00116
00118 Variables();
00119
00121 ~Variables();
00122
00124 int numberOfVariables;
00125
00127 Variable **var;
00128 };
00129
00130
00135 class ObjCoef{
00136 public:
00137
00139 ObjCoef();
00140
00142 ~ObjCoef();
00143
00147 int idx;
00148
00152 double value;
00153 };
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 };
00180
00181
00186 class Constraints{
00187 public:
00188
00190 Constraints();
00191
00193 ~Constraints();
00194
00198 int numberOfConstraints;
00199
00202 Constraint **con;
00203 };
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 };
00247
00252 class Objectives{
00253 public:
00254
00256 Objectives();
00257
00259 ~Objectives();
00260
00264 int numberOfObjectives;
00265
00268 Objective **obj;
00269 };
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 };
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 };
00355
00356
00357
00358
00364 class QuadraticCoefficients {
00365 public:
00366
00368 QuadraticCoefficients();
00369
00371 ~QuadraticCoefficients();
00372
00376 int numberOfQuadraticTerms;
00377
00380 QuadraticTerm** qTerm;
00381 };
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 };
00413
00418 class NonlinearExpressions {
00419 public:
00420
00422 NonlinearExpressions();
00423
00425 ~NonlinearExpressions();
00426
00431 int numberOfNonlinearExpressions;
00432
00435 Nl **nl;
00436 };
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 };
00483
00488 class TimeDomainStages {
00489 public:
00490
00492 TimeDomainStages();
00493
00495 ~TimeDomainStages();
00496
00500 int numberOfStages;
00501
00503 TimeDomainStage **stage;
00504 };
00505
00510 class TimeDomainInterval {
00511 public:
00512
00514 TimeDomainInterval();
00515
00517 ~TimeDomainInterval();
00518
00522 double intervalHorizon;
00523
00527 double intervalStart;
00528 };
00529
00534 class TimeDomain {
00535 public:
00536
00538 TimeDomain();
00539
00541 ~TimeDomain();
00542
00545 TimeDomainStages *stages;
00546
00549 TimeDomainInterval *interval;
00550 };
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 };
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
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
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
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 };
02244
02245 #endif
02246