00001
00002
00003 #ifndef CoinModelUseful_H
00004 #define CoinModelUseful_H
00005
00006
00007 #include <cmath>
00008 #include <cassert>
00009 #include <cfloat>
00010 #include <cstring>
00011 #include <cstdio>
00012 #include <iostream>
00013
00014
00015 #include "CoinPragma.hpp"
00016 #include "CoinFinite.hpp"
00017
00025
00026
00027 class CoinModelLink {
00028
00029 public:
00033 CoinModelLink();
00035 ~CoinModelLink();
00037
00041 CoinModelLink(const CoinModelLink&);
00043 CoinModelLink& operator=(const CoinModelLink&);
00045
00048
00049 inline int row() const
00050 { return row_;}
00052 inline int column() const
00053 { return column_;}
00055 inline double value() const
00056 { return value_;}
00058 inline double element() const
00059 { return value_;}
00061 inline int position() const
00062 { return position_;}
00064 inline bool onRow() const
00065 { return onRow_;}
00067 inline void setRow(int row)
00068 { row_=row;}
00070 inline void setColumn(int column)
00071 { column_=column;}
00073 inline void setValue(double value)
00074 { value_=value;}
00076 inline void setElement(double value)
00077 { value_=value;}
00079 inline void setPosition(int position)
00080 { position_=position;}
00082 inline void setOnRow(bool onRow)
00083 { onRow_=onRow;}
00085
00086 private:
00089
00090 int row_;
00092 int column_;
00094 double value_;
00096 int position_;
00098 bool onRow_;
00100 };
00101
00103
00104 typedef struct {
00105 unsigned int string:1;
00106 unsigned int row:31;
00107
00108 int column;
00109 double value;
00110 } CoinModelTriple;
00111
00113
00114 typedef struct {
00115 int index, next;
00116 } CoinModelHashLink;
00117
00118
00119 typedef double (*func_t) (double);
00120
00122
00123 struct symrec
00124 {
00125 char *name;
00126 int type;
00127 union
00128 {
00129 double var;
00130 func_t fnctptr;
00131 } value;
00132 struct symrec *next;
00133 };
00134
00135 typedef struct symrec symrec;
00136
00137 class CoinYacc {
00138 private:
00139 CoinYacc(const CoinYacc& rhs);
00140 CoinYacc& operator=(const CoinYacc& rhs);
00141
00142 public:
00143 CoinYacc() : symtable(NULL), symbuf(NULL), length(0), unsetValue(0) {}
00144 ~CoinYacc()
00145 {
00146 if (length) {
00147 free(symbuf);
00148 symbuf = NULL;
00149 }
00150 symrec* s = symtable;
00151 while (s) {
00152 free(s->name);
00153 symtable = s;
00154 s = s->next;
00155 free(symtable);
00156 }
00157 }
00158
00159 public:
00160 symrec * symtable;
00161 char * symbuf;
00162 int length;
00163 double unsetValue;
00164 };
00165
00166 class CoinModelHash {
00167
00168 public:
00172 CoinModelHash();
00174 ~CoinModelHash();
00176
00180 CoinModelHash(const CoinModelHash&);
00182 CoinModelHash& operator=(const CoinModelHash&);
00184
00187
00188 void resize(int maxItems,bool forceReHash=false);
00190 inline int numberItems() const
00191 { return numberItems_;}
00193 void setNumberItems(int number);
00195 inline int maximumItems() const
00196 { return maximumItems_;}
00198 inline const char *const * names() const
00199 { return names_;}
00201
00204
00205 int hash(const char * name) const;
00207 void addHash(int index, const char * name);
00209 void deleteHash(int index);
00211 const char * name(int which) const;
00213 char * getName(int which) const;
00215 void setName(int which,char * name ) ;
00217 void validateHash() const;
00218 private:
00220 int hashValue(const char * name) const;
00221 public:
00223 private:
00226
00227 char ** names_;
00229 CoinModelHashLink * hash_;
00231 int numberItems_;
00233 int maximumItems_;
00235 int lastSlot_;
00237 };
00239 class CoinModelHash2 {
00240
00241 public:
00245 CoinModelHash2();
00247 ~CoinModelHash2();
00249
00253 CoinModelHash2(const CoinModelHash2&);
00255 CoinModelHash2& operator=(const CoinModelHash2&);
00257
00260
00261 void resize(int maxItems, const CoinModelTriple * triples,bool forceReHash=false);
00263 inline int numberItems() const
00264 { return numberItems_;}
00266 void setNumberItems(int number);
00268 inline int maximumItems() const
00269 { return maximumItems_;}
00271
00274
00275 int hash(int row, int column, const CoinModelTriple * triples) const;
00277 void addHash(int index, int row, int column, const CoinModelTriple * triples);
00279 void deleteHash(int index, int row, int column);
00280 private:
00282 int hashValue(int row, int column) const;
00283 public:
00285 private:
00288
00289 CoinModelHashLink * hash_;
00291 int numberItems_;
00293 int maximumItems_;
00295 int lastSlot_;
00297 };
00298 class CoinModelLinkedList {
00299
00300 public:
00304 CoinModelLinkedList();
00306 ~CoinModelLinkedList();
00308
00312 CoinModelLinkedList(const CoinModelLinkedList&);
00314 CoinModelLinkedList& operator=(const CoinModelLinkedList&);
00316
00321 void resize(int maxMajor,int maxElements);
00325 void create(int maxMajor,int maxElements,
00326 int numberMajor, int numberMinor,
00327 int type,
00328 int numberElements, const CoinModelTriple * triples);
00330 inline int numberMajor() const
00331 { return numberMajor_;}
00333 inline int maximumMajor() const
00334 { return maximumMajor_;}
00336 inline int numberElements() const
00337 { return numberElements_;}
00339 inline int maximumElements() const
00340 { return maximumElements_;}
00342 inline int firstFree() const
00343 { return first_[maximumMajor_];}
00345 inline int lastFree() const
00346 { return last_[maximumMajor_];}
00348 inline int first(int which) const
00349 { return first_[which];}
00351 inline int last(int which) const
00352 { return last_[which];}
00354 inline const int * next() const
00355 { return next_;}
00357 inline const int * previous() const
00358 { return previous_;}
00360
00366 int addEasy(int majorIndex, int numberOfElements, const int * indices,
00367 const double * elements, CoinModelTriple * triples,
00368 CoinModelHash2 & hash);
00371 void addHard(int minorIndex, int numberOfElements, const int * indices,
00372 const double * elements, CoinModelTriple * triples,
00373 CoinModelHash2 & hash);
00377 void addHard(int first, const CoinModelTriple * triples,
00378 int firstFree, int lastFree,const int * nextOther);
00381 void deleteSame(int which, CoinModelTriple * triples,
00382 CoinModelHash2 & hash, bool zapTriples);
00386 void updateDeleted(int which, CoinModelTriple * triples,
00387 CoinModelLinkedList & otherList);
00390 void deleteRowOne(int position, CoinModelTriple * triples,
00391 CoinModelHash2 & hash);
00395 void updateDeletedOne(int position, const CoinModelTriple * triples);
00397 void fill(int first,int last);
00399 void synchronize(CoinModelLinkedList & other);
00401 void validateLinks(const CoinModelTriple * triples) const;
00403 private:
00406
00407 int * previous_;
00409 int * next_;
00411 int * first_;
00413 int * last_;
00415 int numberMajor_;
00417 int maximumMajor_;
00419 int numberElements_;
00421 int maximumElements_;
00423 int type_;
00425 };
00426
00427 #endif