00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __FICHIER_PROBLEME_H
00034 #define __FICHIER_PROBLEME_H
00035
00036 #include <string>
00037 #include <list>
00038 #include <vector>
00039 #include <map>
00040 #include <iostream>
00041 #include <algorithm>
00042
00043 namespace Modelib {
00044
00045
00046 enum CompType {LOWER_OR_EQUAL_THAN=0,LOWER_THAN=1,EQUAL=2,UPPER_OR_EQUAL_THAN=3,UPPER_THAN=4,DIFFERENT_THAN=5};
00047
00048 typedef enum {MINUS=0,PLUS} Signe;
00049
00050 static const std::string comp[6] = {
00051 "<=",
00052 "<",
00053 ">=",
00054 ">",
00055 "!=",
00056
00057 "="
00058 };
00059
00060 enum {MAXIMIZE=0,SUBJECT,CONSTRAINT,BOUNDS,END,GENERALS,BINARIES,MINIMIZE,FREE};
00061
00062
00066 struct plExprNode
00067 {
00068 std::string var;
00069 std::string num;
00070 Signe signe;
00071
00074 plExprNode(const std::string& _var, const std::string& _num, const Signe _signe)
00075 : var(_var), num(_num), signe(_signe)
00076 {};
00077
00081 plExprNode(const plExprNode& _node)
00082 : var(_node.var), num(_node.num), signe(_node.signe)
00083 {};
00084 };
00085
00089 struct plConstraintNode
00090 {
00091 std::string minBound,maxBound;
00092 std::string num;
00093 std::string var;
00094 unsigned comp1,comp2;
00095
00096 plConstraintNode(const std::string& _var, const std::string& _num,
00097 const std::string& _b1 , const std::string& _b2 ,
00098 const unsigned _c1 , const unsigned _c2)
00099 : minBound(_b1), maxBound(_b2), num(_num), var(_var), comp1(_c1), comp2(_c2)
00100 {};
00101
00105 plConstraintNode(const plConstraintNode& _node)
00106 : minBound(_node.minBound), maxBound(_node.maxBound), num(_node.num), var(_node.var), comp1(_node.comp1), comp2(_node.comp2)
00107 {};
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00122 plConstraintNode(const std::string& _num, const std::string& _var,
00123 const unsigned _c1 , const std::string& _maxbound)
00124 : minBound("-inf"), maxBound(_maxbound), num(_num), var(_var), comp1(_c1), comp2(99)
00125 {};
00126
00130 plConstraintNode(const std::string& _num, const std::string& _var,
00131 const std::string& _minbound, const unsigned _c1 )
00132 : minBound(_minbound), maxBound("+inf"), num(_num), var(_var), comp1(_c1), comp2(99)
00133 {};
00134
00135
00136 };
00137
00141 struct plSimpleConstraint
00142 {
00143 std::string bound;
00144 unsigned comp ;
00145
00146 plSimpleConstraint(const std::string& _bound, const unsigned _comp)
00147 : bound(_bound), comp(_comp)
00148 {};
00149
00150 plSimpleConstraint(const plSimpleConstraint& _cstr)
00151 : bound(_cstr.bound), comp(_cstr.comp)
00152 {};
00153
00154 plSimpleConstraint& operator=(const plSimpleConstraint& _cstr)
00155 {
00156 comp = _cstr.comp;
00157 bound = _cstr.bound;
00158 return *this;
00159 }
00160 };
00161
00162
00171 struct plGlobalNode
00172 {
00173 std::string nom ;
00174 std::list<plExprNode *> expr;
00175 plSimpleConstraint cont;
00176
00177 plGlobalNode(const plGlobalNode& _node)
00178 : nom(_node.nom), cont(_node.cont)
00179 {
00180
00181
00182 for (std::list<plExprNode *>::const_iterator _iter = _node.expr.begin();
00183 _iter != _node.expr.end() ;
00184 ++_iter)
00185 expr.push_back(*_iter);
00186 }
00187
00188 plGlobalNode(const std::string& _nom, const std::list<plExprNode *>& _expr, const plSimpleConstraint& _cont)
00189 : nom(_nom), cont(_cont)
00190 {
00191
00192
00193 for (std::list<plExprNode *>::const_iterator _iter = _expr.begin();
00194 _iter != _expr.end() ;
00195 ++_iter)
00196 expr.push_back(*_iter);
00197 }
00198
00202 ~plGlobalNode()
00203 {
00204 for (std::list<plExprNode*>::iterator i=expr.begin();i!=expr.end();++i)
00205 delete (*i);
00206 }
00207 };
00208
00209
00217 struct Cmp
00218 {
00219 bool operator()(std::string& s1, std::string& s2) const
00220 {
00221
00222 return s1 <= s2;
00223 }
00224 };
00225
00226 class Model;
00227
00237 class FichierProbleme
00238 {
00239 protected:
00242 std::string nom;
00245 bool isMax;
00248 std::list<plExprNode *> exprObj;
00251 std::list<plGlobalNode *> exprConstraint;
00254 std::list<std::string> exprGeneral;
00257 std::list<std::string> exprBinary;
00260 std::list<plConstraintNode *> exprBounds;
00261
00266 std::multimap<std::string,unsigned> mmap;
00267
00269 std::map<std::string,unsigned> Comp2Int;
00270
00273 std::list< std::pair<long,std::string> > commentaires;
00274
00275 protected:
00277 FichierProbleme() {};
00278
00279 public:
00281 virtual bool Open(const std::string& nom) = 0;
00282
00283 friend std::ostream& operator<<(std::ostream&,const FichierProbleme&);
00284 bool operator>> (Model & m);
00285
00288 virtual ~FichierProbleme()
00289 {
00290
00291 for (std::list<plExprNode*>::iterator i=exprObj.begin();i!=exprObj.end();++i)
00292 delete (*i);
00293 for (std::list<plGlobalNode*>::iterator i=exprConstraint.begin();i!=exprConstraint.end();++i)
00294 delete (*i);
00295 for (std::list<plConstraintNode*>::iterator i=exprBounds.begin();i!=exprBounds.end();++i)
00296 delete (*i);
00297
00298 };
00299 };
00300
00301
00302 }
00303
00304 #endif