ruby-cbc 0.1.9 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/Rakefile +0 -2
  4. data/lib/ruby-cbc.rb +1 -1
  5. data/lib/ruby-cbc/problem.rb +6 -8
  6. data/lib/ruby-cbc/version.rb +1 -1
  7. data/ruby-cbc.gemspec +3 -2
  8. metadata +17 -287
  9. data/ext/ruby-cbc/cbc.i +0 -15
  10. data/ext/ruby-cbc/cbc_wrap.c +0 -4618
  11. data/ext/ruby-cbc/extconf.rb +0 -60
  12. data/ext/ruby-cbc/install/bin/cbc +0 -0
  13. data/ext/ruby-cbc/install/bin/clp +0 -0
  14. data/ext/ruby-cbc/install/include/coin/CbcBranchActual.hpp +0 -24
  15. data/ext/ruby-cbc/install/include/coin/CbcBranchAllDifferent.hpp +0 -62
  16. data/ext/ruby-cbc/install/include/coin/CbcBranchBase.hpp +0 -78
  17. data/ext/ruby-cbc/install/include/coin/CbcBranchCut.hpp +0 -183
  18. data/ext/ruby-cbc/install/include/coin/CbcBranchDecision.hpp +0 -129
  19. data/ext/ruby-cbc/install/include/coin/CbcBranchDefaultDecision.hpp +0 -100
  20. data/ext/ruby-cbc/install/include/coin/CbcBranchDynamic.hpp +0 -206
  21. data/ext/ruby-cbc/install/include/coin/CbcBranchLotsize.hpp +0 -242
  22. data/ext/ruby-cbc/install/include/coin/CbcBranchToFixLots.hpp +0 -94
  23. data/ext/ruby-cbc/install/include/coin/CbcBranchingObject.hpp +0 -236
  24. data/ext/ruby-cbc/install/include/coin/CbcClique.hpp +0 -303
  25. data/ext/ruby-cbc/install/include/coin/CbcCompare.hpp +0 -39
  26. data/ext/ruby-cbc/install/include/coin/CbcCompareActual.hpp +0 -14
  27. data/ext/ruby-cbc/install/include/coin/CbcCompareBase.hpp +0 -142
  28. data/ext/ruby-cbc/install/include/coin/CbcCompareDefault.hpp +0 -120
  29. data/ext/ruby-cbc/install/include/coin/CbcCompareDepth.hpp +0 -47
  30. data/ext/ruby-cbc/install/include/coin/CbcCompareEstimate.hpp +0 -48
  31. data/ext/ruby-cbc/install/include/coin/CbcCompareObjective.hpp +0 -49
  32. data/ext/ruby-cbc/install/include/coin/CbcConfig.h +0 -14
  33. data/ext/ruby-cbc/install/include/coin/CbcConsequence.hpp +0 -49
  34. data/ext/ruby-cbc/install/include/coin/CbcCountRowCut.hpp +0 -168
  35. data/ext/ruby-cbc/install/include/coin/CbcCutGenerator.hpp +0 -482
  36. data/ext/ruby-cbc/install/include/coin/CbcCutModifier.hpp +0 -57
  37. data/ext/ruby-cbc/install/include/coin/CbcCutSubsetModifier.hpp +0 -66
  38. data/ext/ruby-cbc/install/include/coin/CbcDummyBranchingObject.hpp +0 -83
  39. data/ext/ruby-cbc/install/include/coin/CbcEventHandler.hpp +0 -245
  40. data/ext/ruby-cbc/install/include/coin/CbcFathom.hpp +0 -137
  41. data/ext/ruby-cbc/install/include/coin/CbcFathomDynamicProgramming.hpp +0 -169
  42. data/ext/ruby-cbc/install/include/coin/CbcFeasibilityBase.hpp +0 -56
  43. data/ext/ruby-cbc/install/include/coin/CbcFixVariable.hpp +0 -67
  44. data/ext/ruby-cbc/install/include/coin/CbcFollowOn.hpp +0 -207
  45. data/ext/ruby-cbc/install/include/coin/CbcFullNodeInfo.hpp +0 -161
  46. data/ext/ruby-cbc/install/include/coin/CbcGeneral.hpp +0 -60
  47. data/ext/ruby-cbc/install/include/coin/CbcGeneralDepth.hpp +0 -279
  48. data/ext/ruby-cbc/install/include/coin/CbcHeuristic.hpp +0 -682
  49. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDINS.hpp +0 -96
  50. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDW.hpp +0 -309
  51. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDive.hpp +0 -192
  52. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveCoefficient.hpp +0 -52
  53. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveFractional.hpp +0 -52
  54. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveGuided.hpp +0 -55
  55. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveLineSearch.hpp +0 -52
  56. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDivePseudoCost.hpp +0 -60
  57. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveVectorLength.hpp +0 -52
  58. data/ext/ruby-cbc/install/include/coin/CbcHeuristicFPump.hpp +0 -340
  59. data/ext/ruby-cbc/install/include/coin/CbcHeuristicGreedy.hpp +0 -280
  60. data/ext/ruby-cbc/install/include/coin/CbcHeuristicLocal.hpp +0 -271
  61. data/ext/ruby-cbc/install/include/coin/CbcHeuristicPivotAndFix.hpp +0 -58
  62. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRENS.hpp +0 -77
  63. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRINS.hpp +0 -102
  64. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRandRound.hpp +0 -58
  65. data/ext/ruby-cbc/install/include/coin/CbcHeuristicVND.hpp +0 -94
  66. data/ext/ruby-cbc/install/include/coin/CbcLinked.hpp +0 -1406
  67. data/ext/ruby-cbc/install/include/coin/CbcMessage.hpp +0 -94
  68. data/ext/ruby-cbc/install/include/coin/CbcMipStartIO.hpp +0 -26
  69. data/ext/ruby-cbc/install/include/coin/CbcModel.hpp +0 -2952
  70. data/ext/ruby-cbc/install/include/coin/CbcNWay.hpp +0 -166
  71. data/ext/ruby-cbc/install/include/coin/CbcNode.hpp +0 -351
  72. data/ext/ruby-cbc/install/include/coin/CbcNodeInfo.hpp +0 -349
  73. data/ext/ruby-cbc/install/include/coin/CbcObject.hpp +0 -272
  74. data/ext/ruby-cbc/install/include/coin/CbcObjectUpdateData.hpp +0 -64
  75. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.cpp +0 -4134
  76. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.hpp +0 -532
  77. data/ext/ruby-cbc/install/include/coin/CbcParam.hpp +0 -324
  78. data/ext/ruby-cbc/install/include/coin/CbcPartialNodeInfo.hpp +0 -110
  79. data/ext/ruby-cbc/install/include/coin/CbcSOS.hpp +0 -279
  80. data/ext/ruby-cbc/install/include/coin/CbcSimpleInteger.hpp +0 -286
  81. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerDynamicPseudoCost.hpp +0 -564
  82. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerPseudoCost.hpp +0 -114
  83. data/ext/ruby-cbc/install/include/coin/CbcSolver.hpp +0 -447
  84. data/ext/ruby-cbc/install/include/coin/CbcStrategy.hpp +0 -258
  85. data/ext/ruby-cbc/install/include/coin/CbcSubProblem.hpp +0 -83
  86. data/ext/ruby-cbc/install/include/coin/CbcTree.hpp +0 -490
  87. data/ext/ruby-cbc/install/include/coin/CbcTreeLocal.hpp +0 -372
  88. data/ext/ruby-cbc/install/include/coin/Cbc_C_Interface.h +0 -381
  89. data/ext/ruby-cbc/install/include/coin/Cgl012cut.hpp +0 -464
  90. data/ext/ruby-cbc/install/include/coin/CglAllDifferent.hpp +0 -115
  91. data/ext/ruby-cbc/install/include/coin/CglClique.hpp +0 -308
  92. data/ext/ruby-cbc/install/include/coin/CglConfig.h +0 -19
  93. data/ext/ruby-cbc/install/include/coin/CglCutGenerator.hpp +0 -121
  94. data/ext/ruby-cbc/install/include/coin/CglDuplicateRow.hpp +0 -189
  95. data/ext/ruby-cbc/install/include/coin/CglFlowCover.hpp +0 -371
  96. data/ext/ruby-cbc/install/include/coin/CglGMI.hpp +0 -364
  97. data/ext/ruby-cbc/install/include/coin/CglGMIParam.hpp +0 -313
  98. data/ext/ruby-cbc/install/include/coin/CglGomory.hpp +0 -204
  99. data/ext/ruby-cbc/install/include/coin/CglKnapsackCover.hpp +0 -310
  100. data/ext/ruby-cbc/install/include/coin/CglLandP.hpp +0 -306
  101. data/ext/ruby-cbc/install/include/coin/CglLandPValidator.hpp +0 -130
  102. data/ext/ruby-cbc/install/include/coin/CglLiftAndProject.hpp +0 -104
  103. data/ext/ruby-cbc/install/include/coin/CglMessage.hpp +0 -50
  104. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding.hpp +0 -429
  105. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding2.hpp +0 -427
  106. data/ext/ruby-cbc/install/include/coin/CglOddHole.hpp +0 -160
  107. data/ext/ruby-cbc/install/include/coin/CglParam.hpp +0 -93
  108. data/ext/ruby-cbc/install/include/coin/CglPreProcess.hpp +0 -492
  109. data/ext/ruby-cbc/install/include/coin/CglProbing.hpp +0 -543
  110. data/ext/ruby-cbc/install/include/coin/CglRedSplit.hpp +0 -448
  111. data/ext/ruby-cbc/install/include/coin/CglRedSplit2.hpp +0 -494
  112. data/ext/ruby-cbc/install/include/coin/CglRedSplit2Param.hpp +0 -495
  113. data/ext/ruby-cbc/install/include/coin/CglRedSplitParam.hpp +0 -272
  114. data/ext/ruby-cbc/install/include/coin/CglResidualCapacity.hpp +0 -240
  115. data/ext/ruby-cbc/install/include/coin/CglSimpleRounding.hpp +0 -174
  116. data/ext/ruby-cbc/install/include/coin/CglStored.hpp +0 -125
  117. data/ext/ruby-cbc/install/include/coin/CglTreeInfo.hpp +0 -180
  118. data/ext/ruby-cbc/install/include/coin/CglTwomir.hpp +0 -565
  119. data/ext/ruby-cbc/install/include/coin/CglZeroHalf.hpp +0 -133
  120. data/ext/ruby-cbc/install/include/coin/ClpAmplObjective.hpp +0 -113
  121. data/ext/ruby-cbc/install/include/coin/ClpCholeskyBase.hpp +0 -294
  122. data/ext/ruby-cbc/install/include/coin/ClpCholeskyDense.hpp +0 -162
  123. data/ext/ruby-cbc/install/include/coin/ClpConfig.h +0 -17
  124. data/ext/ruby-cbc/install/include/coin/ClpConstraint.hpp +0 -125
  125. data/ext/ruby-cbc/install/include/coin/ClpConstraintAmpl.hpp +0 -108
  126. data/ext/ruby-cbc/install/include/coin/ClpConstraintLinear.hpp +0 -110
  127. data/ext/ruby-cbc/install/include/coin/ClpConstraintQuadratic.hpp +0 -119
  128. data/ext/ruby-cbc/install/include/coin/ClpDualRowDantzig.hpp +0 -71
  129. data/ext/ruby-cbc/install/include/coin/ClpDualRowPivot.hpp +0 -129
  130. data/ext/ruby-cbc/install/include/coin/ClpDualRowSteepest.hpp +0 -153
  131. data/ext/ruby-cbc/install/include/coin/ClpDummyMatrix.hpp +0 -183
  132. data/ext/ruby-cbc/install/include/coin/ClpDynamicExampleMatrix.hpp +0 -186
  133. data/ext/ruby-cbc/install/include/coin/ClpDynamicMatrix.hpp +0 -381
  134. data/ext/ruby-cbc/install/include/coin/ClpEventHandler.hpp +0 -187
  135. data/ext/ruby-cbc/install/include/coin/ClpFactorization.hpp +0 -432
  136. data/ext/ruby-cbc/install/include/coin/ClpGubDynamicMatrix.hpp +0 -247
  137. data/ext/ruby-cbc/install/include/coin/ClpGubMatrix.hpp +0 -358
  138. data/ext/ruby-cbc/install/include/coin/ClpInterior.hpp +0 -570
  139. data/ext/ruby-cbc/install/include/coin/ClpLinearObjective.hpp +0 -103
  140. data/ext/ruby-cbc/install/include/coin/ClpMatrixBase.hpp +0 -524
  141. data/ext/ruby-cbc/install/include/coin/ClpMessage.hpp +0 -131
  142. data/ext/ruby-cbc/install/include/coin/ClpModel.hpp +0 -1307
  143. data/ext/ruby-cbc/install/include/coin/ClpNetworkMatrix.hpp +0 -229
  144. data/ext/ruby-cbc/install/include/coin/ClpNode.hpp +0 -349
  145. data/ext/ruby-cbc/install/include/coin/ClpNonLinearCost.hpp +0 -401
  146. data/ext/ruby-cbc/install/include/coin/ClpObjective.hpp +0 -134
  147. data/ext/ruby-cbc/install/include/coin/ClpPackedMatrix.hpp +0 -638
  148. data/ext/ruby-cbc/install/include/coin/ClpParameters.hpp +0 -126
  149. data/ext/ruby-cbc/install/include/coin/ClpPdcoBase.hpp +0 -103
  150. data/ext/ruby-cbc/install/include/coin/ClpPlusMinusOneMatrix.hpp +0 -290
  151. data/ext/ruby-cbc/install/include/coin/ClpPresolve.hpp +0 -299
  152. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnDantzig.hpp +0 -72
  153. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnPivot.hpp +0 -155
  154. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnSteepest.hpp +0 -247
  155. data/ext/ruby-cbc/install/include/coin/ClpQuadraticObjective.hpp +0 -155
  156. data/ext/ruby-cbc/install/include/coin/ClpSimplex.hpp +0 -1797
  157. data/ext/ruby-cbc/install/include/coin/ClpSimplexDual.hpp +0 -300
  158. data/ext/ruby-cbc/install/include/coin/ClpSimplexNonlinear.hpp +0 -117
  159. data/ext/ruby-cbc/install/include/coin/ClpSimplexOther.hpp +0 -277
  160. data/ext/ruby-cbc/install/include/coin/ClpSimplexPrimal.hpp +0 -244
  161. data/ext/ruby-cbc/install/include/coin/ClpSolve.hpp +0 -446
  162. data/ext/ruby-cbc/install/include/coin/Clp_C_Interface.h +0 -525
  163. data/ext/ruby-cbc/install/include/coin/CoinAlloc.hpp +0 -176
  164. data/ext/ruby-cbc/install/include/coin/CoinBuild.hpp +0 -149
  165. data/ext/ruby-cbc/install/include/coin/CoinDenseFactorization.hpp +0 -419
  166. data/ext/ruby-cbc/install/include/coin/CoinDenseVector.hpp +0 -383
  167. data/ext/ruby-cbc/install/include/coin/CoinDistance.hpp +0 -48
  168. data/ext/ruby-cbc/install/include/coin/CoinError.hpp +0 -257
  169. data/ext/ruby-cbc/install/include/coin/CoinFactorization.hpp +0 -2044
  170. data/ext/ruby-cbc/install/include/coin/CoinFileIO.hpp +0 -166
  171. data/ext/ruby-cbc/install/include/coin/CoinFinite.hpp +0 -34
  172. data/ext/ruby-cbc/install/include/coin/CoinFloatEqual.hpp +0 -177
  173. data/ext/ruby-cbc/install/include/coin/CoinHelperFunctions.hpp +0 -1111
  174. data/ext/ruby-cbc/install/include/coin/CoinIndexedVector.hpp +0 -1164
  175. data/ext/ruby-cbc/install/include/coin/CoinLpIO.hpp +0 -805
  176. data/ext/ruby-cbc/install/include/coin/CoinMessage.hpp +0 -96
  177. data/ext/ruby-cbc/install/include/coin/CoinMessageHandler.hpp +0 -666
  178. data/ext/ruby-cbc/install/include/coin/CoinModel.hpp +0 -1054
  179. data/ext/ruby-cbc/install/include/coin/CoinModelUseful.hpp +0 -441
  180. data/ext/ruby-cbc/install/include/coin/CoinMpsIO.hpp +0 -1056
  181. data/ext/ruby-cbc/install/include/coin/CoinOslFactorization.hpp +0 -280
  182. data/ext/ruby-cbc/install/include/coin/CoinPackedMatrix.hpp +0 -947
  183. data/ext/ruby-cbc/install/include/coin/CoinPackedVector.hpp +0 -657
  184. data/ext/ruby-cbc/install/include/coin/CoinPackedVectorBase.hpp +0 -269
  185. data/ext/ruby-cbc/install/include/coin/CoinParam.hpp +0 -644
  186. data/ext/ruby-cbc/install/include/coin/CoinPragma.hpp +0 -26
  187. data/ext/ruby-cbc/install/include/coin/CoinPresolveDoubleton.hpp +0 -73
  188. data/ext/ruby-cbc/install/include/coin/CoinPresolveDual.hpp +0 -85
  189. data/ext/ruby-cbc/install/include/coin/CoinPresolveDupcol.hpp +0 -226
  190. data/ext/ruby-cbc/install/include/coin/CoinPresolveEmpty.hpp +0 -116
  191. data/ext/ruby-cbc/install/include/coin/CoinPresolveFixed.hpp +0 -181
  192. data/ext/ruby-cbc/install/include/coin/CoinPresolveForcing.hpp +0 -61
  193. data/ext/ruby-cbc/install/include/coin/CoinPresolveImpliedFree.hpp +0 -60
  194. data/ext/ruby-cbc/install/include/coin/CoinPresolveIsolated.hpp +0 -51
  195. data/ext/ruby-cbc/install/include/coin/CoinPresolveMatrix.hpp +0 -1842
  196. data/ext/ruby-cbc/install/include/coin/CoinPresolveMonitor.hpp +0 -105
  197. data/ext/ruby-cbc/install/include/coin/CoinPresolvePsdebug.hpp +0 -166
  198. data/ext/ruby-cbc/install/include/coin/CoinPresolveSingleton.hpp +0 -112
  199. data/ext/ruby-cbc/install/include/coin/CoinPresolveSubst.hpp +0 -101
  200. data/ext/ruby-cbc/install/include/coin/CoinPresolveTighten.hpp +0 -55
  201. data/ext/ruby-cbc/install/include/coin/CoinPresolveTripleton.hpp +0 -66
  202. data/ext/ruby-cbc/install/include/coin/CoinPresolveUseless.hpp +0 -63
  203. data/ext/ruby-cbc/install/include/coin/CoinPresolveZeros.hpp +0 -60
  204. data/ext/ruby-cbc/install/include/coin/CoinRational.hpp +0 -44
  205. data/ext/ruby-cbc/install/include/coin/CoinSearchTree.hpp +0 -465
  206. data/ext/ruby-cbc/install/include/coin/CoinShallowPackedVector.hpp +0 -148
  207. data/ext/ruby-cbc/install/include/coin/CoinSignal.hpp +0 -117
  208. data/ext/ruby-cbc/install/include/coin/CoinSimpFactorization.hpp +0 -431
  209. data/ext/ruby-cbc/install/include/coin/CoinSmartPtr.hpp +0 -528
  210. data/ext/ruby-cbc/install/include/coin/CoinSnapshot.hpp +0 -476
  211. data/ext/ruby-cbc/install/include/coin/CoinSort.hpp +0 -678
  212. data/ext/ruby-cbc/install/include/coin/CoinStructuredModel.hpp +0 -247
  213. data/ext/ruby-cbc/install/include/coin/CoinTime.hpp +0 -310
  214. data/ext/ruby-cbc/install/include/coin/CoinTypes.hpp +0 -64
  215. data/ext/ruby-cbc/install/include/coin/CoinUtility.hpp +0 -19
  216. data/ext/ruby-cbc/install/include/coin/CoinUtilsConfig.h +0 -34
  217. data/ext/ruby-cbc/install/include/coin/CoinWarmStart.hpp +0 -58
  218. data/ext/ruby-cbc/install/include/coin/CoinWarmStartBasis.hpp +0 -456
  219. data/ext/ruby-cbc/install/include/coin/CoinWarmStartDual.hpp +0 -166
  220. data/ext/ruby-cbc/install/include/coin/CoinWarmStartPrimalDual.hpp +0 -211
  221. data/ext/ruby-cbc/install/include/coin/CoinWarmStartVector.hpp +0 -488
  222. data/ext/ruby-cbc/install/include/coin/Coin_C_defines.h +0 -115
  223. data/ext/ruby-cbc/install/include/coin/Idiot.hpp +0 -298
  224. data/ext/ruby-cbc/install/include/coin/OsiAuxInfo.hpp +0 -206
  225. data/ext/ruby-cbc/install/include/coin/OsiBranchingObject.hpp +0 -1005
  226. data/ext/ruby-cbc/install/include/coin/OsiCbcSolverInterface.hpp +0 -764
  227. data/ext/ruby-cbc/install/include/coin/OsiChooseVariable.hpp +0 -534
  228. data/ext/ruby-cbc/install/include/coin/OsiClpSolverInterface.hpp +0 -1509
  229. data/ext/ruby-cbc/install/include/coin/OsiColCut.hpp +0 -324
  230. data/ext/ruby-cbc/install/include/coin/OsiCollections.hpp +0 -35
  231. data/ext/ruby-cbc/install/include/coin/OsiConfig.h +0 -19
  232. data/ext/ruby-cbc/install/include/coin/OsiCut.hpp +0 -245
  233. data/ext/ruby-cbc/install/include/coin/OsiCuts.hpp +0 -474
  234. data/ext/ruby-cbc/install/include/coin/OsiPresolve.hpp +0 -252
  235. data/ext/ruby-cbc/install/include/coin/OsiRowCut.hpp +0 -331
  236. data/ext/ruby-cbc/install/include/coin/OsiRowCutDebugger.hpp +0 -187
  237. data/ext/ruby-cbc/install/include/coin/OsiSolverBranch.hpp +0 -152
  238. data/ext/ruby-cbc/install/include/coin/OsiSolverInterface.hpp +0 -2143
  239. data/ext/ruby-cbc/install/include/coin/OsiSolverParameters.hpp +0 -142
  240. data/ext/ruby-cbc/install/include/coin/OsiUnitTests.hpp +0 -374
  241. data/ext/ruby-cbc/install/lib/libCbc.la +0 -35
  242. data/ext/ruby-cbc/install/lib/libCbc.so +0 -0
  243. data/ext/ruby-cbc/install/lib/libCbc.so.3 +0 -0
  244. data/ext/ruby-cbc/install/lib/libCbc.so.3.9.7 +0 -0
  245. data/ext/ruby-cbc/install/lib/libCbcSolver.la +0 -35
  246. data/ext/ruby-cbc/install/lib/libCbcSolver.so +0 -0
  247. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3 +0 -0
  248. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3.9.7 +0 -0
  249. data/ext/ruby-cbc/install/lib/libCgl.la +0 -35
  250. data/ext/ruby-cbc/install/lib/libCgl.so +0 -0
  251. data/ext/ruby-cbc/install/lib/libCgl.so.1 +0 -0
  252. data/ext/ruby-cbc/install/lib/libCgl.so.1.9.7 +0 -0
  253. data/ext/ruby-cbc/install/lib/libClp.la +0 -35
  254. data/ext/ruby-cbc/install/lib/libClp.so +0 -0
  255. data/ext/ruby-cbc/install/lib/libClp.so.1 +0 -0
  256. data/ext/ruby-cbc/install/lib/libClp.so.1.13.9 +0 -0
  257. data/ext/ruby-cbc/install/lib/libClpSolver.la +0 -35
  258. data/ext/ruby-cbc/install/lib/libClpSolver.so +0 -0
  259. data/ext/ruby-cbc/install/lib/libClpSolver.so.1 +0 -0
  260. data/ext/ruby-cbc/install/lib/libClpSolver.so.1.13.9 +0 -0
  261. data/ext/ruby-cbc/install/lib/libCoinUtils.la +0 -35
  262. data/ext/ruby-cbc/install/lib/libCoinUtils.so +0 -0
  263. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3 +0 -0
  264. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3.10.11 +0 -0
  265. data/ext/ruby-cbc/install/lib/libOsi.la +0 -35
  266. data/ext/ruby-cbc/install/lib/libOsi.so +0 -0
  267. data/ext/ruby-cbc/install/lib/libOsi.so.1 +0 -0
  268. data/ext/ruby-cbc/install/lib/libOsi.so.1.12.6 +0 -0
  269. data/ext/ruby-cbc/install/lib/libOsiCbc.la +0 -35
  270. data/ext/ruby-cbc/install/lib/libOsiCbc.so +0 -0
  271. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3 +0 -0
  272. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3.9.7 +0 -0
  273. data/ext/ruby-cbc/install/lib/libOsiClp.la +0 -35
  274. data/ext/ruby-cbc/install/lib/libOsiClp.so +0 -0
  275. data/ext/ruby-cbc/install/lib/libOsiClp.so.1 +0 -0
  276. data/ext/ruby-cbc/install/lib/libOsiClp.so.1.13.9 +0 -0
  277. data/ext/ruby-cbc/install/lib/libOsiCommonTests.la +0 -35
  278. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so +0 -0
  279. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1 +0 -0
  280. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1.12.6 +0 -0
  281. data/ext/ruby-cbc/install/lib/pkgconfig/cbc.pc +0 -12
  282. data/ext/ruby-cbc/install/lib/pkgconfig/cgl.pc +0 -12
  283. data/ext/ruby-cbc/install/lib/pkgconfig/clp.pc +0 -12
  284. data/ext/ruby-cbc/install/lib/pkgconfig/coindatamiplib3.pc +0 -9
  285. data/ext/ruby-cbc/install/lib/pkgconfig/coindatasample.pc +0 -9
  286. data/ext/ruby-cbc/install/lib/pkgconfig/coinutils.pc +0 -12
  287. data/ext/ruby-cbc/install/lib/pkgconfig/osi-cbc.pc +0 -12
  288. data/ext/ruby-cbc/install/lib/pkgconfig/osi-clp.pc +0 -12
  289. data/ext/ruby-cbc/install/lib/pkgconfig/osi-unittests.pc +0 -12
  290. data/ext/ruby-cbc/install/lib/pkgconfig/osi.pc +0 -12
