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
00045
00046
00050 class Variable{
00051 public:
00053 Variable();
00054
00056 ~Variable();
00057
00061 double lb;
00062
00066 double ub;
00067
00071 double init;
00072
00076 char type;
00077
00081 std::string name;
00082
00084 std::string initString;
00085 };
00086
00087
00091 class Variables{
00092 public:
00093
00095 Variables();
00096
00098 ~Variables();
00099
00101 int numberOfVariables;
00102
00104 Variable **var;
00105 };
00106
00107
00112 class ObjCoef{
00113 public:
00114
00116 ObjCoef();
00117
00119 ~ObjCoef();
00120
00124 int idx;
00125
00129 double value;
00130 };
00131
00136 class Constraint{
00137 public:
00138
00140 Constraint();
00141
00143 ~Constraint();
00144
00146 std::string name;
00147
00149 double constant;
00150
00152 double lb;
00153
00155 double ub;
00156 };
00157
00158
00163 class Constraints{
00164 public:
00165
00167 Constraints();
00168
00170 ~Constraints();
00171
00175 int numberOfConstraints;
00176
00179 Constraint **con;
00180 };
00181
00182
00187 class InstanceHeader{
00188 public:
00189
00191 InstanceHeader();
00192
00194 ~InstanceHeader();
00195
00197 std::string description;
00198
00200 std::string name;
00201
00203 std::string source;
00204 };
00205
00210 class Objective{
00211 public:
00212
00214 Objective();
00215
00217 ~Objective();
00218
00220 std::string name;
00221
00225 std::string maxOrMin;
00226
00230 double constant;
00231
00235 double weight;
00236
00240 int numberOfObjCoef;
00241
00244 ObjCoef **coef;
00245 };
00246
00251 class Objectives{
00252 public:
00253
00255 Objectives();
00256
00258 ~Objectives();
00259
00263 int numberOfObjectives;
00264
00267 Objective **obj;
00268 };
00269
00281 class LinearConstraintCoefficients{
00282 public:
00283
00285 LinearConstraintCoefficients();
00286
00288 ~LinearConstraintCoefficients();
00289
00293 int numberOfValues;
00294
00298 IntVector *start;
00299
00301 IntVector *rowIdx;
00302
00304 IntVector *colIdx;
00305
00307 DoubleVector *value;
00314 int iNumberOfStartElements;
00315 };
00316
00317
00327 class QuadraticTerm{
00328 public:
00329
00331 QuadraticTerm();
00332
00334 ~QuadraticTerm();
00335
00339 int idx;
00340
00344 int idxOne;
00345
00349 int idxTwo;
00350
00352 double coef;
00353 };
00354
00355
00356
00357
00363 class QuadraticCoefficients {
00364 public:
00365
00367 QuadraticCoefficients();
00368
00370 ~QuadraticCoefficients();
00371
00375 int numberOfQuadraticTerms;
00376
00379 QuadraticTerm** qTerm;
00380 };
00381
00382
00387 class Nl{
00388 public:
00390 int idx;
00391
00397 bool m_bDeleteExpressionTree;
00398
00400 OSExpressionTree *osExpressionTree;
00401
00405 Nl();
00406
00410 ~Nl();
00411 };
00412
00417 class NonlinearExpressions {
00418 public:
00419
00421 NonlinearExpressions();
00422
00424 ~NonlinearExpressions();
00425
00430 int numberOfNonlinearExpressions;
00431
00434 Nl **nl;
00435 };
00436
00452 class InstanceData{
00453 public:
00454
00456 InstanceData();
00457
00459 ~InstanceData();
00460
00462 Variables *variables;
00463
00465 Objectives *objectives;
00466
00468 Constraints *constraints;
00469
00473 LinearConstraintCoefficients *linearConstraintCoefficients;
00474
00478 QuadraticCoefficients* quadraticCoefficients;
00479
00483 NonlinearExpressions* nonlinearExpressions;
00484 };
00485
00486
00513 class OSInstance {
00514 public:
00515
00517 OSInstance();
00518
00520 ~OSInstance();
00521
00523 InstanceHeader *instanceHeader;
00524
00526 InstanceData *instanceData;
00527
00528 private:
00532 std::string m_sInstanceName;
00536 std::string m_sInstanceSource;
00540 std::string m_sInstanceDescription;
00541
00545 bool m_bProcessVariables ;
00546
00550 int m_iVariableNumber;
00551
00555 int m_iNumberOfIntegerVariables;
00556
00560 int m_iNumberOfBinaryVariables;
00561
00565 int m_iNumberOfQuadraticRowIndexes;
00566
00570 bool m_bQuadraticRowIndexesProcessed;
00571
00575 int *m_miQuadRowIndexes;
00576
00580 int m_iNumberOfNonlinearExpressionTreeIndexes;
00581
00585 bool m_bNonlinearExpressionTreeIndexesProcessed;
00586
00591 int *m_miNonlinearExpressionTreeIndexes;
00592
00597 int m_iNumberOfNonlinearExpressionTreeModIndexes;
00598
00602 bool m_bNonlinearExpressionTreeModIndexesProcessed;
00603
00608 int *m_miNonlinearExpressionTreeModIndexes;
00609
00613 std::string* m_msVariableNames;
00614
00618 double* m_mdVariableInitialValues ;
00619
00623 std::string* m_msVariableInitialStringValues;
00624
00629 char* m_mcVariableTypes;
00630
00634 double* m_mdVariableLowerBounds;
00635
00639 double* m_mdVariableUpperBounds;
00640
00644 bool m_bProcessObjectives;
00645
00649 int m_iObjectiveNumber;
00650
00654 int m_iObjectiveNumberNonlinear;
00655
00659 std::string* m_msObjectiveNames;
00660
00664 std::string* m_msMaxOrMins;
00665
00669 int* m_miNumberOfObjCoef;
00670
00674 double* m_mdObjectiveConstants;
00675
00679 double* m_mdObjectiveWeights;
00680
00685 SparseVector** m_mObjectiveCoefficients;
00686
00690 bool m_bGetDenseObjectives;
00691
00696 double** m_mmdDenseObjectiveCoefficients;
00697
00701 bool m_bProcessConstraints;
00702
00706 int m_iConstraintNumber;
00707
00711 int m_iConstraintNumberNonlinear;
00712
00716 std::string* m_msConstraintNames;
00717
00721 double* m_mdConstraintLowerBounds;
00722
00726 double* m_mdConstraintUpperBounds;
00727
00732 double* m_mdConstraintConstants;
00733
00738 char* m_mcConstraintTypes;
00739
00743 bool m_bProcessLinearConstraintCoefficients;
00744
00749 int m_iLinearConstraintCoefficientNumber;
00750
00754 bool m_bColumnMajor;
00755
00759 bool m_binitForAlgDiff;
00760
00761
00766 SparseMatrix* m_linearConstraintCoefficientsInColumnMajor ;
00767
00772 SparseMatrix* m_linearConstraintCoefficientsInRowMajor ;
00773
00774
00778 bool m_bProcessQuadraticTerms ;
00779
00784 int m_iQuadraticTermNumber ;
00785
00789 double *m_mdConstraintFunctionValues;
00790
00794 double *m_mdObjectiveFunctionValues;
00795
00799 int m_iJacValueSize;
00800
00804 int *m_miJacStart;
00805
00809 int *m_miJacIndex;
00810
00814 double *m_mdJacValue;
00815
00816
00821 int *m_miJacNumConTerms;
00822
00826 SparseJacobianMatrix *m_sparseJacMatrix;
00827
00832 int m_iHighestTaylorCoeffOrder;
00833
00838 QuadraticTerms* m_quadraticTerms;
00839
00842 bool m_bQTermsAdded;
00843
00848 unsigned int m_iNumberOfNonlinearVariables ;
00849
00853 bool m_bProcessNonlinearExpressions ;
00854
00858 int m_iNonlinearExpressionNumber;
00859
00864 int* m_miNonlinearExpressionIndexes ;
00865
00869 bool m_bProcessExpressionTrees;
00870
00874 bool m_bProcessExpressionTreesMod;
00875
00880 std::map<int, OSExpressionTree*> m_mapExpressionTrees ;
00881
00882
00883
00884 std::map<int, int> m_mapCppADFunRangeIndex ;
00885
00890 OSExpressionTree *m_LagrangianExpTree ;
00891
00895 bool m_bLagrangianExpTreeCreated ;
00896
00900 SparseHessianMatrix* m_LagrangianSparseHessian;
00901
00906 bool m_bLagrangianSparseHessianCreated;
00907
00911 std::map<int, int> m_mapAllNonlinearVariablesIndex;
00912
00916 int *m_miNonLinearVarsReverseMap;
00917
00922 bool m_bAllNonlinearVariablesIndex;
00923
00930 std::map<int, OSExpressionTree*> m_mapExpressionTreesMod ;
00931
00936 bool m_bCppADFunIsCreated;
00937
00942 bool m_bCppADTapesBuilt;
00943
00948 bool m_bCppADMustReTape;
00949
00953 bool m_bDuplicateExpressionTreesMap;
00954
00958 bool m_bNonLinearStructuresInitialized;
00959
00963 bool m_bSparseJacobianCalculated;
00964
00969 std::map<int, std::vector<OSnLNode*> > m_mapExpressionTreesInPostfix ;
00970
00971
00976 int m_iHighestOrderEvaluated;
00977
00982 double **m_mmdObjGradient;
00983
00984
00985
00989 CppAD::vector< AD<double> > m_vX;
00990
00995 std::vector<double> m_vdX;
00996
01001 std::vector<double> m_vdYval;
01002
01007 std::vector<double> m_vdYjacval;
01008
01013 std::vector<double> m_vdw;
01014
01019 std::vector<double> m_vdLambda;
01020
01021
01026 std::vector<double> m_vdDomainUnitVec;
01027
01032 std::vector<double> m_vdRangeUnitVec;
01033
01034
01035
01042 bool processVariables() ;
01043
01050 bool processObjectives();
01051
01052
01059 bool processConstraints();
01060
01061
01068 bool processLinearConstraintCoefficients();
01069
01070
01071 public:
01072
01077 bool bUseExpTreeForFunEval;
01078
01083 std::string getInstanceName();
01084
01085
01090 std::string getInstanceSource();
01091
01092
01098 std::string getInstanceDescription();
01099
01105 int getVariableNumber();
01106
01113 std::string* getVariableNames();
01114
01121 double* getVariableInitialValues();
01122
01129 std::string* getVariableInitialStringValues();
01130
01142 char* getVariableTypes();
01143
01148 int getNumberOfIntegerVariables();
01149
01154 int getNumberOfBinaryVariables();
01155
01162 double* getVariableLowerBounds();
01163
01170 double* getVariableUpperBounds();
01171
01177 int getObjectiveNumber();
01178
01179
01186 std::string* getObjectiveNames();
01187
01194 std::string* getObjectiveMaxOrMins();
01195
01204 int* getObjectiveCoefficientNumbers();
01205
01212 double* getObjectiveConstants();
01213
01220 double* getObjectiveWeights();
01221
01232 SparseVector** getObjectiveCoefficients();
01233
01240 double** getDenseObjectiveCoefficients();
01241
01247 int getConstraintNumber();
01248
01255 std::string* getConstraintNames();
01256
01263 double* getConstraintLowerBounds();
01264
01271 double *getConstraintUpperBounds();
01272
01285 char* getConstraintTypes();
01286
01292 int getLinearConstraintCoefficientNumber();
01293
01294
01301 bool getLinearConstraintCoefficientMajor();
01302
01303
01310 SparseMatrix* getLinearConstraintCoefficientsInColumnMajor();
01311
01318 SparseMatrix* getLinearConstraintCoefficientsInRowMajor();
01319
01325 int getNumberOfQuadraticTerms();
01326
01335 QuadraticTerms* getQuadraticTerms();
01336
01344 int* getQuadraticRowIndexes();
01345
01351 int getNumberOfQuadraticRowIndexes();
01352
01358 int getNumberOfNonlinearExpressions();
01359
01360
01366 OSExpressionTree* getNonlinearExpressionTree(int rowIdx);
01367
01374 OSExpressionTree* getNonlinearExpressionTreeMod(int rowIdx);
01375
01382 std::vector<OSnLNode*> getNonlinearExpressionTreeInPostfix( int rowIdx);
01383
01391 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPostfix( int rowIdx);
01392
01399 std::vector<OSnLNode*> getNonlinearExpressionTreeInPrefix( int rowIdx);
01400
01408 std::vector<OSnLNode*> getNonlinearExpressionTreeModInPrefix( int rowIdx);
01409
01410
01414 int getNumberOfNonlinearObjectives();
01415
01419 int getNumberOfNonlinearConstraints();
01420
01424 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTrees();
01425
01426
01430 std::map<int, OSExpressionTree* > getAllNonlinearExpressionTreesMod();
01431
01437 int* getNonlinearExpressionTreeIndexes();
01438
01439
01445 int getNumberOfNonlinearExpressionTreeIndexes();
01446
01447
01454 int* getNonlinearExpressionTreeModIndexes();
01455
01456
01463 int getNumberOfNonlinearExpressionTreeModIndexes();
01464
01465
01466
01467
01468
01475 bool setInstanceSource(std::string source);
01476
01483 bool setInstanceDescription(std::string description);
01484
01485
01492 bool setInstanceName(std::string name);
01493
01500 bool setVariableNumber(int number);
01501
01518 bool addVariable(int index, std::string name, double lowerBound, double upperBound, char type, double init, std::string initString);
01519
01535 bool setVariables(int number, std::string* names, double* lowerBounds,
01536 double* upperBounds, char* types, double* inits, std::string* initsString);
01537
01544 bool setObjectiveNumber(int number);
01545
01563 bool addObjective(int index, std::string name, std::string maxOrMin, double constant, double weight, SparseVector* objectiveCoefficients);
01564
01580 bool setObjectives(int number, std::string *names, std::string *maxOrMins, double *constants, double *weights, SparseVector **objectitiveCoefficients);
01581
01588 bool setConstraintNumber(int number);
01589
01603 bool addConstraint(int index, std::string name, double lowerBound, double upperBound, double constant);
01604
01616 bool setConstraints(int number, std::string* names, double* lowerBounds, double* upperBounds, double* constants);
01617
01636 bool setLinearConstraintCoefficients(int numberOfValues, bool isColumnMajor,
01637 double* values, int valuesBegin, int valuesEnd,
01638 int* indexes, int indexesBegin, int indexesEnd,
01639 int* starts, int startsBegin, int startsEnd);
01640
01656 bool setQuadraticTerms(int number,
01657 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients,
01658 int begin, int end);
01659
01673 bool setQuadraticTermsInNonlinearExpressions(int number,
01674 int* rowIndexes, int* varOneIndexes, int* varTwoIndexes, double* coefficients);
01675
01676
01677
01678
01679
01680
01686 bool initializeNonLinearStructures( );
01687
01701 double calculateFunctionValue(int idx, double* x, bool new_x);
01702
01717 double *calculateAllConstraintFunctionValues(double* x, double *objLambda, double *conLambda,
01718 bool new_x, int highestOrder);
01719
01733 double *calculateAllConstraintFunctionValues(double* x, bool new_x);
01734
01750 double *calculateAllObjectiveFunctionValues(double* x, double *objLambda, double *conLambda,
01751 bool new_x, int highestOrder);
01752
01766 double *calculateAllObjectiveFunctionValues(double* x, bool new_x);
01767
01768
01783 SparseJacobianMatrix *calculateAllConstraintFunctionGradients(double* x, double *objLambda,
01784 double *conLambda, bool new_x, int highestOrder);
01785
01786
01802 SparseVector *calculateConstraintFunctionGradient(double* x, double *objLambda, double *conLambda,
01803 int idx, bool new_x, int highestOrder);
01804
01818 SparseVector *calculateConstraintFunctionGradient(double* x, int idx, bool new_x );
01819
01834 double **calculateAllObjectiveFunctionGradients(double* x, double *objLambda, double *conLambda,
01835 bool new_x, int highestOrder);
01836
01852 double *calculateObjectiveFunctionGradient(double* x, double *objLambda, double *conLambda,
01853 int objIdx, bool new_x, int highestOrder);
01854
01868 double *calculateObjectiveFunctionGradient(double* x, int objIdx, bool new_x );
01869
01887 SparseHessianMatrix *calculateLagrangianHessian( double* x, double *objLambda, double *conLambda,
01888 bool new_x, int highestOrder);
01889
01902 SparseHessianMatrix *calculateHessian( double* x, int idx, bool new_x);
01903
01904
01909 bool getSparseJacobianFromColumnMajor();
01910
01915 bool getSparseJacobianFromRowMajor();
01916
01921 OSExpressionTree* getLagrangianExpTree( );
01922
01927 std::map<int, int> getAllNonlinearVariablesIndexMap( );
01928
01929
01934 SparseHessianMatrix* getLagrangianHessianSparsityPattern();
01935
01936
01937
01942 bool addQTermsToExressionTree();
01943
01948 SparseJacobianMatrix *getJacobianSparsityPattern();
01949
01954 void duplicateExpressionTreesMap();
01955
01956
01961 CppAD::ADFun<double> *Fad;
01962
01974 bool createCppADFun(std::vector<double> vdX );
01975
01986 std::vector<double> forwardAD(int p, std::vector<double> vdX);
01987
01998 std::vector<double> reverseAD(int p, std::vector<double> vdlambda);
01999
02019 bool getIterateResults(double *x, double *objLambda, double *conLambda,
02020 bool new_x, int highestOrder);
02021
02022
02023
02036 bool getZeroOrderResults(double *x, double *objLambda, double *conLambda);
02037
02050 bool getFirstOrderResults(double *x, double *objLambda, double *conLambda );
02051
02064 bool getSecondOrderResults(double *x, double *objLambda, double *conLambda );
02065
02066
02076 bool initForAlgDiff();
02077
02087 bool initObjGradients();
02088
02089
02090 };
02091
02092 #endif
02093