qpOASES  3.0.1
include/qpOASES/MessageHandling.hpp
Go to the documentation of this file.
00001 /*
00002  *  This file is part of qpOASES.
00003  *
00004  *  qpOASES -- An Implementation of the Online Active Set Strategy.
00005  *  Copyright (C) 2007-2014 by Hans Joachim Ferreau, Andreas Potschka,
00006  *  Christian Kirches et al. All rights reserved.
00007  *
00008  *  qpOASES is free software; you can redistribute it and/or
00009  *  modify it under the terms of the GNU Lesser General Public
00010  *  License as published by the Free Software Foundation; either
00011  *  version 2.1 of the License, or (at your option) any later version.
00012  *
00013  *  qpOASES is distributed in the hope that it will be useful,
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00016  *  See the GNU Lesser General Public License for more details.
00017  *
00018  *  You should have received a copy of the GNU Lesser General Public
00019  *  License along with qpOASES; if not, write to the Free Software
00020  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00021  *
00022  */
00023 
00024 
00035 #ifndef QPOASES_MESSAGEHANDLING_HPP
00036 #define QPOASES_MESSAGEHANDLING_HPP
00037 
00038 
00039 #include <stdio.h>
00040 #include <string.h>
00041 
00042 #ifdef __DEBUG__
00043 #include <assert.h>
00044 #endif
00045 
00046 #include <qpOASES/Constants.hpp>
00047 
00048 
00049 BEGIN_NAMESPACE_QPOASES
00050 
00051 
00053 static FILE* stdFile = stdout;
00054 
00055 
00064 enum returnValue
00065 {
00066 TERMINAL_LIST_ELEMENT = -1,                     
00067 /* miscellaneous */
00068 SUCCESSFUL_RETURN = 0,                          
00069 RET_DIV_BY_ZERO,                                
00070 RET_INDEX_OUT_OF_BOUNDS,                        
00071 RET_INVALID_ARGUMENTS,                          
00072 RET_ERROR_UNDEFINED,                            
00073 RET_WARNING_UNDEFINED,                          
00074 RET_INFO_UNDEFINED,                             
00075 RET_EWI_UNDEFINED,                              
00076 RET_AVAILABLE_WITH_LINUX_ONLY,                  
00077 RET_UNKNOWN_BUG,                                
00078 RET_PRINTLEVEL_CHANGED,                         
00079 RET_NOT_YET_IMPLEMENTED,                        
00080 /* Indexlist */
00081 RET_INDEXLIST_MUST_BE_REORDERD,                 
00082 RET_INDEXLIST_EXCEEDS_MAX_LENGTH,               
00083 RET_INDEXLIST_CORRUPTED,                        
00084 RET_INDEXLIST_OUTOFBOUNDS,                      
00085 RET_INDEXLIST_ADD_FAILED,                       
00086 RET_INDEXLIST_INTERSECT_FAILED,                 
00087 /* SubjectTo / Bounds / Constraints */
00088 RET_INDEX_ALREADY_OF_DESIRED_STATUS,            
00089 RET_ADDINDEX_FAILED,                            
00090 RET_REMOVEINDEX_FAILED,                         
00091 RET_SWAPINDEX_FAILED,                           
00092 RET_NOTHING_TO_DO,                              
00093 RET_SETUP_BOUND_FAILED,                         
00094 RET_SETUP_CONSTRAINT_FAILED,                    
00095 RET_MOVING_BOUND_FAILED,                        
00096 RET_MOVING_CONSTRAINT_FAILED,                   
00097 RET_SHIFTING_FAILED,                            
00098 RET_ROTATING_FAILED,                            
00099 /* QProblem */
00100 RET_QPOBJECT_NOT_SETUP,                         
00101 RET_QP_ALREADY_INITIALISED,                     
00102 RET_NO_INIT_WITH_STANDARD_SOLVER,               
00103 RET_RESET_FAILED,                               
00104 RET_INIT_FAILED,                                
00105 RET_INIT_FAILED_TQ,                             
00106 RET_INIT_FAILED_CHOLESKY,                       
00107 RET_INIT_FAILED_HOTSTART,                       
00108 RET_INIT_FAILED_INFEASIBILITY,                  
00109 RET_INIT_FAILED_UNBOUNDEDNESS,                  
00110 RET_INIT_FAILED_REGULARISATION,                 
00111 RET_INIT_SUCCESSFUL,                            
00112 RET_OBTAINING_WORKINGSET_FAILED,                
00113 RET_SETUP_WORKINGSET_FAILED,                    
00114 RET_SETUP_AUXILIARYQP_FAILED,                   
00115 RET_NO_EXTERN_SOLVER,                           
00116 RET_QP_UNBOUNDED,                               
00117 RET_QP_INFEASIBLE,                              
00118 RET_QP_NOT_SOLVED,                              
00119 RET_QP_SOLVED,                                  
00120 RET_UNABLE_TO_SOLVE_QP,                         
00121 RET_INITIALISATION_STARTED,                     
00122 RET_HOTSTART_FAILED,                            
00123 RET_HOTSTART_FAILED_TO_INIT,                    
00124 RET_HOTSTART_FAILED_AS_QP_NOT_INITIALISED,      
00125 RET_ITERATION_STARTED,                          
00126 RET_SHIFT_DETERMINATION_FAILED,                 
00127 RET_STEPDIRECTION_DETERMINATION_FAILED,         
00128 RET_STEPLENGTH_DETERMINATION_FAILED,            
00129 RET_OPTIMAL_SOLUTION_FOUND,                     
00130 RET_HOMOTOPY_STEP_FAILED,                       
00131 RET_HOTSTART_STOPPED_INFEASIBILITY,             
00132 RET_HOTSTART_STOPPED_UNBOUNDEDNESS,             
00133 RET_WORKINGSET_UPDATE_FAILED,                   
00134 RET_MAX_NWSR_REACHED,                           
00135 RET_CONSTRAINTS_NOT_SPECIFIED,                  
00136 RET_INVALID_FACTORISATION_FLAG,                 
00137 RET_UNABLE_TO_SAVE_QPDATA,                      
00138 RET_STEPDIRECTION_FAILED_TQ,                    
00139 RET_STEPDIRECTION_FAILED_CHOLESKY,              
00140 RET_CYCLING_DETECTED,                           
00141 RET_CYCLING_NOT_RESOLVED,                       
00142 RET_CYCLING_RESOLVED,                           
00143 RET_STEPSIZE,                                   
00144 RET_STEPSIZE_NONPOSITIVE,                       
00145 RET_SETUPSUBJECTTOTYPE_FAILED,                  
00146 RET_ADDCONSTRAINT_FAILED,                       
00147 RET_ADDCONSTRAINT_FAILED_INFEASIBILITY,         
00148 RET_ADDBOUND_FAILED,                            
00149 RET_ADDBOUND_FAILED_INFEASIBILITY,              
00150 RET_REMOVECONSTRAINT_FAILED,                    
00151 RET_REMOVEBOUND_FAILED,                         
00152 RET_REMOVE_FROM_ACTIVESET,                      
00153 RET_ADD_TO_ACTIVESET,                           
00154 RET_REMOVE_FROM_ACTIVESET_FAILED,               
00155 RET_ADD_TO_ACTIVESET_FAILED,                    
00156 RET_CONSTRAINT_ALREADY_ACTIVE,                  
00157 RET_ALL_CONSTRAINTS_ACTIVE,                     
00158 RET_LINEARLY_DEPENDENT,                         
00159 RET_LINEARLY_INDEPENDENT,                       
00160 RET_LI_RESOLVED,                                
00161 RET_ENSURELI_FAILED,                            
00162 RET_ENSURELI_FAILED_TQ,                         
00163 RET_ENSURELI_FAILED_NOINDEX,                    
00164 RET_ENSURELI_FAILED_CYCLING,                    
00165 RET_BOUND_ALREADY_ACTIVE,                       
00166 RET_ALL_BOUNDS_ACTIVE,                          
00167 RET_CONSTRAINT_NOT_ACTIVE,                      
00168 RET_BOUND_NOT_ACTIVE,                           
00169 RET_HESSIAN_NOT_SPD,                            
00170 RET_HESSIAN_INDEFINITE,                         
00171 RET_MATRIX_SHIFT_FAILED,                        
00172 RET_MATRIX_FACTORISATION_FAILED,                
00173 RET_PRINT_ITERATION_FAILED,                     
00174 RET_NO_GLOBAL_MESSAGE_OUTPUTFILE,               
00175 RET_DISABLECONSTRAINTS_FAILED,                  
00176 RET_ENABLECONSTRAINTS_FAILED,                   
00177 RET_ALREADY_ENABLED,                            
00178 RET_ALREADY_DISABLED,                           
00179 RET_NO_HESSIAN_SPECIFIED,                       
00180 RET_USING_REGULARISATION,                       
00181 RET_EPS_MUST_BE_POSITVE,                        
00182 RET_REGSTEPS_MUST_BE_POSITVE,                   
00183 RET_HESSIAN_ALREADY_REGULARISED,                
00184 RET_CANNOT_REGULARISE_IDENTITY,                 
00185 RET_CANNOT_REGULARISE_SPARSE,                   
00186 RET_NO_REGSTEP_NWSR,                            
00187 RET_FEWER_REGSTEPS_NWSR,                        
00188 RET_CHOLESKY_OF_ZERO_HESSIAN,                   
00189 RET_CONSTRAINTS_ARE_NOT_SCALED,                 
00190 RET_INITIAL_BOUNDS_STATUS_NYI,                  
00191 RET_ERROR_IN_CONSTRAINTPRODUCT,                 
00192 RET_FIX_BOUNDS_FOR_LP,                          
00193 RET_USE_REGULARISATION_FOR_LP,                  
00194 /* SQProblem */
00195 RET_UPDATEMATRICES_FAILED,                      
00196 RET_UPDATEMATRICES_FAILED_AS_QP_NOT_SOLVED,     
00197 /* Utils */
00198 RET_UNABLE_TO_OPEN_FILE,                        
00199 RET_UNABLE_TO_WRITE_FILE,                       
00200 RET_UNABLE_TO_READ_FILE,                        
00201 RET_FILEDATA_INCONSISTENT,                      
00202 /* Options */
00203 RET_OPTIONS_ADJUSTED,                           
00204 /* SolutionAnalysis */
00205 RET_UNABLE_TO_ANALYSE_QPROBLEM,                 
00206 /* Benchmark */
00207 RET_NWSR_SET_TO_ONE,                            
00208 RET_UNABLE_TO_READ_BENCHMARK,                   
00209 RET_BENCHMARK_ABORTED,                          
00210 RET_INITIAL_QP_SOLVED,                          
00211 RET_QP_SOLUTION_STARTED,                        
00212 RET_BENCHMARK_SUCCESSFUL,                       
00213 /* Sparse matrices */
00214 RET_NO_DIAGONAL_AVAILABLE,                      
00215 RET_DIAGONAL_NOT_INITIALISED,                   
00216 /* Dropping of infeasible constraints */
00217 RET_ENSURELI_DROPPED,                           
00218 /* Simple exitflags */
00219 RET_SIMPLE_STATUS_P1,                           
00220 RET_SIMPLE_STATUS_P0,                           
00221 RET_SIMPLE_STATUS_M1,                           
00222 RET_SIMPLE_STATUS_M2,                           
00223 RET_SIMPLE_STATUS_M3                            
00224 };
00225 
00226 
00237 class MessageHandling
00238 {
00239     /*
00240      *  INTERNAL DATA STRUCTURES
00241      */
00242     public:
00250         typedef struct {
00251             returnValue key;                            
00252             const char* data;                           
00253             VisibilityStatus globalVisibilityStatus;    
00255         } ReturnValueList;
00256 
00257 
00258     /*
00259      *  PUBLIC MEMBER FUNCTIONS
00260      */
00261     public:
00263         MessageHandling( );
00264 
00266         MessageHandling(  FILE* _outputFile                     
00267                           );
00268 
00270         MessageHandling(    VisibilityStatus _errorVisibility,  
00271                             VisibilityStatus _warningVisibility,
00272                             VisibilityStatus _infoVisibility    
00273                             );
00274 
00276         MessageHandling(    FILE* _outputFile,                  
00277                             VisibilityStatus _errorVisibility,  
00278                             VisibilityStatus _warningVisibility,
00279                             VisibilityStatus _infoVisibility    
00280                             );
00281 
00283         MessageHandling(    const MessageHandling& rhs  
00284                             );
00285 
00287         ~MessageHandling( );
00288 
00290         MessageHandling& operator=( const MessageHandling& rhs  
00291                                     );
00292 
00293 
00300         returnValue throwError( returnValue Enumber,                    
00301                                 const char* additionaltext,             
00302                                 const char* functionname,               
00303                                 const char* filename,                   
00304                                 const unsigned long linenumber,         
00305                                 VisibilityStatus localVisibilityStatus  
00308                                 );
00309 
00314         returnValue throwWarning(   returnValue Wnumber,                    
00315                                     const char* additionaltext,             
00316                                     const char* functionname,               
00317                                     const char* filename,                   
00318                                     const unsigned long linenumber,         
00319                                     VisibilityStatus localVisibilityStatus  
00322                                     );
00323 
00327         returnValue throwInfo(  returnValue Inumber,                    
00328                                 const char* additionaltext,             
00329                                 const char* functionname,               
00330                                 const char* filename,                   
00331                                 const unsigned long linenumber,         
00332                                 VisibilityStatus localVisibilityStatus  
00335                                 );
00336 
00337 
00340         returnValue reset( );
00341 
00342 
00345         returnValue listAllMessages( );
00346 
00347 
00350         inline VisibilityStatus getErrorVisibilityStatus( ) const;
00351 
00354         inline VisibilityStatus getWarningVisibilityStatus( ) const;
00355 
00358         inline VisibilityStatus getInfoVisibilityStatus( ) const;
00359 
00362         inline FILE* getOutputFile( ) const;
00363 
00366         inline int getErrorCount( ) const;
00367 
00368 
00370         inline void setErrorVisibilityStatus(   VisibilityStatus _errorVisibility   
00371                                                 );
00372 
00374         inline void setWarningVisibilityStatus( VisibilityStatus _warningVisibility 
00375                                                 );
00376 
00378         inline void setInfoVisibilityStatus(    VisibilityStatus _infoVisibility    
00379                                                 );
00380 
00382         inline void setOutputFile(  FILE* _outputFile   
00383                                     );
00384 
00388         inline returnValue setErrorCount(   int _errorCount 
00389                                             );
00390 
00393         static const char* getErrorCodeMessage( const returnValue _returnValue
00394                                                 );
00395 
00396 
00397     /*
00398      *  PROTECTED MEMBER FUNCTIONS
00399      */
00400     protected:
00404         returnValue throwMessage(
00405             returnValue RETnumber,                  
00406             const char* additionaltext,             
00407             const char* functionname,               
00408             const char* filename,                   
00409             const unsigned long linenumber,         
00410             VisibilityStatus localVisibilityStatus, 
00413             const char* RETstring                   
00414             );
00415 
00416 
00417     /*
00418      *  PROTECTED MEMBER VARIABLES
00419      */
00420     protected:
00421         VisibilityStatus errorVisibility;       
00422         VisibilityStatus warningVisibility;     
00423         VisibilityStatus infoVisibility;        
00425         FILE* outputFile;                       
00427         int errorCount;                         
00428 };
00429 
00430 
00431 #ifndef __FUNCTION__
00432 
00433   #define __FUNCTION__ 0
00434 #endif
00435 
00436 #ifndef __FILE__
00437 
00438   #define __FILE__ 0
00439 #endif
00440 
00441 #ifndef __LINE__
00442 
00443   #define __LINE__ 0
00444 #endif
00445 
00446 
00448 #define THROWERROR(retval) ( getGlobalMessageHandler( )->throwError((retval),0,__FUNCTION__,__FILE__,__LINE__,VS_VISIBLE) )
00449 
00451 #define THROWWARNING(retval) ( getGlobalMessageHandler( )->throwWarning((retval),0,__FUNCTION__,__FILE__,__LINE__,VS_VISIBLE) )
00452 
00454 #define THROWINFO(retval) ( getGlobalMessageHandler( )->throwInfo((retval),0,__FUNCTION__,__FILE__,__LINE__,VS_VISIBLE) )
00455 
00456 
00460 MessageHandling* getGlobalMessageHandler( );
00461 
00462 
00463 END_NAMESPACE_QPOASES
00464 
00465 #include <qpOASES/MessageHandling.ipp>
00466 
00467 #endif /* QPOASES_MESSAGEHANDLING_HPP */
00468 
00469 
00470 /*
00471  *  end of file
00472  */