/home/coin/SVN-release/Bcp-1.2.1/CoinUtils/src/CoinModelUseful.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2005, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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 // for specifying triple
00104 typedef struct {
00105   unsigned int string:1; // nonzero if string
00106   unsigned int row:31;
00107   //CoinModelRowIndex row;
00108   int column;
00109   double value; // If string then index into strings
00110 } CoinModelTriple;
00111 
00113 // for hashing
00114 typedef struct {
00115   int index, next;
00116 } CoinModelHashLink;
00117 
00118 /* Function type.  */
00119 typedef double (*func_t) (double);
00120 
00122 /* Data type for links in the chain of symbols.  */
00123 struct symrec
00124 {
00125   char *name;  /* name of symbol */
00126   int type;    /* type of symbol: either VAR or FNCT */
00127   union
00128   {
00129     double var;      /* value of a VAR */
00130     func_t fnctptr;  /* value of a FNCT */
00131   } value;
00132   struct symrec *next;  /* link field */
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

Generated on Thu Jan 15 03:01:00 2009 for coin-Bcp by  doxygen 1.4.7