Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

MyMessageHandler.cpp

00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved. 
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 // Constructors / Destructor / Assignment
00019 //#############################################################################
00020 
00021 //-------------------------------------------------------------------
00022 // Default Constructor 
00023 //-------------------------------------------------------------------
00024 MyMessageHandler::MyMessageHandler () 
00025   : CoinMessageHandler(),
00026     model_(NULL),
00027     feasibleExtremePoints_(),
00028     iterationNumber_(-1)
00029 {
00030 }
00031 
00032 //-------------------------------------------------------------------
00033 // Copy constructor 
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 // Constructor with pointer to model
00052 MyMessageHandler::MyMessageHandler(ClpSimplex * model,
00053                FILE * userPointer)
00054   : CoinMessageHandler(),
00055     model_(model),
00056     feasibleExtremePoints_(),
00057     iterationNumber_(-1)
00058 {
00059 }
00060 
00061 //-------------------------------------------------------------------
00062 // Destructor 
00063 //-------------------------------------------------------------------
00064 MyMessageHandler::~MyMessageHandler ()
00065 {
00066 }
00067 
00068 //----------------------------------------------------------------
00069 // Assignment operator 
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 // Clone
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       // Feasibility
00098       if (!model_->nonLinearCost()->numberInfeasibilities()) {
00099         // Column solution
00100         int numberColumns = model_->numberColumns();
00101         const double * solution = model_->solutionRegion(1);
00102         
00103         // Create vector to contain solution
00104         StdVectorDouble feasibleExtremePoint;
00105         
00106         const double *objective = model_->objective();
00107         double objectiveValue = 0;
00108         
00109         if (!model_->columnScale()) {
00110           // No scaling
00111           for (int i=0;i<numberColumns;i++) {
00112             feasibleExtremePoint.push_back(solution[i]);
00113             objectiveValue += solution[i]*objective[i];
00114           }
00115         } else {
00116           // scaled
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         // Save solution
00125         feasibleExtremePoints_.push_front(feasibleExtremePoint);
00126         
00127         // Want maximum of 10 solutions, so if more then 10 get rid of oldest
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; // skip printing
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 }

Generated on Wed Dec 3 14:37:36 2003 for CLP by doxygen 1.3.5