1 #if __cplusplus > 201402L
2 template <class T> T CoinMax(const T x1, const T x2);
3 template <class T> T CoinMin(const T x1, const T x2);
5 template <class T> T CoinMax(register const T x1, register const T x2);
6 template <class T> T CoinMin(register const T x1, register const T x2);
8 class CoinIndexedVector;
11 double objectiveScale_;
15 double * rowActivity_;
16 double * columnActivity_;
18 double * reducedCost_;
21 double * rowObjective_;
22 double * columnLower_;
23 double * columnUpper_;
25 double * columnScale_;
26 double * inverseRowScale_;
27 double * inverseColumnScale_;
31 class ClpSimplex : public ClpModel {
32 void deleteRim(int getRidOfFactorizationData=2);
34 double dualTolerance_;
35 double primalTolerance_;
36 double * rowLowerWork_;
37 double * columnLowerWork_;
38 double * rowUpperWork_;
39 double * columnUpperWork_;
40 double * rowObjectiveWork_;
41 CoinIndexedVector * columnArray_[6];
42 double * reducedCostWork_;
43 double * rowActivityWork_;
44 double * columnActivityWork_;
45 ClpSimplex * auxiliaryModel_;
47 class CoinIndexedVector {
51 void ClpSimplex::deleteRim(int getRidOfFactorizationData)
53 int numberRows=numberRows_;
54 int numberColumns=numberColumns_;
56 int numberPrimalScaled=0;
57 int numberPrimalUnscaled=0;
58 int numberDualScaled=0;
59 int numberDualUnscaled=0;
60 double scaleC = 1.0/objectiveScale_;
61 double scaleR = 1.0/rhsScale_;
62 if (!inverseColumnScale_) {
63 for (i=0; i<numberColumns; i++)
65 double scaleFactor = columnScale_[i];
66 double valueScaled = columnActivityWork_[i];
67 double lowerScaled = columnLowerWork_[i];
68 double upperScaled = columnUpperWork_[i];
69 if (lowerScaled>-1.0e20||upperScaled<1.0e20) {
70 if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_)
73 upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled));
75 columnActivity_[i] = valueScaled*scaleFactor*scaleR;
76 double value = columnActivity_[i];
77 if (value<columnLower_[i]-primalTolerance_)
78 numberPrimalUnscaled++;
79 else if (value>columnUpper_[i]+primalTolerance_)
80 numberPrimalUnscaled++;
81 double valueScaledDual = reducedCostWork_[i];
82 if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_)
84 if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_)
86 reducedCost_[i] = (valueScaledDual*scaleC)/scaleFactor;
87 double valueDual = reducedCost_[i];
88 if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_)
90 if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_)
93 for (i=0; i<numberRows; i++)
95 double scaleFactor = rowScale_[i];
96 double valueScaled = rowActivityWork_[i];
97 double lowerScaled = rowLowerWork_[i];
98 double upperScaled = rowUpperWork_[i];
99 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
100 rowActivity_[i] = (valueScaled*scaleR)/scaleFactor;
101 double value = rowActivity_[i];
102 if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
103 else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
104 double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
106 if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
107 if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
108 dual_[i] *= scaleFactor*scaleC;
109 double valueDual = dual_[i];
110 if (rowObjective_) valueDual += rowObjective_[i];
111 if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
112 if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
115 const double * inverseScale = inverseColumnScale_;
116 for (i=0; i<numberColumns; i++)
118 double scaleFactor = columnScale_[i];
119 double valueScaled = columnActivityWork_[i];
120 double lowerScaled = columnLowerWork_[i];
121 double upperScaled = columnUpperWork_[i];
122 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
123 columnActivity_[i] = valueScaled*scaleFactor*scaleR;
124 double value = columnActivity_[i];
125 if (value<columnLower_[i]-primalTolerance_) numberPrimalUnscaled++;
126 else if (value>columnUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
127 double valueScaledDual = reducedCostWork_[i];
128 if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
129 if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
130 reducedCost_[i] = (valueScaledDual*scaleC)*inverseScale[i];
131 double valueDual = reducedCost_[i];
132 if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
133 if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
135 inverseScale = inverseRowScale_;
136 for (i=0; i<numberRows; i++)
138 double scaleFactor = rowScale_[i];
139 double valueScaled = rowActivityWork_[i];
140 double lowerScaled = rowLowerWork_[i];
141 double upperScaled = rowUpperWork_[i];
142 if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
143 rowActivity_[i] = (valueScaled*scaleR)*inverseScale[i];
144 double value = rowActivity_[i];
145 if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
146 else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
147 double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
149 if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
150 if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
151 dual_[i] *= scaleFactor*scaleC;
152 double valueDual = dual_[i];
153 if (rowObjective_) valueDual += rowObjective_[i];
154 if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
155 if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
157 if (numberPrimalUnscaled) {
158 if (numberDualUnscaled)
163 if (numberDualUnscaled)
166 for (iRow=0; iRow<4; iRow++)
168 for (iColumn=0; iColumn<2; iColumn++)
169 if (columnArray_[iColumn])
170 columnArray_[iColumn]->clear();