@@ -1,181 +0,0 @@
1
- /* $Id: CoinPresolveFixed.hpp 1510 2011-12-08 23:56:01Z lou $ */
2
- // Copyright (C) 2002, International Business Machines
3
- // Corporation and others. All Rights Reserved.
4
- // This code is licensed under the terms of the Eclipse Public License (EPL).
5
-
6
- #ifndef CoinPresolveFixed_H
7
- #define CoinPresolveFixed_H
8
- #define FIXED_VARIABLE 1
9
-
10
- /*! \class remove_fixed_action
11
- \brief Excise fixed variables from the model.
12
-
13
- Implements the action of virtually removing one or more fixed variables
14
- x_j from the model by substituting the value sol_j in each constraint.
15
- Specifically, for each constraint i where a_ij != 0, rlo_i and rup_i
16
- are adjusted by -a_ij*sol_j and a_ij is set to 0.
17
-
18
- There is an implicit assumption that the variable already has the correct
19
- value. If this isn't true, corrections to row activity may be incorrect.
20
- If you want to guard against this possibility, consider make_fixed_action.
21
-
22
- Actual removal of the empty column from the matrix is handled by
23
- drop_empty_cols_action. Correction of the objective function is done there.
24
- */
25
- class remove_fixed_action : public CoinPresolveAction {
26
- public:
27
- /*! \brief Structure to hold information necessary to reintroduce a
28
- column into the problem representation.
29
- */
30
- struct action {
31
- int col; ///< column index of variable
32
- int start; ///< start of coefficients in #colels_ and #colrows_
33
- double sol; ///< value of variable
34
- };
35
- /// Array of row indices for coefficients of excised columns
36
- int *colrows_;
37
- /// Array of coefficients of excised columns
38
- double *colels_;
39
- /// Number of entries in #actions_
40
- int nactions_;
41
- /// Vector specifying variable(s) affected by this object
42
- action *actions_;
43
-
44
- private:
45
- /*! \brief Constructor */
46
- remove_fixed_action(int nactions,
47
- action *actions,
48
- double * colels,
49
- int * colrows,
50
- const CoinPresolveAction *next);
51
-
52
- public:
53
- /// Returns string "remove_fixed_action".
54
- const char *name() const;
55
-
56
- /*! \brief Excise the specified columns.
57
-
58
- Remove the specified columns (\p nfcols, \p fcols) from the problem
59
- representation (\p prob), leaving the appropriate postsolve object
60
- linked as the head of the list of postsolve objects (currently headed
61
- by \p next).
62
- */
63
- static const remove_fixed_action *presolve(CoinPresolveMatrix *prob,
64
- int *fcols,
65
- int nfcols,
66
- const CoinPresolveAction *next);
67
-
68
- void postsolve(CoinPostsolveMatrix *prob) const;
69
-
70
- /// Destructor
71
- virtual ~remove_fixed_action();
72
- };
73
-
74
-
75
- /*! \relates remove_fixed_action
76
- \brief Scan the problem for fixed columns and remove them.
77
-
78
- A front end to collect a list of columns with equal bounds and hand them to
79
- remove_fixed_action::presolve() for processing.
80
- */
81
-
82
- const CoinPresolveAction *remove_fixed(CoinPresolveMatrix *prob,
83
- const CoinPresolveAction *next);
84
-
85
-
86
- /*! \class make_fixed_action
87
- \brief Fix a variable at a specified bound.
88
-
89
- Implements the action of fixing a variable by forcing both bounds to the same
90
- value and forcing the value of the variable to match.
91
-
92
- If the bounds are already equal, and the value of the variable is already
93
- correct, consider remove_fixed_action.
94
- */
95
- class make_fixed_action : public CoinPresolveAction {
96
-
97
- /// Structure to preserve the bound overwritten when fixing a variable
98
- struct action {
99
- double bound; ///< Value of bound overwritten to fix variable.
100
- int col ; ///< column index of variable
101
- };
102
-
103
- /// Number of preserved bounds
104
- int nactions_;
105
- /// Vector of preserved bounds, one for each variable fixed in this object
106
- const action *actions_;
107
-
108
- /*! \brief True to fix at lower bound, false to fix at upper bound.
109
-
110
- Note that this applies to all variables fixed in this object.
111
- */
112
- const bool fix_to_lower_;
113
-
114
- /*! \brief The postsolve object with the information required to repopulate
115
- the fixed columns.
116
- */
117
- const remove_fixed_action *faction_;
118
-
119
- /*! \brief Constructor */
120
- make_fixed_action(int nactions, const action *actions, bool fix_to_lower,
121
- const remove_fixed_action *faction,
122
- const CoinPresolveAction *next)
123
- : CoinPresolveAction(next),
124
- nactions_(nactions), actions_(actions),
125
- fix_to_lower_(fix_to_lower),
126
- faction_(faction)
127
- {}
128
-
129
- public:
130
- /// Returns string "make_fixed_action".
131
- const char *name() const;
132
-
133
- /*! \brief Perform actions to fix variables and return postsolve object
134
-
135
- For each specified variable (\p nfcols, \p fcols), fix the variable to
136
- the specified bound (\p fix_to_lower) by setting the variable's bounds
137
- to be equal in \p prob. Create a postsolve object, link it at the head of
138
- the list of postsolve objects (\p next), and return the object.
139
- */
140
- static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob,
141
- int *fcols,
142
- int nfcols,
143
- bool fix_to_lower,
144
- const CoinPresolveAction *next);
145
-
146
- /*! \brief Postsolve (unfix variables)
147
-
148
- Back out the variables fixed by the presolve side of this object.
149
- */
150
- void postsolve(CoinPostsolveMatrix *prob) const;
151
-
152
- /// Destructor
153
- virtual ~make_fixed_action() {
154
- deleteAction(actions_,action*);
155
- delete faction_;
156
- }
157
- };
158
-
159
- /*! \relates make_fixed_action
160
- \brief Scan variables and fix any with equal bounds
161
-
162
- A front end to collect a list of columns with equal bounds and hand them to
163
- make_fixed_action::presolve() for processing.
164
- */
165
-
166
- const CoinPresolveAction *make_fixed(CoinPresolveMatrix *prob,
167
- const CoinPresolveAction *next) ;
168
-
169
- /*! \brief Transfer costs from singleton variables
170
- \relates make_fixed_action
171
-
172
- Transfers costs from singleton variables in equalities onto the other
173
- variables. Will also transfer costs from one integer variable to other
174
- integer variables with zero cost if there's a net gain in integer variables
175
- with non-zero cost.
176
-
177
- The relation to make_fixed_action is tenuous, but this transform should be
178
- attempted before the initial round of variable fixing.
179
- */
180
- void transferCosts(CoinPresolveMatrix * prob);
181
- #endif
@@ -1,61 +0,0 @@
1
- /* $Id: CoinPresolveForcing.hpp 1498 2011-11-02 15:25:35Z mjs $ */
2
- // Copyright (C) 2002, International Business Machines
3
- // Corporation and others. All Rights Reserved.
4
- // This code is licensed under the terms of the Eclipse Public License (EPL).
5
-
6
- #ifndef CoinPresolveForcing_H
7
- #define CoinPresolveForcing_H
8
-
9
- #include "CoinPresolveMatrix.hpp"
10
-
11
- /*!
12
- \file
13
- */
14
-
15
- #define IMPLIED_BOUND 7
16
-
17
- /*! \class forcing_constraint_action
18
- \brief Detect and process forcing constraints and useless constraints
19
-
20
- A constraint is useless if the bounds on the variables prevent the constraint
21
- from ever being violated.
22
-
23
- A constraint is a forcing constraint if the bounds on the constraint force
24
- the value of an involved variable to one of its bounds. A constraint can
25
- force more than one variable.
26
- */
27
- class forcing_constraint_action : public CoinPresolveAction {
28
- forcing_constraint_action();
29
- forcing_constraint_action(const forcing_constraint_action& rhs);
30
- forcing_constraint_action& operator=(const forcing_constraint_action& rhs);
31
- public:
32
- struct action {
33
- const int *rowcols;
34
- const double *bounds;
35
- int row;
36
- int nlo;
37
- int nup;
38
- };
39
- private:
40
- const int nactions_;
41
- // actions_ is owned by the class and must be deleted at destruction
42
- const action *const actions_;
43
-
44
- public:
45
- forcing_constraint_action(int nactions,
46
- const action *actions,
47
- const CoinPresolveAction *next) :
48
- CoinPresolveAction(next),
49
- nactions_(nactions), actions_(actions) {}
50
-
51
- const char *name() const;
52
-
53
- static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob,
54
- const CoinPresolveAction *next);
55
-
56
- void postsolve(CoinPostsolveMatrix *prob) const;
57
-
58
- virtual ~forcing_constraint_action();
59
- };
60
-
61
- #endif
@@ -1,60 +0,0 @@
1
- /* $Id: CoinPresolveImpliedFree.hpp 1694 2014-04-29 02:08:35Z tkr $ */
2
- // Copyright (C) 2002, International Business Machines
3
- // Corporation and others. All Rights Reserved.
4
- // This code is licensed under the terms of the Eclipse Public License (EPL).
5
-
6
- #ifndef CoinPresolveImpliedFree_H
7
- #define CoinPresolveImpliedFree_H
8
-
9
- /*!
10
- \file
11
- */
12
-
13
- #define IMPLIED_FREE 9
14
-
15
- /*! \class implied_free_action
16
- \brief Detect and process implied free variables
17
-
18
- Consider a singleton variable x (<i>i.e.</i>, a variable involved in only
19
- one constraint). Suppose that the bounds on that constraint, combined with
20
- the bounds on the other variables involved in the constraint, are such that
21
- even the worst case values of the other variables still imply bounds for x
22
- which are tighter than the variable's original bounds. Since x can never
23
- reach its upper or lower bounds, it is an implied free variable. Both x and
24
- the constraint can be deleted from the problem.
25
-
26
- A similar transform for the case where the variable is not a natural column
27
- singleton is handled by #subst_constraint_action.
28
- */
29
- class implied_free_action : public CoinPresolveAction {
30
- struct action {
31
- int row, col;
32
- double clo, cup;
33
- double rlo, rup;
34
- const double *rowels;
35
- const double *costs;
36
- int ninrow;
37
- };
38
-
39
- const int nactions_;
40
- const action *const actions_;
41
-
42
- implied_free_action(int nactions,
43
- const action *actions,
44
- const CoinPresolveAction *next) :
45
- CoinPresolveAction(next),
46
- nactions_(nactions), actions_(actions) {}
47
-
48
- public:
49
- const char *name() const;
50
-
51
- static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob,
52
- const CoinPresolveAction *next,
53
- int & fillLevel);
54
-
55
- void postsolve(CoinPostsolveMatrix *prob) const;
56
-
57
- virtual ~implied_free_action();
58
- };
59
-
60
- #endif
@@ -1,51 +0,0 @@
1
- /* $Id: CoinPresolveIsolated.hpp 1498 2011-11-02 15:25:35Z mjs $ */
2
- // Copyright (C) 2002, International Business Machines
3
- // Corporation and others. All Rights Reserved.
4
- // This code is licensed under the terms of the Eclipse Public License (EPL).
5
-
6
- #ifndef CoinPresolveIsolated_H
7
- #define CoinPresolveIsolated_H
8
-
9
- #include "CoinPresolveMatrix.hpp"
10
-
11
- class isolated_constraint_action : public CoinPresolveAction {
12
- isolated_constraint_action();
13
- isolated_constraint_action(const isolated_constraint_action& rhs);
14
- isolated_constraint_action& operator=(const isolated_constraint_action& rhs);
15
-
16
- double rlo_;
17
- double rup_;
18
- int row_;
19
- int ninrow_;
20
- // the arrays are owned by the class and must be deleted at destruction
21
- const int *rowcols_;
22
- const double *rowels_;
23
- const double *costs_;
24
-
25
- isolated_constraint_action(double rlo,
26
- double rup,
27
- int row,
28
- int ninrow,
29
- const int *rowcols,
30
- const double *rowels,
31
- const double *costs,
32
- const CoinPresolveAction *next) :
33
- CoinPresolveAction(next),
34
- rlo_(rlo), rup_(rup), row_(row), ninrow_(ninrow),
35
- rowcols_(rowcols), rowels_(rowels), costs_(costs) {}
36
-
37
- public:
38
- const char *name() const;
39
-
40
- static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob,
41
- int row,
42
- const CoinPresolveAction *next);
43
-
44
- void postsolve(CoinPostsolveMatrix *prob) const;
45
-
46
- virtual ~isolated_constraint_action();
47
- };
48
-
49
-
50
-
51
- #endif
@@ -1,1842 +0,0 @@
1
- /* $Id: CoinPresolveMatrix.hpp 1761 2014-12-10 09:43:07Z forrest $ */
2
- // Copyright (C) 2002, International Business Machines
3
- // Corporation and others. All Rights Reserved.
4
- // This code is licensed under the terms of the Eclipse Public License (EPL).
5
-
6
- #ifndef CoinPresolveMatrix_H
7
- #define CoinPresolveMatrix_H
8
-
9
- #include "CoinPragma.hpp"
10
- #include "CoinPackedMatrix.hpp"
11
- #include "CoinMessage.hpp"
12
- #include "CoinTime.hpp"
13
-
14
- #include <cmath>
15
- #include <cassert>
16
- #include <cfloat>
17
- #include <cassert>
18
- #include <cstdlib>
19
-
20
- #if PRESOLVE_DEBUG > 0
21
- #include "CoinFinite.hpp"
22
- #endif
23
-
24
- /*! \file
25
-
26
- Declarations for CoinPresolveMatrix and CoinPostsolveMatrix and their
27
- common base class CoinPrePostsolveMatrix. Also declarations for
28
- CoinPresolveAction and a number of non-member utility functions.
29
- */
30
-
31
-
32
- #if defined(_MSC_VER)
33
- // Avoid MS Compiler problem in recognizing type to delete
34
- // by casting to type.
35
- // Is this still necessary? -- lh, 111202 --
36
- #define deleteAction(array,type) delete [] ((type) array)
37
- #else
38
- #define deleteAction(array,type) delete [] array
39
- #endif
40
-
41
- /*
42
- Define PRESOLVE_DEBUG and PRESOLVE_CONSISTENCY on the configure command
43
- line or in a Makefile! See comments in CoinPresolvePsdebug.hpp.
44
- */
45
- #if PRESOLVE_DEBUG > 0 || PRESOLVE_CONSISTENCY > 0
46
-
47
- #define PRESOLVE_STMT(s) s
48
-
49
- #define PRESOLVEASSERT(x) \
50
- ((x) ? 1 : ((std::cerr << "FAILED ASSERTION at line " \
51
- << __LINE__ << ": " #x "\n"), abort(), 0))
52
-
53
- inline void DIE(const char *s) { std::cout << s ; abort() ; }
54
-
55
- /*! \brief Indicate column or row present at start of postsolve
56
-
57
- This code is used during postsolve in [cr]done to indicate columns and rows
58
- that are present in the presolved system (i.e., present at the start of
59
- postsolve processing).
60
-
61
- \todo
62
- There are a bunch of these code definitions, scattered through presolve
63
- files. They should be collected in one place.
64
- */
65
- #define PRESENT_IN_REDUCED '\377'
66
-
67
- #else
68
-
69
- #define PRESOLVEASSERT(x) {}
70
- #define PRESOLVE_STMT(s) {}
71
-
72
- inline void DIE(const char *) {}
73
-
74
- #endif
75
-
76
- /*
77
- Unclear why these are separate from standard debug.
78
- */
79
- #ifndef PRESOLVE_DETAIL
80
- #define PRESOLVE_DETAIL_PRINT(s) {}
81
- #else
82
- #define PRESOLVE_DETAIL_PRINT(s) s
83
- #endif
84
-
85
- /*! \brief Zero tolerance
86
-
87
- OSL had a fixed zero tolerance; we still use that here.
88
- */
89
- const double ZTOLDP = 1e-12 ;
90
- /*! \brief Alternate zero tolerance
91
-
92
- Use a different one if we are doing doubletons, etc.
93
- */
94
- const double ZTOLDP2 = 1e-10 ;
95
-
96
- /// The usual finite infinity
97
- #define PRESOLVE_INF COIN_DBL_MAX
98
- /// And a small infinity
99
- #define PRESOLVE_SMALL_INF 1.0e20
100
- /// Check for infinity using finite infinity
101
- #define PRESOLVEFINITE(n) (-PRESOLVE_INF < (n) && (n) < PRESOLVE_INF)
102
-
103
-
104
- class CoinPostsolveMatrix ;
105
-
106
- /*! \class CoinPresolveAction
107
- \brief Abstract base class of all presolve routines.
108
-
109
- The details will make more sense after a quick overview of the grand plan:
110
- A presolve object is handed a problem object, which it is expected to
111
- modify in some useful way. Assuming that it succeeds, the presolve object
112
- should create a postsolve object, <i>i.e.</i>, an object that contains
113
- instructions for backing out the presolve transform to recover the original
114
- problem. These postsolve objects are accumulated in a linked list, with each
115
- successive presolve action adding its postsolve action to the head of the
116
- list. The end result of all this is a presolved problem object, and a list
117
- of postsolve objects. The presolved problem object is then handed to a
118
- solver for optimization, and the problem object augmented with the
119
- results. The list of postsolve objects is then traversed. Each of them
120
- (un)modifies the problem object, with the end result being the original
121
- problem, augmented with solution information.
122
-
123
- The problem object representation is CoinPrePostsolveMatrix and subclasses.
124
- Check there for details. The \c CoinPresolveAction class and subclasses
125
- represent the presolve and postsolve objects.
126
-
127
- In spite of the name, the only information held in a \c CoinPresolveAction
128
- object is the information needed to postsolve (<i>i.e.</i>, the information
129
- needed to back out the presolve transformation). This information is not
130
- expected to change, so the fields are all \c const.
131
-
132
- A subclass of \c CoinPresolveAction, implementing a specific pre/postsolve
133
- action, is expected to declare a static function that attempts to perform a
134
- presolve transformation. This function will be handed a CoinPresolveMatrix
135
- to transform, and a pointer to the head of the list of postsolve objects.
136
- If the transform is successful, the function will create a new
137
- \c CoinPresolveAction object, link it at the head of the list of postsolve
138
- objects, and return a pointer to the postsolve object it has just created.
139
- Otherwise, it should return 0. It is expected that these static functions
140
- will be the only things that can create new \c CoinPresolveAction objects;
141
- this is expressed by making each subclass' constructor(s) private.
142
-
143
- Every subclass must also define a \c postsolve method.
144
- This function will be handed a CoinPostsolveMatrix to transform.
145
-
146
- It is the client's responsibility to implement presolve and postsolve driver
147
- routines. See OsiPresolve for examples.
148
-
149
- \note Since the only fields in a \c CoinPresolveAction are \c const, anything
150
- one can do with a variable declared \c CoinPresolveAction* can also be
151
- done with a variable declared \c const \c CoinPresolveAction* It is
152
- expected that all derived subclasses of \c CoinPresolveAction also have
153
- this property.
154
- */
155
- class CoinPresolveAction
156
- {
157
- public:
158
- /*! \brief Stub routine to throw exceptions.
159
-
160
- Exceptions are inefficient, particularly with g++. Even with xlC, the
161
- use of exceptions adds a long prologue to a routine. Therefore, rather
162
- than use throw directly in the routine, I use it in a stub routine.
163
- */
164
- static void throwCoinError(const char *error, const char *ps_routine)
165
- { throw CoinError(error, ps_routine, "CoinPresolve"); }
166
-
167
- /*! \brief The next presolve transformation
168
-
169
- Set at object construction.
170
- */
171
- const CoinPresolveAction *next;
172
-
173
- /*! \brief Construct a postsolve object and add it to the transformation list.
174
-
175
- This is an `add to head' operation. This object will point to the
176
- one passed as the parameter.
177
- */
178
- CoinPresolveAction(const CoinPresolveAction *next) : next(next) {}
179
- /// modify next (when building rather than passing)
180
- inline void setNext(const CoinPresolveAction *nextAction)
181
- { next = nextAction;}
182
-
183
- /*! \brief A name for debug printing.
184
-
185
- It is expected that the name is not stored in the transform itself.
186
- */
187
- virtual const char *name() const = 0;
188
-
189
- /*! \brief Apply the postsolve transformation for this particular
190
- presolve action.
191
- */
192
- virtual void postsolve(CoinPostsolveMatrix *prob) const = 0;
193
-
194
- /*! \brief Virtual destructor. */
195
- virtual ~CoinPresolveAction() {}
196
- };
197
-
198
- /*
199
- These are needed for OSI-aware constructors associated with
200
- CoinPrePostsolveMatrix, CoinPresolveMatrix, and CoinPostsolveMatrix.
201
- */
202
- class ClpSimplex;
203
- class OsiSolverInterface;
204
-
205
- /*
206
- CoinWarmStartBasis is required for methods in CoinPrePostsolveMatrix
207
- that accept/return a CoinWarmStartBasis object.
208
- */
209
- class CoinWarmStartBasis ;
210
-
211
- /*! \class CoinPrePostsolveMatrix
212
- \brief Collects all the information about the problem that is needed
213
- in both presolve and postsolve.
214
-
215
- In a bit more detail, a column-major representation of the constraint
216
- matrix and upper and lower bounds on variables and constraints, plus row
217
- and column solutions, reduced costs, and status. There's also a set of
218
- arrays holding the original row and column numbers.
219
-
220
- As presolve and postsolve transform the matrix, it will occasionally be
221
- necessary to expand the number of entries in a column. There are two
222
- aspects:
223
- <ul>
224
- <li> During postsolve, the constraint system is expected to grow as
225
- the smaller presolved system is transformed back to the original
226
- system.
227
- <li> During both pre- and postsolve, transforms can increase the number
228
- of coefficients in a row or column. (See the
229
- variable substitution, doubleton, and tripleton transforms.)
230
- </ul>
231
-
232
- The first is addressed by the members #ncols0_, #nrows0_, and #nelems0_.
233
- These should be set (via constructor parameters) to values large enough
234
- for the largest size taken on by the constraint system. Typically, this
235
- will be the size of the original constraint system.
236
-
237
- The second is addressed by a generous allocation of extra (empty) space
238
- for the arrays used to hold coefficients and row indices. When columns
239
- must be expanded, they are moved into the empty space. When it is used up,
240
- the arrays are compacted. When compaction fails to produce sufficient
241
- space, presolve/postsolve will fail.
242
-
243
- CoinPrePostsolveMatrix isn't really intended to be used `bare' --- the
244
- expectation is that it'll be used through CoinPresolveMatrix or
245
- CoinPostsolveMatrix. Some of the functions needed to load a problem are
246
- defined in the derived classes.
247
-
248
- When CoinPresolve is applied when reoptimising, we need to be prepared to
249
- accept a basis and modify it in step with the presolve actions (otherwise
250
- we throw away all the advantages of warm start for reoptimization). But
251
- other solution components (#acts_, #rowduals_, #sol_, and #rcosts_) are
252
- needed only for postsolve, where they're used in places to determine the
253
- proper action(s) when restoring rows or columns. If presolve is provided
254
- with a solution, it will modify it in step with the presolve actions.
255
- Moving the solution components from CoinPrePostsolveMatrix to
256
- CoinPostsolveMatrix would break a lot of code. It's not clear that it's
257
- worth it, and it would preclude upgrades to the presolve side that might
258
- make use of any of these. -- lh, 080501 --
259
-
260
- The constructors that take an OSI or ClpSimplex as a parameter really should
261
- not be here, but for historical reasons they will likely remain for the
262
- forseeable future. -- lh, 111202 --
263
- */
264
-
265
- class CoinPrePostsolveMatrix
266
- {
267
- public:
268
-
269
- /*! \name Constructors & Destructors */
270
-
271
- //@{
272
- /*! \brief `Native' constructor
273
-
274
- This constructor creates an empty object which must then be loaded. On
275
- the other hand, it doesn't assume that the client is an
276
- OsiSolverInterface.
277
- */
278
- CoinPrePostsolveMatrix(int ncols_alloc, int nrows_alloc,
279
- CoinBigIndex nelems_alloc) ;
280
-
281
- /*! \brief Generic OSI constructor
282
-
283
- See OSI code for the definition.
284
- */
285
- CoinPrePostsolveMatrix(const OsiSolverInterface * si,
286
- int ncols_,
287
- int nrows_,
288
- CoinBigIndex nelems_);
289
-
290
- /*! ClpOsi constructor
291
-
292
- See Clp code for the definition.
293
- */
294
- CoinPrePostsolveMatrix(const ClpSimplex * si,
295
- int ncols_,
296
- int nrows_,
297
- CoinBigIndex nelems_,
298
- double bulkRatio);
299
-
300
- /// Destructor
301
- ~CoinPrePostsolveMatrix();
302
- //@}
303
-
304
- /*! \brief Enum for status of various sorts
305
-
306
- Matches CoinWarmStartBasis::Status and adds superBasic. Most code that
307
- converts between CoinPrePostsolveMatrix::Status and
308
- CoinWarmStartBasis::Status will break if this correspondence is broken.
309
-
310
- superBasic is an unresolved problem: there's no analogue in
311
- CoinWarmStartBasis::Status.
312
- */
313
- enum Status {
314
- isFree = 0x00,
315
- basic = 0x01,
316
- atUpperBound = 0x02,
317
- atLowerBound = 0x03,
318
- superBasic = 0x04
319
- };
320
-
321
- /*! \name Functions to work with variable status
322
-
323
- Functions to work with the CoinPrePostsolveMatrix::Status enum and
324
- related vectors.
325
-
326
- \todo
327
- Why are we futzing around with three bit status? A holdover from the
328
- packed arrays of CoinWarmStartBasis? Big swaths of the presolve code
329
- manipulates colstat_ and rowstat_ as unsigned char arrays using simple
330
- assignment to set values.
331
- */
332
- //@{
333
-
334
- /// Set row status (<i>i.e.</i>, status of artificial for this row)
335
- inline void setRowStatus(int sequence, Status status)
336
- {
337
- unsigned char & st_byte = rowstat_[sequence];
338
- st_byte = static_cast<unsigned char>(st_byte & (~7)) ;
339
- st_byte = static_cast<unsigned char>(st_byte | status) ;
340
- }
341
- /// Get row status
342
- inline Status getRowStatus(int sequence) const
343
- {return static_cast<Status> (rowstat_[sequence]&7);}
344
- /// Check if artificial for this row is basic
345
- inline bool rowIsBasic(int sequence) const
346
- {return (static_cast<Status> (rowstat_[sequence]&7)==basic);}
347
- /// Set column status (<i>i.e.</i>, status of primal variable)
348
- inline void setColumnStatus(int sequence, Status status)
349
- {
350
- unsigned char & st_byte = colstat_[sequence];
351
- st_byte = static_cast<unsigned char>(st_byte & (~7)) ;
352
- st_byte = static_cast<unsigned char>(st_byte | status) ;
353
-
354
- # ifdef PRESOLVE_DEBUG
355
- switch (status)
356
- { case isFree:
357
- { if (clo_[sequence] > -PRESOLVE_INF || cup_[sequence] < PRESOLVE_INF)
358
- { std::cout << "Bad status: Var " << sequence
359
- << " isFree, lb = " << clo_[sequence]
360
- << ", ub = " << cup_[sequence] << std::endl ; }
361
- break ; }
362
- case basic:
363
- { break ; }
364
- case atUpperBound:
365
- { if (cup_[sequence] >= PRESOLVE_INF)
366
- { std::cout << "Bad status: Var " << sequence
367
- << " atUpperBound, lb = " << clo_[sequence]
368
- << ", ub = " << cup_[sequence] << std::endl ; }
369
- break ; }
370
- case atLowerBound:
371
- { if (clo_[sequence] <= -PRESOLVE_INF)
372
- { std::cout << "Bad status: Var " << sequence
373
- << " atLowerBound, lb = " << clo_[sequence]
374
- << ", ub = " << cup_[sequence] << std::endl ; }
375
- break ; }
376
- case superBasic:
377
- { if (clo_[sequence] <= -PRESOLVE_INF && cup_[sequence] >= PRESOLVE_INF)
378
- { std::cout << "Bad status: Var " << sequence
379
- << " superBasic, lb = " << clo_[sequence]
380
- << ", ub = " << cup_[sequence] << std::endl ; }
381
- break ; }
382
- default:
383
- { assert(false) ;
384
- break ; } }
385
- # endif
386
- }
387
- /// Get column (structural variable) status
388
- inline Status getColumnStatus(int sequence) const
389
- {return static_cast<Status> (colstat_[sequence]&7);}
390
- /// Check if column (structural variable) is basic
391
- inline bool columnIsBasic(int sequence) const
392
- {return (static_cast<Status> (colstat_[sequence]&7)==basic);}
393
- /*! \brief Set status of row (artificial variable) to the correct nonbasic
394
- status given bounds and current value
395
- */
396
- void setRowStatusUsingValue(int iRow);
397
- /*! \brief Set status of column (structural variable) to the correct
398
- nonbasic status given bounds and current value
399
- */
400
- void setColumnStatusUsingValue(int iColumn);
401
- /*! \brief Set column (structural variable) status vector */
402
- void setStructuralStatus(const char *strucStatus, int lenParam) ;
403
- /*! \brief Set row (artificial variable) status vector */
404
- void setArtificialStatus(const char *artifStatus, int lenParam) ;
405
- /*! \brief Set the status of all variables from a basis */
406
- void setStatus(const CoinWarmStartBasis *basis) ;
407
- /*! \brief Get status in the form of a CoinWarmStartBasis */
408
- CoinWarmStartBasis *getStatus() ;
409
- /*! \brief Return a print string for status of a column (structural
410
- variable)
411
- */
412
- const char *columnStatusString(int j) const ;
413
- /*! \brief Return a print string for status of a row (artificial
414
- variable)
415
- */
416
- const char *rowStatusString(int i) const ;
417
- //@}
418
-
419
- /*! \name Functions to load problem and solution information
420
-
421
- These functions can be used to load portions of the problem definition
422
- and solution. See also the CoinPresolveMatrix and CoinPostsolveMatrix
423
- classes.
424
- */
425
- //@{
426
- /// Set the objective function offset for the original system.
427
- void setObjOffset(double offset) ;
428
- /*! \brief Set the objective sense (max/min)
429
-
430
- Coded as 1.0 for min, -1.0 for max.
431
- Yes, there's a method, and a matching attribute. No, you really
432
- don't want to set this to maximise.
433
- */
434
- void setObjSense(double objSense) ;
435
- /// Set the primal feasibility tolerance
436
- void setPrimalTolerance(double primTol) ;
437
- /// Set the dual feasibility tolerance
438
- void setDualTolerance(double dualTol) ;
439
- /// Set column lower bounds
440
- void setColLower(const double *colLower, int lenParam) ;
441
- /// Set column upper bounds
442
- void setColUpper(const double *colUpper, int lenParam) ;
443
- /// Set column solution
444
- void setColSolution(const double *colSol, int lenParam) ;
445
- /// Set objective coefficients
446
- void setCost(const double *cost, int lenParam) ;
447
- /// Set reduced costs
448
- void setReducedCost(const double *redCost, int lenParam) ;
449
- /// Set row lower bounds
450
- void setRowLower(const double *rowLower, int lenParam) ;
451
- /// Set row upper bounds
452
- void setRowUpper(const double *rowUpper, int lenParam) ;
453
- /// Set row solution
454
- void setRowPrice(const double *rowSol, int lenParam) ;
455
- /// Set row activity
456
- void setRowActivity(const double *rowAct, int lenParam) ;
457
- //@}
458
-
459
- /*! \name Functions to retrieve problem and solution information */
460
- //@{
461
- /// Get current number of columns
462
- inline int getNumCols() const
463
- { return (ncols_) ; }
464
- /// Get current number of rows
465
- inline int getNumRows() const
466
- { return (nrows_) ; }
467
- /// Get current number of non-zero coefficients
468
- inline int getNumElems() const
469
- { return (nelems_) ; }
470
- /// Get column start vector for column-major packed matrix
471
- inline const CoinBigIndex *getColStarts() const
472
- { return (mcstrt_) ; }
473
- /// Get column length vector for column-major packed matrix
474
- inline const int *getColLengths() const
475
- { return (hincol_) ; }
476
- /// Get vector of row indices for column-major packed matrix
477
- inline const int *getRowIndicesByCol() const
478
- { return (hrow_) ; }
479
- /// Get vector of elements for column-major packed matrix
480
- inline const double *getElementsByCol() const
481
- { return (colels_) ; }
482
- /// Get column lower bounds
483
- inline const double *getColLower() const
484
- { return (clo_) ; }
485
- /// Get column upper bounds
486
- inline const double *getColUpper() const
487
- { return (cup_) ; }
488
- /// Get objective coefficients
489
- inline const double *getCost() const
490
- { return (cost_) ; }
491
- /// Get row lower bounds
492
- inline const double *getRowLower() const
493
- { return (rlo_) ; }
494
- /// Get row upper bounds
495
- inline const double *getRowUpper() const
496
- { return (rup_) ; }
497
- /// Get column solution (primal variable values)
498
- inline const double *getColSolution() const
499
- { return (sol_) ; }
500
- /// Get row activity (constraint lhs values)
501
- inline const double *getRowActivity() const
502
- { return (acts_) ; }
503
- /// Get row solution (dual variables)
504
- inline const double *getRowPrice() const
505
- { return (rowduals_) ; }
506
- /// Get reduced costs
507
- inline const double *getReducedCost() const
508
- { return (rcosts_) ; }
509
- /// Count empty columns
510
- inline int countEmptyCols()
511
- { int empty = 0 ;
512
- for (int i = 0 ; i < ncols_ ; i++) if (hincol_[i] == 0) empty++ ;
513
- return (empty) ; }
514
- //@}
515
-
516
-
517
- /*! \name Message handling */
518
- //@{
519
- /// Return message handler
520
- inline CoinMessageHandler *messageHandler() const
521
- { return handler_; }
522
- /*! \brief Set message handler
523
-
524
- The client retains responsibility for the handler --- it will not be
525
- destroyed with the \c CoinPrePostsolveMatrix object.
526
- */
527
- inline void setMessageHandler(CoinMessageHandler *handler)
528
- { if (defaultHandler_ == true)
529
- { delete handler_ ;
530
- defaultHandler_ = false ; }
531
- handler_ = handler ; }
532
- /// Return messages
533
- inline CoinMessages messages() const
534
- { return messages_; }
535
- //@}
536
-
537
- /*! \name Current and Allocated Size
538
-
539
- During pre- and postsolve, the matrix will change in size. During presolve
540
- it will shrink; during postsolve it will grow. Hence there are two sets of
541
- size variables, one for the current size and one for the allocated size.
542
- (See the general comments for the CoinPrePostsolveMatrix class for more
543
- information.)
544
- */
545
- //@{
546
-
547
- /// current number of columns
548
- int ncols_;
549
- /// current number of rows
550
- int nrows_;
551
- /// current number of coefficients
552
- CoinBigIndex nelems_;
553
-
554
- /// Allocated number of columns
555
- int ncols0_;
556
- /// Allocated number of rows
557
- int nrows0_ ;
558
- /// Allocated number of coefficients
559
- CoinBigIndex nelems0_ ;
560
- /*! \brief Allocated size of bulk storage for row indices and coefficients
561
-
562
- This is the space allocated for hrow_ and colels_. This must be large
563
- enough to allow columns to be copied into empty space when they need to
564
- be expanded. For efficiency (to minimize the number of times the
565
- representation must be compressed) it's recommended that this be at least
566
- 2*nelems0_.
567
- */
568
- CoinBigIndex bulk0_ ;
569
- /// Ratio of bulk0_ to nelems0_; default is 2.
570
- double bulkRatio_;
571
- //@}
572
-
573
- /*! \name Problem representation
574
-
575
- The matrix is the common column-major format: A pair of vectors with
576
- positional correspondence to hold coefficients and row indices, and a
577
- second pair of vectors giving the starting position and length of each
578
- column in the first pair.
579
- */
580
- //@{
581
- /// Vector of column start positions in #hrow_, #colels_
582
- CoinBigIndex *mcstrt_;
583
- /// Vector of column lengths
584
- int *hincol_;
585
- /// Row indices (positional correspondence with #colels_)
586
- int *hrow_;
587
- /// Coefficients (positional correspondence with #hrow_)
588
- double *colels_;
589
-
590
- /// Objective coefficients
591
- double *cost_;
592
- /// Original objective offset
593
- double originalOffset_;
594
-
595
- /// Column (primal variable) lower bounds
596
- double *clo_;
597
- /// Column (primal variable) upper bounds
598
- double *cup_;
599
-
600
- /// Row (constraint) lower bounds
601
- double *rlo_;
602
- /// Row (constraint) upper bounds
603
- double *rup_;
604
-
605
- /*! \brief Original column numbers
606
-
607
- Over the current range of column numbers in the presolved problem,
608
- the entry for column j will contain the index of the corresponding
609
- column in the original problem.
610
- */
611
- int * originalColumn_;
612
- /*! \brief Original row numbers
613
-
614
- Over the current range of row numbers in the presolved problem, the
615
- entry for row i will contain the index of the corresponding row in
616
- the original problem.
617
- */
618
- int * originalRow_;
619
-
620
- /// Primal feasibility tolerance
621
- double ztolzb_;
622
- /// Dual feasibility tolerance
623
- double ztoldj_;
624
-
625
- /*! \brief Maximization/minimization
626
-
627
- Yes, there's a variable here. No, you really don't want to set this to
628
- maximise. See the main notes for CoinPresolveMatrix.
629
- */
630
- double maxmin_;
631
- //@}
632
-
633
- /*! \name Problem solution information
634
-
635
- The presolve phase will work without any solution information
636
- (appropriate for initial optimisation) or with solution information
637
- (appropriate for reoptimisation). When solution information is supplied,
638
- presolve will maintain it to the best of its ability. #colstat_ is
639
- checked to determine the presence/absence of status information. #sol_ is
640
- checked for primal solution information, and #rowduals_ for dual solution
641
- information.
642
-
643
- The postsolve phase requires the complete solution information from the
644
- presolved problem (status, primal and dual solutions). It will be
645
- transformed into a correct solution for the original problem.
646
- */
647
- //@{
648
- /*! \brief Vector of primal variable values
649
-
650
- If #sol_ exists, it is assumed that primal solution information should be
651
- updated and that #acts_ also exists.
652
- */
653
- double *sol_;
654
- /*! \brief Vector of dual variable values
655
-
656
- If #rowduals_ exists, it is assumed that dual solution information should
657
- be updated and that #rcosts_ also exists.
658
- */
659
- double *rowduals_;
660
- /*! \brief Vector of constraint left-hand-side values (row activity)
661
-
662
- Produced by evaluating constraints according to #sol_. Updated iff
663
- #sol_ exists.
664
- */
665
- double *acts_;
666
- /*! \brief Vector of reduced costs
667
-
668
- Produced by evaluating dual constraints according to #rowduals_. Updated
669
- iff #rowduals_ exists.
670
- */
671
- double *rcosts_;
672
-
673
- /*! \brief Status of primal variables
674
-
675
- Coded with CoinPrePostSolveMatrix::Status, one code per char. colstat_ and
676
- #rowstat_ <b>MUST</b> be allocated as a single vector. This is to maintain
677
- compatibility with ClpPresolve and OsiPresolve, which do it this way.
678
- */
679
- unsigned char *colstat_;
680
-
681
- /*! \brief Status of constraints
682
-
683
- More accurately, the status of the logical variable associated with the
684
- constraint. Coded with CoinPrePostSolveMatrix::Status, one code per char.
685
- Note that this must be allocated as a single vector with #colstat_.
686
- */
687
- unsigned char *rowstat_;
688
- //@}
689
-
690
- /*! \name Message handling
691
-
692
- Uses the standard COIN approach: a default handler is installed, and the
693
- CoinPrePostsolveMatrix object takes responsibility for it. If the client
694
- replaces the handler with one of their own, it becomes their
695
- responsibility.
696
- */
697
- //@{
698
- /// Message handler
699
- CoinMessageHandler *handler_;
700
- /// Indicates if the current #handler_ is default (true) or not (false).
701
- bool defaultHandler_;
702
- /// Standard COIN messages
703
- CoinMessage messages_;
704
- //@}
705
-
706
- };
707
-
708
- /*! \relates CoinPrePostsolveMatrix
709
- \brief Generate a print string for a status code.
710
- */
711
- const char *statusName (CoinPrePostsolveMatrix::Status status) ;
712
-
713
-
714
- /*! \class presolvehlink
715
- \brief Links to aid in packed matrix modification
716
-
717
- Currently, the matrices held by the CoinPrePostsolveMatrix and
718
- CoinPresolveMatrix objects are represented in the same way as a
719
- CoinPackedMatrix. In the course of presolve and postsolve transforms, it
720
- will happen that a major-dimension vector needs to increase in size. In
721
- order to check whether there is enough room to add another coefficient in
722
- place, it helps to know the next vector (in memory order) in the bulk
723
- storage area. To do that, a linked list of major-dimension vectors is
724
- maintained; the "pre" and "suc" fields give the previous and next vector,
725
- in memory order (that is, the vector whose mcstrt_ or mrstrt_ entry is
726
- next smaller or larger).
727
-
728
- Consider a column-major matrix with ncols columns. By definition,
729
- presolvehlink[ncols].pre points to the column in the last occupied
730
- position of the bulk storage arrays. There is no easy way to find the
731
- column which occupies the first position (there is no presolvehlink[-1] to
732
- consult). If the column that initially occupies the first position is
733
- moved for expansion, there is no way to reclaim the space until the bulk
734
- storage is compacted. The same holds for the last and first rows of a
735
- row-major matrix, of course.
736
- */
737
-
738
- class presolvehlink
739
- { public:
740
- int pre, suc;
741
- } ;
742
-
743
- #define NO_LINK -66666666
744
-
745
- /*! \relates presolvehlink
746
- \brief unlink vector i
747
-
748
- Remove vector i from the ordering.
749
- */
750
- inline void PRESOLVE_REMOVE_LINK(presolvehlink *link, int i)
751
- {
752
- int ipre = link[i].pre;
753
- int isuc = link[i].suc;
754
- if (ipre >= 0) {
755
- link[ipre].suc = isuc;
756
- }
757
- if (isuc >= 0) {
758
- link[isuc].pre = ipre;
759
- }
760
- link[i].pre = NO_LINK, link[i].suc = NO_LINK;
761
- }
762
-
763
- /*! \relates presolvehlink
764
- \brief insert vector i after vector j
765
-
766
- Insert vector i between j and j.suc.
767
- */
768
- inline void PRESOLVE_INSERT_LINK(presolvehlink *link, int i, int j)
769
- {
770
- int isuc = link[j].suc;
771
- link[j].suc = i;
772
- link[i].pre = j;
773
- if (isuc >= 0) {
774
- link[isuc].pre = i;
775
- }
776
- link[i].suc = isuc;
777
- }
778
-
779
- /*! \relates presolvehlink
780
- \brief relink vector j in place of vector i
781
-
782
- Replace vector i in the ordering with vector j. This is equivalent to
783
- <pre>
784
- int pre = link[i].pre;
785
- PRESOLVE_REMOVE_LINK(link,i);
786
- PRESOLVE_INSERT_LINK(link,j,pre);
787
- </pre>
788
- But, this routine will work even if i happens to be first in the order.
789
- */
790
- inline void PRESOLVE_MOVE_LINK(presolvehlink *link, int i, int j)
791
- {
792
- int ipre = link[i].pre;
793
- int isuc = link[i].suc;
794
- if (ipre >= 0) {
795
- link[ipre].suc = j;
796
- }
797
- if (isuc >= 0) {
798
- link[isuc].pre = j;
799
- }
800
- link[i].pre = NO_LINK, link[i].suc = NO_LINK;
801
- }
802
-
803
-
804
- /*! \class CoinPresolveMatrix
805
- \brief Augments CoinPrePostsolveMatrix with information about the problem
806
- that is only needed during presolve.
807
-
808
- For problem manipulation, this class adds a row-major matrix
809
- representation, linked lists that allow for easy manipulation of the matrix
810
- when applying presolve transforms, and vectors to track row and column
811
- processing status (changed, needs further processing, change prohibited)
812
-
813
- For problem representation, this class adds information about variable type
814
- (integer or continuous), an objective offset, and a feasibility tolerance.
815
-
816
- <b>NOTE</b> that the #anyInteger_ and #anyProhibited_ flags are independent
817
- of the vectors used to track this information for individual variables
818
- (#integerType_ and #rowChanged_ and #colChanged_, respectively).
819
-
820
- <b>NOTE</b> also that at the end of presolve the column-major and row-major
821
- matrix representations are loosely packed (<i>i.e.</i>, there may be gaps
822
- between columns in the bulk storage arrays).
823
-
824
- <b>NOTE</b> that while you might think that CoinPresolve is prepared to
825
- handle minimisation or maximisation, it's unlikely that this still works.
826
- This is a good thing: better to convert objective coefficients and duals
827
- once, before starting presolve, rather than doing it over and over in
828
- each transform that considers dual variables.
829
-
830
- The constructors that take an OSI or ClpSimplex as a parameter really should
831
- not be here, but for historical reasons they will likely remain for the
832
- forseeable future. -- lh, 111202 --
833
- */
834
-
835
- class CoinPresolveMatrix : public CoinPrePostsolveMatrix
836
- {
837
- public:
838
-
839
- /*! \brief `Native' constructor
840
-
841
- This constructor creates an empty object which must then be loaded.
842
- On the other hand, it doesn't assume that the client is an
843
- OsiSolverInterface.
844
- */
845
- CoinPresolveMatrix(int ncols_alloc, int nrows_alloc,
846
- CoinBigIndex nelems_alloc) ;
847
-
848
- /*! \brief Clp OSI constructor
849
-
850
- See Clp code for the definition.
851
- */
852
- CoinPresolveMatrix(int ncols0,
853
- double maxmin,
854
- // end prepost members
855
-
856
- ClpSimplex * si,
857
-
858
- // rowrep
859
- int nrows,
860
- CoinBigIndex nelems,
861
- bool doStatus,
862
- double nonLinearVariable,
863
- double bulkRatio);
864
-
865
- /*! \brief Update the model held by a Clp OSI */
866
- void update_model(ClpSimplex * si,
867
- int nrows0,
868
- int ncols0,
869
- CoinBigIndex nelems0);
870
- /*! \brief Generic OSI constructor
871
-
872
- See OSI code for the definition.
873
- */
874
- CoinPresolveMatrix(int ncols0,
875
- double maxmin,
876
- // end prepost members
877
- OsiSolverInterface * si,
878
- // rowrep
879
- int nrows,
880
- CoinBigIndex nelems,
881
- bool doStatus,
882
- double nonLinearVariable,
883
- const char * prohibited,
884
- const char * rowProhibited=NULL);
885
-
886
- /*! \brief Update the model held by a generic OSI */
887
- void update_model(OsiSolverInterface * si,
888
- int nrows0,
889
- int ncols0,
890
- CoinBigIndex nelems0);
891
-
892
- /// Destructor
893
- ~CoinPresolveMatrix();
894
-
895
- /*! \brief Initialize a CoinPostsolveMatrix object, destroying the
896
- CoinPresolveMatrix object.
897
-
898
- See CoinPostsolveMatrix::assignPresolveToPostsolve.
899
- */
900
- friend void assignPresolveToPostsolve (CoinPresolveMatrix *&preObj) ;
901
-
902
- /*! \name Functions to load the problem representation
903
- */
904
- //@{
905
- /*! \brief Load the cofficient matrix.
906
-
907
- Load the coefficient matrix before loading the other vectors (bounds,
908
- objective, variable type) required to define the problem.
909
- */
910
- void setMatrix(const CoinPackedMatrix *mtx) ;
911
-
912
- /// Count number of empty rows
913
- inline int countEmptyRows()
914
- { int empty = 0 ;
915
- for (int i = 0 ; i < nrows_ ; i++) if (hinrow_[i] == 0) empty++ ;
916
- return (empty) ; }
917
-
918
- /*! \brief Set variable type information for a single variable
919
-
920
- Set \p variableType to 0 for continous, 1 for integer.
921
- Does not manipulate the #anyInteger_ flag.
922
- */
923
- inline void setVariableType(int i, int variableType)
924
- { if (integerType_ == 0) integerType_ = new unsigned char [ncols0_] ;
925
- integerType_[i] = static_cast<unsigned char>(variableType) ; }
926
-
927
- /*! \brief Set variable type information for all variables
928
-
929
- Set \p variableType[i] to 0 for continuous, 1 for integer.
930
- Does not manipulate the #anyInteger_ flag.
931
- */
932
- void setVariableType(const unsigned char *variableType, int lenParam) ;
933
-
934
- /*! \brief Set the type of all variables
935
-
936
- allIntegers should be true to set the type to integer, false to set the
937
- type to continuous.
938
- */
939
- void setVariableType (bool allIntegers, int lenParam) ;
940
-
941
- /// Set a flag for presence (true) or absence (false) of integer variables
942
- inline void setAnyInteger (bool anyInteger = true)
943
- { anyInteger_ = anyInteger ; }
944
- //@}
945
-
946
- /*! \name Functions to retrieve problem information
947
- */
948
- //@{
949
-
950
- /// Get row start vector for row-major packed matrix
951
- inline const CoinBigIndex *getRowStarts() const
952
- { return (mrstrt_) ; }
953
- /// Get vector of column indices for row-major packed matrix
954
- inline const int *getColIndicesByRow() const
955
- { return (hcol_) ; }
956
- /// Get vector of elements for row-major packed matrix
957
- inline const double *getElementsByRow() const
958
- { return (rowels_) ; }
959
-
960
- /*! \brief Check for integrality of the specified variable.
961
-
962
- Consults the #integerType_ vector if present; fallback is the
963
- #anyInteger_ flag.
964
- */
965
- inline bool isInteger (int i) const
966
- { if (integerType_ == 0)
967
- { return (anyInteger_) ; }
968
- else
969
- if (integerType_[i] == 1)
970
- { return (true) ; }
971
- else
972
- { return (false) ; } }
973
-
974
- /*! \brief Check if there are any integer variables
975
-
976
- Consults the #anyInteger_ flag
977
- */
978
- inline bool anyInteger () const
979
- { return (anyInteger_) ; }
980
- /// Picks up any special options
981
- inline int presolveOptions() const
982
- { return presolveOptions_;}
983
- /// Sets any special options (see #presolveOptions_)
984
- inline void setPresolveOptions(int value)
985
- { presolveOptions_=value;}
986
- //@}
987
-
988
- /*! \name Matrix storage management links
989
-
990
- Linked lists, modelled after the linked lists used in OSL
991
- factorization. They are used for management of the bulk coefficient
992
- and minor index storage areas.
993
- */
994
- //@{
995
- /// Linked list for the column-major representation.
996
- presolvehlink *clink_;
997
- /// Linked list for the row-major representation.
998
- presolvehlink *rlink_;
999
- //@}
1000
-
1001
- /// Objective function offset introduced during presolve
1002
- double dobias_ ;
1003
-
1004
- /// Adjust objective function constant offset
1005
- inline void change_bias(double change_amount)
1006
- {
1007
- dobias_ += change_amount ;
1008
- # if PRESOLVE_DEBUG > 2
1009
- assert(fabs(change_amount)<1.0e50) ;
1010
- if (change_amount)
1011
- PRESOLVE_STMT(printf("changing bias by %g to %g\n",
1012
- change_amount, dobias_)) ;
1013
- # endif
1014
- }
1015
-
1016
- /*! \name Row-major representation
1017
-
1018
- Common row-major format: A pair of vectors with positional
1019
- correspondence to hold coefficients and column indices, and a second pair
1020
- of vectors giving the starting position and length of each row in
1021
- the first pair.
1022
- */
1023
- //@{
1024
- /// Vector of row start positions in #hcol, #rowels_
1025
- CoinBigIndex *mrstrt_;
1026
- /// Vector of row lengths
1027
- int *hinrow_;
1028
- /// Coefficients (positional correspondence with #hcol_)
1029
- double *rowels_;
1030
- /// Column indices (positional correspondence with #rowels_)
1031
- int *hcol_;
1032
- //@}
1033
-
1034
- /// Tracks integrality of columns (1 for integer, 0 for continuous)
1035
- unsigned char *integerType_;
1036
- /*! \brief Flag to say if any variables are integer
1037
-
1038
- Note that this flag is <i>not</i> manipulated by the various
1039
- \c setVariableType routines.
1040
- */
1041
- bool anyInteger_ ;
1042
- /// Print statistics for tuning
1043
- bool tuning_;
1044
- /// Say we want statistics - also set time
1045
- void statistics();
1046
- /// Start time of presolve
1047
- double startTime_;
1048
-
1049
- /// Bounds can be moved by this to retain feasibility
1050
- double feasibilityTolerance_;
1051
- /// Return feasibility tolerance
1052
- inline double feasibilityTolerance()
1053
- { return (feasibilityTolerance_) ; }
1054
- /// Set feasibility tolerance
1055
- inline void setFeasibilityTolerance (double val)
1056
- { feasibilityTolerance_ = val ; }
1057
-
1058
- /*! \brief Output status: 0 = feasible, 1 = infeasible, 2 = unbounded
1059
-
1060
- Actually implemented as single bit flags: 1^0 = infeasible, 1^1 =
1061
- unbounded.
1062
- */
1063
- int status_;
1064
- /// Returns problem status (0 = feasible, 1 = infeasible, 2 = unbounded)
1065
- inline int status()
1066
- { return (status_) ; }
1067
- /// Set problem status
1068
- inline void setStatus(int status)
1069
- { status_ = (status&0x3) ; }
1070
-
1071
- /*! \brief Presolve pass number
1072
-
1073
- Should be incremented externally by the method controlling application of
1074
- presolve transforms.
1075
- Used to control the execution of testRedundant (evoked by the
1076
- implied_free transform).
1077
- */
1078
- int pass_;
1079
- /// Set pass number
1080
- inline void setPass (int pass = 0)
1081
- { pass_ = pass ; }
1082
-
1083
- /*! \brief Maximum substitution level
1084
-
1085
- Used to control the execution of subst from implied_free
1086
- */
1087
- int maxSubstLevel_;
1088
- /// Set Maximum substitution level (normally 3)
1089
- inline void setMaximumSubstitutionLevel (int level)
1090
- { maxSubstLevel_ = level ; }
1091
-
1092
-
1093
- /*! \name Row and column processing status
1094
-
1095
- Information used to determine if rows or columns can be changed and
1096
- if they require further processing due to changes.
1097
-
1098
- There are four major lists: the [row,col]ToDo list, and the
1099
- [row,col]NextToDo list. In general, a transform processes entries from
1100
- the ToDo list and adds entries to the NextToDo list.
1101
-
1102
- There are two vectors, [row,col]Changed, which track the status of
1103
- individual rows and columns.
1104
- */
1105
- //@{
1106
- /*! \brief Column change status information
1107
-
1108
- Coded using the following bits:
1109
- <ul>
1110
- <li> 0x01: Column has changed
1111
- <li> 0x02: preprocessing prohibited
1112
- <li> 0x04: Column has been used
1113
- <li> 0x08: Column originally had infinite ub
1114
- </ul>
1115
- */
1116
- unsigned char * colChanged_;
1117
- /// Input list of columns to process
1118
- int * colsToDo_;
1119
- /// Length of #colsToDo_
1120
- int numberColsToDo_;
1121
- /// Output list of columns to process next
1122
- int * nextColsToDo_;
1123
- /// Length of #nextColsToDo_
1124
- int numberNextColsToDo_;
1125
-
1126
- /*! \brief Row change status information
1127
-
1128
- Coded using the following bits:
1129
- <ul>
1130
- <li> 0x01: Row has changed
1131
- <li> 0x02: preprocessing prohibited
1132
- <li> 0x04: Row has been used
1133
- </ul>
1134
- */
1135
- unsigned char * rowChanged_;
1136
- /// Input list of rows to process
1137
- int * rowsToDo_;
1138
- /// Length of #rowsToDo_
1139
- int numberRowsToDo_;
1140
- /// Output list of rows to process next
1141
- int * nextRowsToDo_;
1142
- /// Length of #nextRowsToDo_
1143
- int numberNextRowsToDo_;
1144
- /*! \brief Fine control over presolve actions
1145
-
1146
- Set/clear the following bits to allow or suppress actions:
1147
- - 0x01 allow duplicate column tests for integer variables
1148
- - 0x02 not used
1149
- - 0x04 set to inhibit x+y+z=1 mods
1150
- - 0x08 not used
1151
- - 0x10 set to allow stuff which won't unroll easily (overlapping
1152
- duplicate rows; opportunistic fixing of variables from bound
1153
- propagation).
1154
- - 0x04000 allow presolve transforms to arbitrarily ignore infeasibility
1155
- and set arbitrary feasible bounds.
1156
- - 0x10000 instructs implied_free_action to be `more lightweight'; will
1157
- return without doing anything after 15 presolve passes.
1158
- - 0x(2,4,6)0000 instructs implied_free_action to remove small created elements
1159
- - 0x80000000 set by presolve to say dupcol_action compressed columns
1160
- */
1161
- int presolveOptions_;
1162
- /*! Flag to say if any rows or columns are marked as prohibited
1163
-
1164
- Note that this flag is <i>not</i> manipulated by any of the
1165
- various \c set*Prohibited routines.
1166
- */
1167
- bool anyProhibited_;
1168
- //@}
1169
-
1170
- /*! \name Scratch work arrays
1171
-
1172
- Preallocated work arrays are useful to avoid having to allocate and free
1173
- work arrays in individual presolve methods.
1174
-
1175
- All are allocated from #setMatrix by #initializeStuff, freed from
1176
- #~CoinPresolveMatrix. You can use #deleteStuff followed by
1177
- #initializeStuff to remove and recreate them.
1178
- */
1179
- //@{
1180
- /// Preallocated scratch work array, 3*nrows_
1181
- int *usefulRowInt_ ;
1182
- /// Preallocated scratch work array, 2*nrows_
1183
- double *usefulRowDouble_ ;
1184
- /// Preallocated scratch work array, 2*ncols_
1185
- int *usefulColumnInt_ ;
1186
- /// Preallocated scratch work array, ncols_
1187
- double *usefulColumnDouble_ ;
1188
- /// Array of random numbers (max row,column)
1189
- double *randomNumber_ ;
1190
-
1191
- /// Work array for count of infinite contributions to row lhs upper bound
1192
- int *infiniteUp_ ;
1193
- /// Work array for sum of finite contributions to row lhs upper bound
1194
- double *sumUp_ ;
1195
- /// Work array for count of infinite contributions to row lhs lower bound
1196
- int *infiniteDown_ ;
1197
- /// Work array for sum of finite contributions to row lhs lower bound
1198
- double *sumDown_ ;
1199
- //@}
1200
-
1201
- /*! \brief Recompute row lhs bounds
1202
-
1203
- Calculate finite contributions to row lhs upper and lower bounds
1204
- and count infinite contributions. Returns the number of rows found
1205
- to be infeasible.
1206
-
1207
- If \p whichRow < 0, bounds are recomputed for all rows.
1208
-
1209
- As of 110611, this seems to be a work in progress in the sense that it's
1210
- barely used by the existing presolve code.
1211
- */
1212
- int recomputeSums(int whichRow) ;
1213
-
1214
- /// Allocate scratch arrays
1215
- void initializeStuff() ;
1216
- /// Free scratch arrays
1217
- void deleteStuff() ;
1218
-
1219
- /*! \name Functions to manipulate row and column processing status */
1220
- //@{
1221
-
1222
- /*! \brief Initialise the column ToDo lists
1223
-
1224
- Places all columns in the #colsToDo_ list except for columns marked
1225
- as prohibited (<i>viz.</i> #colChanged_).
1226
- */
1227
- void initColsToDo () ;
1228
-
1229
- /*! \brief Step column ToDo lists
1230
-
1231
- Moves columns on the #nextColsToDo_ list to the #colsToDo_ list, emptying
1232
- #nextColsToDo_. Returns the number of columns transferred.
1233
- */
1234
- int stepColsToDo () ;
1235
-
1236
- /// Return the number of columns on the #colsToDo_ list
1237
- inline int numberColsToDo()
1238
- { return (numberColsToDo_) ; }
1239
-
1240
- /// Has column been changed?
1241
- inline bool colChanged(int i) const {
1242
- return (colChanged_[i]&1)!=0;
1243
- }
1244
- /// Mark column as not changed
1245
- inline void unsetColChanged(int i) {
1246
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] & (~1)) ;
1247
- }
1248
- /// Mark column as changed.
1249
- inline void setColChanged(int i) {
1250
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] | (1)) ;
1251
- }
1252
- /// Mark column as changed and add to list of columns to process next
1253
- inline void addCol(int i) {
1254
- if ((colChanged_[i]&1)==0) {
1255
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] | (1)) ;
1256
- nextColsToDo_[numberNextColsToDo_++] = i;
1257
- }
1258
- }
1259
- /// Test if column is eligible for preprocessing
1260
- inline bool colProhibited(int i) const {
1261
- return (colChanged_[i]&2)!=0;
1262
- }
1263
- /*! \brief Test if column is eligible for preprocessing
1264
-
1265
- The difference between this method and #colProhibited() is that this
1266
- method first tests #anyProhibited_ before examining the specific entry
1267
- for the specified column.
1268
- */
1269
- inline bool colProhibited2(int i) const {
1270
- if (!anyProhibited_)
1271
- return false;
1272
- else
1273
- return (colChanged_[i]&2)!=0;
1274
- }
1275
- /// Mark column as ineligible for preprocessing
1276
- inline void setColProhibited(int i) {
1277
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] | (2)) ;
1278
- }
1279
- /*! \brief Test if column is marked as used
1280
-
1281
- This is for doing faster lookups to see where two columns have entries
1282
- in common.
1283
- */
1284
- inline bool colUsed(int i) const {
1285
- return (colChanged_[i]&4)!=0;
1286
- }
1287
- /// Mark column as used
1288
- inline void setColUsed(int i) {
1289
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] | (4)) ;
1290
- }
1291
- /// Mark column as unused
1292
- inline void unsetColUsed(int i) {
1293
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] & (~4)) ;
1294
- }
1295
- /// Has column infinite ub (originally)
1296
- inline bool colInfinite(int i) const {
1297
- return (colChanged_[i]&8)!=0;
1298
- }
1299
- /// Mark column as not infinite ub (originally)
1300
- inline void unsetColInfinite(int i) {
1301
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] & (~8)) ;
1302
- }
1303
- /// Mark column as infinite ub (originally)
1304
- inline void setColInfinite(int i) {
1305
- colChanged_[i] = static_cast<unsigned char>(colChanged_[i] | (8)) ;
1306
- }
1307
-
1308
- /*! \brief Initialise the row ToDo lists
1309
-
1310
- Places all rows in the #rowsToDo_ list except for rows marked
1311
- as prohibited (<i>viz.</i> #rowChanged_).
1312
- */
1313
- void initRowsToDo () ;
1314
-
1315
- /*! \brief Step row ToDo lists
1316
-
1317
- Moves rows on the #nextRowsToDo_ list to the #rowsToDo_ list, emptying
1318
- #nextRowsToDo_. Returns the number of rows transferred.
1319
- */
1320
- int stepRowsToDo () ;
1321
-
1322
- /// Return the number of rows on the #rowsToDo_ list
1323
- inline int numberRowsToDo()
1324
- { return (numberRowsToDo_) ; }
1325
-
1326
- /// Has row been changed?
1327
- inline bool rowChanged(int i) const {
1328
- return (rowChanged_[i]&1)!=0;
1329
- }
1330
- /// Mark row as not changed
1331
- inline void unsetRowChanged(int i) {
1332
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] & (~1)) ;
1333
- }
1334
- /// Mark row as changed
1335
- inline void setRowChanged(int i) {
1336
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] | (1)) ;
1337
- }
1338
- /// Mark row as changed and add to list of rows to process next
1339
- inline void addRow(int i) {
1340
- if ((rowChanged_[i]&1)==0) {
1341
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] | (1)) ;
1342
- nextRowsToDo_[numberNextRowsToDo_++] = i;
1343
- }
1344
- }
1345
- /// Test if row is eligible for preprocessing
1346
- inline bool rowProhibited(int i) const {
1347
- return (rowChanged_[i]&2)!=0;
1348
- }
1349
- /*! \brief Test if row is eligible for preprocessing
1350
-
1351
- The difference between this method and #rowProhibited() is that this
1352
- method first tests #anyProhibited_ before examining the specific entry
1353
- for the specified row.
1354
- */
1355
- inline bool rowProhibited2(int i) const {
1356
- if (!anyProhibited_)
1357
- return false;
1358
- else
1359
- return (rowChanged_[i]&2)!=0;
1360
- }
1361
- /// Mark row as ineligible for preprocessing
1362
- inline void setRowProhibited(int i) {
1363
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] | (2)) ;
1364
- }
1365
- /*! \brief Test if row is marked as used
1366
-
1367
- This is for doing faster lookups to see where two rows have entries
1368
- in common. It can be used anywhere as long as it ends up zeroed out.
1369
- */
1370
- inline bool rowUsed(int i) const {
1371
- return (rowChanged_[i]&4)!=0;
1372
- }
1373
- /// Mark row as used
1374
- inline void setRowUsed(int i) {
1375
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] | (4)) ;
1376
- }
1377
- /// Mark row as unused
1378
- inline void unsetRowUsed(int i) {
1379
- rowChanged_[i] = static_cast<unsigned char>(rowChanged_[i] & (~4)) ;
1380
- }
1381
-
1382
-
1383
- /// Check if there are any prohibited rows or columns
1384
- inline bool anyProhibited() const
1385
- { return anyProhibited_;}
1386
- /// Set a flag for presence of prohibited rows or columns
1387
- inline void setAnyProhibited(bool val = true)
1388
- { anyProhibited_ = val ; }
1389
- //@}
1390
-
1391
- };
1392
-
1393
- /*! \class CoinPostsolveMatrix
1394
- \brief Augments CoinPrePostsolveMatrix with information about the problem
1395
- that is only needed during postsolve.
1396
-
1397
- The notable point is that the matrix representation is threaded. The
1398
- representation is column-major and starts with the standard two pairs of
1399
- arrays: one pair to hold the row indices and coefficients, the second pair
1400
- to hold the column starting positions and lengths. But the row indices and
1401
- coefficients for a column do not necessarily occupy a contiguous block in
1402
- their respective arrays. Instead, a link array gives the position of the
1403
- next (row index,coefficient) pair. If the row index and value of a
1404
- coefficient a<p,j> occupy position kp in their arrays, then the position of
1405
- the next coefficient a<q,j> is found as kq = link[kp].
1406
-
1407
- This threaded representation allows for efficient expansion of columns as
1408
- rows are reintroduced during postsolve transformations. The basic packed
1409
- structures are allocated to the expected size of the postsolved matrix,
1410
- and as new coefficients are added, their location is simply added to the
1411
- thread for the column.
1412
-
1413
- There is no provision to convert the threaded representation to a packed
1414
- representation. In the context of postsolve, it's not required. (You did
1415
- keep a copy of the original matrix, eh?)
1416
-
1417
- The constructors that take an OSI or ClpSimplex as a parameter really should
1418
- not be here, but for historical reasons they will likely remain for the
1419
- forseeable future. -- lh, 111202 --
1420
- */
1421
- class CoinPostsolveMatrix : public CoinPrePostsolveMatrix
1422
- {
1423
- public:
1424
-
1425
- /*! \brief `Native' constructor
1426
-
1427
- This constructor creates an empty object which must then be loaded.
1428
- On the other hand, it doesn't assume that the client is an
1429
- OsiSolverInterface.
1430
- */
1431
- CoinPostsolveMatrix(int ncols_alloc, int nrows_alloc,
1432
- CoinBigIndex nelems_alloc) ;
1433
-
1434
-
1435
- /*! \brief Clp OSI constructor
1436
-
1437
- See Clp code for the definition.
1438
- */
1439
- CoinPostsolveMatrix(ClpSimplex * si,
1440
-
1441
- int ncols0,
1442
- int nrows0,
1443
- CoinBigIndex nelems0,
1444
-
1445
- double maxmin_,
1446
- // end prepost members
1447
-
1448
- double *sol,
1449
- double *acts,
1450
-
1451
- unsigned char *colstat,
1452
- unsigned char *rowstat);
1453
-
1454
- /*! \brief Generic OSI constructor
1455
-
1456
- See OSI code for the definition.
1457
- */
1458
- CoinPostsolveMatrix(OsiSolverInterface * si,
1459
-
1460
- int ncols0,
1461
- int nrows0,
1462
- CoinBigIndex nelems0,
1463
-
1464
- double maxmin_,
1465
- // end prepost members
1466
-
1467
- double *sol,
1468
- double *acts,
1469
-
1470
- unsigned char *colstat,
1471
- unsigned char *rowstat);
1472
-
1473
- /*! \brief Load an empty CoinPostsolveMatrix from a CoinPresolveMatrix
1474
-
1475
- This routine transfers the contents of the CoinPrePostsolveMatrix
1476
- object from the CoinPresolveMatrix object to the CoinPostsolveMatrix
1477
- object and completes initialisation of the CoinPostsolveMatrix object.
1478
- The empty shell of the CoinPresolveMatrix object is destroyed.
1479
-
1480
- The routine expects an empty CoinPostsolveMatrix object. If handed a loaded
1481
- object, a lot of memory will leak.
1482
- */
1483
- void assignPresolveToPostsolve (CoinPresolveMatrix *&preObj) ;
1484
-
1485
- /// Destructor
1486
- ~CoinPostsolveMatrix();
1487
-
1488
- /*! \name Column thread structures
1489
-
1490
- As mentioned in the class documentation, the entries for a given column
1491
- do not necessarily occupy a contiguous block of space. The #link_ array
1492
- is used to maintain the threading. There is one thread for each column,
1493
- and a single thread for all free entries in #hrow_ and #colels_.
1494
-
1495
- The allocated size of #link_ must be at least as large as the allocated
1496
- size of #hrow_ and #colels_.
1497
- */
1498
- //@{
1499
-
1500
- /*! \brief First entry in free entries thread */
1501
- CoinBigIndex free_list_;
1502
- /// Allocated size of #link_
1503
- int maxlink_;
1504
- /*! \brief Thread array
1505
-
1506
- Within a thread, link_[k] points to the next entry in the thread.
1507
- */
1508
- CoinBigIndex *link_;
1509
-
1510
- //@}
1511
-
1512
- /*! \name Debugging aids
1513
-
1514
- These arrays are allocated only when CoinPresolve is compiled with
1515
- PRESOLVE_DEBUG defined. They hold codes which track the reason that
1516
- a column or row is added to the problem during postsolve.
1517
- */
1518
- //@{
1519
- char *cdone_;
1520
- char *rdone_;
1521
- //@}
1522
-
1523
- /// debug
1524
- void check_nbasic();
1525
-
1526
- };
1527
-
1528
-
1529
- /*! \defgroup MtxManip Presolve Matrix Manipulation Functions
1530
-
1531
- Functions to work with the loosely packed and threaded packed matrix
1532
- structures used during presolve and postsolve.
1533
- */
1534
- //@{
1535
-
1536
- /*! \relates CoinPrePostsolveMatrix
1537
- \brief Initialise linked list for major vector order in bulk storage
1538
- */
1539
-
1540
- void presolve_make_memlists(/*CoinBigIndex *starts,*/ int *lengths,
1541
- presolvehlink *link, int n);
1542
-
1543
- /*! \relates CoinPrePostsolveMatrix
1544
- \brief Make sure a major-dimension vector k has room for one more
1545
- coefficient.
1546
-
1547
- You can use this directly, or use the inline wrappers presolve_expand_col
1548
- and presolve_expand_row
1549
- */
1550
- bool presolve_expand_major(CoinBigIndex *majstrts, double *majels,
1551
- int *minndxs, int *majlens,
1552
- presolvehlink *majlinks, int nmaj, int k) ;
1553
-
1554
- /*! \relates CoinPrePostsolveMatrix
1555
- \brief Make sure a column (colx) in a column-major matrix has room for
1556
- one more coefficient
1557
- */
1558
-
1559
- inline bool presolve_expand_col(CoinBigIndex *mcstrt, double *colels,
1560
- int *hrow, int *hincol,
1561
- presolvehlink *clink, int ncols, int colx)
1562
- { return presolve_expand_major(mcstrt,colels,
1563
- hrow,hincol,clink,ncols,colx) ; }
1564
-
1565
- /*! \relates CoinPrePostsolveMatrix
1566
- \brief Make sure a row (rowx) in a row-major matrix has room for one
1567
- more coefficient
1568
- */
1569
-
1570
- inline bool presolve_expand_row(CoinBigIndex *mrstrt, double *rowels,
1571
- int *hcol, int *hinrow,
1572
- presolvehlink *rlink, int nrows, int rowx)
1573
- { return presolve_expand_major(mrstrt,rowels,
1574
- hcol,hinrow,rlink,nrows,rowx) ; }
1575
-
1576
-
1577
- /*! \relates CoinPrePostsolveMatrix
1578
- \brief Find position of a minor index in a major vector.
1579
-
1580
- The routine returns the position \c k in \p minndxs for the specified
1581
- minor index \p tgt. It will abort if the entry does not exist. Can be
1582
- used directly or via the inline wrappers presolve_find_row and
1583
- presolve_find_col.
1584
- */
1585
- inline CoinBigIndex presolve_find_minor(int tgt,
1586
- CoinBigIndex ks, CoinBigIndex ke,
1587
- const int *minndxs)
1588
- { CoinBigIndex k ;
1589
- for (k = ks ; k < ke ; k++)
1590
- #ifndef NDEBUG
1591
- { if (minndxs[k] == tgt)
1592
- return (k) ; }
1593
- DIE("FIND_MINOR") ;
1594
-
1595
- abort () ; return -1;
1596
- #else
1597
- { if (minndxs[k] == tgt)
1598
- break ; }
1599
- return (k) ;
1600
- #endif
1601
- }
1602
-
1603
- /*! \relates CoinPrePostsolveMatrix
1604
- \brief Find position of a row in a column in a column-major matrix.
1605
-
1606
- The routine returns the position \c k in \p hrow for the specified \p row.
1607
- It will abort if the entry does not exist.
1608
- */
1609
- inline CoinBigIndex presolve_find_row(int row, CoinBigIndex kcs,
1610
- CoinBigIndex kce, const int *hrow)
1611
- { return presolve_find_minor(row,kcs,kce,hrow) ; }
1612
-
1613
- /*! \relates CoinPostsolveMatrix
1614
- \brief Find position of a column in a row in a row-major matrix.
1615
-
1616
- The routine returns the position \c k in \p hcol for the specified \p col.
1617
- It will abort if the entry does not exist.
1618
- */
1619
- inline CoinBigIndex presolve_find_col(int col, CoinBigIndex krs,
1620
- CoinBigIndex kre, const int *hcol)
1621
- { return presolve_find_minor(col,krs,kre,hcol) ; }
1622
-
1623
-
1624
- /*! \relates CoinPrePostsolveMatrix
1625
- \brief Find position of a minor index in a major vector.
1626
-
1627
- The routine returns the position \c k in \p minndxs for the specified
1628
- minor index \p tgt. A return value of \p ke means the entry does not
1629
- exist. Can be used directly or via the inline wrappers
1630
- presolve_find_row1 and presolve_find_col1.
1631
- */
1632
- CoinBigIndex presolve_find_minor1(int tgt, CoinBigIndex ks, CoinBigIndex ke,
1633
- const int *minndxs);
1634
-
1635
- /*! \relates CoinPrePostsolveMatrix
1636
- \brief Find position of a row in a column in a column-major matrix.
1637
-
1638
- The routine returns the position \c k in \p hrow for the specified \p row.
1639
- A return value of \p kce means the entry does not exist.
1640
- */
1641
- inline CoinBigIndex presolve_find_row1(int row, CoinBigIndex kcs,
1642
- CoinBigIndex kce, const int *hrow)
1643
- { return presolve_find_minor1(row,kcs,kce,hrow) ; }
1644
-
1645
- /*! \relates CoinPrePostsolveMatrix
1646
- \brief Find position of a column in a row in a row-major matrix.
1647
-
1648
- The routine returns the position \c k in \p hcol for the specified \p col.
1649
- A return value of \p kre means the entry does not exist.
1650
- */
1651
- inline CoinBigIndex presolve_find_col1(int col, CoinBigIndex krs,
1652
- CoinBigIndex kre, const int *hcol)
1653
- { return presolve_find_minor1(col,krs,kre,hcol) ; }
1654
-
1655
- /*! \relates CoinPostsolveMatrix
1656
- \brief Find position of a minor index in a major vector in a threaded
1657
- matrix.
1658
-
1659
- The routine returns the position \c k in \p minndxs for the specified
1660
- minor index \p tgt. It will abort if the entry does not exist. Can be
1661
- used directly or via the inline wrapper presolve_find_row2.
1662
- */
1663
- CoinBigIndex presolve_find_minor2(int tgt, CoinBigIndex ks, int majlen,
1664
- const int *minndxs,
1665
- const CoinBigIndex *majlinks) ;
1666
-
1667
- /*! \relates CoinPostsolveMatrix
1668
- \brief Find position of a row in a column in a column-major threaded
1669
- matrix.
1670
-
1671
- The routine returns the position \c k in \p hrow for the specified \p row.
1672
- It will abort if the entry does not exist.
1673
- */
1674
- inline CoinBigIndex presolve_find_row2(int row, CoinBigIndex kcs, int collen,
1675
- const int *hrow,
1676
- const CoinBigIndex *clinks)
1677
- { return presolve_find_minor2(row,kcs,collen,hrow,clinks) ; }
1678
-
1679
- /*! \relates CoinPostsolveMatrix
1680
- \brief Find position of a minor index in a major vector in a threaded
1681
- matrix.
1682
-
1683
- The routine returns the position \c k in \p minndxs for the specified
1684
- minor index \p tgt. It will return -1 if the entry does not exist.
1685
- Can be used directly or via the inline wrappers presolve_find_row3.
1686
- */
1687
- CoinBigIndex presolve_find_minor3(int tgt, CoinBigIndex ks, int majlen,
1688
- const int *minndxs,
1689
- const CoinBigIndex *majlinks) ;
1690
-
1691
- /*! \relates CoinPostsolveMatrix
1692
- \brief Find position of a row in a column in a column-major threaded
1693
- matrix.
1694
-
1695
- The routine returns the position \c k in \p hrow for the specified \p row.
1696
- It will return -1 if the entry does not exist.
1697
- */
1698
- inline CoinBigIndex presolve_find_row3(int row, CoinBigIndex kcs, int collen,
1699
- const int *hrow,
1700
- const CoinBigIndex *clinks)
1701
- { return presolve_find_minor3(row,kcs,collen,hrow,clinks) ; }
1702
-
1703
- /*! \relates CoinPrePostsolveMatrix
1704
- \brief Delete the entry for a minor index from a major vector.
1705
-
1706
- Deletes the entry for \p minndx from the major vector \p majndx.
1707
- Specifically, the relevant entries are removed from the minor index
1708
- (\p minndxs) and coefficient (\p els) arrays and the vector length (\p
1709
- majlens) is decremented. Loose packing is maintained by swapping the last
1710
- entry in the row into the position occupied by the deleted entry.
1711
- */
1712
- inline void presolve_delete_from_major(int majndx, int minndx,
1713
- const CoinBigIndex *majstrts,
1714
- int *majlens, int *minndxs, double *els)
1715
- {
1716
- const CoinBigIndex ks = majstrts[majndx] ;
1717
- const CoinBigIndex ke = ks+majlens[majndx] ;
1718
-
1719
- const CoinBigIndex kmi = presolve_find_minor(minndx,ks,ke,minndxs) ;
1720
-
1721
- minndxs[kmi] = minndxs[ke-1] ;
1722
- els[kmi] = els[ke-1] ;
1723
- majlens[majndx]-- ;
1724
-
1725
- return ;
1726
- }
1727
-
1728
- /*! \relates CoinPrePostsolveMatrix
1729
- \brief Delete marked entries
1730
-
1731
- Removes the entries specified in \p marked, compressing the major vector
1732
- to maintain loose packing. \p marked is cleared in the process.
1733
- */
1734
- inline void presolve_delete_many_from_major(int majndx, char *marked,
1735
- const CoinBigIndex *majstrts,
1736
- int *majlens, int *minndxs, double *els)
1737
- {
1738
- const CoinBigIndex ks = majstrts[majndx] ;
1739
- const CoinBigIndex ke = ks+majlens[majndx] ;
1740
- CoinBigIndex put = ks ;
1741
- for (CoinBigIndex k = ks ; k < ke ; k++) {
1742
- int iMinor = minndxs[k] ;
1743
- if (!marked[iMinor]) {
1744
- minndxs[put] = iMinor ;
1745
- els[put++] = els[k] ;
1746
- } else {
1747
- marked[iMinor] = 0 ;
1748
- }
1749
- }
1750
- majlens[majndx] = put-ks ;
1751
- return ;
1752
- }
1753
-
1754
- /*! \relates CoinPrePostsolveMatrix
1755
- \brief Delete the entry for row \p row from column \p col in a
1756
- column-major matrix
1757
-
1758
- Deletes the entry for \p row from the major vector for \p col.
1759
- Specifically, the relevant entries are removed from the row index (\p
1760
- hrow) and coefficient (\p colels) arrays and the vector length (\p
1761
- hincol) is decremented. Loose packing is maintained by swapping the last
1762
- entry in the row into the position occupied by the deleted entry.
1763
- */
1764
- inline void presolve_delete_from_col(int row, int col,
1765
- const CoinBigIndex *mcstrt,
1766
- int *hincol, int *hrow, double *colels)
1767
- { presolve_delete_from_major(col,row,mcstrt,hincol,hrow,colels) ; }
1768
-
1769
- /*! \relates CoinPrePostsolveMatrix
1770
- \brief Delete the entry for column \p col from row \p row in a
1771
- row-major matrix
1772
-
1773
- Deletes the entry for \p col from the major vector for \p row.
1774
- Specifically, the relevant entries are removed from the column index (\p
1775
- hcol) and coefficient (\p rowels) arrays and the vector length (\p
1776
- hinrow) is decremented. Loose packing is maintained by swapping the last
1777
- entry in the column into the position occupied by the deleted entry.
1778
- */
1779
- inline void presolve_delete_from_row(int row, int col,
1780
- const CoinBigIndex *mrstrt,
1781
- int *hinrow, int *hcol, double *rowels)
1782
- { presolve_delete_from_major(row,col,mrstrt,hinrow,hcol,rowels) ; }
1783
-
1784
- /*! \relates CoinPostsolveMatrix
1785
- \brief Delete the entry for a minor index from a major vector in a
1786
- threaded matrix.
1787
-
1788
- Deletes the entry for \p minndx from the major vector \p majndx.
1789
- Specifically, the relevant entries are removed from the minor index (\p
1790
- minndxs) and coefficient (\p els) arrays and the vector length (\p
1791
- majlens) is decremented. The thread for the major vector is relinked
1792
- around the deleted entry and the space is returned to the free list.
1793
- */
1794
- void presolve_delete_from_major2 (int majndx, int minndx,
1795
- CoinBigIndex *majstrts, int *majlens,
1796
- int *minndxs, int *majlinks,
1797
- CoinBigIndex *free_listp) ;
1798
-
1799
- /*! \relates CoinPostsolveMatrix
1800
- \brief Delete the entry for row \p row from column \p col in a
1801
- column-major threaded matrix
1802
-
1803
- Deletes the entry for \p row from the major vector for \p col.
1804
- Specifically, the relevant entries are removed from the row index (\p
1805
- hrow) and coefficient (\p colels) arrays and the vector length (\p
1806
- hincol) is decremented. The thread for the major vector is relinked
1807
- around the deleted entry and the space is returned to the free list.
1808
- */
1809
- inline void presolve_delete_from_col2(int row, int col, CoinBigIndex *mcstrt,
1810
- int *hincol, int *hrow,
1811
- int *clinks, CoinBigIndex *free_listp)
1812
- { presolve_delete_from_major2(col,row,mcstrt,hincol,hrow,clinks,free_listp) ; }
1813
-
1814
- //@}
1815
-
1816
- /*! \defgroup PresolveUtilities Presolve Utility Functions
1817
-
1818
- Utilities used by multiple presolve transform objects.
1819
- */
1820
- //@{
1821
-
1822
- /*! \brief Duplicate a major-dimension vector; optionally omit the entry
1823
- with minor index \p tgt.
1824
-
1825
- Designed to copy a major-dimension vector from the paired coefficient
1826
- (\p elems) and minor index (\p indices) arrays used in the standard
1827
- packed matrix representation. Copies \p length entries starting at
1828
- \p offset.
1829
-
1830
- If \p tgt is specified, the entry with minor index == \p tgt is
1831
- omitted from the copy.
1832
- */
1833
- double *presolve_dupmajor(const double *elems, const int *indices,
1834
- int length, CoinBigIndex offset, int tgt = -1);
1835
-
1836
- /// Initialize a vector with random numbers
1837
- void coin_init_random_vec(double *work, int n);
1838
-
1839
- //@}
1840
-
1841
-
1842
- #endif