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
00042
00047 class InstanceHeader{
00048 public:
00049
00051 InstanceHeader();
00052
00054 ~InstanceHeader();
00055
00057 std::string description;
00058
00060 std::string name;
00061
00063 std::string source;
00064 };
00065
00066
00067
00071 class Variable{
00072 public:
00074 Variable();
00075
00077 ~Variable();
00078
00082 double lb;
00083
00087 double ub;
00088
00092
00093
00097 char type;
00098
00102 std::string name;
00103
00107
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
00438
00439
00444 class TimeDomainStageVar {
00445 public:
00446
00448 TimeDomainStageVar();
00449
00451 ~TimeDomainStageVar();
00452
00454 int idx;
00455 };
00456
00461 class TimeDomainStageVariables {
00462 public:
00463
00465 TimeDomainStageVariables();
00466
00468 ~TimeDomainStageVariables();
00469
00471 int numberOfVariables;
00472
00474 int startIdx;
00475
00477 TimeDomainStageVar** var;
00478 };
00479
00480
00485 class TimeDomainStageCon {
00486 public:
00487
00489 TimeDomainStageCon();
00490
00492 ~TimeDomainStageCon();
00493
00495 int idx;
00496 };
00497
00502 class TimeDomainStageConstraints {
00503 public:
00504
00506 TimeDomainStageConstraints();
00507
00509 ~TimeDomainStageConstraints();
00510
00512 int numberOfConstraints;
00513
00515 int startIdx;
00516
00518 TimeDomainStageCon** con;
00519 };
00520
00521
00526 class TimeDomainStageObj {
00527 public:
00528
00530 TimeDomainStageObj();
00531
00533 ~TimeDomainStageObj();
00534
00536 int idx;
00537 };
00538
00543 class TimeDomainStageObjectives {
00544 public:
00545
00547 TimeDomainStageObjectives();
00548
00550 ~TimeDomainStageObjectives();
00551
00553 int numberOfObjectives;
00554
00556 int startIdx;
00557
00559 TimeDomainStageObj** obj;
00560 };
00561
00562
00567 class TimeDomainStage {
00568 public:
00569
00571 TimeDomainStage();
00572
00574 ~TimeDomainStage();
00575
00579 std::string name;
00580
00582 TimeDomainStageVariables *variables;
00583
00585 TimeDomainStageConstraints *constraints;
00586
00588 TimeDomainStageObjectives *objectives;
00589 };
00590
00595 class TimeDomainStages {
00596 public:
00597
00599 TimeDomainStages();
00600
00602 ~TimeDomainStages();
00603
00607 int numberOfStages;
00608
00610 TimeDomainStage **stage;
00611 };
00612
00617 class TimeDomainInterval {
00618 public:
00619
00621 TimeDomainInterval();
00622
00624 ~TimeDomainInterval();
00625
00629 double start;
00630
00634 double horizon;
00635 };
00636
00641 class TimeDomain {
00642 public:
00643
00645 TimeDomain();
00646
00648 ~TimeDomain();
00649
00652 TimeDomainStages *stages;
00653
00656 TimeDomainInterval *interval;
00657 };
00658
00675 class InstanceData{
00676 public:
00677
00679 InstanceData();
00680
00682 ~InstanceData();
00683
00685 Variables *variables;
00686
00688 Objectives *objectives;
00689
00691 Constraints *constraints;
00692
00696 LinearConstraintCoefficients *linearConstraintCoefficients;
00697
00701 QuadraticCoefficients* quadraticCoefficients;
00702
00706 NonlinearExpressions* nonlinearExpressions;
00707
00711 TimeDomain* timeDomain;
00712 };
00713
00714
00741 class OSInstance {
00742 public:
00743
00745 OSInstance();
00746
00748 ~OSInstance();
00749
00751 InstanceHeader *instanceHeader;
00752
00754 InstanceData *instanceData;
00755
00756 private:
00760 std::string m_sInstanceName;
00764 std::string m_sInstanceSource;
00768 std::string m_sInstanceDescription;
00769
00773 bool m_bProcessVariables ;
00774
00778 int m_iVariableNumber;
00779
00783 int m_iNumberOfIntegerVariables;
00784
00788 int m_iNumberOfBinaryVariables;
00789
00793 int m_iNumberOfQuadraticRowIndexes;
00794
00798 bool m_bQuadraticRowIndexesProcessed;
00799
00803 int *m_miQuadRowIndexes;
00804
00808 int m_iNumberOfNonlinearExpressionTreeIndexes;
00809
00813 bool m_bNonlinearExpressionTreeIndexesProcessed;
00814
00819 int *m_miNonlinearExpressionTreeIndexes;
00820
00825 int m_iNumberOfNonlinearExpressionTreeModIndexes;
00826
00830 bool m_bNonlinearExpressionTreeModIndexesProcessed;
00831
00836 int *m_miNonlinearExpressionTreeModIndexes;
00837
00841 std::string* m_msVariableNames;
00842
00847
00848
00853
00854
00859 char* m_mcVariableTypes;
00860
00864 double* m_mdVariableLowerBounds;
00865
00869 double* m_mdVariableUpperBounds;
00870
00874 bool m_bProcessObjectives;
00875
00879 int m_iObjectiveNumber;
00880
00884 int m_iObjectiveNumberNonlinear;
00885
00889 std::string* m_msObjectiveNames;
00890
00894 std::string* m_msMaxOrMins;
00895
00899 int* m_miNumberOfObjCoef;
00900
00904 double* m_mdObjectiveConstants;
00905
00909 double* m_mdObjectiveWeights;
00910
00915 SparseVector** m_mObjectiveCoefficients;
00916
00920 bool m_bGetDenseObjectives;
00921
00926 double** m_mmdDenseObjectiveCoefficients;
00927
00931 bool m_bProcessConstraints;
00932
00936 int m_iConstraintNumber;
00937
00941 int m_iConstraintNumberNonlinear;
00942
00946 std::string* m_msConstraintNames;
00947
00951 double* m_mdConstraintLowerBounds;
00952
00956 double* m_mdConstraintUpperBounds;
00957
00962 double* m_mdConstraintConstants;
00963
00968 char* m_mcConstraintTypes;
00969
00973 bool m_bProcessLinearConstraintCoefficients;
00974
00979 int m_iLinearConstraintCoefficientNumber;
00980
00984 bool m_bColumnMajor;
00985
00989 bool m_binitForAlgDiff;
00990
00991
00996 SparseMatrix* m_linearConstraintCoefficientsInColumnMajor ;
00997
01002 SparseMatrix* m_linearConstraintCoefficientsInRowMajor ;
01003
01004
01008 bool m_bProcessQuadraticTerms ;
01009
01014 int m_iQuadraticTermNumber ;
01015
01019 double *m_mdConstraintFunctionValues;
01020
01024 double *m_mdObjectiveFunctionValues;
01025
01029 int m_iJacValueSize;
01030
01034 int *m_miJacStart;
01035
01039 int *m_miJacIndex;
01040
01044 double *m_mdJacValue;
01045
01046
01051 int *m_miJacNumConTerms;
01052
01056 SparseJacobianMatrix *m_sparseJacMatrix;
01057
01062 int m_iHighestTaylorCoeffOrder;
01063
01068 QuadraticTerms* m_quadraticTerms;
01069
01072 bool m_bQTermsAdded;
01073
01078 unsigned int m_iNumberOfNonlinearVariables ;
01079
01083 bool m_bProcessNonlinearExpressions ;
01084
01088 int m_iNonlinearExpressionNumber;
01089
01094 int* m_miNonlinearExpressionIndexes ;
01095
01099 bool m_bProcessExpressionTrees;
01100
01104 bool m_bProcessExpressionTreesMod;
01105
01110 std::map<int, OSExpressionTree*> m_mapExpressionTrees ;
01111
01112
01113
01114 std::map<int, int> m_mapOSADFunRangeIndex ;
01115
01120 OSExpressionTree *m_LagrangianExpTree ;
01121
01125 bool m_bLagrangianExpTreeCreated ;
01126
01130 SparseHessianMatrix* m_LagrangianSparseHessian;
01131
01136 bool m_bLagrangianSparseHessianCreated;
01137
01141 std::map<int, int> m_mapAllNonlinearVariablesIndex;
01142
01146 int *m_miNonLinearVarsReverseMap;
01147
01152 bool m_bAllNonlinearVariablesIndex;
01153
01160 std::map<int, OSExpressionTree*> m_mapExpressionTreesMod ;
01161
01166 bool m_bOSADFunIsCreated;
01167
01172 bool m_bCppADTapesBuilt;
01173
01178 bool m_bCppADMustReTape;
01179
01183 bool m_bDuplicateExpressionTreesMap;
01184
01188 bool m_bNonLinearStructuresInitialized;
01189
01193 bool m_bSparseJacobianCalculated;
01194
01199 std::map<int, std::vector<OSnLNode*> > m_mapExpressionTreesInPostfix ;
01200
01201
01206 int m_iHighestOrderEvaluated;
01207
01212 double **m_mmdObjGradient;
01213
01214
01215
01220 std::vector<double> m_vdX;
01221
01226 std::vector<double> m_vdYval;
01227
01233 std::vector<bool> m_vbLagHessNonz;
01234
01239 std::vector<double> m_vdYjacval;
01240
01245 std::vector<double> m_vdw;
01246
01251 std::vector<double> m_vdLambda;
01252
01253
01258 std::vector<double> m_vdDomainUnitVec;
01259
01264 std::vector<double> m_vdRangeUnitVec;
01265
01266
01270 bool m_bProcessTimeDomain;
01271
01275 bool m_bProcessTimeStages;
01276
01280 bool m_bProcessTimeInterval;
01281
01285 bool m_bFiniteTimeStages;
01286
01290 int m_iNumberOfTimeStages;
01291
01295 std::string m_sTimeDomainFormat;
01296
01301 std::string* m_msTimeDomainStageNames;
01302
01307 int* m_miTimeDomainStageVariableNumber;
01308
01313 int** m_mmiTimeDomainStageVarList;
01314
01319 int* m_miTimeDomainStageConstraintNumber;
01320
01325 int** m_mmiTimeDomainStageConList;
01326
01331 int* m_miTimeDomainStageObjectiveNumber;
01332
01337 int** m_mmiTimeDomainStageObjList;
01338
01339
01346 bool processVariables() ;
01347
01354 bool processObjectives();
01355
01356
01363 bool processConstraints();
01364
01365
01372 bool processLinearConstraintCoefficients();
01373
01374
01375 public:
01376
01381 std::string getInstanceName();
01382
01383
01388 std::string getInstanceSource();
01389
01390
01396 std::string getInstanceDescription();
01397
01403 int getVariableNumber();
01404
01411 std::string* getVariableNames();
01412
01420
01421
01429
01430
01442 char* getVariableTypes();
01443
01448 int getNumberOfIntegerVariables();
01449
01454 int getNumberOfBinaryVariables();
01455
01462 double* getVariableLowerBounds();
01463
01470 double* getVariableUpperBounds();
01471
01477 int getObjectiveNumber();
01478
01479
01486 std::string* getObjectiveNames();
01487
01494 std::string* getObjectiveMaxOrMins();
01495
01504 int* getObjectiveCoefficientNumbers();
01505
01512 double* getObjectiveConstants();
01513
01520 double* getObjectiveWeights();
01521
01532 SparseVector** getObjectiveCoefficients();
01533
01540 double** getDenseObjectiveCoefficients();
01541
01547 int getConstraintNumber();
01548
01555 std::string* getConstraintNames();
01556
01563 double* getConstraintLowerBounds();
01564
01571 double *getConstraintUpperBounds();
01572
01585 char* getConstraintTypes();
01586
01592 int getLinearConstraintCoefficientNumber();
01593
01594
01601 bool getLinearConstraintCoefficientMajor();
01602
01603
01610 SparseMatrix* getLinearConstraintCoefficientsInColumnMajor();
01611
01618 SparseMatrix* getLinearConstraintCoefficientsInRowMajor();
01619
01625 int getNumberOfQuadraticTerms();
01626
01635 QuadraticTerms* getQuadraticTerms();
01636
01644 int* getQuadraticRowIndexes();
01645
01651 int getNumberOfQuadraticRowIndexes();
01652
01658 int getNumberOfNonlinearExpressions();
01659
01660
01666 OSExpressionTree* getNonlinearExpressionTree(int rowIdx);
01667
01674 OSExpressionTree* getNonlinearExpressionTreeMod(int rowIdx);
01675
01682 std::vector<OSnLNode*> getNonlinearExpressionTreeInPostfix( int rowIdx);
01683
01691 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPostfix( int rowIdx);
01692
01699 std::vector<OSnLNode*> getNonlinearExpressionTreeInPrefix( int rowIdx);
01700
01708 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPrefix( int rowIdx);
01709
01710
01714 int getNumberOfNonlinearObjectives();
01715
01719 int getNumberOfNonlinearConstraints();
01720
01724 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTrees();
01725
01726
01730 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTreesMod();
01731
01737 int* getNonlinearExpressionTreeIndexes();
01738
01739
01745 int getNumberOfNonlinearExpressionTreeIndexes();
01746
01747
01754 int* getNonlinearExpressionTreeModIndexes();
01755
01756
01763 int getNumberOfNonlinearExpressionTreeModIndexes();
01764
01765
01771 std::string getTimeDomainFormat();
01772
01778 int getTimeDomainStageNumber();
01779
01785 std::string* getTimeDomainStageNames();
01786
01792 int* getTimeDomainStageNumberOfVariables();
01793
01799 int* getTimeDomainStageNumberOfConstraints();
01800
01806 int* getTimeDomainStageNumberOfObjectives();
01807
01813 int** getTimeDomainStageVarList();
01814
01820 int** getTimeDomainStageConList();
01821
01827 int** getTimeDomainStageObjList();
01828
01834 double getTimeDomainIntervalStart();
01835
01841 double getTimeDomainIntervalHorizon();
01842
01843
01844
01845
01846
01847
01854 bool setInstanceSource(std::string source);
01855
01862 bool setInstanceDescription(std::string description);
01863
01864
01871 bool setInstanceName(std::string name);
01872
01879 bool setVariableNumber(int number);
01880
01898 bool addVariable(int index, std::string name, double lowerBound, double upperBound, char type);
01899
01918 bool setVariables(int number, std::string* names, double* lowerBounds,
01919 double* upperBounds, char* types);
01920
01927 bool setObjectiveNumber(int number);
01928
01946 bool addObjective(int index, std::string name, std::string maxOrMin, double constant, double weight, SparseVector* objectiveCoefficients);
01947
01963 bool setObjectives(int number, std::string *names, std::string *maxOrMins, double *constants, double *weights, SparseVector **objectitiveCoefficients);
01964
01971 bool setConstraintNumber(int number);
01972
01986 bool addConstraint(int index, std::string name, double lowerBound, double upperBound, double constant);
01987
01999 bool setConstraints(int number, std::string* names, double* lowerBounds, double* upperBounds, double* constants);
02000
02019 bool setLinearConstraintCoefficients(int numberOfValues, bool isColumnMajor,
02020 double* values, int valuesBegin, int valuesEnd,
02021 int* indexes, int indexesBegin, int indexesEnd,
02022 int* starts, int startsBegin, int startsEnd);
02023
02039 bool setQuadraticTerms(int number,
02040 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients,
02041 int begin, int end);
02042
02056 bool setQuadraticTermsInNonlinearExpressions(int number,
02057 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients);
02058
02059
02060
02061
02062
02063
02069 bool initializeNonLinearStructures( );
02070
02084 double calculateFunctionValue(int idx, double* x, bool new_x);
02085
02100 double *calculateAllConstraintFunctionValues(double* x, double *objLambda, double *conLambda,
02101 bool new_x, int highestOrder);
02102
02116 double *calculateAllConstraintFunctionValues(double* x, bool new_x);
02117
02133 double *calculateAllObjectiveFunctionValues(double* x, double *objLambda, double *conLambda,
02134 bool new_x, int highestOrder);
02135
02149 double *calculateAllObjectiveFunctionValues(double* x, bool new_x);
02150
02151
02166 SparseJacobianMatrix *calculateAllConstraintFunctionGradients(double* x, double *objLambda,
02167 double *conLambda, bool new_x, int highestOrder);
02168
02169
02185 SparseVector *calculateConstraintFunctionGradient(double* x, double *objLambda, double *conLambda,
02186 int idx, bool new_x, int highestOrder);
02187
02201 SparseVector *calculateConstraintFunctionGradient(double* x, int idx, bool new_x );
02202
02217 double **calculateAllObjectiveFunctionGradients(double* x, double *objLambda, double *conLambda,
02218 bool new_x, int highestOrder);
02219
02235 double *calculateObjectiveFunctionGradient(double* x, double *objLambda, double *conLambda,
02236 int objIdx, bool new_x, int highestOrder);
02237
02250 double *calculateObjectiveFunctionGradient(double* x, int objIdx, bool new_x );
02251
02269 SparseHessianMatrix *calculateLagrangianHessian( double* x, double *objLambda, double *conLambda,
02270 bool new_x, int highestOrder);
02271
02284 SparseHessianMatrix *calculateHessian( double* x, int idx, bool new_x);
02285
02286
02291 bool getSparseJacobianFromColumnMajor();
02292
02297 bool getSparseJacobianFromRowMajor();
02298
02303 OSExpressionTree* getLagrangianExpTree( );
02304
02309 std::map<int, int> getAllNonlinearVariablesIndexMap( );
02310
02315 SparseHessianMatrix* getLagrangianHessianSparsityPattern();
02316
02321 bool addQTermsToExressionTree();
02322
02327 SparseJacobianMatrix *getJacobianSparsityPattern();
02328
02333 void duplicateExpressionTreesMap();
02334
02335 #ifdef COIN_HAS_CPPAD
02336
02340 CppAD::ADFun<double> *Fad;
02341 #endif
02342
02353 bool createOSADFun(std::vector<double> vdX );
02354
02365 std::vector<double> forwardAD(int p, std::vector<double> vdX);
02366
02377 std::vector<double> reverseAD(int p, std::vector<double> vdlambda);
02378
02391 int getADSparsityHessian();
02392
02412 bool getIterateResults(double *x, double *objLambda, double *conLambda,
02413 bool new_x, int highestOrder);
02414
02415
02416
02429 bool getZeroOrderResults(double *x, double *objLambda, double *conLambda);
02430
02443 bool getFirstOrderResults(double *x, double *objLambda, double *conLambda );
02444
02457 bool getSecondOrderResults(double *x, double *objLambda, double *conLambda );
02458
02459
02469 bool initForAlgDiff();
02470
02480 bool initObjGradients();
02481
02482
02487 bool bUseExpTreeForFunEval;
02488
02489
02493 bool setTimeDomain(std::string format);
02494
02498 bool setTimeDomainStages(int number, std::string *names);
02499
02505 bool setTimeDomainStageVariablesOrdered(int numberOfStages, int *numberOfVariables, int *startIdx);
02506
02512 bool setTimeDomainStageVariablesUnordered(int numberOfStages, int *numberOfVariables, int **varIndex);
02513
02519 bool setTimeDomainStageConstraintsOrdered(int numberOfStages, int *numberOfConstraints, int *startIdx);
02520
02526 bool setTimeDomainStageConstraintsUnordered(int numberOfStages, int *numberOfConstraints, int **conIndex);
02527
02533 bool setTimeDomainStageObjectivesOrdered(int numberOfStages, int *numberOfObjectives, int *startIdx);
02534
02540 bool setTimeDomainStageObjectivesUnordered(int numberOfStages, int *numberOfObjectives, int **varIndex);
02541
02545 bool setTimeDomainInterval(double start, double horizon);
02546
02547
02548 };
02549
02550 #endif
02551