00001
00034 #ifndef OSINSTANCE_H
00035 #define OSINSTANCE_H
00036 #include "OSParameters.h"
00037 #include "OSGeneral.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
00069 bool IsEqual(InstanceHeader *that);
00070 };
00071
00072
00073
00077 class Variable{
00078 public:
00080 Variable();
00081
00083 ~Variable();
00084
00088 double lb;
00089
00093 double ub;
00094
00098 char type;
00099
00103 std::string name;
00104
00105
00109 bool IsEqual(Variable *that);
00110 };
00111
00112
00116 class Variables{
00117 public:
00118
00120 Variables();
00121
00123 ~Variables();
00124
00126 int numberOfVariables;
00127
00129 Variable **var;
00130
00134 bool IsEqual(Variables *that);
00135 };
00136
00137
00142 class ObjCoef{
00143 public:
00144
00146 ObjCoef();
00147
00149 ~ObjCoef();
00150
00154 int idx;
00155
00159 double value;
00160
00164 bool IsEqual(ObjCoef *that);
00165 };
00166
00167
00172 class Objective{
00173 public:
00174
00176 Objective();
00177
00179 ~Objective();
00180
00182 std::string name;
00183
00187 std::string maxOrMin;
00188
00192 double constant;
00193
00197 double weight;
00198
00202 int numberOfObjCoef;
00203
00206 ObjCoef **coef;
00207
00211 bool IsEqual(Objective *that);
00212 };
00213
00218 class Objectives{
00219 public:
00220
00222 Objectives();
00223
00225 ~Objectives();
00226
00230 int numberOfObjectives;
00231
00234 Objective **obj;
00235
00239 bool IsEqual(Objectives *that);
00240 };
00241
00242
00247 class Constraint{
00248 public:
00249
00251 Constraint();
00252
00254 ~Constraint();
00255
00257 std::string name;
00258
00260 double constant;
00261
00263 double lb;
00264
00266 double ub;
00267
00271 bool IsEqual(Constraint *that);
00272 };
00273
00274
00279 class Constraints{
00280 public:
00281
00283 Constraints();
00284
00286 ~Constraints();
00287
00291 int numberOfConstraints;
00292
00295 Constraint **con;
00296
00300 bool IsEqual(Constraints *that);
00301 };
00302
00303
00315 class LinearConstraintCoefficients{
00316 public:
00317
00319 LinearConstraintCoefficients();
00320
00322 ~LinearConstraintCoefficients();
00323
00327 int numberOfValues;
00328
00332 IntVector *start;
00333
00335 IntVector *rowIdx;
00336
00338 IntVector *colIdx;
00339
00341 DoubleVector *value;
00348 int iNumberOfStartElements;
00349
00353 bool IsEqual(LinearConstraintCoefficients *that);
00354 };
00355
00356
00366 class QuadraticTerm{
00367 public:
00368
00370 QuadraticTerm();
00371
00373 ~QuadraticTerm();
00374
00378 int idx;
00379
00383 int idxOne;
00384
00388 int idxTwo;
00389
00391 double coef;
00392
00396 bool IsEqual(QuadraticTerm *that);
00397 };
00398
00399
00400
00401
00407 class QuadraticCoefficients {
00408 public:
00409
00411 QuadraticCoefficients();
00412
00414 ~QuadraticCoefficients();
00415
00419 int numberOfQuadraticTerms;
00420
00423 QuadraticTerm** qTerm;
00424
00428 bool IsEqual(QuadraticCoefficients *that);
00429 };
00430
00431
00436 class Nl{
00437 public:
00439 int idx;
00440
00446 bool m_bDeleteExpressionTree;
00447
00449 OSExpressionTree *osExpressionTree;
00450
00454 Nl();
00455
00459 ~Nl();
00460
00464 bool IsEqual(Nl *that);
00465 };
00466
00471 class NonlinearExpressions {
00472 public:
00473
00475 NonlinearExpressions();
00476
00478 ~NonlinearExpressions();
00479
00484 int numberOfNonlinearExpressions;
00485
00488 Nl **nl;
00489
00493 bool IsEqual(NonlinearExpressions *that);
00494 };
00495
00496
00497
00502 class TimeDomainStageVar {
00503 public:
00504
00506 TimeDomainStageVar();
00507
00509 ~TimeDomainStageVar();
00510
00512 int idx;
00513 };
00514
00519 class TimeDomainStageVariables {
00520 public:
00521
00523 TimeDomainStageVariables();
00524
00526 ~TimeDomainStageVariables();
00527
00529 int numberOfVariables;
00530
00532 int startIdx;
00533
00535 TimeDomainStageVar** var;
00536 };
00537
00538
00543 class TimeDomainStageCon {
00544 public:
00545
00547 TimeDomainStageCon();
00548
00550 ~TimeDomainStageCon();
00551
00553 int idx;
00554 };
00555
00560 class TimeDomainStageConstraints {
00561 public:
00562
00564 TimeDomainStageConstraints();
00565
00567 ~TimeDomainStageConstraints();
00568
00570 int numberOfConstraints;
00571
00573 int startIdx;
00574
00576 TimeDomainStageCon** con;
00577 };
00578
00579
00584 class TimeDomainStageObj {
00585 public:
00586
00588 TimeDomainStageObj();
00589
00591 ~TimeDomainStageObj();
00592
00594 int idx;
00595 };
00596
00601 class TimeDomainStageObjectives {
00602 public:
00603
00605 TimeDomainStageObjectives();
00606
00608 ~TimeDomainStageObjectives();
00609
00611 int numberOfObjectives;
00612
00614 int startIdx;
00615
00617 TimeDomainStageObj** obj;
00618 };
00619
00620
00625 class TimeDomainStage {
00626 public:
00627
00629 TimeDomainStage();
00630
00632 ~TimeDomainStage();
00633
00637 std::string name;
00638
00640 TimeDomainStageVariables *variables;
00641
00643 TimeDomainStageConstraints *constraints;
00644
00646 TimeDomainStageObjectives *objectives;
00647 };
00648
00653 class TimeDomainStages {
00654 public:
00655
00657 TimeDomainStages();
00658
00660 ~TimeDomainStages();
00661
00665 int numberOfStages;
00666
00668 TimeDomainStage **stage;
00669 };
00670
00675 class TimeDomainInterval {
00676 public:
00677
00679 TimeDomainInterval();
00680
00682 ~TimeDomainInterval();
00683
00687 double start;
00688
00692 double horizon;
00693 };
00694
00699 class TimeDomain {
00700 public:
00701
00703 TimeDomain();
00704
00706 ~TimeDomain();
00707
00710 TimeDomainStages *stages;
00711
00714 TimeDomainInterval *interval;
00715 };
00716
00733 class InstanceData{
00734 public:
00735
00737 InstanceData();
00738
00740 ~InstanceData();
00741
00743 Variables *variables;
00744
00746 Objectives *objectives;
00747
00749 Constraints *constraints;
00750
00754 LinearConstraintCoefficients *linearConstraintCoefficients;
00755
00759 QuadraticCoefficients* quadraticCoefficients;
00760
00764 NonlinearExpressions* nonlinearExpressions;
00765
00769 TimeDomain* timeDomain;
00770
00774 bool IsEqual(InstanceData *that);
00775 };
00776
00777
00804 class OSInstance {
00805 public:
00806
00808 OSInstance();
00809
00811 ~OSInstance();
00812
00814 InstanceHeader *instanceHeader;
00815
00817 InstanceData *instanceData;
00818
00822 bool IsEqual(OSInstance *that);
00823
00827 bool bVariablesModified ;
00828
00832 bool bObjectivesModified ;
00833
00837 bool bConstraintsModified ;
00838
00842 bool bAMatrixModified ;
00843
00844
00845
00846 private:
00850 std::string m_sInstanceName;
00854 std::string m_sInstanceSource;
00858 std::string m_sInstanceDescription;
00859
00863 bool m_bProcessVariables;
00864
00868 int m_iVariableNumber;
00869
00873 int m_iNumberOfIntegerVariables;
00874
00878 int m_iNumberOfBinaryVariables;
00879
00883 int m_iNumberOfSemiContinuousVariables;
00884
00888 int m_iNumberOfSemiIntegerVariables;
00889
00893 int m_iNumberOfStringVariables;
00894
00898 int m_iNumberOfQuadraticRowIndexes;
00899
00903 bool m_bQuadraticRowIndexesProcessed;
00904
00908 int *m_miQuadRowIndexes;
00909
00913 int m_iNumberOfNonlinearExpressionTreeIndexes;
00914
00918 bool m_bNonlinearExpressionTreeIndexesProcessed;
00919
00924 int *m_miNonlinearExpressionTreeIndexes;
00925
00930 int m_iNumberOfNonlinearExpressionTreeModIndexes;
00931
00935 bool m_bNonlinearExpressionTreeModIndexesProcessed;
00936
00941 int *m_miNonlinearExpressionTreeModIndexes;
00942
00946 std::string* m_msVariableNames;
00947
00952
00953
00958
00959
00964 char* m_mcVariableTypes;
00965
00969 double* m_mdVariableLowerBounds;
00970
00974 double* m_mdVariableUpperBounds;
00975
00979 bool m_bProcessObjectives;
00980
00984 int m_iObjectiveNumber;
00985
00989 int m_iObjectiveNumberNonlinear;
00990
00994 std::string* m_msObjectiveNames;
00995
00999 std::string* m_msMaxOrMins;
01000
01004 int* m_miNumberOfObjCoef;
01005
01009 double* m_mdObjectiveConstants;
01010
01014 double* m_mdObjectiveWeights;
01015
01020 SparseVector** m_mObjectiveCoefficients;
01021
01025 bool m_bGetDenseObjectives;
01026
01031 double** m_mmdDenseObjectiveCoefficients;
01032
01036 bool m_bProcessConstraints;
01037
01041 int m_iConstraintNumber;
01042
01046 int m_iConstraintNumberNonlinear;
01047
01051 std::string* m_msConstraintNames;
01052
01056 double* m_mdConstraintLowerBounds;
01057
01061 double* m_mdConstraintUpperBounds;
01062
01067 double* m_mdConstraintConstants;
01068
01073 char* m_mcConstraintTypes;
01074
01078 bool m_bProcessLinearConstraintCoefficients;
01079
01084 int m_iLinearConstraintCoefficientNumber;
01085
01089 bool m_bColumnMajor;
01090
01094 bool m_binitForAlgDiff;
01095
01096
01101 SparseMatrix* m_linearConstraintCoefficientsInColumnMajor;
01102
01107 SparseMatrix* m_linearConstraintCoefficientsInRowMajor;
01108
01109
01113 bool m_bProcessQuadraticTerms;
01114
01119 int m_iQuadraticTermNumber;
01120
01124 double *m_mdConstraintFunctionValues;
01125
01129 double *m_mdObjectiveFunctionValues;
01130
01134 int m_iJacValueSize;
01135
01139 int *m_miJacStart;
01140
01144 int *m_miJacIndex;
01145
01149 double *m_mdJacValue;
01150
01151
01156 int *m_miJacNumConTerms;
01157
01161 SparseJacobianMatrix *m_sparseJacMatrix;
01162
01167 int m_iHighestTaylorCoeffOrder;
01168
01173 QuadraticTerms* m_quadraticTerms;
01174
01177 bool m_bQTermsAdded;
01178
01183 unsigned int m_iNumberOfNonlinearVariables;
01184
01188 bool m_bProcessNonlinearExpressions;
01189
01193 int m_iNonlinearExpressionNumber;
01194
01199 int* m_miNonlinearExpressionIndexes;
01200
01204 bool m_bProcessExpressionTrees;
01205
01209 bool m_bProcessExpressionTreesMod;
01210
01215 std::map<int, OSExpressionTree*> m_mapExpressionTrees ;
01216
01217
01218
01219 std::map<int, int> m_mapOSADFunRangeIndex ;
01220
01225 OSExpressionTree *m_LagrangianExpTree ;
01226
01230 bool m_bLagrangianExpTreeCreated ;
01231
01235 SparseHessianMatrix* m_LagrangianSparseHessian;
01236
01241 bool m_bLagrangianSparseHessianCreated;
01242
01246 std::map<int, int> m_mapAllNonlinearVariablesIndex;
01247
01251 int *m_miNonLinearVarsReverseMap;
01252
01257 bool m_bAllNonlinearVariablesIndex;
01258
01265 std::map<int, OSExpressionTree*> m_mapExpressionTreesMod ;
01266
01271 bool m_bOSADFunIsCreated;
01272
01277 bool m_bCppADTapesBuilt;
01278
01283 bool m_bCppADMustReTape;
01284
01288 bool m_bDuplicateExpressionTreesMap;
01289
01293 bool m_bNonLinearStructuresInitialized;
01294
01298 bool m_bSparseJacobianCalculated;
01299
01304 std::map<int, std::vector<OSnLNode*> > m_mapExpressionTreesInPostfix ;
01305
01306
01311 int m_iHighestOrderEvaluated;
01312
01317 double **m_mmdObjGradient;
01318
01319
01320
01325 std::vector<double> m_vdX;
01326
01331 std::vector<double> m_vdYval;
01332
01338 std::vector<bool> m_vbLagHessNonz;
01339
01344 std::vector<double> m_vdYjacval;
01345
01350 std::vector<double> m_vdw;
01351
01356 std::vector<double> m_vdLambda;
01357
01358
01363 std::vector<double> m_vdDomainUnitVec;
01364
01369 std::vector<double> m_vdRangeUnitVec;
01370
01371
01375 bool m_bProcessTimeDomain;
01376
01380 bool m_bProcessTimeStages;
01381
01385 bool m_bProcessTimeInterval;
01386
01390 bool m_bFiniteTimeStages;
01391
01395 int m_iNumberOfTimeStages;
01396
01400 std::string m_sTimeDomainFormat;
01401
01406 std::string* m_msTimeDomainStageNames;
01407
01412 int* m_miTimeDomainStageVariableNumber;
01413
01418 int** m_mmiTimeDomainStageVarList;
01419
01424 int* m_miTimeDomainStageConstraintNumber;
01425
01430 int** m_mmiTimeDomainStageConList;
01431
01436 int* m_miTimeDomainStageObjectiveNumber;
01437
01442 int** m_mmiTimeDomainStageObjList;
01443
01444
01451 bool processVariables() ;
01452
01459 bool processObjectives();
01460
01461
01468 bool processConstraints();
01469
01470
01477 bool processLinearConstraintCoefficients();
01478
01479
01480 public:
01481
01486 std::string getInstanceName();
01487
01488
01493 std::string getInstanceSource();
01494
01495
01501 std::string getInstanceDescription();
01502
01508 int getVariableNumber();
01509
01516 std::string* getVariableNames();
01517
01525
01526
01534
01535
01547 char* getVariableTypes();
01548
01553 int getNumberOfIntegerVariables();
01554
01559 int getNumberOfBinaryVariables();
01560
01565 int getNumberOfSemiContinuousVariables();
01566
01571 int getNumberOfSemiIntegerVariables();
01572
01577 int getNumberOfStringVariables();
01578
01585 double* getVariableLowerBounds();
01586
01593 double* getVariableUpperBounds();
01594
01600 int getObjectiveNumber();
01601
01602
01609 std::string* getObjectiveNames();
01610
01617 std::string* getObjectiveMaxOrMins();
01618
01627 int* getObjectiveCoefficientNumbers();
01628
01635 double* getObjectiveConstants();
01636
01643 double* getObjectiveWeights();
01644
01655 SparseVector** getObjectiveCoefficients();
01656
01663 double** getDenseObjectiveCoefficients();
01664
01670 int getConstraintNumber();
01671
01678 std::string* getConstraintNames();
01679
01686 double* getConstraintLowerBounds();
01687
01694 double *getConstraintUpperBounds();
01695
01708 char* getConstraintTypes();
01709
01715 int getLinearConstraintCoefficientNumber();
01716
01717
01724 bool getLinearConstraintCoefficientMajor();
01725
01726
01733 SparseMatrix* getLinearConstraintCoefficientsInColumnMajor();
01734
01741 SparseMatrix* getLinearConstraintCoefficientsInRowMajor();
01742
01748 int getNumberOfQuadraticTerms();
01749
01758 QuadraticTerms* getQuadraticTerms();
01759
01767 int* getQuadraticRowIndexes();
01768
01774 int getNumberOfQuadraticRowIndexes();
01775
01781 int getNumberOfNonlinearExpressions();
01782
01783
01789 OSExpressionTree* getNonlinearExpressionTree(int rowIdx);
01790
01797 OSExpressionTree* getNonlinearExpressionTreeMod(int rowIdx);
01798
01805 std::vector<OSnLNode*> getNonlinearExpressionTreeInPostfix( int rowIdx);
01806
01814 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPostfix( int rowIdx);
01815
01822 std::vector<OSnLNode*> getNonlinearExpressionTreeInPrefix( int rowIdx);
01823
01831 std::string getNonlinearExpressionTreeInInfix( int rowIdx);
01832
01833
01838 std::string printModel( );
01839
01840
01848 std::string printModel( int rowIdx);
01849
01857 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPrefix( int rowIdx);
01858
01859
01863 int getNumberOfNonlinearObjectives();
01864
01868 int getNumberOfNonlinearConstraints();
01869
01873 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTrees();
01874
01875
01879 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTreesMod();
01880
01886 int* getNonlinearExpressionTreeIndexes();
01887
01888
01894 int getNumberOfNonlinearExpressionTreeIndexes();
01895
01896
01903 int* getNonlinearExpressionTreeModIndexes();
01904
01905
01912 int getNumberOfNonlinearExpressionTreeModIndexes();
01913
01914
01920 std::string getTimeDomainFormat();
01921
01927 int getTimeDomainStageNumber();
01928
01934 std::string* getTimeDomainStageNames();
01935
01941 int* getTimeDomainStageNumberOfVariables();
01942
01948 int* getTimeDomainStageNumberOfConstraints();
01949
01955 int* getTimeDomainStageNumberOfObjectives();
01956
01962 int** getTimeDomainStageVarList();
01963
01969 int** getTimeDomainStageConList();
01970
01976 int** getTimeDomainStageObjList();
01977
01983 double getTimeDomainIntervalStart();
01984
01990 double getTimeDomainIntervalHorizon();
01991
01992
01993
01994
01995
01996
02003 bool setInstanceSource(std::string source);
02004
02011 bool setInstanceDescription(std::string description);
02012
02013
02020 bool setInstanceName(std::string name);
02021
02028 bool setVariableNumber(int number);
02029
02047 bool addVariable(int index, std::string name, double lowerBound, double upperBound, char type);
02048
02067 bool setVariables(int number, std::string* names, double* lowerBounds,
02068 double* upperBounds, char* types);
02069
02076 bool setObjectiveNumber(int number);
02077
02095 bool addObjective(int index, std::string name, std::string maxOrMin, double constant, double weight, SparseVector* objectiveCoefficients);
02096
02112 bool setObjectives(int number, std::string *names, std::string *maxOrMins, double *constants, double *weights, SparseVector **objectitiveCoefficients);
02113
02120 bool setConstraintNumber(int number);
02121
02135 bool addConstraint(int index, std::string name, double lowerBound, double upperBound, double constant);
02136
02148 bool setConstraints(int number, std::string* names, double* lowerBounds, double* upperBounds, double* constants);
02149
02168 bool setLinearConstraintCoefficients(int numberOfValues, bool isColumnMajor,
02169 double* values, int valuesBegin, int valuesEnd,
02170 int* indexes, int indexesBegin, int indexesEnd,
02171 int* starts, int startsBegin, int startsEnd);
02172
02188 bool setQuadraticTerms(int number,
02189 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients,
02190 int begin, int end);
02191
02205 bool setQuadraticTermsInNonlinearExpressions(int number,
02206 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients);
02207
02208
02209
02210
02211
02212
02218 bool initializeNonLinearStructures( );
02219
02233 double calculateFunctionValue(int idx, double* x, bool new_x);
02234
02249 double *calculateAllConstraintFunctionValues(double* x, double *objLambda, double *conLambda,
02250 bool new_x, int highestOrder);
02251
02265 double *calculateAllConstraintFunctionValues(double* x, bool new_x);
02266
02282 double *calculateAllObjectiveFunctionValues(double* x, double *objLambda, double *conLambda,
02283 bool new_x, int highestOrder);
02284
02298 double *calculateAllObjectiveFunctionValues(double* x, bool new_x);
02299
02300
02315 SparseJacobianMatrix *calculateAllConstraintFunctionGradients(double* x, double *objLambda,
02316 double *conLambda, bool new_x, int highestOrder);
02317
02318
02334 SparseVector *calculateConstraintFunctionGradient(double* x, double *objLambda, double *conLambda,
02335 int idx, bool new_x, int highestOrder);
02336
02350 SparseVector *calculateConstraintFunctionGradient(double* x, int idx, bool new_x );
02351
02366 double **calculateAllObjectiveFunctionGradients(double* x, double *objLambda, double *conLambda,
02367 bool new_x, int highestOrder);
02368
02384 double *calculateObjectiveFunctionGradient(double* x, double *objLambda, double *conLambda,
02385 int objIdx, bool new_x, int highestOrder);
02386
02399 double *calculateObjectiveFunctionGradient(double* x, int objIdx, bool new_x );
02400
02418 SparseHessianMatrix *calculateLagrangianHessian( double* x, double *objLambda, double *conLambda,
02419 bool new_x, int highestOrder);
02420
02433 SparseHessianMatrix *calculateHessian( double* x, int idx, bool new_x);
02434
02435
02440 bool getSparseJacobianFromColumnMajor();
02441
02446 bool getSparseJacobianFromRowMajor();
02447
02452 OSExpressionTree* getLagrangianExpTree( );
02453
02458 std::map<int, int> getAllNonlinearVariablesIndexMap( );
02459
02464 SparseHessianMatrix* getLagrangianHessianSparsityPattern();
02465
02470 bool addQTermsToExressionTree();
02471
02476 SparseJacobianMatrix *getJacobianSparsityPattern();
02477
02482 void duplicateExpressionTreesMap();
02483
02484 #ifdef COIN_HAS_CPPAD
02485
02489 CppAD::ADFun<double> *Fad;
02490 #endif
02491
02502 bool createOSADFun(std::vector<double> vdX );
02503
02514 std::vector<double> forwardAD(int p, std::vector<double> vdX);
02515
02526 std::vector<double> reverseAD(int p, std::vector<double> vdlambda);
02527
02540 int getADSparsityHessian();
02541
02561 bool getIterateResults(double *x, double *objLambda, double *conLambda,
02562 bool new_x, int highestOrder);
02563
02564
02565
02578 bool getZeroOrderResults(double *x, double *objLambda, double *conLambda);
02579
02592 bool getFirstOrderResults(double *x, double *objLambda, double *conLambda );
02593
02606 bool getSecondOrderResults(double *x, double *objLambda, double *conLambda );
02607
02608
02618 bool initForAlgDiff();
02619
02629 bool initObjGradients();
02630
02631
02636 bool bUseExpTreeForFunEval;
02637
02638
02642 bool setTimeDomain(std::string format);
02643
02647 bool setTimeDomainStages(int number, std::string *names);
02648
02654 bool setTimeDomainStageVariablesOrdered(int numberOfStages, int *numberOfVariables, int *startIdx);
02655
02661 bool setTimeDomainStageVariablesUnordered(int numberOfStages, int *numberOfVariables, int **varIndex);
02662
02668 bool setTimeDomainStageConstraintsOrdered(int numberOfStages, int *numberOfConstraints, int *startIdx);
02669
02675 bool setTimeDomainStageConstraintsUnordered(int numberOfStages, int *numberOfConstraints, int **conIndex);
02676
02682 bool setTimeDomainStageObjectivesOrdered(int numberOfStages, int *numberOfObjectives, int *startIdx);
02683
02689 bool setTimeDomainStageObjectivesUnordered(int numberOfStages, int *numberOfObjectives, int **varIndex);
02690
02694 bool setTimeDomainInterval(double start, double horizon);
02695
02696
02697 };
02698
02699 #endif
02700