1 template <class T> T CoinMax(register const T x1, register const T x2);
2 template <class T> T CoinMin(register const T x1, register const T x2);
3 class CoinIndexedVector;
6 double objectiveScale_;
10 double * rowActivity_;
11 double * columnActivity_;
13 double * reducedCost_;
16 double * rowObjective_;
17 double * columnLower_;
18 double * columnUpper_;
20 double * columnScale_;
21 double * inverseRowScale_;
22 double * inverseColumnScale_;
26 class ClpSimplex : public ClpModel {
27 void deleteRim(int getRidOfFactorizationData=2);
29 double dualTolerance_;
30 double primalTolerance_;
31 double * rowLowerWork_;
32 double * columnLowerWork_;
33 double * rowUpperWork_;
34 double * columnUpperWork_;
35 double * rowObjectiveWork_;
36 CoinIndexedVector * columnArray_[6];
37 double * reducedCostWork_;
38 double * rowActivityWork_;
39 double * columnActivityWork_;
40 ClpSimplex * auxiliaryModel_;
42 class CoinIndexedVector {
46 void ClpSimplex::deleteRim(int getRidOfFactorizationData)
48 int numberRows=numberRows_;
49 int numberColumns=numberColumns_;
51 int numberPrimalScaled=0;
52 int numberPrimalUnscaled=0;
53 int numberDualScaled=0;
54 int numberDualUnscaled=0;
55 double scaleC = 1.0/objectiveScale_;
56 double scaleR = 1.0/rhsScale_;
57 if (!inverseColumnScale_) {
58 for (i=0; i<numberColumns; i++)
60 double scaleFactor = columnScale_[i];
61 double valueScaled = columnActivityWork_[i];
62 double lowerScaled = columnLowerWork_[i];
63 double upperScaled = columnUpperWork_[i];
64 if (lowerScaled>-1.0e20||upperScaled<1.0e20) {
65 if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_)
68 upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled));
70 columnActivity_[i] = valueScaled*scaleFactor*scaleR;
71 double value = columnActivity_[i];
72 if (value<columnLower_[i]-primalTolerance_)
73 numberPrimalUnscaled++;
74 else if (value>columnUpper_[i]+primalTolerance_)
75 numberPrimalUnscaled++;
76 double valueScaledDual = reducedCostWork_[i];
77 if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_)
79 if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_)
81 reducedCost_[i] = (valueScaledDual*scaleC)/scaleFactor;
82 double valueDual = reducedCost_[i];
83 if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_)
85 if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_)
88 for (i=0; i<numberRows; i++)
90 double scaleFactor = rowScale_[i];
91 double valueScaled = rowActivityWork_[i];
92 double lowerScaled = rowLowerWork_[i];
93 double upperScaled = rowUpperWork_[i];
94 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
95 rowActivity_[i] = (valueScaled*scaleR)/scaleFactor;
96 double value = rowActivity_[i];
97 if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
98 else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
99 double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
101 if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
102 if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
103 dual_[i] *= scaleFactor*scaleC;
104 double valueDual = dual_[i];
105 if (rowObjective_) valueDual += rowObjective_[i];
106 if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
107 if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
110 const double * inverseScale = inverseColumnScale_;
111 for (i=0; i<numberColumns; i++)
113 double scaleFactor = columnScale_[i];
114 double valueScaled = columnActivityWork_[i];
115 double lowerScaled = columnLowerWork_[i];
116 double upperScaled = columnUpperWork_[i];
117 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
118 columnActivity_[i] = valueScaled*scaleFactor*scaleR;
119 double value = columnActivity_[i];
120 if (value<columnLower_[i]-primalTolerance_) numberPrimalUnscaled++;
121 else if (value>columnUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
122 double valueScaledDual = reducedCostWork_[i];
123 if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
124 if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
125 reducedCost_[i] = (valueScaledDual*scaleC)*inverseScale[i];
126 double valueDual = reducedCost_[i];
127 if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
128 if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
130 inverseScale = inverseRowScale_;
131 for (i=0; i<numberRows; i++)
133 double scaleFactor = rowScale_[i];
134 double valueScaled = rowActivityWork_[i];
135 double lowerScaled = rowLowerWork_[i];
136 double upperScaled = rowUpperWork_[i];
137 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
138 rowActivity_[i] = (valueScaled*scaleR)*inverseScale[i];
139 double value = rowActivity_[i];
140 if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
141 else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
142 double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
144 if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
145 if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
146 dual_[i] *= scaleFactor*scaleC;
147 double valueDual = dual_[i];
148 if (rowObjective_) valueDual += rowObjective_[i];
149 if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
150 if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
152 if (numberPrimalUnscaled) {
153 if (numberDualUnscaled)
158 if (numberDualUnscaled)
161 for (iRow=0; iRow<4; iRow++)
163 for (iColumn=0; iColumn<2; iColumn++)
164 if (columnArray_[iColumn])
165 columnArray_[iColumn]->clear();