summaryrefslogtreecommitdiff
path: root/thirdparty/windows/include/coin/CoinBuild.hpp
blob: 770c269e7ac2379888907ae26e7c354bff0dd45b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* $Id: CoinBuild.hpp 1416 2011-04-17 09:57:29Z stefan $ */
// Copyright (C) 2005, International Business Machines
// Corporation and others.  All Rights Reserved.
// This code is licensed under the terms of the Eclipse Public License (EPL).

#ifndef CoinBuild_H
#define CoinBuild_H


#include "CoinPragma.hpp"
#include "CoinTypes.hpp"
#include "CoinFinite.hpp"


/** 
    In many cases it is natural to build a model by adding one row at a time.  In Coin this
    is inefficient so this class gives some help.  An instance of CoinBuild can be built up
    more efficiently and then added to the Clp/OsiModel in one go.

    It may be more efficient to have fewer arrays and re-allocate them but this should
    give a large gain over addRow.

    I have now extended it to columns.

*/

class CoinBuild {
  
public:
  /**@name Useful methods */
   //@{
   /// add a row
   void addRow(int numberInRow, const int * columns,
	       const double * elements, double rowLower=-COIN_DBL_MAX, 
              double rowUpper=COIN_DBL_MAX);
   /// add a column
   void addColumn(int numberInColumn, const int * rows,
                  const double * elements, 
                  double columnLower=0.0, 
                  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0);
   /// add a column
   inline void addCol(int numberInColumn, const int * rows,
                  const double * elements, 
                  double columnLower=0.0, 
                  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0)
  { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue);}
   /// Return number of rows or maximum found so far
  inline int numberRows() const
  { return (type_==0) ? numberItems_ : numberOther_;}
   /// Return number of columns or maximum found so far
  inline int numberColumns() const
  { return (type_==1) ? numberItems_ : numberOther_;}
   /// Return number of elements
  inline CoinBigIndex numberElements() const
  { return numberElements_;}
  /**  Returns number of elements in a row and information in row
   */
  int row(int whichRow, double & rowLower, double & rowUpper,
          const int * & indices, const double * & elements) const;
  /**  Returns number of elements in current row and information in row
       Used as rows may be stored in a chain
   */
  int currentRow(double & rowLower, double & rowUpper,
          const int * & indices, const double * & elements) const;
  /// Set current row
  void setCurrentRow(int whichRow);
  /// Returns current row number
  int currentRow() const;
  /**  Returns number of elements in a column and information in column
   */
  int column(int whichColumn, 
             double & columnLower, double & columnUpper,double & objectiveValue,
             const int * & indices, const double * & elements) const;
  /**  Returns number of elements in current column and information in column
       Used as columns may be stored in a chain
   */
  int currentColumn( double & columnLower, double & columnUpper,double & objectiveValue,
          const int * & indices, const double * & elements) const;
  /// Set current column
  void setCurrentColumn(int whichColumn);
  /// Returns current column number
  int currentColumn() const;
  /// Returns type
  inline int type() const
  { return type_;}
   //@}


  /**@name Constructors, destructor */
   //@{
   /** Default constructor. */
   CoinBuild();
   /** Constructor with type 0==for addRow, 1== for addColumn. */
   CoinBuild(int type);
   /** Destructor */
   ~CoinBuild();
   //@}

   /**@name Copy method */
   //@{
   /** The copy constructor. */
   CoinBuild(const CoinBuild&);
  /// =
   CoinBuild& operator=(const CoinBuild&);
   //@}
private:
  /// Set current 
  void setMutableCurrent(int which) const;
   /// add a item
   void addItem(int numberInItem, const int * indices,
                  const double * elements, 
                  double itemLower, 
                  double itemUpper, double objectiveValue);
  /**  Returns number of elements in a item and information in item
   */
  int item(int whichItem, 
             double & itemLower, double & itemUpper,double & objectiveValue,
             const int * & indices, const double * & elements) const;
  /**  Returns number of elements in current item and information in item
       Used as items may be stored in a chain
   */
  int currentItem( double & itemLower, double & itemUpper,double & objectiveValue,
          const int * & indices, const double * & elements) const;
  /// Set current item
  void setCurrentItem(int whichItem);
  /// Returns current item number
  int currentItem() const;
   
private:
  /**@name Data members */
   //@{
  /// Current number of items
  int numberItems_;
  /// Current number of other dimension i.e. Columns if addRow (i.e. max)
  int numberOther_;
  /// Current number of elements
  CoinBigIndex numberElements_;
  /// Current item pointer
  mutable double * currentItem_;
  /// First item pointer
  double * firstItem_;
  /// Last item pointer
  double * lastItem_;
  /// Type of build - 0 for row, 1 for column, -1 unset
  int type_;
   //@}
};

#endif