00001
00002
00003
00004
00005
00006 #ifndef CoinModelUseful_H
00007 #define CoinModelUseful_H
00008
00009
00010 #include <cstdlib>
00011 #include <cmath>
00012 #include <cassert>
00013 #include <cfloat>
00014 #include <cstring>
00015 #include <cstdio>
00016 #include <iostream>
00017
00018
00019 #include "CoinPragma.hpp"
00020
00028
00029
00030 class CoinModelLink {
00031
00032 public:
00036 CoinModelLink();
00038 ~CoinModelLink();
00040
00044 CoinModelLink(const CoinModelLink&);
00046 CoinModelLink& operator=(const CoinModelLink&);
00048
00051
00052 inline int row() const
00053 { return row_;}
00055 inline int column() const
00056 { return column_;}
00058 inline double value() const
00059 { return value_;}
00061 inline double element() const
00062 { return value_;}
00064 inline int position() const
00065 { return position_;}
00067 inline bool onRow() const
00068 { return onRow_;}
00070 inline void setRow(int row)
00071 { row_=row;}
00073 inline void setColumn(int column)
00074 { column_=column;}
00076 inline void setValue(double value)
00077 { value_=value;}
00079 inline void setElement(double value)
00080 { value_=value;}
00082 inline void setPosition(int position)
00083 { position_=position;}
00085 inline void setOnRow(bool onRow)
00086 { onRow_=onRow;}
00088
00089 private:
00092
00093 int row_;
00095 int column_;
00097 double value_;
00099 int position_;
00101 bool onRow_;
00103 };
00104
00106
00107 typedef struct {
00108
00109
00110 unsigned int row;
00111
00112 int column;
00113 double value;
00114 } CoinModelTriple;
00115 inline int rowInTriple(const CoinModelTriple & triple)
00116 { return triple.row&0x7fffffff;}
00117 inline void setRowInTriple(CoinModelTriple & triple,int iRow)
00118 { triple.row = iRow|(triple.row&0x80000000);}
00119 inline bool stringInTriple(const CoinModelTriple & triple)
00120 { return (triple.row&0x80000000)!=0;}
00121 inline void setStringInTriple(CoinModelTriple & triple,bool string)
00122 { triple.row = (string ? 0x80000000 : 0)|(triple.row&0x7fffffff);}
00123 inline void setRowAndStringInTriple(CoinModelTriple & triple,
00124 int iRow,bool string)
00125 { triple.row = (string ? 0x80000000 : 0)|iRow;}
00127
00128 typedef struct {
00129 int index, next;
00130 } CoinModelHashLink;
00131
00132
00133 typedef double (*func_t) (double);
00134
00136
00137 struct symrec
00138 {
00139 char *name;
00140 int type;
00141 union
00142 {
00143 double var;
00144 func_t fnctptr;
00145 } value;
00146 struct symrec *next;
00147 };
00148
00149 typedef struct symrec symrec;
00150
00151 class CoinYacc {
00152 private:
00153 CoinYacc(const CoinYacc& rhs);
00154 CoinYacc& operator=(const CoinYacc& rhs);
00155
00156 public:
00157 CoinYacc() : symtable(NULL), symbuf(NULL), length(0), unsetValue(0) {}
00158 ~CoinYacc()
00159 {
00160 if (length) {
00161 free(symbuf);
00162 symbuf = NULL;
00163 }
00164 symrec* s = symtable;
00165 while (s) {
00166 free(s->name);
00167 symtable = s;
00168 s = s->next;
00169 free(symtable);
00170 }
00171 }
00172
00173 public:
00174 symrec * symtable;
00175 char * symbuf;
00176 int length;
00177 double unsetValue;
00178 };
00179
00180 class CoinModelHash {
00181
00182 public:
00186 CoinModelHash();
00188 ~CoinModelHash();
00190
00194 CoinModelHash(const CoinModelHash&);
00196 CoinModelHash& operator=(const CoinModelHash&);
00198
00201
00202 void resize(int maxItems,bool forceReHash=false);
00204 inline int numberItems() const
00205 { return numberItems_;}
00207 void setNumberItems(int number);
00209 inline int maximumItems() const
00210 { return maximumItems_;}
00212 inline const char *const * names() const
00213 { return names_;}
00215
00218
00219 int hash(const char * name) const;
00221 void addHash(int index, const char * name);
00223 void deleteHash(int index);
00225 const char * name(int which) const;
00227 char * getName(int which) const;
00229 void setName(int which,char * name ) ;
00231 void validateHash() const;
00232 private:
00234 int hashValue(const char * name) const;
00235 public:
00237 private:
00240
00241 char ** names_;
00243 CoinModelHashLink * hash_;
00245 int numberItems_;
00247 int maximumItems_;
00249 int lastSlot_;
00251 };
00253 class CoinModelHash2 {
00254
00255 public:
00259 CoinModelHash2();
00261 ~CoinModelHash2();
00263
00267 CoinModelHash2(const CoinModelHash2&);
00269 CoinModelHash2& operator=(const CoinModelHash2&);
00271
00274
00275 void resize(int maxItems, const CoinModelTriple * triples,bool forceReHash=false);
00277 inline int numberItems() const
00278 { return numberItems_;}
00280 void setNumberItems(int number);
00282 inline int maximumItems() const
00283 { return maximumItems_;}
00285
00288
00289 int hash(int row, int column, const CoinModelTriple * triples) const;
00291 void addHash(int index, int row, int column, const CoinModelTriple * triples);
00293 void deleteHash(int index, int row, int column);
00294 private:
00296 int hashValue(int row, int column) const;
00297 public:
00299 private:
00302
00303 CoinModelHashLink * hash_;
00305 int numberItems_;
00307 int maximumItems_;
00309 int lastSlot_;
00311 };
00312 class CoinModelLinkedList {
00313
00314 public:
00318 CoinModelLinkedList();
00320 ~CoinModelLinkedList();
00322
00326 CoinModelLinkedList(const CoinModelLinkedList&);
00328 CoinModelLinkedList& operator=(const CoinModelLinkedList&);
00330
00335 void resize(int maxMajor,int maxElements);
00339 void create(int maxMajor,int maxElements,
00340 int numberMajor, int numberMinor,
00341 int type,
00342 int numberElements, const CoinModelTriple * triples);
00344 inline int numberMajor() const
00345 { return numberMajor_;}
00347 inline int maximumMajor() const
00348 { return maximumMajor_;}
00350 inline int numberElements() const
00351 { return numberElements_;}
00353 inline int maximumElements() const
00354 { return maximumElements_;}
00356 inline int firstFree() const
00357 { return first_[maximumMajor_];}
00359 inline int lastFree() const
00360 { return last_[maximumMajor_];}
00362 inline int first(int which) const
00363 { return first_[which];}
00365 inline int last(int which) const
00366 { return last_[which];}
00368 inline const int * next() const
00369 { return next_;}
00371 inline const int * previous() const
00372 { return previous_;}
00374
00380 int addEasy(int majorIndex, int numberOfElements, const int * indices,
00381 const double * elements, CoinModelTriple * triples,
00382 CoinModelHash2 & hash);
00385 void addHard(int minorIndex, int numberOfElements, const int * indices,
00386 const double * elements, CoinModelTriple * triples,
00387 CoinModelHash2 & hash);
00391 void addHard(int first, const CoinModelTriple * triples,
00392 int firstFree, int lastFree,const int * nextOther);
00395 void deleteSame(int which, CoinModelTriple * triples,
00396 CoinModelHash2 & hash, bool zapTriples);
00400 void updateDeleted(int which, CoinModelTriple * triples,
00401 CoinModelLinkedList & otherList);
00404 void deleteRowOne(int position, CoinModelTriple * triples,
00405 CoinModelHash2 & hash);
00409 void updateDeletedOne(int position, const CoinModelTriple * triples);
00411 void fill(int first,int last);
00413 void synchronize(CoinModelLinkedList & other);
00415 void validateLinks(const CoinModelTriple * triples) const;
00417 private:
00420
00421 int * previous_;
00423 int * next_;
00425 int * first_;
00427 int * last_;
00429 int numberMajor_;
00431 int maximumMajor_;
00433 int numberElements_;
00435 int maximumElements_;
00437 int type_;
00439 };
00440
00441 #endif