00001
00034 #ifndef OSINSTANCE_H
00035 #define OSINSTANCE_H
00036 #include "OSParameters.h"
00037 #include "OSDataStructures.h"
00038 #include "OSnLNode.h"
00039 #include "OSExpressionTree.h"
00040 #include <string>
00041 #include <map>
00042
00043
00048 class InstanceHeader{
00049 public:
00050
00052 InstanceHeader();
00053
00055 ~InstanceHeader();
00056
00058 std::string description;
00059
00061 std::string name;
00062
00064 std::string source;
00065 };
00066
00067
00068
00072 class Variable{
00073 public:
00075 Variable();
00076
00078 ~Variable();
00079
00083 double lb;
00084
00088 double ub;
00089
00093
00094
00098 char type;
00099
00103 std::string name;
00104
00108
00109 };
00110
00111
00115 class Variables{
00116 public:
00117
00119 Variables();
00120
00122 ~Variables();
00123
00125 int numberOfVariables;
00126
00128 Variable **var;
00129 };
00130
00131
00136 class ObjCoef{
00137 public:
00138
00140 ObjCoef();
00141
00143 ~ObjCoef();
00144
00148 int idx;
00149
00153 double value;
00154 };
00155
00160 class Constraint{
00161 public:
00162
00164 Constraint();
00165
00167 ~Constraint();
00168
00170 std::string name;
00171
00173 double constant;
00174
00176 double lb;
00177
00179 double ub;
00180 };
00181
00182
00187 class Constraints{
00188 public:
00189
00191 Constraints();
00192
00194 ~Constraints();
00195
00199 int numberOfConstraints;
00200
00203 Constraint **con;
00204 };
00205
00206
00207
00212 class Objective{
00213 public:
00214
00216 Objective();
00217
00219 ~Objective();
00220
00222 std::string name;
00223
00227 std::string maxOrMin;
00228
00232 double constant;
00233
00237 double weight;
00238
00242 int numberOfObjCoef;
00243
00246 ObjCoef **coef;
00247 };
00248
00253 class Objectives{
00254 public:
00255
00257 Objectives();
00258
00260 ~Objectives();
00261
00265 int numberOfObjectives;
00266
00269 Objective **obj;
00270 };
00271
00283 class LinearConstraintCoefficients{
00284 public:
00285
00287 LinearConstraintCoefficients();
00288
00290 ~LinearConstraintCoefficients();
00291
00295 int numberOfValues;
00296
00300 IntVector *start;
00301
00303 IntVector *rowIdx;
00304
00306 IntVector *colIdx;
00307
00309 DoubleVector *value;
00316 int iNumberOfStartElements;
00317 };
00318
00319
00329 class QuadraticTerm{
00330 public:
00331
00333 QuadraticTerm();
00334
00336 ~QuadraticTerm();
00337
00341 int idx;
00342
00346 int idxOne;
00347
00351 int idxTwo;
00352
00354 double coef;
00355 };
00356
00357
00358
00359
00365 class QuadraticCoefficients {
00366 public:
00367
00369 QuadraticCoefficients();
00370
00372 ~QuadraticCoefficients();
00373
00377 int numberOfQuadraticTerms;
00378
00381 QuadraticTerm** qTerm;
00382 };
00383
00384
00389 class Nl{
00390 public:
00392 int idx;
00393
00399 bool m_bDeleteExpressionTree;
00400
00402 OSExpressionTree *osExpressionTree;
00403
00407 Nl();
00408
00412 ~Nl();
00413 };
00414
00419 class NonlinearExpressions {
00420 public:
00421
00423 NonlinearExpressions();
00424
00426 ~NonlinearExpressions();
00427
00432 int numberOfNonlinearExpressions;
00433
00436 Nl **nl;
00437 };
00438
00439
00440
00445 class TimeDomainStageVar {
00446 public:
00447
00449 TimeDomainStageVar();
00450
00452 ~TimeDomainStageVar();
00453
00455 int idx;
00456 };
00457
00462 class TimeDomainStageVariables {
00463 public:
00464
00466 TimeDomainStageVariables();
00467
00469 ~TimeDomainStageVariables();
00470
00472 int numberOfVariables;
00473
00475 int startIdx;
00476
00478 TimeDomainStageVar** var;
00479 };
00480
00481
00486 class TimeDomainStageCon {
00487 public:
00488
00490 TimeDomainStageCon();
00491
00493 ~TimeDomainStageCon();
00494
00496 int idx;
00497 };
00498
00503 class TimeDomainStageConstraints {
00504 public:
00505
00507 TimeDomainStageConstraints();
00508
00510 ~TimeDomainStageConstraints();
00511
00513 int numberOfConstraints;
00514
00516 int startIdx;
00517
00519 TimeDomainStageCon** con;
00520 };
00521
00522
00527 class TimeDomainStageObj {
00528 public:
00529
00531 TimeDomainStageObj();
00532
00534 ~TimeDomainStageObj();
00535
00537 int idx;
00538 };
00539
00544 class TimeDomainStageObjectives {
00545 public:
00546
00548 TimeDomainStageObjectives();
00549
00551 ~TimeDomainStageObjectives();
00552
00554 int numberOfObjectives;
00555
00557 int startIdx;
00558
00560 TimeDomainStageObj** obj;
00561 };
00562
00563
00568 class TimeDomainStage {
00569 public:
00570
00572 TimeDomainStage();
00573
00575 ~TimeDomainStage();
00576
00580 std::string name;
00581
00583 TimeDomainStageVariables *variables;
00584
00586 TimeDomainStageConstraints *constraints;
00587
00589 TimeDomainStageObjectives *objectives;
00590 };
00591
00596 class TimeDomainStages {
00597 public:
00598
00600 TimeDomainStages();
00601
00603 ~TimeDomainStages();
00604
00608 int numberOfStages;
00609
00611 TimeDomainStage **stage;
00612 };
00613
00618 class TimeDomainInterval {
00619 public:
00620
00622 TimeDomainInterval();
00623
00625 ~TimeDomainInterval();
00626
00630 double start;
00631
00635 double horizon;
00636 };
00637
00642 class TimeDomain {
00643 public:
00644
00646 TimeDomain();
00647
00649 ~TimeDomain();
00650
00653 TimeDomainStages *stages;
00654
00657 TimeDomainInterval *interval;
00658 };
00659
00676 class InstanceData{
00677 public:
00678
00680 InstanceData();
00681
00683 ~InstanceData();
00684
00686 Variables *variables;
00687
00689 Objectives *objectives;
00690
00692 Constraints *constraints;
00693
00697 LinearConstraintCoefficients *linearConstraintCoefficients;
00698
00702 QuadraticCoefficients* quadraticCoefficients;
00703
00707 NonlinearExpressions* nonlinearExpressions;
00708
00712 TimeDomain* timeDomain;
00713 };
00714
00715
00742 class OSInstance {
00743 public:
00744
00746 OSInstance();
00747
00749 ~OSInstance();
00750
00752 InstanceHeader *instanceHeader;
00753
00755 InstanceData *instanceData;
00756
00760 bool bVariablesModified ;
00761
00765 bool bObjectivesModified ;
00766
00770 bool bConstraintsModified ;
00771
00775 bool bAMatrixModified ;
00776
00777
00778
00779 private:
00783 std::string m_sInstanceName;
00787 std::string m_sInstanceSource;
00791 std::string m_sInstanceDescription;
00792
00796 bool m_bProcessVariables;
00797
00801 int m_iVariableNumber;
00802
00806 int m_iNumberOfIntegerVariables;
00807
00811 int m_iNumberOfBinaryVariables;
00812
00816 int m_iNumberOfStringVariables;
00817
00821 int m_iNumberOfQuadraticRowIndexes;
00822
00826 bool m_bQuadraticRowIndexesProcessed;
00827
00831 int *m_miQuadRowIndexes;
00832
00836 int m_iNumberOfNonlinearExpressionTreeIndexes;
00837
00841 bool m_bNonlinearExpressionTreeIndexesProcessed;
00842
00847 int *m_miNonlinearExpressionTreeIndexes;
00848
00853 int m_iNumberOfNonlinearExpressionTreeModIndexes;
00854
00858 bool m_bNonlinearExpressionTreeModIndexesProcessed;
00859
00864 int *m_miNonlinearExpressionTreeModIndexes;
00865
00869 std::string* m_msVariableNames;
00870
00875
00876
00881
00882
00887 char* m_mcVariableTypes;
00888
00892 double* m_mdVariableLowerBounds;
00893
00897 double* m_mdVariableUpperBounds;
00898
00902 bool m_bProcessObjectives;
00903
00907 int m_iObjectiveNumber;
00908
00912 int m_iObjectiveNumberNonlinear;
00913
00917 std::string* m_msObjectiveNames;
00918
00922 std::string* m_msMaxOrMins;
00923
00927 int* m_miNumberOfObjCoef;
00928
00932 double* m_mdObjectiveConstants;
00933
00937 double* m_mdObjectiveWeights;
00938
00943 SparseVector** m_mObjectiveCoefficients;
00944
00948 bool m_bGetDenseObjectives;
00949
00954 double** m_mmdDenseObjectiveCoefficients;
00955
00959 bool m_bProcessConstraints;
00960
00964 int m_iConstraintNumber;
00965
00969 int m_iConstraintNumberNonlinear;
00970
00974 std::string* m_msConstraintNames;
00975
00979 double* m_mdConstraintLowerBounds;
00980
00984 double* m_mdConstraintUpperBounds;
00985
00990 double* m_mdConstraintConstants;
00991
00996 char* m_mcConstraintTypes;
00997
01001 bool m_bProcessLinearConstraintCoefficients;
01002
01007 int m_iLinearConstraintCoefficientNumber;
01008
01012 bool m_bColumnMajor;
01013
01017 bool m_binitForAlgDiff;
01018
01019
01024 SparseMatrix* m_linearConstraintCoefficientsInColumnMajor;
01025
01030 SparseMatrix* m_linearConstraintCoefficientsInRowMajor;
01031
01032
01036 bool m_bProcessQuadraticTerms;
01037
01042 int m_iQuadraticTermNumber;
01043
01047 double *m_mdConstraintFunctionValues;
01048
01052 double *m_mdObjectiveFunctionValues;
01053
01057 int m_iJacValueSize;
01058
01062 int *m_miJacStart;
01063
01067 int *m_miJacIndex;
01068
01072 double *m_mdJacValue;
01073
01074
01079 int *m_miJacNumConTerms;
01080
01084 SparseJacobianMatrix *m_sparseJacMatrix;
01085
01090 int m_iHighestTaylorCoeffOrder;
01091
01096 QuadraticTerms* m_quadraticTerms;
01097
01100 bool m_bQTermsAdded;
01101
01106 unsigned int m_iNumberOfNonlinearVariables;
01107
01111 bool m_bProcessNonlinearExpressions;
01112
01116 int m_iNonlinearExpressionNumber;
01117
01122 int* m_miNonlinearExpressionIndexes;
01123
01127 bool m_bProcessExpressionTrees;
01128
01132 bool m_bProcessExpressionTreesMod;
01133
01138 std::map<int, OSExpressionTree*> m_mapExpressionTrees ;
01139
01140
01141
01142 std::map<int, int> m_mapOSADFunRangeIndex ;
01143
01148 OSExpressionTree *m_LagrangianExpTree ;
01149
01153 bool m_bLagrangianExpTreeCreated ;
01154
01158 SparseHessianMatrix* m_LagrangianSparseHessian;
01159
01164 bool m_bLagrangianSparseHessianCreated;
01165
01169 std::map<int, int> m_mapAllNonlinearVariablesIndex;
01170
01174 int *m_miNonLinearVarsReverseMap;
01175
01180 bool m_bAllNonlinearVariablesIndex;
01181
01188 std::map<int, OSExpressionTree*> m_mapExpressionTreesMod ;
01189
01194 bool m_bOSADFunIsCreated;
01195
01200 bool m_bCppADTapesBuilt;
01201
01206 bool m_bCppADMustReTape;
01207
01211 bool m_bDuplicateExpressionTreesMap;
01212
01216 bool m_bNonLinearStructuresInitialized;
01217
01221 bool m_bSparseJacobianCalculated;
01222
01227 std::map<int, std::vector<OSnLNode*> > m_mapExpressionTreesInPostfix ;
01228
01229
01234 int m_iHighestOrderEvaluated;
01235
01240 double **m_mmdObjGradient;
01241
01242
01243
01248 std::vector<double> m_vdX;
01249
01254 std::vector<double> m_vdYval;
01255
01261 std::vector<bool> m_vbLagHessNonz;
01262
01267 std::vector<double> m_vdYjacval;
01268
01273 std::vector<double> m_vdw;
01274
01279 std::vector<double> m_vdLambda;
01280
01281
01286 std::vector<double> m_vdDomainUnitVec;
01287
01292 std::vector<double> m_vdRangeUnitVec;
01293
01294
01298 bool m_bProcessTimeDomain;
01299
01303 bool m_bProcessTimeStages;
01304
01308 bool m_bProcessTimeInterval;
01309
01313 bool m_bFiniteTimeStages;
01314
01318 int m_iNumberOfTimeStages;
01319
01323 std::string m_sTimeDomainFormat;
01324
01329 std::string* m_msTimeDomainStageNames;
01330
01335 int* m_miTimeDomainStageVariableNumber;
01336
01341 int** m_mmiTimeDomainStageVarList;
01342
01347 int* m_miTimeDomainStageConstraintNumber;
01348
01353 int** m_mmiTimeDomainStageConList;
01354
01359 int* m_miTimeDomainStageObjectiveNumber;
01360
01365 int** m_mmiTimeDomainStageObjList;
01366
01367
01374 bool processVariables() ;
01375
01382 bool processObjectives();
01383
01384
01391 bool processConstraints();
01392
01393
01400 bool processLinearConstraintCoefficients();
01401
01402
01403 public:
01404
01409 std::string getInstanceName();
01410
01411
01416 std::string getInstanceSource();
01417
01418
01424 std::string getInstanceDescription();
01425
01431 int getVariableNumber();
01432
01439 std::string* getVariableNames();
01440
01448
01449
01457
01458
01470 char* getVariableTypes();
01471
01476 int getNumberOfIntegerVariables();
01477
01482 int getNumberOfBinaryVariables();
01483
01488 int getNumberOfStringVariables();
01489
01496 double* getVariableLowerBounds();
01497
01504 double* getVariableUpperBounds();
01505
01511 int getObjectiveNumber();
01512
01513
01520 std::string* getObjectiveNames();
01521
01528 std::string* getObjectiveMaxOrMins();
01529
01538 int* getObjectiveCoefficientNumbers();
01539
01546 double* getObjectiveConstants();
01547
01554 double* getObjectiveWeights();
01555
01566 SparseVector** getObjectiveCoefficients();
01567
01574 double** getDenseObjectiveCoefficients();
01575
01581 int getConstraintNumber();
01582
01589 std::string* getConstraintNames();
01590
01597 double* getConstraintLowerBounds();
01598
01605 double *getConstraintUpperBounds();
01606
01619 char* getConstraintTypes();
01620
01626 int getLinearConstraintCoefficientNumber();
01627
01628
01635 bool getLinearConstraintCoefficientMajor();
01636
01637
01644 SparseMatrix* getLinearConstraintCoefficientsInColumnMajor();
01645
01652 SparseMatrix* getLinearConstraintCoefficientsInRowMajor();
01653
01659 int getNumberOfQuadraticTerms();
01660
01669 QuadraticTerms* getQuadraticTerms();
01670
01678 int* getQuadraticRowIndexes();
01679
01685 int getNumberOfQuadraticRowIndexes();
01686
01692 int getNumberOfNonlinearExpressions();
01693
01694
01700 OSExpressionTree* getNonlinearExpressionTree(int rowIdx);
01701
01708 OSExpressionTree* getNonlinearExpressionTreeMod(int rowIdx);
01709
01716 std::vector<OSnLNode*> getNonlinearExpressionTreeInPostfix( int rowIdx);
01717
01725 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPostfix( int rowIdx);
01726
01733 std::vector<OSnLNode*> getNonlinearExpressionTreeInPrefix( int rowIdx);
01734
01742 std::string getNonlinearExpressionTreeInInfix( int rowIdx);
01743
01744
01749 std::string printModel( );
01750
01751
01759 std::string printModel( int rowIdx);
01760
01768 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPrefix( int rowIdx);
01769
01770
01774 int getNumberOfNonlinearObjectives();
01775
01779 int getNumberOfNonlinearConstraints();
01780
01784 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTrees();
01785
01786
01790 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTreesMod();
01791
01797 int* getNonlinearExpressionTreeIndexes();
01798
01799
01805 int getNumberOfNonlinearExpressionTreeIndexes();
01806
01807
01814 int* getNonlinearExpressionTreeModIndexes();
01815
01816
01823 int getNumberOfNonlinearExpressionTreeModIndexes();
01824
01825
01831 std::string getTimeDomainFormat();
01832
01838 int getTimeDomainStageNumber();
01839
01845 std::string* getTimeDomainStageNames();
01846
01852 int* getTimeDomainStageNumberOfVariables();
01853
01859 int* getTimeDomainStageNumberOfConstraints();
01860
01866 int* getTimeDomainStageNumberOfObjectives();
01867
01873 int** getTimeDomainStageVarList();
01874
01880 int** getTimeDomainStageConList();
01881
01887 int** getTimeDomainStageObjList();
01888
01894 double getTimeDomainIntervalStart();
01895
01901 double getTimeDomainIntervalHorizon();
01902
01903
01904
01905
01906
01907
01914 bool setInstanceSource(std::string source);
01915
01922 bool setInstanceDescription(std::string description);
01923
01924
01931 bool setInstanceName(std::string name);
01932
01939 bool setVariableNumber(int number);
01940
01958 bool addVariable(int index, std::string name, double lowerBound, double upperBound, char type);
01959
01978 bool setVariables(int number, std::string* names, double* lowerBounds,
01979 double* upperBounds, char* types);
01980
01987 bool setObjectiveNumber(int number);
01988
02006 bool addObjective(int index, std::string name, std::string maxOrMin, double constant, double weight, SparseVector* objectiveCoefficients);
02007
02023 bool setObjectives(int number, std::string *names, std::string *maxOrMins, double *constants, double *weights, SparseVector **objectitiveCoefficients);
02024
02031 bool setConstraintNumber(int number);
02032
02046 bool addConstraint(int index, std::string name, double lowerBound, double upperBound, double constant);
02047
02059 bool setConstraints(int number, std::string* names, double* lowerBounds, double* upperBounds, double* constants);
02060
02079 bool setLinearConstraintCoefficients(int numberOfValues, bool isColumnMajor,
02080 double* values, int valuesBegin, int valuesEnd,
02081 int* indexes, int indexesBegin, int indexesEnd,
02082 int* starts, int startsBegin, int startsEnd);
02083
02099 bool setQuadraticTerms(int number,
02100 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients,
02101 int begin, int end);
02102
02116 bool setQuadraticTermsInNonlinearExpressions(int number,
02117 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients);
02118
02119
02120
02121
02122
02123
02129 bool initializeNonLinearStructures( );
02130
02144 double calculateFunctionValue(int idx, double* x, bool new_x);
02145
02160 double *calculateAllConstraintFunctionValues(double* x, double *objLambda, double *conLambda,
02161 bool new_x, int highestOrder);
02162
02176 double *calculateAllConstraintFunctionValues(double* x, bool new_x);
02177
02193 double *calculateAllObjectiveFunctionValues(double* x, double *objLambda, double *conLambda,
02194 bool new_x, int highestOrder);
02195
02209 double *calculateAllObjectiveFunctionValues(double* x, bool new_x);
02210
02211
02226 SparseJacobianMatrix *calculateAllConstraintFunctionGradients(double* x, double *objLambda,
02227 double *conLambda, bool new_x, int highestOrder);
02228
02229
02245 SparseVector *calculateConstraintFunctionGradient(double* x, double *objLambda, double *conLambda,
02246 int idx, bool new_x, int highestOrder);
02247
02261 SparseVector *calculateConstraintFunctionGradient(double* x, int idx, bool new_x );
02262
02277 double **calculateAllObjectiveFunctionGradients(double* x, double *objLambda, double *conLambda,
02278 bool new_x, int highestOrder);
02279
02295 double *calculateObjectiveFunctionGradient(double* x, double *objLambda, double *conLambda,
02296 int objIdx, bool new_x, int highestOrder);
02297
02310 double *calculateObjectiveFunctionGradient(double* x, int objIdx, bool new_x );
02311
02329 SparseHessianMatrix *calculateLagrangianHessian( double* x, double *objLambda, double *conLambda,
02330 bool new_x, int highestOrder);
02331
02344 SparseHessianMatrix *calculateHessian( double* x, int idx, bool new_x);
02345
02346
02351 bool getSparseJacobianFromColumnMajor();
02352
02357 bool getSparseJacobianFromRowMajor();
02358
02363 OSExpressionTree* getLagrangianExpTree( );
02364
02369 std::map<int, int> getAllNonlinearVariablesIndexMap( );
02370
02375 SparseHessianMatrix* getLagrangianHessianSparsityPattern();
02376
02381 bool addQTermsToExressionTree();
02382
02387 SparseJacobianMatrix *getJacobianSparsityPattern();
02388
02393 void duplicateExpressionTreesMap();
02394
02395 #ifdef COIN_HAS_CPPAD
02396
02400 CppAD::ADFun<double> *Fad;
02401 #endif
02402
02413 bool createOSADFun(std::vector<double> vdX );
02414
02425 std::vector<double> forwardAD(int p, std::vector<double> vdX);
02426
02437 std::vector<double> reverseAD(int p, std::vector<double> vdlambda);
02438
02451 int getADSparsityHessian();
02452
02472 bool getIterateResults(double *x, double *objLambda, double *conLambda,
02473 bool new_x, int highestOrder);
02474
02475
02476
02489 bool getZeroOrderResults(double *x, double *objLambda, double *conLambda);
02490
02503 bool getFirstOrderResults(double *x, double *objLambda, double *conLambda );
02504
02517 bool getSecondOrderResults(double *x, double *objLambda, double *conLambda );
02518
02519
02529 bool initForAlgDiff();
02530
02540 bool initObjGradients();
02541
02542
02547 bool bUseExpTreeForFunEval;
02548
02549
02553 bool setTimeDomain(std::string format);
02554
02558 bool setTimeDomainStages(int number, std::string *names);
02559
02565 bool setTimeDomainStageVariablesOrdered(int numberOfStages, int *numberOfVariables, int *startIdx);
02566
02572 bool setTimeDomainStageVariablesUnordered(int numberOfStages, int *numberOfVariables, int **varIndex);
02573
02579 bool setTimeDomainStageConstraintsOrdered(int numberOfStages, int *numberOfConstraints, int *startIdx);
02580
02586 bool setTimeDomainStageConstraintsUnordered(int numberOfStages, int *numberOfConstraints, int **conIndex);
02587
02593 bool setTimeDomainStageObjectivesOrdered(int numberOfStages, int *numberOfObjectives, int *startIdx);
02594
02600 bool setTimeDomainStageObjectivesUnordered(int numberOfStages, int *numberOfObjectives, int **varIndex);
02601
02605 bool setTimeDomainInterval(double start, double horizon);
02606
02607
02608 };
02609
02610 #endif
02611