00001
00002
00003
00004 #if defined(_MSC_VER)
00005 #pragma warning(disable:4786)
00006 #pragma warning(disable:4503)
00007 #endif
00008
00009 #include <cstdio>
00010
00011 #include "ClpSimplex.hpp"
00012 #include "ClpNonLinearCost.hpp"
00013 #include "MyMessageHandler.hpp"
00014 #include "ClpMessage.hpp"
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 MyMessageHandler::MyMessageHandler ()
00025 : CoinMessageHandler(),
00026 model_(NULL),
00027 feasibleExtremePoints_(),
00028 iterationNumber_(-1)
00029 {
00030 }
00031
00032
00033
00034
00035 MyMessageHandler::MyMessageHandler (const MyMessageHandler & rhs)
00036 : CoinMessageHandler(rhs),
00037 model_(rhs.model_),
00038 feasibleExtremePoints_(rhs.feasibleExtremePoints_),
00039 iterationNumber_(rhs.iterationNumber_)
00040 {
00041 }
00042
00043 MyMessageHandler::MyMessageHandler (const CoinMessageHandler & rhs)
00044 : CoinMessageHandler(),
00045 model_(NULL),
00046 feasibleExtremePoints_(),
00047 iterationNumber_(-1)
00048 {
00049 }
00050
00051
00052 MyMessageHandler::MyMessageHandler(ClpSimplex * model,
00053 FILE * userPointer)
00054 : CoinMessageHandler(),
00055 model_(model),
00056 feasibleExtremePoints_(),
00057 iterationNumber_(-1)
00058 {
00059 }
00060
00061
00062
00063
00064 MyMessageHandler::~MyMessageHandler ()
00065 {
00066 }
00067
00068
00069
00070
00071 MyMessageHandler &
00072 MyMessageHandler::operator=(const MyMessageHandler& rhs)
00073 {
00074 if (this != &rhs) {
00075 CoinMessageHandler::operator=(rhs);
00076 model_ = rhs.model_;
00077 feasibleExtremePoints_ = rhs.feasibleExtremePoints_;
00078 iterationNumber_ = rhs.iterationNumber_;
00079 }
00080 return *this;
00081 }
00082
00083
00084
00085 CoinMessageHandler * MyMessageHandler::clone() const
00086 {
00087 return new MyMessageHandler(*this);
00088 }
00089
00090 int
00091 MyMessageHandler::print()
00092 {
00093 if (currentSource()=="Clp") {
00094 if (currentMessage().externalNumber()==102) {
00095 printf("There are %d primal infeasibilities\n",
00096 model_->nonLinearCost()->numberInfeasibilities());
00097
00098 if (!model_->nonLinearCost()->numberInfeasibilities()) {
00099
00100 int numberColumns = model_->numberColumns();
00101 const double * solution = model_->solutionRegion(1);
00102
00103
00104 StdVectorDouble feasibleExtremePoint;
00105
00106 const double *objective = model_->objective();
00107 double objectiveValue = 0;
00108
00109 if (!model_->columnScale()) {
00110
00111 for (int i=0;i<numberColumns;i++) {
00112 feasibleExtremePoint.push_back(solution[i]);
00113 objectiveValue += solution[i]*objective[i];
00114 }
00115 } else {
00116
00117 const double * columnScale = model_->columnScale();
00118 for (int i=0;i<numberColumns;i++) {
00119 feasibleExtremePoint.push_back(solution[i]*columnScale[i]);
00120 objectiveValue += solution[i]*objective[i]*columnScale[i];
00121 }
00122 }
00123 std::cout << "Objective "<< objectiveValue << std::endl;
00124
00125 feasibleExtremePoints_.push_front(feasibleExtremePoint);
00126
00127
00128 int numExtremePointsSaved = feasibleExtremePoints_.size();
00129 if ( numExtremePointsSaved>=10 ) {
00130 feasibleExtremePoints_.pop_back();
00131 assert( feasibleExtremePoints_.size() ==
00132 (unsigned int) numExtremePointsSaved-1 );
00133 };
00134
00135 }
00136 return 0;
00137 }
00138 }
00139 return CoinMessageHandler::print();
00140 }
00141 const ClpSimplex *
00142 MyMessageHandler::model() const
00143 {
00144 return model_;
00145 }
00146 void
00147 MyMessageHandler::setModel(ClpSimplex * model)
00148 {
00149 model_ = model;
00150 }
00151
00152 const std::deque<StdVectorDouble> & MyMessageHandler::getFeasibleExtremePoints() const
00153 {
00154 return feasibleExtremePoints_;
00155 }
00156 void MyMessageHandler::clearFeasibleExtremePoints()
00157 {
00158 feasibleExtremePoints_.clear();
00159 }