ruby-cbc 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/README.md +203 -0
  7. data/Rakefile +40 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/ext/ruby-cbc/cbc.i +15 -0
  11. data/ext/ruby-cbc/cbc_wrap.c +4618 -0
  12. data/ext/ruby-cbc/extconf.rb +60 -0
  13. data/ext/ruby-cbc/install/bin/cbc +0 -0
  14. data/ext/ruby-cbc/install/bin/clp +0 -0
  15. data/ext/ruby-cbc/install/include/coin/CbcBranchActual.hpp +24 -0
  16. data/ext/ruby-cbc/install/include/coin/CbcBranchAllDifferent.hpp +62 -0
  17. data/ext/ruby-cbc/install/include/coin/CbcBranchBase.hpp +78 -0
  18. data/ext/ruby-cbc/install/include/coin/CbcBranchCut.hpp +183 -0
  19. data/ext/ruby-cbc/install/include/coin/CbcBranchDecision.hpp +129 -0
  20. data/ext/ruby-cbc/install/include/coin/CbcBranchDefaultDecision.hpp +100 -0
  21. data/ext/ruby-cbc/install/include/coin/CbcBranchDynamic.hpp +206 -0
  22. data/ext/ruby-cbc/install/include/coin/CbcBranchLotsize.hpp +242 -0
  23. data/ext/ruby-cbc/install/include/coin/CbcBranchToFixLots.hpp +94 -0
  24. data/ext/ruby-cbc/install/include/coin/CbcBranchingObject.hpp +236 -0
  25. data/ext/ruby-cbc/install/include/coin/CbcClique.hpp +303 -0
  26. data/ext/ruby-cbc/install/include/coin/CbcCompare.hpp +39 -0
  27. data/ext/ruby-cbc/install/include/coin/CbcCompareActual.hpp +14 -0
  28. data/ext/ruby-cbc/install/include/coin/CbcCompareBase.hpp +142 -0
  29. data/ext/ruby-cbc/install/include/coin/CbcCompareDefault.hpp +120 -0
  30. data/ext/ruby-cbc/install/include/coin/CbcCompareDepth.hpp +47 -0
  31. data/ext/ruby-cbc/install/include/coin/CbcCompareEstimate.hpp +48 -0
  32. data/ext/ruby-cbc/install/include/coin/CbcCompareObjective.hpp +49 -0
  33. data/ext/ruby-cbc/install/include/coin/CbcConfig.h +14 -0
  34. data/ext/ruby-cbc/install/include/coin/CbcConsequence.hpp +49 -0
  35. data/ext/ruby-cbc/install/include/coin/CbcCountRowCut.hpp +168 -0
  36. data/ext/ruby-cbc/install/include/coin/CbcCutGenerator.hpp +482 -0
  37. data/ext/ruby-cbc/install/include/coin/CbcCutModifier.hpp +57 -0
  38. data/ext/ruby-cbc/install/include/coin/CbcCutSubsetModifier.hpp +66 -0
  39. data/ext/ruby-cbc/install/include/coin/CbcDummyBranchingObject.hpp +83 -0
  40. data/ext/ruby-cbc/install/include/coin/CbcEventHandler.hpp +245 -0
  41. data/ext/ruby-cbc/install/include/coin/CbcFathom.hpp +137 -0
  42. data/ext/ruby-cbc/install/include/coin/CbcFathomDynamicProgramming.hpp +169 -0
  43. data/ext/ruby-cbc/install/include/coin/CbcFeasibilityBase.hpp +56 -0
  44. data/ext/ruby-cbc/install/include/coin/CbcFixVariable.hpp +67 -0
  45. data/ext/ruby-cbc/install/include/coin/CbcFollowOn.hpp +207 -0
  46. data/ext/ruby-cbc/install/include/coin/CbcFullNodeInfo.hpp +161 -0
  47. data/ext/ruby-cbc/install/include/coin/CbcGeneral.hpp +60 -0
  48. data/ext/ruby-cbc/install/include/coin/CbcGeneralDepth.hpp +279 -0
  49. data/ext/ruby-cbc/install/include/coin/CbcHeuristic.hpp +682 -0
  50. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDINS.hpp +96 -0
  51. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDW.hpp +309 -0
  52. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDive.hpp +192 -0
  53. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveCoefficient.hpp +52 -0
  54. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveFractional.hpp +52 -0
  55. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveGuided.hpp +55 -0
  56. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveLineSearch.hpp +52 -0
  57. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDivePseudoCost.hpp +60 -0
  58. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveVectorLength.hpp +52 -0
  59. data/ext/ruby-cbc/install/include/coin/CbcHeuristicFPump.hpp +340 -0
  60. data/ext/ruby-cbc/install/include/coin/CbcHeuristicGreedy.hpp +280 -0
  61. data/ext/ruby-cbc/install/include/coin/CbcHeuristicLocal.hpp +271 -0
  62. data/ext/ruby-cbc/install/include/coin/CbcHeuristicPivotAndFix.hpp +58 -0
  63. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRENS.hpp +77 -0
  64. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRINS.hpp +102 -0
  65. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRandRound.hpp +58 -0
  66. data/ext/ruby-cbc/install/include/coin/CbcHeuristicVND.hpp +94 -0
  67. data/ext/ruby-cbc/install/include/coin/CbcLinked.hpp +1406 -0
  68. data/ext/ruby-cbc/install/include/coin/CbcMessage.hpp +94 -0
  69. data/ext/ruby-cbc/install/include/coin/CbcMipStartIO.hpp +26 -0
  70. data/ext/ruby-cbc/install/include/coin/CbcModel.hpp +2952 -0
  71. data/ext/ruby-cbc/install/include/coin/CbcNWay.hpp +166 -0
  72. data/ext/ruby-cbc/install/include/coin/CbcNode.hpp +351 -0
  73. data/ext/ruby-cbc/install/include/coin/CbcNodeInfo.hpp +349 -0
  74. data/ext/ruby-cbc/install/include/coin/CbcObject.hpp +272 -0
  75. data/ext/ruby-cbc/install/include/coin/CbcObjectUpdateData.hpp +64 -0
  76. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.cpp +4134 -0
  77. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.hpp +532 -0
  78. data/ext/ruby-cbc/install/include/coin/CbcParam.hpp +324 -0
  79. data/ext/ruby-cbc/install/include/coin/CbcPartialNodeInfo.hpp +110 -0
  80. data/ext/ruby-cbc/install/include/coin/CbcSOS.hpp +279 -0
  81. data/ext/ruby-cbc/install/include/coin/CbcSimpleInteger.hpp +286 -0
  82. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerDynamicPseudoCost.hpp +564 -0
  83. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerPseudoCost.hpp +114 -0
  84. data/ext/ruby-cbc/install/include/coin/CbcSolver.hpp +447 -0
  85. data/ext/ruby-cbc/install/include/coin/CbcStrategy.hpp +258 -0
  86. data/ext/ruby-cbc/install/include/coin/CbcSubProblem.hpp +83 -0
  87. data/ext/ruby-cbc/install/include/coin/CbcTree.hpp +490 -0
  88. data/ext/ruby-cbc/install/include/coin/CbcTreeLocal.hpp +372 -0
  89. data/ext/ruby-cbc/install/include/coin/Cbc_C_Interface.h +381 -0
  90. data/ext/ruby-cbc/install/include/coin/Cgl012cut.hpp +464 -0
  91. data/ext/ruby-cbc/install/include/coin/CglAllDifferent.hpp +115 -0
  92. data/ext/ruby-cbc/install/include/coin/CglClique.hpp +308 -0
  93. data/ext/ruby-cbc/install/include/coin/CglConfig.h +19 -0
  94. data/ext/ruby-cbc/install/include/coin/CglCutGenerator.hpp +121 -0
  95. data/ext/ruby-cbc/install/include/coin/CglDuplicateRow.hpp +189 -0
  96. data/ext/ruby-cbc/install/include/coin/CglFlowCover.hpp +371 -0
  97. data/ext/ruby-cbc/install/include/coin/CglGMI.hpp +364 -0
  98. data/ext/ruby-cbc/install/include/coin/CglGMIParam.hpp +313 -0
  99. data/ext/ruby-cbc/install/include/coin/CglGomory.hpp +204 -0
  100. data/ext/ruby-cbc/install/include/coin/CglKnapsackCover.hpp +310 -0
  101. data/ext/ruby-cbc/install/include/coin/CglLandP.hpp +306 -0
  102. data/ext/ruby-cbc/install/include/coin/CglLandPValidator.hpp +130 -0
  103. data/ext/ruby-cbc/install/include/coin/CglLiftAndProject.hpp +104 -0
  104. data/ext/ruby-cbc/install/include/coin/CglMessage.hpp +50 -0
  105. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding.hpp +429 -0
  106. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding2.hpp +427 -0
  107. data/ext/ruby-cbc/install/include/coin/CglOddHole.hpp +160 -0
  108. data/ext/ruby-cbc/install/include/coin/CglParam.hpp +93 -0
  109. data/ext/ruby-cbc/install/include/coin/CglPreProcess.hpp +492 -0
  110. data/ext/ruby-cbc/install/include/coin/CglProbing.hpp +543 -0
  111. data/ext/ruby-cbc/install/include/coin/CglRedSplit.hpp +448 -0
  112. data/ext/ruby-cbc/install/include/coin/CglRedSplit2.hpp +494 -0
  113. data/ext/ruby-cbc/install/include/coin/CglRedSplit2Param.hpp +495 -0
  114. data/ext/ruby-cbc/install/include/coin/CglRedSplitParam.hpp +272 -0
  115. data/ext/ruby-cbc/install/include/coin/CglResidualCapacity.hpp +240 -0
  116. data/ext/ruby-cbc/install/include/coin/CglSimpleRounding.hpp +174 -0
  117. data/ext/ruby-cbc/install/include/coin/CglStored.hpp +125 -0
  118. data/ext/ruby-cbc/install/include/coin/CglTreeInfo.hpp +180 -0
  119. data/ext/ruby-cbc/install/include/coin/CglTwomir.hpp +565 -0
  120. data/ext/ruby-cbc/install/include/coin/CglZeroHalf.hpp +133 -0
  121. data/ext/ruby-cbc/install/include/coin/ClpAmplObjective.hpp +113 -0
  122. data/ext/ruby-cbc/install/include/coin/ClpCholeskyBase.hpp +294 -0
  123. data/ext/ruby-cbc/install/include/coin/ClpCholeskyDense.hpp +162 -0
  124. data/ext/ruby-cbc/install/include/coin/ClpConfig.h +17 -0
  125. data/ext/ruby-cbc/install/include/coin/ClpConstraint.hpp +125 -0
  126. data/ext/ruby-cbc/install/include/coin/ClpConstraintAmpl.hpp +108 -0
  127. data/ext/ruby-cbc/install/include/coin/ClpConstraintLinear.hpp +110 -0
  128. data/ext/ruby-cbc/install/include/coin/ClpConstraintQuadratic.hpp +119 -0
  129. data/ext/ruby-cbc/install/include/coin/ClpDualRowDantzig.hpp +71 -0
  130. data/ext/ruby-cbc/install/include/coin/ClpDualRowPivot.hpp +129 -0
  131. data/ext/ruby-cbc/install/include/coin/ClpDualRowSteepest.hpp +153 -0
  132. data/ext/ruby-cbc/install/include/coin/ClpDummyMatrix.hpp +183 -0
  133. data/ext/ruby-cbc/install/include/coin/ClpDynamicExampleMatrix.hpp +186 -0
  134. data/ext/ruby-cbc/install/include/coin/ClpDynamicMatrix.hpp +381 -0
  135. data/ext/ruby-cbc/install/include/coin/ClpEventHandler.hpp +187 -0
  136. data/ext/ruby-cbc/install/include/coin/ClpFactorization.hpp +432 -0
  137. data/ext/ruby-cbc/install/include/coin/ClpGubDynamicMatrix.hpp +247 -0
  138. data/ext/ruby-cbc/install/include/coin/ClpGubMatrix.hpp +358 -0
  139. data/ext/ruby-cbc/install/include/coin/ClpInterior.hpp +570 -0
  140. data/ext/ruby-cbc/install/include/coin/ClpLinearObjective.hpp +103 -0
  141. data/ext/ruby-cbc/install/include/coin/ClpMatrixBase.hpp +524 -0
  142. data/ext/ruby-cbc/install/include/coin/ClpMessage.hpp +131 -0
  143. data/ext/ruby-cbc/install/include/coin/ClpModel.hpp +1307 -0
  144. data/ext/ruby-cbc/install/include/coin/ClpNetworkMatrix.hpp +229 -0
  145. data/ext/ruby-cbc/install/include/coin/ClpNode.hpp +349 -0
  146. data/ext/ruby-cbc/install/include/coin/ClpNonLinearCost.hpp +401 -0
  147. data/ext/ruby-cbc/install/include/coin/ClpObjective.hpp +134 -0
  148. data/ext/ruby-cbc/install/include/coin/ClpPackedMatrix.hpp +638 -0
  149. data/ext/ruby-cbc/install/include/coin/ClpParameters.hpp +126 -0
  150. data/ext/ruby-cbc/install/include/coin/ClpPdcoBase.hpp +103 -0
  151. data/ext/ruby-cbc/install/include/coin/ClpPlusMinusOneMatrix.hpp +290 -0
  152. data/ext/ruby-cbc/install/include/coin/ClpPresolve.hpp +299 -0
  153. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnDantzig.hpp +72 -0
  154. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnPivot.hpp +155 -0
  155. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnSteepest.hpp +247 -0
  156. data/ext/ruby-cbc/install/include/coin/ClpQuadraticObjective.hpp +155 -0
  157. data/ext/ruby-cbc/install/include/coin/ClpSimplex.hpp +1797 -0
  158. data/ext/ruby-cbc/install/include/coin/ClpSimplexDual.hpp +300 -0
  159. data/ext/ruby-cbc/install/include/coin/ClpSimplexNonlinear.hpp +117 -0
  160. data/ext/ruby-cbc/install/include/coin/ClpSimplexOther.hpp +277 -0
  161. data/ext/ruby-cbc/install/include/coin/ClpSimplexPrimal.hpp +244 -0
  162. data/ext/ruby-cbc/install/include/coin/ClpSolve.hpp +446 -0
  163. data/ext/ruby-cbc/install/include/coin/Clp_C_Interface.h +525 -0
  164. data/ext/ruby-cbc/install/include/coin/CoinAlloc.hpp +176 -0
  165. data/ext/ruby-cbc/install/include/coin/CoinBuild.hpp +149 -0
  166. data/ext/ruby-cbc/install/include/coin/CoinDenseFactorization.hpp +419 -0
  167. data/ext/ruby-cbc/install/include/coin/CoinDenseVector.hpp +383 -0
  168. data/ext/ruby-cbc/install/include/coin/CoinDistance.hpp +48 -0
  169. data/ext/ruby-cbc/install/include/coin/CoinError.hpp +257 -0
  170. data/ext/ruby-cbc/install/include/coin/CoinFactorization.hpp +2044 -0
  171. data/ext/ruby-cbc/install/include/coin/CoinFileIO.hpp +166 -0
  172. data/ext/ruby-cbc/install/include/coin/CoinFinite.hpp +34 -0
  173. data/ext/ruby-cbc/install/include/coin/CoinFloatEqual.hpp +177 -0
  174. data/ext/ruby-cbc/install/include/coin/CoinHelperFunctions.hpp +1111 -0
  175. data/ext/ruby-cbc/install/include/coin/CoinIndexedVector.hpp +1164 -0
  176. data/ext/ruby-cbc/install/include/coin/CoinLpIO.hpp +805 -0
  177. data/ext/ruby-cbc/install/include/coin/CoinMessage.hpp +96 -0
  178. data/ext/ruby-cbc/install/include/coin/CoinMessageHandler.hpp +666 -0
  179. data/ext/ruby-cbc/install/include/coin/CoinModel.hpp +1054 -0
  180. data/ext/ruby-cbc/install/include/coin/CoinModelUseful.hpp +441 -0
  181. data/ext/ruby-cbc/install/include/coin/CoinMpsIO.hpp +1056 -0
  182. data/ext/ruby-cbc/install/include/coin/CoinOslFactorization.hpp +280 -0
  183. data/ext/ruby-cbc/install/include/coin/CoinPackedMatrix.hpp +947 -0
  184. data/ext/ruby-cbc/install/include/coin/CoinPackedVector.hpp +657 -0
  185. data/ext/ruby-cbc/install/include/coin/CoinPackedVectorBase.hpp +269 -0
  186. data/ext/ruby-cbc/install/include/coin/CoinParam.hpp +644 -0
  187. data/ext/ruby-cbc/install/include/coin/CoinPragma.hpp +26 -0
  188. data/ext/ruby-cbc/install/include/coin/CoinPresolveDoubleton.hpp +73 -0
  189. data/ext/ruby-cbc/install/include/coin/CoinPresolveDual.hpp +85 -0
  190. data/ext/ruby-cbc/install/include/coin/CoinPresolveDupcol.hpp +226 -0
  191. data/ext/ruby-cbc/install/include/coin/CoinPresolveEmpty.hpp +116 -0
  192. data/ext/ruby-cbc/install/include/coin/CoinPresolveFixed.hpp +181 -0
  193. data/ext/ruby-cbc/install/include/coin/CoinPresolveForcing.hpp +61 -0
  194. data/ext/ruby-cbc/install/include/coin/CoinPresolveImpliedFree.hpp +60 -0
  195. data/ext/ruby-cbc/install/include/coin/CoinPresolveIsolated.hpp +51 -0
  196. data/ext/ruby-cbc/install/include/coin/CoinPresolveMatrix.hpp +1842 -0
  197. data/ext/ruby-cbc/install/include/coin/CoinPresolveMonitor.hpp +105 -0
  198. data/ext/ruby-cbc/install/include/coin/CoinPresolvePsdebug.hpp +166 -0
  199. data/ext/ruby-cbc/install/include/coin/CoinPresolveSingleton.hpp +112 -0
  200. data/ext/ruby-cbc/install/include/coin/CoinPresolveSubst.hpp +101 -0
  201. data/ext/ruby-cbc/install/include/coin/CoinPresolveTighten.hpp +55 -0
  202. data/ext/ruby-cbc/install/include/coin/CoinPresolveTripleton.hpp +66 -0
  203. data/ext/ruby-cbc/install/include/coin/CoinPresolveUseless.hpp +63 -0
  204. data/ext/ruby-cbc/install/include/coin/CoinPresolveZeros.hpp +60 -0
  205. data/ext/ruby-cbc/install/include/coin/CoinRational.hpp +44 -0
  206. data/ext/ruby-cbc/install/include/coin/CoinSearchTree.hpp +465 -0
  207. data/ext/ruby-cbc/install/include/coin/CoinShallowPackedVector.hpp +148 -0
  208. data/ext/ruby-cbc/install/include/coin/CoinSignal.hpp +117 -0
  209. data/ext/ruby-cbc/install/include/coin/CoinSimpFactorization.hpp +431 -0
  210. data/ext/ruby-cbc/install/include/coin/CoinSmartPtr.hpp +528 -0
  211. data/ext/ruby-cbc/install/include/coin/CoinSnapshot.hpp +476 -0
  212. data/ext/ruby-cbc/install/include/coin/CoinSort.hpp +678 -0
  213. data/ext/ruby-cbc/install/include/coin/CoinStructuredModel.hpp +247 -0
  214. data/ext/ruby-cbc/install/include/coin/CoinTime.hpp +310 -0
  215. data/ext/ruby-cbc/install/include/coin/CoinTypes.hpp +64 -0
  216. data/ext/ruby-cbc/install/include/coin/CoinUtility.hpp +19 -0
  217. data/ext/ruby-cbc/install/include/coin/CoinUtilsConfig.h +34 -0
  218. data/ext/ruby-cbc/install/include/coin/CoinWarmStart.hpp +58 -0
  219. data/ext/ruby-cbc/install/include/coin/CoinWarmStartBasis.hpp +456 -0
  220. data/ext/ruby-cbc/install/include/coin/CoinWarmStartDual.hpp +166 -0
  221. data/ext/ruby-cbc/install/include/coin/CoinWarmStartPrimalDual.hpp +211 -0
  222. data/ext/ruby-cbc/install/include/coin/CoinWarmStartVector.hpp +488 -0
  223. data/ext/ruby-cbc/install/include/coin/Coin_C_defines.h +115 -0
  224. data/ext/ruby-cbc/install/include/coin/Idiot.hpp +298 -0
  225. data/ext/ruby-cbc/install/include/coin/OsiAuxInfo.hpp +206 -0
  226. data/ext/ruby-cbc/install/include/coin/OsiBranchingObject.hpp +1005 -0
  227. data/ext/ruby-cbc/install/include/coin/OsiCbcSolverInterface.hpp +764 -0
  228. data/ext/ruby-cbc/install/include/coin/OsiChooseVariable.hpp +534 -0
  229. data/ext/ruby-cbc/install/include/coin/OsiClpSolverInterface.hpp +1509 -0
  230. data/ext/ruby-cbc/install/include/coin/OsiColCut.hpp +324 -0
  231. data/ext/ruby-cbc/install/include/coin/OsiCollections.hpp +35 -0
  232. data/ext/ruby-cbc/install/include/coin/OsiConfig.h +19 -0
  233. data/ext/ruby-cbc/install/include/coin/OsiCut.hpp +245 -0
  234. data/ext/ruby-cbc/install/include/coin/OsiCuts.hpp +474 -0
  235. data/ext/ruby-cbc/install/include/coin/OsiPresolve.hpp +252 -0
  236. data/ext/ruby-cbc/install/include/coin/OsiRowCut.hpp +331 -0
  237. data/ext/ruby-cbc/install/include/coin/OsiRowCutDebugger.hpp +187 -0
  238. data/ext/ruby-cbc/install/include/coin/OsiSolverBranch.hpp +152 -0
  239. data/ext/ruby-cbc/install/include/coin/OsiSolverInterface.hpp +2143 -0
  240. data/ext/ruby-cbc/install/include/coin/OsiSolverParameters.hpp +142 -0
  241. data/ext/ruby-cbc/install/include/coin/OsiUnitTests.hpp +374 -0
  242. data/ext/ruby-cbc/install/lib/libCbc.la +35 -0
  243. data/ext/ruby-cbc/install/lib/libCbc.so +0 -0
  244. data/ext/ruby-cbc/install/lib/libCbc.so.3 +0 -0
  245. data/ext/ruby-cbc/install/lib/libCbc.so.3.9.7 +0 -0
  246. data/ext/ruby-cbc/install/lib/libCbcSolver.la +35 -0
  247. data/ext/ruby-cbc/install/lib/libCbcSolver.so +0 -0
  248. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3 +0 -0
  249. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3.9.7 +0 -0
  250. data/ext/ruby-cbc/install/lib/libCgl.la +35 -0
  251. data/ext/ruby-cbc/install/lib/libCgl.so +0 -0
  252. data/ext/ruby-cbc/install/lib/libCgl.so.1 +0 -0
  253. data/ext/ruby-cbc/install/lib/libCgl.so.1.9.7 +0 -0
  254. data/ext/ruby-cbc/install/lib/libClp.la +35 -0
  255. data/ext/ruby-cbc/install/lib/libClp.so +0 -0
  256. data/ext/ruby-cbc/install/lib/libClp.so.1 +0 -0
  257. data/ext/ruby-cbc/install/lib/libClp.so.1.13.9 +0 -0
  258. data/ext/ruby-cbc/install/lib/libClpSolver.la +35 -0
  259. data/ext/ruby-cbc/install/lib/libClpSolver.so +0 -0
  260. data/ext/ruby-cbc/install/lib/libClpSolver.so.1 +0 -0
  261. data/ext/ruby-cbc/install/lib/libClpSolver.so.1.13.9 +0 -0
  262. data/ext/ruby-cbc/install/lib/libCoinUtils.la +35 -0
  263. data/ext/ruby-cbc/install/lib/libCoinUtils.so +0 -0
  264. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3 +0 -0
  265. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3.10.11 +0 -0
  266. data/ext/ruby-cbc/install/lib/libOsi.la +35 -0
  267. data/ext/ruby-cbc/install/lib/libOsi.so +0 -0
  268. data/ext/ruby-cbc/install/lib/libOsi.so.1 +0 -0
  269. data/ext/ruby-cbc/install/lib/libOsi.so.1.12.6 +0 -0
  270. data/ext/ruby-cbc/install/lib/libOsiCbc.la +35 -0
  271. data/ext/ruby-cbc/install/lib/libOsiCbc.so +0 -0
  272. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3 +0 -0
  273. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3.9.7 +0 -0
  274. data/ext/ruby-cbc/install/lib/libOsiClp.la +35 -0
  275. data/ext/ruby-cbc/install/lib/libOsiClp.so +0 -0
  276. data/ext/ruby-cbc/install/lib/libOsiClp.so.1 +0 -0
  277. data/ext/ruby-cbc/install/lib/libOsiClp.so.1.13.9 +0 -0
  278. data/ext/ruby-cbc/install/lib/libOsiCommonTests.la +35 -0
  279. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so +0 -0
  280. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1 +0 -0
  281. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1.12.6 +0 -0
  282. data/ext/ruby-cbc/install/lib/pkgconfig/cbc.pc +12 -0
  283. data/ext/ruby-cbc/install/lib/pkgconfig/cgl.pc +12 -0
  284. data/ext/ruby-cbc/install/lib/pkgconfig/clp.pc +12 -0
  285. data/ext/ruby-cbc/install/lib/pkgconfig/coindatamiplib3.pc +9 -0
  286. data/ext/ruby-cbc/install/lib/pkgconfig/coindatasample.pc +9 -0
  287. data/ext/ruby-cbc/install/lib/pkgconfig/coinutils.pc +12 -0
  288. data/ext/ruby-cbc/install/lib/pkgconfig/osi-cbc.pc +12 -0
  289. data/ext/ruby-cbc/install/lib/pkgconfig/osi-clp.pc +12 -0
  290. data/ext/ruby-cbc/install/lib/pkgconfig/osi-unittests.pc +12 -0
  291. data/ext/ruby-cbc/install/lib/pkgconfig/osi.pc +12 -0
  292. data/lib/ruby-cbc/ilp/constant.rb +44 -0
  293. data/lib/ruby-cbc/ilp/constraint.rb +32 -0
  294. data/lib/ruby-cbc/ilp/objective.rb +26 -0
  295. data/lib/ruby-cbc/ilp/term.rb +47 -0
  296. data/lib/ruby-cbc/ilp/term_array.rb +80 -0
  297. data/lib/ruby-cbc/ilp/var.rb +62 -0
  298. data/lib/ruby-cbc/model.rb +125 -0
  299. data/lib/ruby-cbc/problem.rb +170 -0
  300. data/lib/ruby-cbc/version.rb +3 -0
  301. data/lib/ruby-cbc.rb +21 -0
  302. data/ruby-cbc.gemspec +36 -0
  303. metadata +431 -0
@@ -0,0 +1,2952 @@
1
+ /* $Id: CbcModel.hpp 2206 2015-07-07 20:44:40Z stefan $ */
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 CbcModel_H
7
+ #define CbcModel_H
8
+ #include <string>
9
+ #include <vector>
10
+ #include "CoinMessageHandler.hpp"
11
+ #include "OsiSolverInterface.hpp"
12
+ #include "OsiBranchingObject.hpp"
13
+ #include "OsiCuts.hpp"
14
+ #include "CoinWarmStartBasis.hpp"
15
+ #include "CbcCompareBase.hpp"
16
+ #include "CbcCountRowCut.hpp"
17
+ #include "CbcMessage.hpp"
18
+ #include "CbcEventHandler.hpp"
19
+ #include "ClpDualRowPivot.hpp"
20
+
21
+
22
+ class CbcCutGenerator;
23
+ class CbcBaseModel;
24
+ class OsiRowCut;
25
+ class OsiBabSolver;
26
+ class OsiRowCutDebugger;
27
+ class CglCutGenerator;
28
+ class CglStored;
29
+ class CbcCutModifier;
30
+ class CglTreeProbingInfo;
31
+ class CbcHeuristic;
32
+ class OsiObject;
33
+ class CbcThread;
34
+ class CbcTree;
35
+ class CbcStrategy;
36
+ class CbcSymmetry;
37
+ class CbcFeasibilityBase;
38
+ class CbcStatistics;
39
+ class CbcFullNodeInfo;
40
+ class CbcEventHandler ;
41
+ class CglPreProcess;
42
+ class OsiClpSolverInterface;
43
+ class ClpNodeStuff;
44
+
45
+ // #define CBC_CHECK_BASIS 1
46
+
47
+ //#############################################################################
48
+
49
+ /** Simple Branch and bound class
50
+
51
+ The initialSolve() method solves the initial LP relaxation of the MIP
52
+ problem. The branchAndBound() method can then be called to finish using
53
+ a branch and cut algorithm.
54
+
55
+ <h3>Search Tree Traversal</h3>
56
+
57
+ Subproblems (aka nodes) requiring additional evaluation are stored using
58
+ the CbcNode and CbcNodeInfo objects. Ancestry linkage is maintained in the
59
+ CbcNodeInfo object. Evaluation of a subproblem within branchAndBound()
60
+ proceeds as follows:
61
+ <ul>
62
+ <li> The node representing the most promising parent subproblem is popped
63
+ from the heap which holds the set of subproblems requiring further
64
+ evaluation.
65
+ <li> Using branching instructions stored in the node, and information in
66
+ its ancestors, the model and solver are adjusted to create the
67
+ active subproblem.
68
+ <li> If the parent subproblem will require further evaluation
69
+ (<i>i.e.</i>, there are branches remaining) its node is pushed back
70
+ on the heap. Otherwise, the node is deleted. This may trigger
71
+ recursive deletion of ancestors.
72
+ <li> The newly created subproblem is evaluated.
73
+ <li> If the subproblem requires further evaluation, a node is created.
74
+ All information needed to recreate the subproblem (branching
75
+ information, row and column cuts) is placed in the node and the node
76
+ is added to the set of subproblems awaiting further evaluation.
77
+ </ul>
78
+ Note that there is never a node representing the active subproblem; the model
79
+ and solver represent the active subproblem.
80
+
81
+ <h3>Row (Constraint) Cut Handling</h3>
82
+
83
+ For a typical subproblem, the sequence of events is as follows:
84
+ <ul>
85
+ <li> The subproblem is rebuilt for further evaluation: One result of a
86
+ call to addCuts() is a traversal of ancestors, leaving a list of all
87
+ cuts used in the ancestors in #addedCuts_. This list is then scanned
88
+ to construct a basis that includes only tight cuts. Entries for
89
+ loose cuts are set to NULL.
90
+ <li> The subproblem is evaluated: One result of a call to solveWithCuts()
91
+ is the return of a set of newly generated cuts for the subproblem.
92
+ #addedCuts_ is also kept up-to-date as old cuts become loose.
93
+ <li> The subproblem is stored for further processing: A call to
94
+ CbcNodeInfo::addCuts() adds the newly generated cuts to the
95
+ CbcNodeInfo object associated with this node.
96
+ </ul>
97
+ See CbcCountRowCut for details of the bookkeeping associated with cut
98
+ management.
99
+ */
100
+
101
+ class CbcModel {
102
+
103
+ public:
104
+
105
+ enum CbcIntParam {
106
+ /** The maximum number of nodes before terminating */
107
+ CbcMaxNumNode = 0,
108
+ /** The maximum number of solutions before terminating */
109
+ CbcMaxNumSol,
110
+ /** Fathoming discipline
111
+
112
+ Controls objective function comparisons for purposes of fathoming by bound
113
+ or determining monotonic variables.
114
+
115
+ If 1, action is taken only when the current objective is strictly worse
116
+ than the target. Implementation is handled by adding a small tolerance to
117
+ the target.
118
+ */
119
+ CbcFathomDiscipline,
120
+ /** Adjusts printout
121
+ 1 does different node message with number unsatisfied on last branch
122
+ */
123
+ CbcPrinting,
124
+ /** Number of branches (may be more than number of nodes as may
125
+ include strong branching) */
126
+ CbcNumberBranches,
127
+ /** Just a marker, so that a static sized array can store parameters. */
128
+ CbcLastIntParam
129
+ };
130
+
131
+ enum CbcDblParam {
132
+ /** The maximum amount the value of an integer variable can vary from
133
+ integer and still be considered feasible. */
134
+ CbcIntegerTolerance = 0,
135
+ /** The objective is assumed to worsen by this amount for each
136
+ integer infeasibility. */
137
+ CbcInfeasibilityWeight,
138
+ /** The amount by which to tighten the objective function cutoff when
139
+ a new solution is discovered. */
140
+ CbcCutoffIncrement,
141
+ /** Stop when the gap between the objective value of the best known solution
142
+ and the best bound on the objective of any solution is less than this.
143
+
144
+ This is an absolute value. Conversion from a percentage is left to the
145
+ client.
146
+ */
147
+ CbcAllowableGap,
148
+ /** Stop when the gap between the objective value of the best known solution
149
+ and the best bound on the objective of any solution is less than this
150
+ fraction of of the absolute value of best known solution.
151
+
152
+ Code stops if either this test or CbcAllowableGap test succeeds
153
+ */
154
+ CbcAllowableFractionGap,
155
+ /** \brief The maximum number of seconds before terminating.
156
+ A double should be adequate! */
157
+ CbcMaximumSeconds,
158
+ /// Cutoff - stored for speed
159
+ CbcCurrentCutoff,
160
+ /// Optimization direction - stored for speed
161
+ CbcOptimizationDirection,
162
+ /// Current objective value
163
+ CbcCurrentObjectiveValue,
164
+ /// Current minimization objective value
165
+ CbcCurrentMinimizationObjectiveValue,
166
+ /** \brief The time at start of model.
167
+ So that other pieces of code can access */
168
+ CbcStartSeconds,
169
+ /** Stop doing heuristics when the gap between the objective value of the
170
+ best known solution and the best bound on the objective of any solution
171
+ is less than this.
172
+
173
+ This is an absolute value. Conversion from a percentage is left to the
174
+ client.
175
+ */
176
+ CbcHeuristicGap,
177
+ /** Stop doing heuristics when the gap between the objective value of the
178
+ best known solution and the best bound on the objective of any solution
179
+ is less than this fraction of of the absolute value of best known
180
+ solution.
181
+
182
+ Code stops if either this test or CbcAllowableGap test succeeds
183
+ */
184
+ CbcHeuristicFractionGap,
185
+ /// Smallest non-zero change on a branch
186
+ CbcSmallestChange,
187
+ /// Sum of non-zero changes on a branch
188
+ CbcSumChange,
189
+ /// Largest non-zero change on a branch
190
+ CbcLargestChange,
191
+ /// Small non-zero change on a branch to be used as guess
192
+ CbcSmallChange,
193
+ /** Just a marker, so that a static sized array can store parameters. */
194
+ CbcLastDblParam
195
+ };
196
+
197
+ //---------------------------------------------------------------------------
198
+
199
+ public:
200
+ ///@name Solve methods
201
+ //@{
202
+ /** \brief Solve the initial LP relaxation
203
+
204
+ Invoke the solver's %initialSolve() method.
205
+ */
206
+ void initialSolve();
207
+
208
+ /** \brief Invoke the branch \& cut algorithm
209
+
210
+ The method assumes that initialSolve() has been called to solve the
211
+ LP relaxation. It processes the root node, then proceeds to explore the
212
+ branch & cut search tree. The search ends when the tree is exhausted or
213
+ one of several execution limits is reached.
214
+ If doStatistics is 1 summary statistics are printed
215
+ if 2 then also the path to best solution (if found by branching)
216
+ if 3 then also one line per node
217
+ */
218
+ void branchAndBound(int doStatistics = 0);
219
+ private:
220
+
221
+ /** \brief Evaluate a subproblem using cutting planes and heuristics
222
+
223
+ The method invokes a main loop which generates cuts, applies heuristics,
224
+ and reoptimises using the solver's native %resolve() method.
225
+ It returns true if the subproblem remains feasible at the end of the
226
+ evaluation.
227
+ */
228
+ bool solveWithCuts(OsiCuts & cuts, int numberTries, CbcNode * node);
229
+ /** Generate one round of cuts - serial mode
230
+ returns -
231
+ 0 - normal
232
+ 1 - must keep going
233
+ 2 - set numberTries to zero
234
+ -1 - infeasible
235
+ */
236
+ int serialCuts(OsiCuts & cuts, CbcNode * node, OsiCuts & slackCuts, int lastNumberCuts);
237
+ /** Generate one round of cuts - parallel mode
238
+ returns -
239
+ 0 - normal
240
+ 1 - must keep going
241
+ 2 - set numberTries to zero
242
+ -1 - infeasible
243
+ */
244
+ int parallelCuts(CbcBaseModel * master, OsiCuts & cuts, CbcNode * node, OsiCuts & slackCuts, int lastNumberCuts);
245
+ /** Input one node output N nodes to put on tree and optional solution update
246
+ This should be able to operate in parallel so is given a solver and is const(ish)
247
+ However we will need to keep an array of solver_ and bases and more
248
+ status is 0 for normal, 1 if solution
249
+ Calling code should always push nodes back on tree
250
+ */
251
+ CbcNode ** solveOneNode(int whichSolver, CbcNode * node,
252
+ int & numberNodesOutput, int & status) ;
253
+ /// Update size of whichGenerator
254
+ void resizeWhichGenerator(int numberNow, int numberAfter);
255
+ public:
256
+ #ifdef CBC_KEEP_DEPRECATED
257
+ // See if anyone is using these any more!!
258
+ /** \brief create a clean model from partially fixed problem
259
+
260
+ The method creates a new model with given bounds and with no tree.
261
+ */
262
+ CbcModel * cleanModel(const double * lower, const double * upper);
263
+ /** \brief Invoke the branch \& cut algorithm on partially fixed problem
264
+
265
+ The method presolves the given model and does branch and cut. The search
266
+ ends when the tree is exhausted or maximum nodes is reached.
267
+
268
+ If better solution found then it is saved.
269
+
270
+ Returns 0 if search completed and solution, 1 if not completed and solution,
271
+ 2 if completed and no solution, 3 if not completed and no solution.
272
+
273
+ Normally okay to do cleanModel immediately followed by subBranchandBound
274
+ (== other form of subBranchAndBound)
275
+ but may need to get at model for advanced features.
276
+
277
+ Deletes model2
278
+ */
279
+ int subBranchAndBound(CbcModel * model2,
280
+ CbcModel * presolvedModel,
281
+ int maximumNodes);
282
+ /** \brief Invoke the branch \& cut algorithm on partially fixed problem
283
+
284
+ The method creates a new model with given bounds, presolves it
285
+ then proceeds to explore the branch & cut search tree. The search
286
+ ends when the tree is exhausted or maximum nodes is reached.
287
+
288
+ If better solution found then it is saved.
289
+
290
+ Returns 0 if search completed and solution, 1 if not completed and solution,
291
+ 2 if completed and no solution, 3 if not completed and no solution.
292
+
293
+ This is just subModel immediately followed by other version of
294
+ subBranchandBound.
295
+
296
+ */
297
+ int subBranchAndBound(const double * lower, const double * upper,
298
+ int maximumNodes);
299
+
300
+ /** \brief Process root node and return a strengthened model
301
+
302
+ The method assumes that initialSolve() has been called to solve the
303
+ LP relaxation. It processes the root node and then returns a pointer
304
+ to the strengthened model (or NULL if infeasible)
305
+ */
306
+ OsiSolverInterface * strengthenedModel();
307
+ /** preProcess problem - replacing solver
308
+ If makeEquality true then <= cliques converted to ==.
309
+ Presolve will be done numberPasses times.
310
+
311
+ Returns NULL if infeasible
312
+
313
+ If makeEquality is 1 add slacks to get cliques,
314
+ if 2 add slacks to get sos (but only if looks plausible) and keep sos info
315
+ */
316
+ CglPreProcess * preProcess( int makeEquality = 0, int numberPasses = 5,
317
+ int tuning = 5);
318
+ /** Does postprocessing - original solver back.
319
+ User has to delete process */
320
+ void postProcess(CglPreProcess * process);
321
+ #endif
322
+ /// Adds an update information object
323
+ void addUpdateInformation(const CbcObjectUpdateData & data);
324
+ /** Do one node - broken out for clarity?
325
+ also for parallel (when baseModel!=this)
326
+ Returns 1 if solution found
327
+ node NULL on return if no branches left
328
+ newNode NULL if no new node created
329
+ */
330
+ int doOneNode(CbcModel * baseModel, CbcNode * & node, CbcNode * & newNode);
331
+
332
+ public:
333
+ /** \brief Reoptimise an LP relaxation
334
+
335
+ Invoke the solver's %resolve() method.
336
+ whereFrom -
337
+ 0 - initial continuous
338
+ 1 - resolve on branch (before new cuts)
339
+ 2 - after new cuts
340
+ 3 - obsolete code or something modified problem in unexpected way
341
+ 10 - after strong branching has fixed variables at root
342
+ 11 - after strong branching has fixed variables in tree
343
+
344
+ returns 1 feasible, 0 infeasible, -1 feasible but skip cuts
345
+ */
346
+ int resolve(CbcNodeInfo * parent, int whereFrom,
347
+ double * saveSolution = NULL,
348
+ double * saveLower = NULL,
349
+ double * saveUpper = NULL);
350
+ /// Make given rows (L or G) into global cuts and remove from lp
351
+ void makeGlobalCuts(int numberRows, const int * which);
352
+ /// Make given cut into a global cut
353
+ int makeGlobalCut(const OsiRowCut * cut);
354
+ /// Make given cut into a global cut
355
+ int makeGlobalCut(const OsiRowCut & cut);
356
+ /// Make given column cut into a global cut
357
+ void makeGlobalCut(const OsiColCut * cut);
358
+ /// Make given column cut into a global cut
359
+ void makeGlobalCut(const OsiColCut & cut);
360
+ /// Make partial cut into a global cut and save
361
+ void makePartialCut(const OsiRowCut * cut, const OsiSolverInterface * solver=NULL);
362
+ /// Make partial cuts into global cuts
363
+ void makeGlobalCuts();
364
+ /// Which cut generator generated this cut
365
+ inline const int * whichGenerator() const
366
+ { return whichGenerator_;}
367
+ //@}
368
+
369
+ /** \name Presolve methods */
370
+ //@{
371
+
372
+ /** Identify cliques and construct corresponding objects.
373
+
374
+ Find cliques with size in the range
375
+ [\p atLeastThisMany, \p lessThanThis] and construct corresponding
376
+ CbcClique objects.
377
+ If \p makeEquality is true then a new model may be returned if
378
+ modifications had to be made, otherwise \c this is returned.
379
+ If the problem is infeasible #numberObjects_ is set to -1.
380
+ A client must use deleteObjects() before a second call to findCliques().
381
+ If priorities exist, clique priority is set to the default.
382
+ */
383
+ CbcModel * findCliques(bool makeEquality, int atLeastThisMany,
384
+ int lessThanThis, int defaultValue = 1000);
385
+
386
+ /** Do integer presolve, creating a new (presolved) model.
387
+
388
+ Returns the new model, or NULL if feasibility is lost.
389
+ If weak is true then just does a normal presolve
390
+
391
+ \todo It remains to work out the cleanest way of getting a solution to
392
+ the original problem at the end. So this is very preliminary.
393
+ */
394
+ CbcModel * integerPresolve(bool weak = false);
395
+
396
+ /** Do integer presolve, modifying the current model.
397
+
398
+ Returns true if the model remains feasible after presolve.
399
+ */
400
+ bool integerPresolveThisModel(OsiSolverInterface * originalSolver, bool weak = false);
401
+
402
+
403
+ /// Put back information into the original model after integer presolve.
404
+ void originalModel(CbcModel * presolvedModel, bool weak);
405
+
406
+ /** \brief For variables involved in VUB constraints, see if we can tighten
407
+ bounds by solving lp's
408
+
409
+ Returns false if feasibility is lost.
410
+ If CglProbing is available, it will be tried as well to see if it can
411
+ tighten bounds.
412
+ This routine is just a front end for tightenVubs(int,const int*,double).
413
+
414
+ If <tt>type = -1</tt> all variables are processed (could be very slow).
415
+ If <tt>type = 0</tt> only variables involved in VUBs are processed.
416
+ If <tt>type = n > 0</tt>, only the n most expensive VUB variables
417
+ are processed, where it is assumed that x is at its maximum so delta
418
+ would have to go to 1 (if x not at bound).
419
+
420
+ If \p allowMultipleBinary is true, then a VUB constraint is a row with
421
+ one continuous variable and any number of binary variables.
422
+
423
+ If <tt>useCutoff < 1.0e30</tt>, the original objective is installed as a
424
+ constraint with \p useCutoff as a bound.
425
+ */
426
+ bool tightenVubs(int type, bool allowMultipleBinary = false,
427
+ double useCutoff = 1.0e50);
428
+
429
+ /** \brief For variables involved in VUB constraints, see if we can tighten
430
+ bounds by solving lp's
431
+
432
+ This version is just handed a list of variables to be processed.
433
+ */
434
+ bool tightenVubs(int numberVubs, const int * which,
435
+ double useCutoff = 1.0e50);
436
+ /**
437
+ Analyze problem to find a minimum change in the objective function.
438
+ */
439
+ void analyzeObjective();
440
+
441
+ /**
442
+ Add additional integers.
443
+ */
444
+ void AddIntegers();
445
+ /**
446
+ Save copy of the model.
447
+ */
448
+ void saveModel(OsiSolverInterface * saveSolver, double * checkCutoffForRestart, bool * feasible);
449
+ /**
450
+ Flip direction of optimization on all models
451
+ */
452
+ void flipModel();
453
+
454
+ //@}
455
+
456
+ /** \name Object manipulation routines
457
+
458
+ See OsiObject for an explanation of `object' in the context of CbcModel.
459
+ */
460
+ //@{
461
+
462
+ /// Get the number of objects
463
+ inline int numberObjects() const {
464
+ return numberObjects_;
465
+ }
466
+ /// Set the number of objects
467
+ inline void setNumberObjects(int number) {
468
+ numberObjects_ = number;
469
+ }
470
+
471
+ /// Get the array of objects
472
+ inline OsiObject ** objects() const {
473
+ return object_;
474
+ }
475
+
476
+ /// Get the specified object
477
+ const inline OsiObject * object(int which) const {
478
+ return object_[which];
479
+ }
480
+ /// Get the specified object
481
+ inline OsiObject * modifiableObject(int which) const {
482
+ return object_[which];
483
+ }
484
+
485
+ void setOptionalInteger(int index);
486
+
487
+ /// Delete all object information (and just back to integers if true)
488
+ void deleteObjects(bool findIntegers = true);
489
+
490
+ /** Add in object information.
491
+
492
+ Objects are cloned; the owner can delete the originals.
493
+ */
494
+ void addObjects(int numberObjects, OsiObject ** objects);
495
+
496
+ /** Add in object information.
497
+
498
+ Objects are cloned; the owner can delete the originals.
499
+ */
500
+ void addObjects(int numberObjects, CbcObject ** objects);
501
+
502
+ /// Ensure attached objects point to this model.
503
+ void synchronizeModel() ;
504
+
505
+ /** \brief Identify integer variables and create corresponding objects.
506
+
507
+ Record integer variables and create an CbcSimpleInteger object for each
508
+ one.
509
+ If \p startAgain is true, a new scan is forced, overwriting any existing
510
+ integer variable information.
511
+ If type > 0 then 1==PseudoCost, 2 new ones low priority
512
+ */
513
+
514
+ void findIntegers(bool startAgain, int type = 0);
515
+
516
+ #ifdef SWITCH_VARIABLES
517
+ /// Convert Dynamic to Switching
518
+ int findSwitching();
519
+ /// Fix associated variables
520
+ int fixAssociated(OsiSolverInterface * solver,int cleanBasis);
521
+ /// Debug associated variables
522
+ int checkAssociated(const OsiSolverInterface * solver,
523
+ const double * solution, int printLevel);
524
+ #endif
525
+ //@}
526
+
527
+ //---------------------------------------------------------------------------
528
+
529
+ /**@name Parameter set/get methods
530
+
531
+ The set methods return true if the parameter was set to the given value,
532
+ false if the value of the parameter is out of range.
533
+
534
+ The get methods return the value of the parameter.
535
+
536
+ */
537
+ //@{
538
+ /// Set an integer parameter
539
+ inline bool setIntParam(CbcIntParam key, int value) {
540
+ intParam_[key] = value;
541
+ return true;
542
+ }
543
+ /// Set a double parameter
544
+ inline bool setDblParam(CbcDblParam key, double value) {
545
+ dblParam_[key] = value;
546
+ return true;
547
+ }
548
+ /// Get an integer parameter
549
+ inline int getIntParam(CbcIntParam key) const {
550
+ return intParam_[key];
551
+ }
552
+ /// Get a double parameter
553
+ inline double getDblParam(CbcDblParam key) const {
554
+ return dblParam_[key];
555
+ }
556
+ /*! \brief Set cutoff bound on the objective function.
557
+
558
+ When using strict comparison, the bound is adjusted by a tolerance to
559
+ avoid accidentally cutting off the optimal solution.
560
+ */
561
+ void setCutoff(double value) ;
562
+
563
+ /// Get the cutoff bound on the objective function - always as minimize
564
+ inline double getCutoff() const { //double value ;
565
+ //solver_->getDblParam(OsiDualObjectiveLimit,value) ;
566
+ //assert( dblParam_[CbcCurrentCutoff]== value * solver_->getObjSense());
567
+ return dblParam_[CbcCurrentCutoff];
568
+ }
569
+
570
+ /// Set the \link CbcModel::CbcMaxNumNode maximum node limit \endlink
571
+ inline bool setMaximumNodes( int value) {
572
+ return setIntParam(CbcMaxNumNode, value);
573
+ }
574
+
575
+ /// Get the \link CbcModel::CbcMaxNumNode maximum node limit \endlink
576
+ inline int getMaximumNodes() const {
577
+ return getIntParam(CbcMaxNumNode);
578
+ }
579
+
580
+ /** Set the
581
+ \link CbcModel::CbcMaxNumSol maximum number of solutions \endlink
582
+ desired.
583
+ */
584
+ inline bool setMaximumSolutions( int value) {
585
+ return setIntParam(CbcMaxNumSol, value);
586
+ }
587
+ /** Get the
588
+ \link CbcModel::CbcMaxNumSol maximum number of solutions \endlink
589
+ desired.
590
+ */
591
+ inline int getMaximumSolutions() const {
592
+ return getIntParam(CbcMaxNumSol);
593
+ }
594
+ /// Set the printing mode
595
+ inline bool setPrintingMode( int value) {
596
+ return setIntParam(CbcPrinting, value);
597
+ }
598
+
599
+ /// Get the printing mode
600
+ inline int getPrintingMode() const {
601
+ return getIntParam(CbcPrinting);
602
+ }
603
+
604
+ /** Set the
605
+ \link CbcModel::CbcMaximumSeconds maximum number of seconds \endlink
606
+ desired.
607
+ */
608
+ inline bool setMaximumSeconds( double value) {
609
+ return setDblParam(CbcMaximumSeconds, value);
610
+ }
611
+ /** Get the
612
+ \link CbcModel::CbcMaximumSeconds maximum number of seconds \endlink
613
+ desired.
614
+ */
615
+ inline double getMaximumSeconds() const {
616
+ return getDblParam(CbcMaximumSeconds);
617
+ }
618
+ /// Current time since start of branchAndbound
619
+ double getCurrentSeconds() const ;
620
+
621
+ /// Return true if maximum time reached
622
+ bool maximumSecondsReached() const ;
623
+
624
+ /** Set the
625
+ \link CbcModel::CbcIntegerTolerance integrality tolerance \endlink
626
+ */
627
+ inline bool setIntegerTolerance( double value) {
628
+ return setDblParam(CbcIntegerTolerance, value);
629
+ }
630
+ /** Get the
631
+ \link CbcModel::CbcIntegerTolerance integrality tolerance \endlink
632
+ */
633
+ inline double getIntegerTolerance() const {
634
+ return getDblParam(CbcIntegerTolerance);
635
+ }
636
+
637
+ /** Set the
638
+ \link CbcModel::CbcInfeasibilityWeight
639
+ weight per integer infeasibility \endlink
640
+ */
641
+ inline bool setInfeasibilityWeight( double value) {
642
+ return setDblParam(CbcInfeasibilityWeight, value);
643
+ }
644
+ /** Get the
645
+ \link CbcModel::CbcInfeasibilityWeight
646
+ weight per integer infeasibility \endlink
647
+ */
648
+ inline double getInfeasibilityWeight() const {
649
+ return getDblParam(CbcInfeasibilityWeight);
650
+ }
651
+
652
+ /** Set the \link CbcModel::CbcAllowableGap allowable gap \endlink
653
+ between the best known solution and the best possible solution.
654
+ */
655
+ inline bool setAllowableGap( double value) {
656
+ return setDblParam(CbcAllowableGap, value);
657
+ }
658
+ /** Get the \link CbcModel::CbcAllowableGap allowable gap \endlink
659
+ between the best known solution and the best possible solution.
660
+ */
661
+ inline double getAllowableGap() const {
662
+ return getDblParam(CbcAllowableGap);
663
+ }
664
+
665
+ /** Set the \link CbcModel::CbcAllowableFractionGap fraction allowable gap \endlink
666
+ between the best known solution and the best possible solution.
667
+ */
668
+ inline bool setAllowableFractionGap( double value) {
669
+ return setDblParam(CbcAllowableFractionGap, value);
670
+ }
671
+ /** Get the \link CbcModel::CbcAllowableFractionGap fraction allowable gap \endlink
672
+ between the best known solution and the best possible solution.
673
+ */
674
+ inline double getAllowableFractionGap() const {
675
+ return getDblParam(CbcAllowableFractionGap);
676
+ }
677
+ /** Set the \link CbcModel::CbcAllowableFractionGap percentage allowable gap \endlink
678
+ between the best known solution and the best possible solution.
679
+ */
680
+ inline bool setAllowablePercentageGap( double value) {
681
+ return setDblParam(CbcAllowableFractionGap, value*0.01);
682
+ }
683
+ /** Get the \link CbcModel::CbcAllowableFractionGap percentage allowable gap \endlink
684
+ between the best known solution and the best possible solution.
685
+ */
686
+ inline double getAllowablePercentageGap() const {
687
+ return 100.0*getDblParam(CbcAllowableFractionGap);
688
+ }
689
+ /** Set the \link CbcModel::CbcHeuristicGap heuristic gap \endlink
690
+ between the best known solution and the best possible solution.
691
+ */
692
+ inline bool setHeuristicGap( double value) {
693
+ return setDblParam(CbcHeuristicGap, value);
694
+ }
695
+ /** Get the \link CbcModel::CbcHeuristicGap heuristic gap \endlink
696
+ between the best known solution and the best possible solution.
697
+ */
698
+ inline double getHeuristicGap() const {
699
+ return getDblParam(CbcHeuristicGap);
700
+ }
701
+
702
+ /** Set the \link CbcModel::CbcHeuristicFractionGap fraction heuristic gap \endlink
703
+ between the best known solution and the best possible solution.
704
+ */
705
+ inline bool setHeuristicFractionGap( double value) {
706
+ return setDblParam(CbcHeuristicFractionGap, value);
707
+ }
708
+ /** Get the \link CbcModel::CbcHeuristicFractionGap fraction heuristic gap \endlink
709
+ between the best known solution and the best possible solution.
710
+ */
711
+ inline double getHeuristicFractionGap() const {
712
+ return getDblParam(CbcHeuristicFractionGap);
713
+ }
714
+ /** Set the
715
+ \link CbcModel::CbcCutoffIncrement \endlink
716
+ desired.
717
+ */
718
+ inline bool setCutoffIncrement( double value) {
719
+ return setDblParam(CbcCutoffIncrement, value);
720
+ }
721
+ /** Get the
722
+ \link CbcModel::CbcCutoffIncrement \endlink
723
+ desired.
724
+ */
725
+ inline double getCutoffIncrement() const {
726
+ return getDblParam(CbcCutoffIncrement);
727
+ }
728
+ /// See if can stop on gap
729
+ bool canStopOnGap() const;
730
+
731
+ /** Pass in target solution and optional priorities.
732
+ If priorities then >0 means only branch if incorrect
733
+ while <0 means branch even if correct. +1 or -1 are
734
+ highest priority */
735
+ void setHotstartSolution(const double * solution, const int * priorities = NULL) ;
736
+
737
+ /// Set the minimum drop to continue cuts
738
+ inline void setMinimumDrop(double value) {
739
+ minimumDrop_ = value;
740
+ }
741
+ /// Get the minimum drop to continue cuts
742
+ inline double getMinimumDrop() const {
743
+ return minimumDrop_;
744
+ }
745
+
746
+ /** Set the maximum number of cut passes at root node (default 20)
747
+ Minimum drop can also be used for fine tuning */
748
+ inline void setMaximumCutPassesAtRoot(int value) {
749
+ maximumCutPassesAtRoot_ = value;
750
+ }
751
+ /** Get the maximum number of cut passes at root node */
752
+ inline int getMaximumCutPassesAtRoot() const {
753
+ return maximumCutPassesAtRoot_;
754
+ }
755
+
756
+ /** Set the maximum number of cut passes at other nodes (default 10)
757
+ Minimum drop can also be used for fine tuning */
758
+ inline void setMaximumCutPasses(int value) {
759
+ maximumCutPasses_ = value;
760
+ }
761
+ /** Get the maximum number of cut passes at other nodes (default 10) */
762
+ inline int getMaximumCutPasses() const {
763
+ return maximumCutPasses_;
764
+ }
765
+ /** Get current cut pass number in this round of cuts.
766
+ (1 is first pass) */
767
+ inline int getCurrentPassNumber() const {
768
+ return currentPassNumber_;
769
+ }
770
+ /** Set current cut pass number in this round of cuts.
771
+ (1 is first pass) */
772
+ inline void setCurrentPassNumber(int value) {
773
+ currentPassNumber_ = value;
774
+ }
775
+
776
+ /** Set the maximum number of candidates to be evaluated for strong
777
+ branching.
778
+
779
+ A value of 0 disables strong branching.
780
+ */
781
+ void setNumberStrong(int number);
782
+ /** Get the maximum number of candidates to be evaluated for strong
783
+ branching.
784
+ */
785
+ inline int numberStrong() const {
786
+ return numberStrong_;
787
+ }
788
+ /** Set global preferred way to branch
789
+ -1 down, +1 up, 0 no preference */
790
+ inline void setPreferredWay(int value) {
791
+ preferredWay_ = value;
792
+ }
793
+ /** Get the preferred way to branch (default 0) */
794
+ inline int getPreferredWay() const {
795
+ return preferredWay_;
796
+ }
797
+ /// Get at which depths to do cuts
798
+ inline int whenCuts() const {
799
+ return whenCuts_;
800
+ }
801
+ /// Set at which depths to do cuts
802
+ inline void setWhenCuts(int value) {
803
+ whenCuts_ = value;
804
+ }
805
+ /** Return true if we want to do cuts
806
+ If allowForTopOfTree zero then just does on multiples of depth
807
+ if 1 then allows for doing at top of tree
808
+ if 2 then says if cuts allowed anywhere apart from root
809
+ */
810
+ bool doCutsNow(int allowForTopOfTree) const;
811
+
812
+ /** Set the number of branches before pseudo costs believed
813
+ in dynamic strong branching.
814
+
815
+ A value of 0 disables dynamic strong branching.
816
+ */
817
+ void setNumberBeforeTrust(int number);
818
+ /** get the number of branches before pseudo costs believed
819
+ in dynamic strong branching. */
820
+ inline int numberBeforeTrust() const {
821
+ return numberBeforeTrust_;
822
+ }
823
+ /** Set the number of variables for which to compute penalties
824
+ in dynamic strong branching.
825
+
826
+ A value of 0 disables penalties.
827
+ */
828
+ void setNumberPenalties(int number);
829
+ /** get the number of variables for which to compute penalties
830
+ in dynamic strong branching. */
831
+ inline int numberPenalties() const {
832
+ return numberPenalties_;
833
+ }
834
+ /// Pointer to top of tree
835
+ inline const CbcFullNodeInfo * topOfTree() const
836
+ { return topOfTree_;}
837
+ /// Number of analyze iterations to do
838
+ inline void setNumberAnalyzeIterations(int number) {
839
+ numberAnalyzeIterations_ = number;
840
+ }
841
+ inline int numberAnalyzeIterations() const {
842
+ return numberAnalyzeIterations_;
843
+ }
844
+ /** Get scale factor to make penalties match strong.
845
+ Should/will be computed */
846
+ inline double penaltyScaleFactor() const {
847
+ return penaltyScaleFactor_;
848
+ }
849
+ /** Set scale factor to make penalties match strong.
850
+ Should/will be computed */
851
+ void setPenaltyScaleFactor(double value);
852
+ /** Problem type as set by user or found by analysis. This will be extended
853
+ 0 - not known
854
+ 1 - Set partitioning <=
855
+ 2 - Set partitioning ==
856
+ 3 - Set covering
857
+ 4 - all +- 1 or all +1 and odd
858
+ */
859
+ void inline setProblemType(int number) {
860
+ problemType_ = number;
861
+ }
862
+ inline int problemType() const {
863
+ return problemType_;
864
+ }
865
+ /// Current depth
866
+ inline int currentDepth() const {
867
+ return currentDepth_;
868
+ }
869
+
870
+ /// Set how often to scan global cuts
871
+ void setHowOftenGlobalScan(int number);
872
+ /// Get how often to scan global cuts
873
+ inline int howOftenGlobalScan() const {
874
+ return howOftenGlobalScan_;
875
+ }
876
+ /// Original columns as created by integerPresolve or preprocessing
877
+ inline int * originalColumns() const {
878
+ return originalColumns_;
879
+ }
880
+ /// Set original columns as created by preprocessing
881
+ void setOriginalColumns(const int * originalColumns,
882
+ int numberGood=COIN_INT_MAX) ;
883
+ /// Create conflict cut (well - most of)
884
+ OsiRowCut * conflictCut(const OsiSolverInterface * solver, bool & localCuts);
885
+
886
+ /** Set the print frequency.
887
+
888
+ Controls the number of nodes evaluated between status prints.
889
+ If <tt>number <=0</tt> the print frequency is set to 100 nodes for large
890
+ problems, 1000 for small problems.
891
+ Print frequency has very slight overhead if small.
892
+ */
893
+ inline void setPrintFrequency(int number) {
894
+ printFrequency_ = number;
895
+ }
896
+ /// Get the print frequency
897
+ inline int printFrequency() const {
898
+ return printFrequency_;
899
+ }
900
+ //@}
901
+
902
+ //---------------------------------------------------------------------------
903
+ ///@name Methods returning info on how the solution process terminated
904
+ //@{
905
+ /// Are there a numerical difficulties?
906
+ bool isAbandoned() const;
907
+ /// Is optimality proven?
908
+ bool isProvenOptimal() const;
909
+ /// Is infeasiblity proven (or none better than cutoff)?
910
+ bool isProvenInfeasible() const;
911
+ /// Was continuous solution unbounded
912
+ bool isContinuousUnbounded() const;
913
+ /// Was continuous solution unbounded
914
+ bool isProvenDualInfeasible() const;
915
+ /// Node limit reached?
916
+ bool isNodeLimitReached() const;
917
+ /// Time limit reached?
918
+ bool isSecondsLimitReached() const;
919
+ /// Solution limit reached?
920
+ bool isSolutionLimitReached() const;
921
+ /// Get how many iterations it took to solve the problem.
922
+ inline int getIterationCount() const {
923
+ return numberIterations_;
924
+ }
925
+ /// Increment how many iterations it took to solve the problem.
926
+ inline void incrementIterationCount(int value) {
927
+ numberIterations_ += value;
928
+ }
929
+ /// Get how many Nodes it took to solve the problem (including those in complete fathoming B&B inside CLP).
930
+ inline int getNodeCount() const {
931
+ return numberNodes_;
932
+ }
933
+ /// Increment how many nodes it took to solve the problem.
934
+ inline void incrementNodeCount(int value) {
935
+ numberNodes_ += value;
936
+ }
937
+ /// Get how many Nodes were enumerated in complete fathoming B&B inside CLP
938
+ inline int getExtraNodeCount() const {
939
+ return numberExtraNodes_;
940
+ }
941
+ /// Get how many times complete fathoming B&B was done
942
+ inline int getFathomCount() const {
943
+ return numberFathoms_;
944
+ }
945
+ /** Final status of problem
946
+ Some of these can be found out by is...... functions
947
+ -1 before branchAndBound
948
+ 0 finished - check isProvenOptimal or isProvenInfeasible to see if solution found
949
+ (or check value of best solution)
950
+ 1 stopped - on maxnodes, maxsols, maxtime
951
+ 2 difficulties so run was abandoned
952
+ (5 event user programmed event occurred)
953
+ */
954
+ inline int status() const {
955
+ return status_;
956
+ }
957
+ inline void setProblemStatus(int value) {
958
+ status_ = value;
959
+ }
960
+ /** Secondary status of problem
961
+ -1 unset (status_ will also be -1)
962
+ 0 search completed with solution
963
+ 1 linear relaxation not feasible (or worse than cutoff)
964
+ 2 stopped on gap
965
+ 3 stopped on nodes
966
+ 4 stopped on time
967
+ 5 stopped on user event
968
+ 6 stopped on solutions
969
+ 7 linear relaxation unbounded
970
+ 8 stopped on iteration limit
971
+ */
972
+ inline int secondaryStatus() const {
973
+ return secondaryStatus_;
974
+ }
975
+ inline void setSecondaryStatus(int value) {
976
+ secondaryStatus_ = value;
977
+ }
978
+ /// Are there numerical difficulties (for initialSolve) ?
979
+ bool isInitialSolveAbandoned() const ;
980
+ /// Is optimality proven (for initialSolve) ?
981
+ bool isInitialSolveProvenOptimal() const ;
982
+ /// Is primal infeasiblity proven (for initialSolve) ?
983
+ bool isInitialSolveProvenPrimalInfeasible() const ;
984
+ /// Is dual infeasiblity proven (for initialSolve) ?
985
+ bool isInitialSolveProvenDualInfeasible() const ;
986
+
987
+ //@}
988
+
989
+ //---------------------------------------------------------------------------
990
+ /**@name Problem information methods
991
+
992
+ These methods call the solver's query routines to return
993
+ information about the problem referred to by the current object.
994
+ Querying a problem that has no data associated with it result in
995
+ zeros for the number of rows and columns, and NULL pointers from
996
+ the methods that return vectors.
997
+
998
+ Const pointers returned from any data-query method are valid as
999
+ long as the data is unchanged and the solver is not called.
1000
+ */
1001
+ //@{
1002
+ /// Number of rows in continuous (root) problem.
1003
+ inline int numberRowsAtContinuous() const {
1004
+ return numberRowsAtContinuous_;
1005
+ }
1006
+
1007
+ /// Get number of columns
1008
+ inline int getNumCols() const {
1009
+ return solver_->getNumCols();
1010
+ }
1011
+
1012
+ /// Get number of rows
1013
+ inline int getNumRows() const {
1014
+ return solver_->getNumRows();
1015
+ }
1016
+
1017
+ /// Get number of nonzero elements
1018
+ inline CoinBigIndex getNumElements() const {
1019
+ return solver_->getNumElements();
1020
+ }
1021
+
1022
+ /// Number of integers in problem
1023
+ inline int numberIntegers() const {
1024
+ return numberIntegers_;
1025
+ }
1026
+ // Integer variables
1027
+ inline const int * integerVariable() const {
1028
+ return integerVariable_;
1029
+ }
1030
+ /// Whether or not integer
1031
+ inline char integerType(int i) const {
1032
+ assert (integerInfo_);
1033
+ assert (integerInfo_[i] == 0 || integerInfo_[i] == 1);
1034
+ return integerInfo_[i];
1035
+ }
1036
+ /// Whether or not integer
1037
+ inline const char * integerType() const {
1038
+ return integerInfo_;
1039
+ }
1040
+
1041
+ /// Get pointer to array[getNumCols()] of column lower bounds
1042
+ inline const double * getColLower() const {
1043
+ return solver_->getColLower();
1044
+ }
1045
+
1046
+ /// Get pointer to array[getNumCols()] of column upper bounds
1047
+ inline const double * getColUpper() const {
1048
+ return solver_->getColUpper();
1049
+ }
1050
+
1051
+ /** Get pointer to array[getNumRows()] of row constraint senses.
1052
+ <ul>
1053
+ <li>'L': <= constraint
1054
+ <li>'E': = constraint
1055
+ <li>'G': >= constraint
1056
+ <li>'R': ranged constraint
1057
+ <li>'N': free constraint
1058
+ </ul>
1059
+ */
1060
+ inline const char * getRowSense() const {
1061
+ return solver_->getRowSense();
1062
+ }
1063
+
1064
+ /** Get pointer to array[getNumRows()] of rows right-hand sides
1065
+ <ul>
1066
+ <li> if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i]
1067
+ <li> if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i]
1068
+ <li> if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i]
1069
+ <li> if rowsense()[i] == 'N' then rhs()[i] == 0.0
1070
+ </ul>
1071
+ */
1072
+ inline const double * getRightHandSide() const {
1073
+ return solver_->getRightHandSide();
1074
+ }
1075
+
1076
+ /** Get pointer to array[getNumRows()] of row ranges.
1077
+ <ul>
1078
+ <li> if rowsense()[i] == 'R' then
1079
+ rowrange()[i] == rowupper()[i] - rowlower()[i]
1080
+ <li> if rowsense()[i] != 'R' then
1081
+ rowrange()[i] is 0.0
1082
+ </ul>
1083
+ */
1084
+ inline const double * getRowRange() const {
1085
+ return solver_->getRowRange();
1086
+ }
1087
+
1088
+ /// Get pointer to array[getNumRows()] of row lower bounds
1089
+ inline const double * getRowLower() const {
1090
+ return solver_->getRowLower();
1091
+ }
1092
+
1093
+ /// Get pointer to array[getNumRows()] of row upper bounds
1094
+ inline const double * getRowUpper() const {
1095
+ return solver_->getRowUpper();
1096
+ }
1097
+
1098
+ /// Get pointer to array[getNumCols()] of objective function coefficients
1099
+ inline const double * getObjCoefficients() const {
1100
+ return solver_->getObjCoefficients();
1101
+ }
1102
+
1103
+ /// Get objective function sense (1 for min (default), -1 for max)
1104
+ inline double getObjSense() const {
1105
+ //assert (dblParam_[CbcOptimizationDirection]== solver_->getObjSense());
1106
+ return dblParam_[CbcOptimizationDirection];
1107
+ }
1108
+
1109
+ /// Return true if variable is continuous
1110
+ inline bool isContinuous(int colIndex) const {
1111
+ return solver_->isContinuous(colIndex);
1112
+ }
1113
+
1114
+ /// Return true if variable is binary
1115
+ inline bool isBinary(int colIndex) const {
1116
+ return solver_->isBinary(colIndex);
1117
+ }
1118
+
1119
+ /** Return true if column is integer.
1120
+ Note: This function returns true if the the column
1121
+ is binary or a general integer.
1122
+ */
1123
+ inline bool isInteger(int colIndex) const {
1124
+ return solver_->isInteger(colIndex);
1125
+ }
1126
+
1127
+ /// Return true if variable is general integer
1128
+ inline bool isIntegerNonBinary(int colIndex) const {
1129
+ return solver_->isIntegerNonBinary(colIndex);
1130
+ }
1131
+
1132
+ /// Return true if variable is binary and not fixed at either bound
1133
+ inline bool isFreeBinary(int colIndex) const {
1134
+ return solver_->isFreeBinary(colIndex) ;
1135
+ }
1136
+
1137
+ /// Get pointer to row-wise copy of matrix
1138
+ inline const CoinPackedMatrix * getMatrixByRow() const {
1139
+ return solver_->getMatrixByRow();
1140
+ }
1141
+
1142
+ /// Get pointer to column-wise copy of matrix
1143
+ inline const CoinPackedMatrix * getMatrixByCol() const {
1144
+ return solver_->getMatrixByCol();
1145
+ }
1146
+
1147
+ /// Get solver's value for infinity
1148
+ inline double getInfinity() const {
1149
+ return solver_->getInfinity();
1150
+ }
1151
+ /// Get pointer to array[getNumCols()] (for speed) of column lower bounds
1152
+ inline const double * getCbcColLower() const {
1153
+ return cbcColLower_;
1154
+ }
1155
+ /// Get pointer to array[getNumCols()] (for speed) of column upper bounds
1156
+ inline const double * getCbcColUpper() const {
1157
+ return cbcColUpper_;
1158
+ }
1159
+ /// Get pointer to array[getNumRows()] (for speed) of row lower bounds
1160
+ inline const double * getCbcRowLower() const {
1161
+ return cbcRowLower_;
1162
+ }
1163
+ /// Get pointer to array[getNumRows()] (for speed) of row upper bounds
1164
+ inline const double * getCbcRowUpper() const {
1165
+ return cbcRowUpper_;
1166
+ }
1167
+ /// Get pointer to array[getNumCols()] (for speed) of primal solution vector
1168
+ inline const double * getCbcColSolution() const {
1169
+ return cbcColSolution_;
1170
+ }
1171
+ /// Get pointer to array[getNumRows()] (for speed) of dual prices
1172
+ inline const double * getCbcRowPrice() const {
1173
+ return cbcRowPrice_;
1174
+ }
1175
+ /// Get a pointer to array[getNumCols()] (for speed) of reduced costs
1176
+ inline const double * getCbcReducedCost() const {
1177
+ return cbcReducedCost_;
1178
+ }
1179
+ /// Get pointer to array[getNumRows()] (for speed) of row activity levels.
1180
+ inline const double * getCbcRowActivity() const {
1181
+ return cbcRowActivity_;
1182
+ }
1183
+ //@}
1184
+
1185
+
1186
+ /**@name Methods related to querying the solution */
1187
+ //@{
1188
+ /// Holds solution at continuous (after cuts if branchAndBound called)
1189
+ inline double * continuousSolution() const {
1190
+ return continuousSolution_;
1191
+ }
1192
+ /** Array marked whenever a solution is found if non-zero.
1193
+ Code marks if heuristic returns better so heuristic
1194
+ need only mark if it wants to on solutions which
1195
+ are worse than current */
1196
+ inline int * usedInSolution() const {
1197
+ return usedInSolution_;
1198
+ }
1199
+ /// Increases usedInSolution for nonzeros
1200
+ void incrementUsed(const double * solution);
1201
+ /// Record a new incumbent solution and update objectiveValue
1202
+ void setBestSolution(CBC_Message how,
1203
+ double & objectiveValue, const double *solution,
1204
+ int fixVariables = 0);
1205
+ /// Just update objectiveValue
1206
+ void setBestObjectiveValue( double objectiveValue);
1207
+ /// Deals with event handler and solution
1208
+ CbcEventHandler::CbcAction dealWithEventHandler(CbcEventHandler::CbcEvent event,
1209
+ double objValue,
1210
+ const double * solution);
1211
+
1212
+ /** Call this to really test if a valid solution can be feasible
1213
+ Solution is number columns in size.
1214
+ If fixVariables true then bounds of continuous solver updated.
1215
+ Returns objective value (worse than cutoff if not feasible)
1216
+ Previously computed objective value is now passed in (in case user does not do solve)
1217
+ virtual so user can override
1218
+ */
1219
+ virtual double checkSolution(double cutoff, double * solution,
1220
+ int fixVariables, double originalObjValue);
1221
+ /** Test the current solution for feasiblility.
1222
+
1223
+ Scan all objects for indications of infeasibility. This is broken down
1224
+ into simple integer infeasibility (\p numberIntegerInfeasibilities)
1225
+ and all other reports of infeasibility (\p numberObjectInfeasibilities).
1226
+ */
1227
+ bool feasibleSolution(int & numberIntegerInfeasibilities,
1228
+ int & numberObjectInfeasibilities) const;
1229
+
1230
+ /** Solution to the most recent lp relaxation.
1231
+
1232
+ The solver's solution to the most recent lp relaxation.
1233
+ */
1234
+
1235
+ inline double * currentSolution() const {
1236
+ return currentSolution_;
1237
+ }
1238
+ /** For testing infeasibilities - will point to
1239
+ currentSolution_ or solver-->getColSolution()
1240
+ */
1241
+ inline const double * testSolution() const {
1242
+ return testSolution_;
1243
+ }
1244
+ inline void setTestSolution(const double * solution) {
1245
+ testSolution_ = solution;
1246
+ }
1247
+ /// Make sure region there and optionally copy solution
1248
+ void reserveCurrentSolution(const double * solution = NULL);
1249
+
1250
+ /// Get pointer to array[getNumCols()] of primal solution vector
1251
+ inline const double * getColSolution() const {
1252
+ return solver_->getColSolution();
1253
+ }
1254
+
1255
+ /// Get pointer to array[getNumRows()] of dual prices
1256
+ inline const double * getRowPrice() const {
1257
+ return solver_->getRowPrice();
1258
+ }
1259
+
1260
+ /// Get a pointer to array[getNumCols()] of reduced costs
1261
+ inline const double * getReducedCost() const {
1262
+ return solver_->getReducedCost();
1263
+ }
1264
+
1265
+ /// Get pointer to array[getNumRows()] of row activity levels.
1266
+ inline const double * getRowActivity() const {
1267
+ return solver_->getRowActivity();
1268
+ }
1269
+
1270
+ /// Get current objective function value
1271
+ inline double getCurrentObjValue() const {
1272
+ return dblParam_[CbcCurrentObjectiveValue];
1273
+ }
1274
+ /// Get current minimization objective function value
1275
+ inline double getCurrentMinimizationObjValue() const {
1276
+ return dblParam_[CbcCurrentMinimizationObjectiveValue];
1277
+ }
1278
+
1279
+ /// Get best objective function value as minimization
1280
+ inline double getMinimizationObjValue() const {
1281
+ return bestObjective_;
1282
+ }
1283
+ /// Set best objective function value as minimization
1284
+ inline void setMinimizationObjValue(double value) {
1285
+ bestObjective_ = value;
1286
+ }
1287
+
1288
+ /// Get best objective function value
1289
+ inline double getObjValue() const {
1290
+ return bestObjective_ * solver_->getObjSense() ;
1291
+ }
1292
+ /** Get best possible objective function value.
1293
+ This is better of best possible left on tree
1294
+ and best solution found.
1295
+ If called from within branch and cut may be optimistic.
1296
+ */
1297
+ double getBestPossibleObjValue() const;
1298
+ /// Set best objective function value
1299
+ inline void setObjValue(double value) {
1300
+ bestObjective_ = value * solver_->getObjSense() ;
1301
+ }
1302
+ /// Get solver objective function value (as minimization)
1303
+ inline double getSolverObjValue() const {
1304
+ return solver_->getObjValue() * solver_->getObjSense() ;
1305
+ }
1306
+
1307
+ /** The best solution to the integer programming problem.
1308
+
1309
+ The best solution to the integer programming problem found during
1310
+ the search. If no solution is found, the method returns null.
1311
+ */
1312
+
1313
+ inline double * bestSolution() const {
1314
+ return bestSolution_;
1315
+ }
1316
+ /** User callable setBestSolution.
1317
+ If check false does not check valid
1318
+ If true then sees if feasible and warns if objective value
1319
+ worse than given (so just set to COIN_DBL_MAX if you don't care).
1320
+ If check true then does not save solution if not feasible
1321
+ */
1322
+ void setBestSolution(const double * solution, int numberColumns,
1323
+ double objectiveValue, bool check = false);
1324
+
1325
+ /// Get number of solutions
1326
+ inline int getSolutionCount() const {
1327
+ return numberSolutions_;
1328
+ }
1329
+
1330
+ /// Set number of solutions (so heuristics will be different)
1331
+ inline void setSolutionCount(int value) {
1332
+ numberSolutions_ = value;
1333
+ }
1334
+ /// Number of saved solutions (including best)
1335
+ int numberSavedSolutions() const;
1336
+ /// Maximum number of extra saved solutions
1337
+ inline int maximumSavedSolutions() const {
1338
+ return maximumSavedSolutions_;
1339
+ }
1340
+ /// Set maximum number of extra saved solutions
1341
+ void setMaximumSavedSolutions(int value);
1342
+ /// Return a saved solution (0==best) - NULL if off end
1343
+ const double * savedSolution(int which) const;
1344
+ /// Return a saved solution objective (0==best) - COIN_DBL_MAX if off end
1345
+ double savedSolutionObjective(int which) const;
1346
+ /// Delete a saved solution and move others up
1347
+ void deleteSavedSolution(int which);
1348
+
1349
+ /** Current phase (so heuristics etc etc can find out).
1350
+ 0 - initial solve
1351
+ 1 - solve with cuts at root
1352
+ 2 - solve with cuts
1353
+ 3 - other e.g. strong branching
1354
+ 4 - trying to validate a solution
1355
+ 5 - at end of search
1356
+ */
1357
+ inline int phase() const {
1358
+ return phase_;
1359
+ }
1360
+
1361
+ /// Get number of heuristic solutions
1362
+ inline int getNumberHeuristicSolutions() const {
1363
+ return numberHeuristicSolutions_;
1364
+ }
1365
+ /// Set number of heuristic solutions
1366
+ inline void setNumberHeuristicSolutions(int value) {
1367
+ numberHeuristicSolutions_ = value;
1368
+ }
1369
+
1370
+ /// Set objective function sense (1 for min (default), -1 for max,)
1371
+ inline void setObjSense(double s) {
1372
+ dblParam_[CbcOptimizationDirection] = s;
1373
+ solver_->setObjSense(s);
1374
+ }
1375
+
1376
+ /// Value of objective at continuous
1377
+ inline double getContinuousObjective() const {
1378
+ return originalContinuousObjective_;
1379
+ }
1380
+ inline void setContinuousObjective(double value) {
1381
+ originalContinuousObjective_ = value;
1382
+ }
1383
+ /// Number of infeasibilities at continuous
1384
+ inline int getContinuousInfeasibilities() const {
1385
+ return continuousInfeasibilities_;
1386
+ }
1387
+ inline void setContinuousInfeasibilities(int value) {
1388
+ continuousInfeasibilities_ = value;
1389
+ }
1390
+ /// Value of objective after root node cuts added
1391
+ inline double rootObjectiveAfterCuts() const {
1392
+ return continuousObjective_;
1393
+ }
1394
+ /// Sum of Changes to objective by first solve
1395
+ inline double sumChangeObjective() const {
1396
+ return sumChangeObjective1_;
1397
+ }
1398
+ /** Number of times global cuts violated. When global cut pool then this
1399
+ should be kept for each cut and type of cut */
1400
+ inline int numberGlobalViolations() const {
1401
+ return numberGlobalViolations_;
1402
+ }
1403
+ inline void clearNumberGlobalViolations() {
1404
+ numberGlobalViolations_ = 0;
1405
+ }
1406
+ /// Whether to force a resolve after takeOffCuts
1407
+ inline bool resolveAfterTakeOffCuts() const {
1408
+ return resolveAfterTakeOffCuts_;
1409
+ }
1410
+ inline void setResolveAfterTakeOffCuts(bool yesNo) {
1411
+ resolveAfterTakeOffCuts_ = yesNo;
1412
+ }
1413
+ /// Maximum number of rows
1414
+ inline int maximumRows() const {
1415
+ return maximumRows_;
1416
+ }
1417
+ /// Work basis for temporary use
1418
+ inline CoinWarmStartBasis & workingBasis() {
1419
+ return workingBasis_;
1420
+ }
1421
+ /// Get number of "iterations" to stop after
1422
+ inline int getStopNumberIterations() const {
1423
+ return stopNumberIterations_;
1424
+ }
1425
+ /// Set number of "iterations" to stop after
1426
+ inline void setStopNumberIterations(int value) {
1427
+ stopNumberIterations_ = value;
1428
+ }
1429
+ /// A pointer to model from CbcHeuristic
1430
+ inline CbcModel * heuristicModel() const
1431
+ { return heuristicModel_;}
1432
+ /// Set a pointer to model from CbcHeuristic
1433
+ inline void setHeuristicModel(CbcModel * model)
1434
+ { heuristicModel_ = model;}
1435
+ //@}
1436
+
1437
+ /** \name Node selection */
1438
+ //@{
1439
+ // Comparison functions (which may be overridden by inheritance)
1440
+ inline CbcCompareBase * nodeComparison() const {
1441
+ return nodeCompare_;
1442
+ }
1443
+ void setNodeComparison(CbcCompareBase * compare);
1444
+ void setNodeComparison(CbcCompareBase & compare);
1445
+ //@}
1446
+
1447
+ /** \name Problem feasibility checking */
1448
+ //@{
1449
+ // Feasibility functions (which may be overridden by inheritance)
1450
+ inline CbcFeasibilityBase * problemFeasibility() const {
1451
+ return problemFeasibility_;
1452
+ }
1453
+ void setProblemFeasibility(CbcFeasibilityBase * feasibility);
1454
+ void setProblemFeasibility(CbcFeasibilityBase & feasibility);
1455
+ //@}
1456
+
1457
+ /** \name Tree methods and subtree methods */
1458
+ //@{
1459
+ /// Tree method e.g. heap (which may be overridden by inheritance)
1460
+ inline CbcTree * tree() const {
1461
+ return tree_;
1462
+ }
1463
+ /// For modifying tree handling (original is cloned)
1464
+ void passInTreeHandler(CbcTree & tree);
1465
+ /** For passing in an CbcModel to do a sub Tree (with derived tree handlers).
1466
+ Passed in model must exist for duration of branch and bound
1467
+ */
1468
+ void passInSubTreeModel(CbcModel & model);
1469
+ /** For retrieving a copy of subtree model with given OsiSolver.
1470
+ If no subtree model will use self (up to user to reset cutoff etc).
1471
+ If solver NULL uses current
1472
+ */
1473
+ CbcModel * subTreeModel(OsiSolverInterface * solver = NULL) const;
1474
+ /// Returns number of times any subtree stopped on nodes, time etc
1475
+ inline int numberStoppedSubTrees() const {
1476
+ return numberStoppedSubTrees_;
1477
+ }
1478
+ /// Says a sub tree was stopped
1479
+ inline void incrementSubTreeStopped() {
1480
+ numberStoppedSubTrees_++;
1481
+ }
1482
+ /** Whether to automatically do presolve before branch and bound (subTrees).
1483
+ 0 - no
1484
+ 1 - ordinary presolve
1485
+ 2 - integer presolve (dodgy)
1486
+ */
1487
+ inline int typePresolve() const {
1488
+ return presolve_;
1489
+ }
1490
+ inline void setTypePresolve(int value) {
1491
+ presolve_ = value;
1492
+ }
1493
+
1494
+ //@}
1495
+
1496
+ /** \name Branching Decisions
1497
+
1498
+ See the CbcBranchDecision class for additional information.
1499
+ */
1500
+ //@{
1501
+
1502
+ /// Get the current branching decision method.
1503
+ inline CbcBranchDecision * branchingMethod() const {
1504
+ return branchingMethod_;
1505
+ }
1506
+ /// Set the branching decision method.
1507
+ inline void setBranchingMethod(CbcBranchDecision * method) {
1508
+ delete branchingMethod_;
1509
+ branchingMethod_ = method->clone();
1510
+ }
1511
+ /** Set the branching method
1512
+
1513
+ \overload
1514
+ */
1515
+ inline void setBranchingMethod(CbcBranchDecision & method) {
1516
+ delete branchingMethod_;
1517
+ branchingMethod_ = method.clone();
1518
+ }
1519
+ /// Get the current cut modifier method
1520
+ inline CbcCutModifier * cutModifier() const {
1521
+ return cutModifier_;
1522
+ }
1523
+ /// Set the cut modifier method
1524
+ void setCutModifier(CbcCutModifier * modifier);
1525
+ /** Set the cut modifier method
1526
+
1527
+ \overload
1528
+ */
1529
+ void setCutModifier(CbcCutModifier & modifier);
1530
+ //@}
1531
+
1532
+ /** \name Row (constraint) and Column (variable) cut generation */
1533
+ //@{
1534
+
1535
+ /** State of search
1536
+ 0 - no solution
1537
+ 1 - only heuristic solutions
1538
+ 2 - branched to a solution
1539
+ 3 - no solution but many nodes
1540
+ */
1541
+ inline int stateOfSearch() const {
1542
+ return stateOfSearch_;
1543
+ }
1544
+ inline void setStateOfSearch(int state) {
1545
+ stateOfSearch_ = state;
1546
+ }
1547
+ /// Strategy worked out - mainly at root node for use by CbcNode
1548
+ inline int searchStrategy() const {
1549
+ return searchStrategy_;
1550
+ }
1551
+ /// Set strategy worked out - mainly at root node for use by CbcNode
1552
+ inline void setSearchStrategy(int value) {
1553
+ searchStrategy_ = value;
1554
+ }
1555
+ /// Stong branching strategy
1556
+ inline int strongStrategy() const {
1557
+ return strongStrategy_;
1558
+ }
1559
+ /// Set strong branching strategy
1560
+ inline void setStrongStrategy(int value) {
1561
+ strongStrategy_ = value;
1562
+ }
1563
+
1564
+ /// Get the number of cut generators
1565
+ inline int numberCutGenerators() const {
1566
+ return numberCutGenerators_;
1567
+ }
1568
+ /// Get the list of cut generators
1569
+ inline CbcCutGenerator ** cutGenerators() const {
1570
+ return generator_;
1571
+ }
1572
+ ///Get the specified cut generator
1573
+ inline CbcCutGenerator * cutGenerator(int i) const {
1574
+ return generator_[i];
1575
+ }
1576
+ ///Get the specified cut generator before any changes
1577
+ inline CbcCutGenerator * virginCutGenerator(int i) const {
1578
+ return virginGenerator_[i];
1579
+ }
1580
+ /** Add one generator - up to user to delete generators.
1581
+ howoften affects how generator is used. 0 or 1 means always,
1582
+ >1 means every that number of nodes. Negative values have same
1583
+ meaning as positive but they may be switched off (-> -100) by code if
1584
+ not many cuts generated at continuous. -99 is just done at root.
1585
+ Name is just for printout.
1586
+ If depth >0 overrides how often generator is called (if howOften==-1 or >0).
1587
+ */
1588
+ void addCutGenerator(CglCutGenerator * generator,
1589
+ int howOften = 1, const char * name = NULL,
1590
+ bool normal = true, bool atSolution = false,
1591
+ bool infeasible = false, int howOftenInSub = -100,
1592
+ int whatDepth = -1, int whatDepthInSub = -1);
1593
+ //@}
1594
+ /** \name Strategy and sub models
1595
+
1596
+ See the CbcStrategy class for additional information.
1597
+ */
1598
+ //@{
1599
+
1600
+ /// Get the current strategy
1601
+ inline CbcStrategy * strategy() const {
1602
+ return strategy_;
1603
+ }
1604
+ /// Set the strategy. Clones
1605
+ void setStrategy(CbcStrategy & strategy);
1606
+ /// Set the strategy. assigns
1607
+ inline void setStrategy(CbcStrategy * strategy) {
1608
+ strategy_ = strategy;
1609
+ }
1610
+ /// Get the current parent model
1611
+ inline CbcModel * parentModel() const {
1612
+ return parentModel_;
1613
+ }
1614
+ /// Set the parent model
1615
+ inline void setParentModel(CbcModel & parentModel) {
1616
+ parentModel_ = &parentModel;
1617
+ }
1618
+ //@}
1619
+
1620
+
1621
+ /** \name Heuristics and priorities */
1622
+ //@{
1623
+ /*! \brief Add one heuristic - up to user to delete
1624
+
1625
+ The name is just used for print messages.
1626
+ */
1627
+ void addHeuristic(CbcHeuristic * generator, const char *name = NULL,
1628
+ int before = -1);
1629
+ ///Get the specified heuristic
1630
+ inline CbcHeuristic * heuristic(int i) const {
1631
+ return heuristic_[i];
1632
+ }
1633
+ /// Get the number of heuristics
1634
+ inline int numberHeuristics() const {
1635
+ return numberHeuristics_;
1636
+ }
1637
+ /// Set the number of heuristics
1638
+ inline void setNumberHeuristics(int value) {
1639
+ numberHeuristics_ = value;
1640
+ }
1641
+ /// Pointer to heuristic solver which found last solution (or NULL)
1642
+ inline CbcHeuristic * lastHeuristic() const {
1643
+ return lastHeuristic_;
1644
+ }
1645
+ /// set last heuristic which found a solution
1646
+ inline void setLastHeuristic(CbcHeuristic * last) {
1647
+ lastHeuristic_ = last;
1648
+ }
1649
+
1650
+ /** Pass in branching priorities.
1651
+
1652
+ If ifClique then priorities are on cliques otherwise priorities are
1653
+ on integer variables.
1654
+ Other type (if exists set to default)
1655
+ 1 is highest priority. (well actually -INT_MAX is but that's ugly)
1656
+ If hotstart > 0 then branches are created to force
1657
+ the variable to the value given by best solution. This enables a
1658
+ sort of hot start. The node choice should be greatest depth
1659
+ and hotstart should normally be switched off after a solution.
1660
+
1661
+ If ifNotSimpleIntegers true then appended to normal integers
1662
+
1663
+ This is now deprecated except for simple usage. If user
1664
+ creates Cbcobjects then set priority in them
1665
+
1666
+ \internal Added for Kurt Spielberg.
1667
+ */
1668
+ void passInPriorities(const int * priorities, bool ifNotSimpleIntegers);
1669
+
1670
+ /// Returns priority level for an object (or 1000 if no priorities exist)
1671
+ inline int priority(int sequence) const {
1672
+ return object_[sequence]->priority();
1673
+ }
1674
+
1675
+ /*! \brief Set an event handler
1676
+
1677
+ A clone of the handler passed as a parameter is stored in CbcModel.
1678
+ */
1679
+ void passInEventHandler(const CbcEventHandler *eventHandler) ;
1680
+
1681
+ /*! \brief Retrieve a pointer to the event handler */
1682
+ inline CbcEventHandler* getEventHandler() const {
1683
+ return (eventHandler_) ;
1684
+ }
1685
+
1686
+ //@}
1687
+
1688
+ /**@name Setting/Accessing application data */
1689
+ //@{
1690
+ /** Set application data.
1691
+
1692
+ This is a pointer that the application can store into and
1693
+ retrieve from the solver interface.
1694
+ This field is available for the application to optionally
1695
+ define and use.
1696
+ */
1697
+ void setApplicationData (void * appData);
1698
+
1699
+ /// Get application data
1700
+ void * getApplicationData() const;
1701
+ /**
1702
+ For advanced applications you may wish to modify the behavior of Cbc
1703
+ e.g. if the solver is a NLP solver then you may not have an exact
1704
+ optimum solution at each step. Information could be built into
1705
+ OsiSolverInterface but this is an alternative so that that interface
1706
+ does not have to be changed. If something similar is useful to
1707
+ enough solvers then it could be migrated
1708
+ You can also pass in by using solver->setAuxiliaryInfo.
1709
+ You should do that if solver is odd - if solver is normal simplex
1710
+ then use this.
1711
+ NOTE - characteristics are not cloned
1712
+ */
1713
+ void passInSolverCharacteristics(OsiBabSolver * solverCharacteristics);
1714
+ /// Get solver characteristics
1715
+ inline const OsiBabSolver * solverCharacteristics() const {
1716
+ return solverCharacteristics_;
1717
+ }
1718
+ //@}
1719
+
1720
+ //---------------------------------------------------------------------------
1721
+
1722
+ /**@name Message handling etc */
1723
+ //@{
1724
+ /// Pass in Message handler (not deleted at end)
1725
+ void passInMessageHandler(CoinMessageHandler * handler);
1726
+ /// Set language
1727
+ void newLanguage(CoinMessages::Language language);
1728
+ inline void setLanguage(CoinMessages::Language language) {
1729
+ newLanguage(language);
1730
+ }
1731
+ /// Return handler
1732
+ inline CoinMessageHandler * messageHandler() const {
1733
+ return handler_;
1734
+ }
1735
+ /// Return messages
1736
+ inline CoinMessages & messages() {
1737
+ return messages_;
1738
+ }
1739
+ /// Return pointer to messages
1740
+ inline CoinMessages * messagesPointer() {
1741
+ return &messages_;
1742
+ }
1743
+ /// Set log level
1744
+ void setLogLevel(int value);
1745
+ /// Get log level
1746
+ inline int logLevel() const {
1747
+ return handler_->logLevel();
1748
+ }
1749
+ /** Set flag to say if handler_ is the default handler.
1750
+
1751
+ The default handler is deleted when the model is deleted. Other
1752
+ handlers (supplied by the client) will not be deleted.
1753
+ */
1754
+ inline void setDefaultHandler(bool yesNo) {
1755
+ defaultHandler_ = yesNo;
1756
+ }
1757
+ /// Check default handler
1758
+ inline bool defaultHandler() const {
1759
+ return defaultHandler_;
1760
+ }
1761
+ //@}
1762
+ //---------------------------------------------------------------------------
1763
+ ///@name Specialized
1764
+ //@{
1765
+
1766
+ /**
1767
+ Set special options
1768
+ 0 bit (1) - check if cuts valid (if on debugger list)
1769
+ 1 bit (2) - use current basis to check integer solution (rather than all slack)
1770
+ 2 bit (4) - don't check integer solution (by solving LP)
1771
+ 3 bit (8) - fast analyze
1772
+ 4 bit (16) - non-linear model - so no well defined CoinPackedMatrix
1773
+ 5 bit (32) - keep names
1774
+ 6 bit (64) - try for dominated columns
1775
+ 7 bit (128) - SOS type 1 but all declared integer
1776
+ 8 bit (256) - Set to say solution just found, unset by doing cuts
1777
+ 9 bit (512) - Try reduced model after 100 nodes
1778
+ 10 bit (1024) - Switch on some heuristics even if seems unlikely
1779
+ 11 bit (2048) - Mark as in small branch and bound
1780
+ 12 bit (4096) - Funny cuts so do slow way (in some places)
1781
+ 13 bit (8192) - Funny cuts so do slow way (in other places)
1782
+ 14 bit (16384) - Use Cplex! for fathoming
1783
+ 15 bit (32768) - Try reduced model after 0 nodes
1784
+ 16 bit (65536) - Original model had integer bounds
1785
+ 17 bit (131072) - Perturbation switched off
1786
+ 18 bit (262144) - donor CbcModel
1787
+ 19 bit (524288) - recipient CbcModel
1788
+ 20 bit (1048576) - waiting for sub model to return
1789
+ 22 bit (4194304) - do not initialize random seed in solver (user has)
1790
+ 23 bit (8388608) - leave solver_ with cuts
1791
+ 24 bit (16777216) - just get feasible if no cutoff
1792
+ */
1793
+ inline void setSpecialOptions(int value) {
1794
+ specialOptions_ = value;
1795
+ }
1796
+ /// Get special options
1797
+ inline int specialOptions() const {
1798
+ return specialOptions_;
1799
+ }
1800
+ /// Set random seed
1801
+ inline void setRandomSeed(int value) {
1802
+ randomSeed_ = value;
1803
+ }
1804
+ /// Get random seed
1805
+ inline int getRandomSeed() const {
1806
+ return randomSeed_;
1807
+ }
1808
+ /// Set multiple root tries
1809
+ inline void setMultipleRootTries(int value) {
1810
+ multipleRootTries_ = value;
1811
+ }
1812
+ /// Get multiple root tries
1813
+ inline int getMultipleRootTries() const {
1814
+ return multipleRootTries_;
1815
+ }
1816
+ /// Tell model to stop on event
1817
+ inline void sayEventHappened()
1818
+ { eventHappened_=true;}
1819
+ /// Says if normal solver i.e. has well defined CoinPackedMatrix
1820
+ inline bool normalSolver() const {
1821
+ return (specialOptions_&16) == 0;
1822
+ }
1823
+ /** Says if model is sitting there waiting for mini branch and bound to finish
1824
+ This is because an event handler may only have access to parent model in
1825
+ mini branch and bound
1826
+ */
1827
+ inline bool waitingForMiniBranchAndBound() const {
1828
+ return (specialOptions_&1048576) != 0;
1829
+ }
1830
+ /** Set more special options
1831
+ at present bottom 6 bits used for shadow price mode
1832
+ 1024 for experimental hotstart
1833
+ 2048,4096 breaking out of cuts
1834
+ 8192 slowly increase minimum drop
1835
+ 16384 gomory
1836
+ 32768 more heuristics in sub trees
1837
+ 65536 no cuts in preprocessing
1838
+ 131072 Time limits elapsed
1839
+ 18 bit (262144) - Perturb fathom nodes
1840
+ 19 bit (524288) - No limit on fathom nodes
1841
+ 20 bit (1048576) - Reduce sum of infeasibilities before cuts
1842
+ 21 bit (2097152) - Reduce sum of infeasibilities after cuts
1843
+ 22 bit (4194304) - Conflict analysis
1844
+ 23 bit (8388608) - Conflict analysis - temporary bit
1845
+ 24 bit (16777216) - Add cutoff as LP constraint (out)
1846
+ 25 bit (33554432) - diving/reordering
1847
+ 26 bit (67108864) - load global cuts from file
1848
+ 27 bit (134217728) - append binding global cuts to file
1849
+ 28 bit (268435456) - idiot branching
1850
+ 29 bit (536870912) - don't make fake objective
1851
+ 30 bit (1073741824) - Funny SOS or similar - be careful
1852
+ */
1853
+ inline void setMoreSpecialOptions(int value) {
1854
+ moreSpecialOptions_ = value;
1855
+ }
1856
+ /// Get more special options
1857
+ inline int moreSpecialOptions() const {
1858
+ return moreSpecialOptions_;
1859
+ }
1860
+ /** Set more more special options
1861
+ 0 bit (1) - find switching variables
1862
+ 1 bit (2) - using fake objective until solution
1863
+ 2 bit (4) - switching variables exist
1864
+ 3 bit (8) - skip most of setBestSolution checks
1865
+ 4 bit (16) - very lightweight preprocessing in smallB&B
1866
+ 5 bit (32) - event handler needs to be cloned when parallel
1867
+ 6 bit (64) - testing - use probing to make cliques
1868
+ 7/8 bit (128) - try orbital branching (if nauty)
1869
+ 9 bit (512) - branching on objective (later)
1870
+ 10 bit (1024) - branching on constraints (later)
1871
+ 11/12 bit 2048 - intermittent cuts
1872
+ 13/14 bit 8192 - go to bitter end in strong branching (first time)
1873
+ */
1874
+ inline void setMoreSpecialOptions2(int value) {
1875
+ moreSpecialOptions2_ = value;
1876
+ }
1877
+ /// Get more special options2
1878
+ inline int moreSpecialOptions2() const {
1879
+ return moreSpecialOptions2_;
1880
+ }
1881
+ /// Set cutoff as constraint
1882
+ inline void setCutoffAsConstraint(bool yesNo) {
1883
+ cutoffRowNumber_ = (yesNo) ? -2 : -1;
1884
+ }
1885
+ /// Set time method
1886
+ inline void setUseElapsedTime(bool yesNo) {
1887
+ if (yesNo)
1888
+ moreSpecialOptions_ |= 131072;
1889
+ else
1890
+ moreSpecialOptions_ &= ~131072;
1891
+ }
1892
+ /// Get time method
1893
+ inline bool useElapsedTime() const {
1894
+ return (moreSpecialOptions_&131072)!=0;
1895
+ }
1896
+ /// Get useful temporary pointer
1897
+ inline void * temporaryPointer() const
1898
+ { return temporaryPointer_;}
1899
+ /// Set useful temporary pointer
1900
+ inline void setTemporaryPointer(void * pointer)
1901
+ { temporaryPointer_=pointer;}
1902
+ /// Go to dantzig pivot selection if easy problem (clp only)
1903
+ void goToDantzig(int numberNodes, ClpDualRowPivot *& savePivotMethod);
1904
+ /// Now we may not own objects - just point to solver's objects
1905
+ inline bool ownObjects() const {
1906
+ return ownObjects_;
1907
+ }
1908
+ /// Check original model before it gets messed up
1909
+ void checkModel();
1910
+ //@}
1911
+ //---------------------------------------------------------------------------
1912
+
1913
+ ///@name Constructors and destructors etc
1914
+ //@{
1915
+ /// Default Constructor
1916
+ CbcModel();
1917
+
1918
+ /// Constructor from solver
1919
+ CbcModel(const OsiSolverInterface &);
1920
+
1921
+ /** Assign a solver to the model (model assumes ownership)
1922
+
1923
+ On return, \p solver will be NULL.
1924
+ If deleteSolver then current solver deleted (if model owned)
1925
+
1926
+ \note Parameter settings in the outgoing solver are not inherited by
1927
+ the incoming solver.
1928
+ */
1929
+ void assignSolver(OsiSolverInterface *&solver, bool deleteSolver = true);
1930
+
1931
+ /** \brief Set ownership of solver
1932
+
1933
+ A parameter of false tells CbcModel it does not own the solver and
1934
+ should not delete it. Once you claim ownership of the solver, you're
1935
+ responsible for eventually deleting it. Note that CbcModel clones
1936
+ solvers with abandon. Unless you have a deep understanding of the
1937
+ workings of CbcModel, the only time you want to claim ownership is when
1938
+ you're about to delete the CbcModel object but want the solver to
1939
+ continue to exist (as, for example, when branchAndBound has finished
1940
+ and you want to hang on to the answer).
1941
+ */
1942
+ inline void setModelOwnsSolver (bool ourSolver) {
1943
+ ownership_ = ourSolver ? (ownership_ | 0x80000000) : (ownership_ & (~0x80000000)) ;
1944
+ }
1945
+
1946
+ /*! \brief Get ownership of solver
1947
+
1948
+ A return value of true means that CbcModel owns the solver and will
1949
+ take responsibility for deleting it when that becomes necessary.
1950
+ */
1951
+ inline bool modelOwnsSolver () {
1952
+ return ((ownership_&0x80000000) != 0) ;
1953
+ }
1954
+
1955
+ /** Copy constructor .
1956
+ If cloneHandler is true then message handler is cloned
1957
+ */
1958
+ CbcModel(const CbcModel & rhs, bool cloneHandler = false);
1959
+
1960
+ /** Clone */
1961
+ virtual CbcModel *clone (bool cloneHandler);
1962
+
1963
+ /// Assignment operator
1964
+ CbcModel & operator=(const CbcModel& rhs);
1965
+
1966
+ /// Destructor
1967
+ virtual ~CbcModel ();
1968
+
1969
+ /// Returns solver - has current state
1970
+ inline OsiSolverInterface * solver() const {
1971
+ return solver_;
1972
+ }
1973
+
1974
+ /// Returns current solver - sets new one
1975
+ inline OsiSolverInterface * swapSolver(OsiSolverInterface * solver) {
1976
+ OsiSolverInterface * returnSolver = solver_;
1977
+ solver_ = solver;
1978
+ return returnSolver;
1979
+ }
1980
+
1981
+ /// Returns solver with continuous state
1982
+ inline OsiSolverInterface * continuousSolver() const {
1983
+ return continuousSolver_;
1984
+ }
1985
+
1986
+ /// Create solver with continuous state
1987
+ inline void createContinuousSolver() {
1988
+ continuousSolver_ = solver_->clone();
1989
+ }
1990
+ /// Clear solver with continuous state
1991
+ inline void clearContinuousSolver() {
1992
+ delete continuousSolver_;
1993
+ continuousSolver_ = NULL;
1994
+ }
1995
+
1996
+ /// A copy of the solver, taken at constructor or by saveReferenceSolver
1997
+ inline OsiSolverInterface * referenceSolver() const {
1998
+ return referenceSolver_;
1999
+ }
2000
+
2001
+ /// Save a copy of the current solver so can be reset to
2002
+ void saveReferenceSolver();
2003
+
2004
+ /** Uses a copy of reference solver to be current solver.
2005
+ Because of possible mismatches all exotic integer information is loat
2006
+ (apart from normal information in OsiSolverInterface)
2007
+ so SOS etc and priorities will have to be redone
2008
+ */
2009
+ void resetToReferenceSolver();
2010
+
2011
+ /// Clears out as much as possible (except solver)
2012
+ void gutsOfDestructor();
2013
+ /** Clears out enough to reset CbcModel as if no branch and bound done
2014
+ */
2015
+ void gutsOfDestructor2();
2016
+ /** Clears out enough to reset CbcModel cutoff etc
2017
+ */
2018
+ void resetModel();
2019
+ /** Most of copy constructor
2020
+ mode - 0 copy but don't delete before
2021
+ 1 copy and delete before
2022
+ 2 copy and delete before (but use virgin generators)
2023
+ */
2024
+ void gutsOfCopy(const CbcModel & rhs, int mode = 0);
2025
+ /// Move status, nodes etc etc across
2026
+ void moveInfo(const CbcModel & rhs);
2027
+ //@}
2028
+
2029
+ ///@name Multithreading
2030
+ //@{
2031
+ /// Indicates whether Cbc library has been compiled with multithreading support
2032
+ static bool haveMultiThreadSupport();
2033
+ /// Get pointer to masterthread
2034
+ CbcThread * masterThread() const {
2035
+ return masterThread_;
2036
+ }
2037
+ /// Get pointer to walkback
2038
+ CbcNodeInfo ** walkback() const {
2039
+ return walkback_;
2040
+ }
2041
+ /// Get number of threads
2042
+ inline int getNumberThreads() const {
2043
+ return numberThreads_;
2044
+ }
2045
+ /// Set number of threads
2046
+ inline void setNumberThreads(int value) {
2047
+ numberThreads_ = value;
2048
+ }
2049
+ /// Get thread mode
2050
+ inline int getThreadMode() const {
2051
+ return threadMode_;
2052
+ }
2053
+ /** Set thread mode
2054
+ always use numberThreads for branching
2055
+ 1 set then deterministic
2056
+ 2 set then use numberThreads for root cuts
2057
+ 4 set then use numberThreads in root mini branch and bound
2058
+ 8 set and numberThreads - do heuristics numberThreads at a time
2059
+ 8 set and numberThreads==0 do all heuristics at once
2060
+ default is 0
2061
+ */
2062
+ inline void setThreadMode(int value) {
2063
+ threadMode_ = value;
2064
+ }
2065
+ /** Return
2066
+ -2 if deterministic threaded and main thread
2067
+ -1 if deterministic threaded and serial thread
2068
+ 0 if serial
2069
+ 1 if opportunistic threaded
2070
+ */
2071
+ inline int parallelMode() const {
2072
+ if (!numberThreads_) {
2073
+ if ((threadMode_&1) == 0)
2074
+ return 0;
2075
+ else
2076
+ return -1;
2077
+ return 0;
2078
+ } else {
2079
+ if ((threadMode_&1) == 0)
2080
+ return 1;
2081
+ else
2082
+ return -2;
2083
+ }
2084
+ }
2085
+ /// Thread stuff for master
2086
+ inline CbcBaseModel * master() const
2087
+ { return master_;}
2088
+ /// From here to end of section - code in CbcThread.cpp until class changed
2089
+ /// Returns true if locked
2090
+ bool isLocked() const;
2091
+ #ifdef CBC_THREAD
2092
+ /**
2093
+ Locks a thread if parallel so that stuff like cut pool
2094
+ can be updated and/or used.
2095
+ */
2096
+ void lockThread();
2097
+ /**
2098
+ Unlocks a thread if parallel to say cut pool stuff not needed
2099
+ */
2100
+ void unlockThread();
2101
+ #else
2102
+ inline void lockThread() {}
2103
+ inline void unlockThread() {}
2104
+ #endif
2105
+ /** Set information in a child
2106
+ -3 pass pointer to child thread info
2107
+ -2 just stop
2108
+ -1 delete simple child stuff
2109
+ 0 delete opportunistic child stuff
2110
+ 1 delete deterministic child stuff
2111
+ */
2112
+ void setInfoInChild(int type, CbcThread * info);
2113
+ /** Move/copy information from one model to another
2114
+ -1 - initialization
2115
+ 0 - from base model
2116
+ 1 - to base model (and reset)
2117
+ 2 - add in final statistics etc (and reset so can do clean destruction)
2118
+ */
2119
+ void moveToModel(CbcModel * baseModel, int mode);
2120
+ /// Split up nodes
2121
+ int splitModel(int numberModels, CbcModel ** model,
2122
+ int numberNodes);
2123
+ /// Start threads
2124
+ void startSplitModel(int numberIterations);
2125
+ /// Merge models
2126
+ void mergeModels(int numberModel, CbcModel ** model,
2127
+ int numberNodes);
2128
+ //@}
2129
+
2130
+ ///@name semi-private i.e. users should not use
2131
+ //@{
2132
+ /// Get how many Nodes it took to solve the problem.
2133
+ int getNodeCount2() const {
2134
+ return numberNodes2_;
2135
+ }
2136
+ /// Set pointers for speed
2137
+ void setPointers(const OsiSolverInterface * solver);
2138
+ /** Perform reduced cost fixing
2139
+
2140
+ Fixes integer variables at their current value based on reduced cost
2141
+ penalties. Returns number fixed
2142
+ */
2143
+ int reducedCostFix() ;
2144
+ /** Makes all handlers same. If makeDefault 1 then makes top level
2145
+ default and rest point to that. If 2 then each is copy
2146
+ */
2147
+ void synchronizeHandlers(int makeDefault);
2148
+ /// Save a solution to saved list
2149
+ void saveExtraSolution(const double * solution, double objectiveValue);
2150
+ /// Save a solution to best and move current to saved
2151
+ void saveBestSolution(const double * solution, double objectiveValue);
2152
+ /// Delete best and saved solutions
2153
+ void deleteSolutions();
2154
+ /// Encapsulates solver resolve
2155
+ int resolve(OsiSolverInterface * solver);
2156
+ #ifdef CLP_RESOLVE
2157
+ /// Special purpose resolve
2158
+ int resolveClp(OsiClpSolverInterface * solver, int type);
2159
+ #endif
2160
+
2161
+ /** Encapsulates choosing a variable -
2162
+ anyAction -2, infeasible (-1 round again), 0 done
2163
+ */
2164
+ int chooseBranch(CbcNode * & newNode, int numberPassesLeft,
2165
+ CbcNode * oldNode, OsiCuts & cuts,
2166
+ bool & resolved, CoinWarmStartBasis *lastws,
2167
+ const double * lowerBefore, const double * upperBefore,
2168
+ OsiSolverBranch * & branches);
2169
+ int chooseBranch(CbcNode * newNode, int numberPassesLeft, bool & resolved);
2170
+
2171
+ /** Return an empty basis object of the specified size
2172
+
2173
+ A useful utility when constructing a basis for a subproblem from scratch.
2174
+ The object returned will be of the requested capacity and appropriate for
2175
+ the solver attached to the model.
2176
+ */
2177
+ CoinWarmStartBasis *getEmptyBasis(int ns = 0, int na = 0) const ;
2178
+
2179
+ /** Remove inactive cuts from the model
2180
+
2181
+ An OsiSolverInterface is expected to maintain a valid basis, but not a
2182
+ valid solution, when loose cuts are deleted. Restoring a valid solution
2183
+ requires calling the solver to reoptimise. If it's certain the solution
2184
+ will not be required, set allowResolve to false to suppress
2185
+ reoptimisation.
2186
+ If saveCuts then slack cuts will be saved
2187
+ On input current cuts are cuts and newCuts
2188
+ on exit current cuts will be correct. Returns number dropped
2189
+ */
2190
+ int takeOffCuts(OsiCuts &cuts,
2191
+ bool allowResolve, OsiCuts * saveCuts,
2192
+ int numberNewCuts = 0, const OsiRowCut ** newCuts = NULL) ;
2193
+
2194
+ /** Determine and install the active cuts that need to be added for
2195
+ the current subproblem
2196
+
2197
+ The whole truth is a bit more complicated. The first action is a call to
2198
+ addCuts1(). addCuts() then sorts through the list, installs the tight
2199
+ cuts in the model, and does bookkeeping (adjusts reference counts).
2200
+ The basis returned from addCuts1() is adjusted accordingly.
2201
+
2202
+ If it turns out that the node should really be fathomed by bound,
2203
+ addCuts() simply treats all the cuts as loose as it does the bookkeeping.
2204
+
2205
+ */
2206
+ int addCuts(CbcNode * node, CoinWarmStartBasis *&lastws);
2207
+
2208
+ /** Traverse the tree from node to root and prep the model
2209
+
2210
+ addCuts1() begins the job of prepping the model to match the current
2211
+ subproblem. The model is stripped of all cuts, and the search tree is
2212
+ traversed from node to root to determine the changes required. Appropriate
2213
+ bounds changes are installed, a list of cuts is collected but not
2214
+ installed, and an appropriate basis (minus the cuts, but big enough to
2215
+ accommodate them) is constructed.
2216
+
2217
+ Returns true if new problem similar to old
2218
+
2219
+ \todo addCuts1() is called in contexts where it's known in advance that
2220
+ all that's desired is to determine a list of cuts and do the
2221
+ bookkeeping (adjust the reference counts). The work of installing
2222
+ bounds and building a basis goes to waste.
2223
+ */
2224
+ bool addCuts1(CbcNode * node, CoinWarmStartBasis *&lastws);
2225
+ /** Returns bounds just before where - initially original bounds.
2226
+ Also sets downstream nodes (lower if force 1, upper if 2)
2227
+ */
2228
+ void previousBounds (CbcNode * node, CbcNodeInfo * where, int iColumn,
2229
+ double & lower, double & upper, int force);
2230
+ /** Set objective value in a node. This is separated out so that
2231
+ odd solvers can use. It may look at extra information in
2232
+ solverCharacteriscs_ and will also use bound from parent node
2233
+ */
2234
+ void setObjectiveValue(CbcNode * thisNode, const CbcNode * parentNode) const;
2235
+
2236
+ /** If numberBeforeTrust >0 then we are going to use CbcBranchDynamic.
2237
+ Scan and convert CbcSimpleInteger objects
2238
+ */
2239
+ void convertToDynamic();
2240
+ /// Set numberBeforeTrust in all objects
2241
+ void synchronizeNumberBeforeTrust(int type = 0);
2242
+ /// Zap integer information in problem (may leave object info)
2243
+ void zapIntegerInformation(bool leaveObjects = true);
2244
+ /// Use cliques for pseudocost information - return nonzero if infeasible
2245
+ int cliquePseudoCosts(int doStatistics);
2246
+ /// Fill in useful estimates
2247
+ void pseudoShadow(int type);
2248
+ /** Return pseudo costs
2249
+ If not all integers or not pseudo costs - returns all zero
2250
+ Length of arrays are numberIntegers() and entries
2251
+ correspond to integerVariable()[i]
2252
+ User must allocate arrays before call
2253
+ */
2254
+ void fillPseudoCosts(double * downCosts, double * upCosts,
2255
+ int * priority = NULL,
2256
+ int * numberDown = NULL, int * numberUp = NULL,
2257
+ int * numberDownInfeasible = NULL,
2258
+ int * numberUpInfeasible = NULL) const;
2259
+ /** Do heuristics at root.
2260
+ 0 - don't delete
2261
+ 1 - delete
2262
+ 2 - just delete - don't even use
2263
+ */
2264
+ void doHeuristicsAtRoot(int deleteHeuristicsAfterwards = 0);
2265
+ /// Adjust heuristics based on model
2266
+ void adjustHeuristics();
2267
+ /// Get the hotstart solution
2268
+ inline const double * hotstartSolution() const {
2269
+ return hotstartSolution_;
2270
+ }
2271
+ /// Get the hotstart priorities
2272
+ inline const int * hotstartPriorities() const {
2273
+ return hotstartPriorities_;
2274
+ }
2275
+
2276
+ /// Return the list of cuts initially collected for this subproblem
2277
+ inline CbcCountRowCut ** addedCuts() const {
2278
+ return addedCuts_;
2279
+ }
2280
+ /// Number of entries in the list returned by #addedCuts()
2281
+ inline int currentNumberCuts() const {
2282
+ return currentNumberCuts_;
2283
+ }
2284
+ /// Global cuts
2285
+ inline CbcRowCuts * globalCuts() {
2286
+ return &globalCuts_;
2287
+ }
2288
+ /// Get rid of global cuts
2289
+ inline void zapGlobalCuts() {
2290
+ globalCuts_ = CbcRowCuts();
2291
+ }
2292
+ /// Copy and set a pointer to a row cut which will be added instead of normal branching.
2293
+ void setNextRowCut(const OsiRowCut & cut);
2294
+ /// Get a pointer to current node (be careful)
2295
+ inline CbcNode * currentNode() const {
2296
+ return currentNode_;
2297
+ }
2298
+ /// Get a pointer to probing info
2299
+ inline CglTreeProbingInfo * probingInfo() const {
2300
+ return probingInfo_;
2301
+ }
2302
+ /// Thread specific random number generator
2303
+ inline CoinThreadRandom * randomNumberGenerator() {
2304
+ return &randomNumberGenerator_;
2305
+ }
2306
+ /// Set the number of iterations done in strong branching.
2307
+ inline void setNumberStrongIterations(int number) {
2308
+ numberStrongIterations_ = number;
2309
+ }
2310
+ /// Get the number of iterations done in strong branching.
2311
+ inline int numberStrongIterations() const {
2312
+ return numberStrongIterations_;
2313
+ }
2314
+ /// Get maximum number of iterations (designed to be used in heuristics)
2315
+ inline int maximumNumberIterations() const {
2316
+ return maximumNumberIterations_;
2317
+ }
2318
+ /// Set maximum number of iterations (designed to be used in heuristics)
2319
+ inline void setMaximumNumberIterations(int value) {
2320
+ maximumNumberIterations_ = value;
2321
+ }
2322
+ /// Symmetry information
2323
+ inline CbcSymmetry * symmetryInfo() const
2324
+ { return symmetryInfo_;}
2325
+ /// Set depth for fast nodes
2326
+ inline void setFastNodeDepth(int value) {
2327
+ fastNodeDepth_ = value;
2328
+ }
2329
+ /// Get depth for fast nodes
2330
+ inline int fastNodeDepth() const {
2331
+ return fastNodeDepth_;
2332
+ }
2333
+ /// Get anything with priority >= this can be treated as continuous
2334
+ inline int continuousPriority() const {
2335
+ return continuousPriority_;
2336
+ }
2337
+ /// Set anything with priority >= this can be treated as continuous
2338
+ inline void setContinuousPriority(int value) {
2339
+ continuousPriority_ = value;
2340
+ }
2341
+ inline void incrementExtra(int nodes, int iterations, int fathoms=1) {
2342
+ numberExtraNodes_ += nodes;
2343
+ numberExtraIterations_ += iterations;
2344
+ numberFathoms_ += fathoms;
2345
+ }
2346
+ /// Zero extra
2347
+ inline void zeroExtra() {
2348
+ numberExtraNodes_ = 0;
2349
+ numberExtraIterations_ = 0;
2350
+ numberFathoms_ = 0;
2351
+ }
2352
+ /// Number of extra iterations
2353
+ inline int numberExtraIterations() const {
2354
+ return numberExtraIterations_;
2355
+ }
2356
+ /// Increment strong info
2357
+ void incrementStrongInfo(int numberTimes, int numberIterations,
2358
+ int numberFixed, bool ifInfeasible);
2359
+ /// Return strong info
2360
+ inline const int * strongInfo() const {
2361
+ return strongInfo_;
2362
+ }
2363
+
2364
+ /// Return mutable strong info
2365
+ inline int * mutableStrongInfo() {
2366
+ return strongInfo_;
2367
+ }
2368
+ /// Get stored row cuts for donor/recipient CbcModel
2369
+ CglStored * storedRowCuts() const {
2370
+ return storedRowCuts_;
2371
+ }
2372
+ /// Set stored row cuts for donor/recipient CbcModel
2373
+ void setStoredRowCuts(CglStored * cuts) {
2374
+ storedRowCuts_ = cuts;
2375
+ }
2376
+ /// Says whether all dynamic integers
2377
+ inline bool allDynamic () const {
2378
+ return ((ownership_&0x40000000) != 0) ;
2379
+ }
2380
+ /// Create C++ lines to get to current state
2381
+ void generateCpp( FILE * fp, int options);
2382
+ /// Generate an OsiBranchingInformation object
2383
+ OsiBranchingInformation usefulInformation() const;
2384
+ /** Warm start object produced by heuristic or strong branching
2385
+
2386
+ If get a valid integer solution outside branch and bound then it can take
2387
+ a reasonable time to solve LP which produces clean solution. If this object has
2388
+ any size then it will be used in solve.
2389
+ */
2390
+ inline void setBestSolutionBasis(const CoinWarmStartBasis & bestSolutionBasis) {
2391
+ bestSolutionBasis_ = bestSolutionBasis;
2392
+ }
2393
+ /// Redo walkback arrays
2394
+ void redoWalkBack();
2395
+ //@}
2396
+
2397
+ void setMIPStart( const std::vector< std::pair< std::string, double > > &mips ) {
2398
+ this->mipStart_ = mips;
2399
+ }
2400
+
2401
+ const std::vector< std::pair< std::string, double > > &getMIPStart() {
2402
+ return this->mipStart_;
2403
+ }
2404
+
2405
+
2406
+ //---------------------------------------------------------------------------
2407
+
2408
+ private:
2409
+ ///@name Private member data
2410
+ //@{
2411
+
2412
+ /// The solver associated with this model.
2413
+ OsiSolverInterface * solver_;
2414
+
2415
+ /** Ownership of objects and other stuff
2416
+
2417
+ 0x80000000 model owns solver
2418
+ 0x40000000 all variables CbcDynamicPseudoCost
2419
+ */
2420
+ unsigned int ownership_ ;
2421
+
2422
+ /// A copy of the solver, taken at the continuous (root) node.
2423
+ OsiSolverInterface * continuousSolver_;
2424
+
2425
+ /// A copy of the solver, taken at constructor or by saveReferenceSolver
2426
+ OsiSolverInterface * referenceSolver_;
2427
+
2428
+ /// Message handler
2429
+ CoinMessageHandler * handler_;
2430
+
2431
+ /** Flag to say if handler_ is the default handler.
2432
+
2433
+ The default handler is deleted when the model is deleted. Other
2434
+ handlers (supplied by the client) will not be deleted.
2435
+ */
2436
+ bool defaultHandler_;
2437
+
2438
+ /// Cbc messages
2439
+ CoinMessages messages_;
2440
+
2441
+ /// Array for integer parameters
2442
+ int intParam_[CbcLastIntParam];
2443
+
2444
+ /// Array for double parameters
2445
+ double dblParam_[CbcLastDblParam];
2446
+
2447
+ /** Pointer to an empty warm start object
2448
+
2449
+ It turns out to be useful to have this available as a base from
2450
+ which to build custom warm start objects. This is typed as CoinWarmStart
2451
+ rather than CoinWarmStartBasis to allow for the possibility that a
2452
+ client might want to apply a solver that doesn't use a basis-based warm
2453
+ start. See getEmptyBasis for an example of how this field can be used.
2454
+ */
2455
+ mutable CoinWarmStart *emptyWarmStart_ ;
2456
+
2457
+ /// Best objective
2458
+ double bestObjective_;
2459
+ /// Best possible objective
2460
+ double bestPossibleObjective_;
2461
+ /// Sum of Changes to objective by first solve
2462
+ double sumChangeObjective1_;
2463
+ /// Sum of Changes to objective by subsequent solves
2464
+ double sumChangeObjective2_;
2465
+
2466
+ /// Array holding the incumbent (best) solution.
2467
+ double * bestSolution_;
2468
+ /// Arrays holding other solutions.
2469
+ double ** savedSolutions_;
2470
+
2471
+ /** Array holding the current solution.
2472
+
2473
+ This array is used more as a temporary.
2474
+ */
2475
+ double * currentSolution_;
2476
+ /** For testing infeasibilities - will point to
2477
+ currentSolution_ or solver-->getColSolution()
2478
+ */
2479
+ mutable const double * testSolution_;
2480
+ /** MIPstart values
2481
+ values for integer variables which will be converted to a complete integer initial feasible solution
2482
+ */
2483
+ std::vector< std::pair< std::string, double > > mipStart_;
2484
+ /** Warm start object produced by heuristic or strong branching
2485
+
2486
+ If get a valid integer solution outside branch and bound then it can take
2487
+ a reasonable time to solve LP which produces clean solution. If this object has
2488
+ any size then it will be used in solve.
2489
+ */
2490
+ CoinWarmStartBasis bestSolutionBasis_ ;
2491
+ /// Global cuts
2492
+ CbcRowCuts globalCuts_;
2493
+ /// Global conflict cuts
2494
+ CbcRowCuts * globalConflictCuts_;
2495
+
2496
+ /// Minimum degradation in objective value to continue cut generation
2497
+ double minimumDrop_;
2498
+ /// Number of solutions
2499
+ int numberSolutions_;
2500
+ /// Number of saved solutions
2501
+ int numberSavedSolutions_;
2502
+ /// Maximum number of saved solutions
2503
+ int maximumSavedSolutions_;
2504
+ /** State of search
2505
+ 0 - no solution
2506
+ 1 - only heuristic solutions
2507
+ 2 - branched to a solution
2508
+ 3 - no solution but many nodes
2509
+ */
2510
+ int stateOfSearch_;
2511
+ /// At which depths to do cuts
2512
+ int whenCuts_;
2513
+ /// Hotstart solution
2514
+ double * hotstartSolution_;
2515
+ /// Hotstart priorities
2516
+ int * hotstartPriorities_;
2517
+ /// Number of heuristic solutions
2518
+ int numberHeuristicSolutions_;
2519
+ /// Cumulative number of nodes
2520
+ int numberNodes_;
2521
+ /** Cumulative number of nodes for statistics.
2522
+ Must fix to match up
2523
+ */
2524
+ int numberNodes2_;
2525
+ /// Cumulative number of iterations
2526
+ int numberIterations_;
2527
+ /// Cumulative number of solves
2528
+ int numberSolves_;
2529
+ /// Status of problem - 0 finished, 1 stopped, 2 difficulties
2530
+ int status_;
2531
+ /** Secondary status of problem
2532
+ -1 unset (status_ will also be -1)
2533
+ 0 search completed with solution
2534
+ 1 linear relaxation not feasible (or worse than cutoff)
2535
+ 2 stopped on gap
2536
+ 3 stopped on nodes
2537
+ 4 stopped on time
2538
+ 5 stopped on user event
2539
+ 6 stopped on solutions
2540
+ */
2541
+ int secondaryStatus_;
2542
+ /// Number of integers in problem
2543
+ int numberIntegers_;
2544
+ /// Number of rows at continuous
2545
+ int numberRowsAtContinuous_;
2546
+ /**
2547
+ -1 - cutoff as constraint not activated
2548
+ -2 - waiting to activate
2549
+ >=0 - activated
2550
+ */
2551
+ int cutoffRowNumber_;
2552
+ /// Maximum number of cuts
2553
+ int maximumNumberCuts_;
2554
+ /** Current phase (so heuristics etc etc can find out).
2555
+ 0 - initial solve
2556
+ 1 - solve with cuts at root
2557
+ 2 - solve with cuts
2558
+ 3 - other e.g. strong branching
2559
+ 4 - trying to validate a solution
2560
+ 5 - at end of search
2561
+ */
2562
+ int phase_;
2563
+
2564
+ /// Number of entries in #addedCuts_
2565
+ int currentNumberCuts_;
2566
+
2567
+ /** Current limit on search tree depth
2568
+
2569
+ The allocated size of #walkback_. Increased as needed.
2570
+ */
2571
+ int maximumDepth_;
2572
+ /** Array used to assemble the path between a node and the search tree root
2573
+
2574
+ The array is resized when necessary. #maximumDepth_ is the current
2575
+ allocated size.
2576
+ */
2577
+ CbcNodeInfo ** walkback_;
2578
+ CbcNodeInfo ** lastNodeInfo_;
2579
+ const OsiRowCut ** lastCut_;
2580
+ int lastDepth_;
2581
+ int lastNumberCuts2_;
2582
+ int maximumCuts_;
2583
+ int * lastNumberCuts_;
2584
+
2585
+ /** The list of cuts initially collected for this subproblem
2586
+
2587
+ When the subproblem at this node is rebuilt, a set of cuts is collected
2588
+ for inclusion in the constraint system. If any of these cuts are
2589
+ subsequently removed because they have become loose, the corresponding
2590
+ entry is set to NULL.
2591
+ */
2592
+ CbcCountRowCut ** addedCuts_;
2593
+
2594
+ /** A pointer to a row cut which will be added instead of normal branching.
2595
+ After use it should be set to NULL.
2596
+ */
2597
+ OsiRowCut * nextRowCut_;
2598
+
2599
+ /// Current node so can be used elsewhere
2600
+ CbcNode * currentNode_;
2601
+
2602
+ /// Indices of integer variables
2603
+ int * integerVariable_;
2604
+ /// Whether of not integer
2605
+ char * integerInfo_;
2606
+ /// Holds solution at continuous (after cuts)
2607
+ double * continuousSolution_;
2608
+ /// Array marked whenever a solution is found if non-zero
2609
+ int * usedInSolution_;
2610
+ /**
2611
+ Special options
2612
+ 0 bit (1) - check if cuts valid (if on debugger list)
2613
+ 1 bit (2) - use current basis to check integer solution (rather than all slack)
2614
+ 2 bit (4) - don't check integer solution (by solving LP)
2615
+ 3 bit (8) - fast analyze
2616
+ 4 bit (16) - non-linear model - so no well defined CoinPackedMatrix
2617
+ 5 bit (32) - keep names
2618
+ 6 bit (64) - try for dominated columns
2619
+ 7 bit (128) - SOS type 1 but all declared integer
2620
+ 8 bit (256) - Set to say solution just found, unset by doing cuts
2621
+ 9 bit (512) - Try reduced model after 100 nodes
2622
+ 10 bit (1024) - Switch on some heuristics even if seems unlikely
2623
+ 11 bit (2048) - Mark as in small branch and bound
2624
+ 12 bit (4096) - Funny cuts so do slow way (in some places)
2625
+ 13 bit (8192) - Funny cuts so do slow way (in other places)
2626
+ 14 bit (16384) - Use Cplex! for fathoming
2627
+ 15 bit (32768) - Try reduced model after 0 nodes
2628
+ 16 bit (65536) - Original model had integer bounds
2629
+ 17 bit (131072) - Perturbation switched off
2630
+ 18 bit (262144) - donor CbcModel
2631
+ 19 bit (524288) - recipient CbcModel
2632
+ 20 bit (1048576) - waiting for sub model to return
2633
+ 22 bit (4194304) - do not initialize random seed in solver (user has)
2634
+ 23 bit (8388608) - leave solver_ with cuts
2635
+ 24 bit (16777216) - just get feasible if no cutoff
2636
+ */
2637
+ int specialOptions_;
2638
+ /** More special options
2639
+ at present bottom 6 bits used for shadow price mode
2640
+ 1024 for experimental hotstart
2641
+ 2048,4096 breaking out of cuts
2642
+ 8192 slowly increase minimum drop
2643
+ 16384 gomory
2644
+ 32768 more heuristics in sub trees
2645
+ 65536 no cuts in preprocessing
2646
+ 131072 Time limits elapsed
2647
+ 18 bit (262144) - Perturb fathom nodes
2648
+ 19 bit (524288) - No limit on fathom nodes
2649
+ 20 bit (1048576) - Reduce sum of infeasibilities before cuts
2650
+ 21 bit (2097152) - Reduce sum of infeasibilities after cuts
2651
+ */
2652
+ int moreSpecialOptions_;
2653
+ /** More more special options
2654
+ 0 bit (1) - find switching variables
2655
+ 1 bit (2) - using fake objective until solution
2656
+ 2 bit (4) - switching variables exist
2657
+ 3 bit (8) - skip most of setBestSolution checks
2658
+ 4 bit (16) - very lightweight preprocessing in smallB&B
2659
+ 5 bit (32) - event handler needs to be cloned when parallel
2660
+ 6 bit (64) - testing - use probing to make cliques
2661
+ 7/8 bit (128) - try orbital branching (if nauty)
2662
+ 9 bit (512) - branching on objective (later)
2663
+ 10 bit (1024) - branching on constraints (later)
2664
+ 11/12 bit 2048 - intermittent cuts
2665
+ */
2666
+ int moreSpecialOptions2_;
2667
+ /// User node comparison function
2668
+ CbcCompareBase * nodeCompare_;
2669
+ /// User feasibility function (see CbcFeasibleBase.hpp)
2670
+ CbcFeasibilityBase * problemFeasibility_;
2671
+ /// Tree
2672
+ CbcTree * tree_;
2673
+ /// Pointer to top of tree
2674
+ CbcFullNodeInfo * topOfTree_;
2675
+ /// A pointer to model to be used for subtrees
2676
+ CbcModel * subTreeModel_;
2677
+ /// A pointer to model from CbcHeuristic
2678
+ CbcModel * heuristicModel_;
2679
+ /// Number of times any subtree stopped on nodes, time etc
2680
+ int numberStoppedSubTrees_;
2681
+ /// Variable selection function
2682
+ CbcBranchDecision * branchingMethod_;
2683
+ /// Cut modifier function
2684
+ CbcCutModifier * cutModifier_;
2685
+ /// Strategy
2686
+ CbcStrategy * strategy_;
2687
+ /// Parent model
2688
+ CbcModel * parentModel_;
2689
+ /** Whether to automatically do presolve before branch and bound.
2690
+ 0 - no
2691
+ 1 - ordinary presolve
2692
+ 2 - integer presolve (dodgy)
2693
+ */
2694
+ /// Pointer to array[getNumCols()] (for speed) of column lower bounds
2695
+ const double * cbcColLower_;
2696
+ /// Pointer to array[getNumCols()] (for speed) of column upper bounds
2697
+ const double * cbcColUpper_;
2698
+ /// Pointer to array[getNumRows()] (for speed) of row lower bounds
2699
+ const double * cbcRowLower_;
2700
+ /// Pointer to array[getNumRows()] (for speed) of row upper bounds
2701
+ const double * cbcRowUpper_;
2702
+ /// Pointer to array[getNumCols()] (for speed) of primal solution vector
2703
+ const double * cbcColSolution_;
2704
+ /// Pointer to array[getNumRows()] (for speed) of dual prices
2705
+ const double * cbcRowPrice_;
2706
+ /// Get a pointer to array[getNumCols()] (for speed) of reduced costs
2707
+ const double * cbcReducedCost_;
2708
+ /// Pointer to array[getNumRows()] (for speed) of row activity levels.
2709
+ const double * cbcRowActivity_;
2710
+ /// Pointer to user-defined data structure
2711
+ void * appData_;
2712
+ /// Presolve for CbcTreeLocal
2713
+ int presolve_;
2714
+ /** Maximum number of candidates to consider for strong branching.
2715
+ To disable strong branching, set this to 0.
2716
+ */
2717
+ int numberStrong_;
2718
+ /** \brief The number of branches before pseudo costs believed
2719
+ in dynamic strong branching.
2720
+
2721
+ A value of 0 is off.
2722
+ */
2723
+ int numberBeforeTrust_;
2724
+ /** \brief The number of variables for which to compute penalties
2725
+ in dynamic strong branching.
2726
+ */
2727
+ int numberPenalties_;
2728
+ /// For threads - stop after this many "iterations"
2729
+ int stopNumberIterations_;
2730
+ /** Scale factor to make penalties match strong.
2731
+ Should/will be computed */
2732
+ double penaltyScaleFactor_;
2733
+ /// Number of analyze iterations to do
2734
+ int numberAnalyzeIterations_;
2735
+ /// Arrays with analysis results
2736
+ double * analyzeResults_;
2737
+ /// Useful temporary pointer
2738
+ void * temporaryPointer_;
2739
+ /// Number of nodes infeasible by normal branching (before cuts)
2740
+ int numberInfeasibleNodes_;
2741
+ /** Problem type as set by user or found by analysis. This will be extended
2742
+ 0 - not known
2743
+ 1 - Set partitioning <=
2744
+ 2 - Set partitioning ==
2745
+ 3 - Set covering
2746
+ */
2747
+ int problemType_;
2748
+ /// Print frequency
2749
+ int printFrequency_;
2750
+ /// Number of cut generators
2751
+ int numberCutGenerators_;
2752
+ // Cut generators
2753
+ CbcCutGenerator ** generator_;
2754
+ // Cut generators before any changes
2755
+ CbcCutGenerator ** virginGenerator_;
2756
+ /// Number of heuristics
2757
+ int numberHeuristics_;
2758
+ /// Heuristic solvers
2759
+ CbcHeuristic ** heuristic_;
2760
+ /// Pointer to heuristic solver which found last solution (or NULL)
2761
+ CbcHeuristic * lastHeuristic_;
2762
+ /// Depth for fast nodes
2763
+ int fastNodeDepth_;
2764
+ /*! Pointer to the event handler */
2765
+ # ifdef CBC_ONLY_CLP
2766
+ ClpEventHandler *eventHandler_ ;
2767
+ # else
2768
+ CbcEventHandler *eventHandler_ ;
2769
+ # endif
2770
+ /// Symmetry information
2771
+ CbcSymmetry * symmetryInfo_;
2772
+ /// Total number of objects
2773
+ int numberObjects_;
2774
+
2775
+ /** \brief Integer and Clique and ... information
2776
+
2777
+ \note The code assumes that the first objects on the list will be
2778
+ SimpleInteger objects for each integer variable, followed by
2779
+ Clique objects. Portions of the code that understand Clique objects
2780
+ will fail if they do not immediately follow the SimpleIntegers.
2781
+ Large chunks of the code will fail if the first objects are not
2782
+ SimpleInteger. As of 2003.08, SimpleIntegers and Cliques are the only
2783
+ objects.
2784
+ */
2785
+ OsiObject ** object_;
2786
+ /// Now we may not own objects - just point to solver's objects
2787
+ bool ownObjects_;
2788
+
2789
+ /// Original columns as created by integerPresolve or preprocessing
2790
+ int * originalColumns_;
2791
+ /// How often to scan global cuts
2792
+ int howOftenGlobalScan_;
2793
+ /** Number of times global cuts violated. When global cut pool then this
2794
+ should be kept for each cut and type of cut */
2795
+ int numberGlobalViolations_;
2796
+ /// Number of extra iterations in fast lp
2797
+ int numberExtraIterations_;
2798
+ /// Number of extra nodes in fast lp
2799
+ int numberExtraNodes_;
2800
+ /// Number of times fast lp entered
2801
+ int numberFathoms_;
2802
+ /** Value of objective at continuous
2803
+ (Well actually after initial round of cuts)
2804
+ */
2805
+ double continuousObjective_;
2806
+ /** Value of objective before root node cuts added
2807
+ */
2808
+ double originalContinuousObjective_;
2809
+ /// Number of infeasibilities at continuous
2810
+ int continuousInfeasibilities_;
2811
+ /// Maximum number of cut passes at root
2812
+ int maximumCutPassesAtRoot_;
2813
+ /// Maximum number of cut passes
2814
+ int maximumCutPasses_;
2815
+ /// Preferred way of branching
2816
+ int preferredWay_;
2817
+ /// Current cut pass number
2818
+ int currentPassNumber_;
2819
+ /// Maximum number of cuts (for whichGenerator_)
2820
+ int maximumWhich_;
2821
+ /// Maximum number of rows
2822
+ int maximumRows_;
2823
+ /// Random seed
2824
+ int randomSeed_;
2825
+ /// Multiple root tries
2826
+ int multipleRootTries_;
2827
+ /// Current depth
2828
+ int currentDepth_;
2829
+ /// Thread specific random number generator
2830
+ mutable CoinThreadRandom randomNumberGenerator_;
2831
+ /// Work basis for temporary use
2832
+ CoinWarmStartBasis workingBasis_;
2833
+ /// Which cut generator generated this cut
2834
+ int * whichGenerator_;
2835
+ /// Maximum number of statistics
2836
+ int maximumStatistics_;
2837
+ /// statistics
2838
+ CbcStatistics ** statistics_;
2839
+ /// Maximum depth reached
2840
+ int maximumDepthActual_;
2841
+ /// Number of reduced cost fixings
2842
+ double numberDJFixed_;
2843
+ /// Probing info
2844
+ CglTreeProbingInfo * probingInfo_;
2845
+ /// Number of fixed by analyze at root
2846
+ int numberFixedAtRoot_;
2847
+ /// Number fixed by analyze so far
2848
+ int numberFixedNow_;
2849
+ /// Whether stopping on gap
2850
+ bool stoppedOnGap_;
2851
+ /// Whether event happened
2852
+ mutable bool eventHappened_;
2853
+ /// Number of long strong goes
2854
+ int numberLongStrong_;
2855
+ /// Number of old active cuts
2856
+ int numberOldActiveCuts_;
2857
+ /// Number of new cuts
2858
+ int numberNewCuts_;
2859
+ /// Strategy worked out - mainly at root node
2860
+ int searchStrategy_;
2861
+ /** Strategy for strong branching
2862
+ 0 - normal
2863
+ when to do all fractional
2864
+ 1 - root node
2865
+ 2 - depth less than modifier
2866
+ 4 - if objective == best possible
2867
+ 6 - as 2+4
2868
+ when to do all including satisfied
2869
+ 10 - root node etc.
2870
+ If >=100 then do when depth <= strategy/100 (otherwise 5)
2871
+ */
2872
+ int strongStrategy_;
2873
+ /// Number of iterations in strong branching
2874
+ int numberStrongIterations_;
2875
+ /** 0 - number times strong branching done, 1 - number fixed, 2 - number infeasible
2876
+ Second group of three is a snapshot at node [6] */
2877
+ int strongInfo_[7];
2878
+ /**
2879
+ For advanced applications you may wish to modify the behavior of Cbc
2880
+ e.g. if the solver is a NLP solver then you may not have an exact
2881
+ optimum solution at each step. This gives characteristics - just for one BAB.
2882
+ For actually saving/restoring a solution you need the actual solver one.
2883
+ */
2884
+ OsiBabSolver * solverCharacteristics_;
2885
+ /// Whether to force a resolve after takeOffCuts
2886
+ bool resolveAfterTakeOffCuts_;
2887
+ /// Maximum number of iterations (designed to be used in heuristics)
2888
+ int maximumNumberIterations_;
2889
+ /// Anything with priority >= this can be treated as continuous
2890
+ int continuousPriority_;
2891
+ /// Number of outstanding update information items
2892
+ int numberUpdateItems_;
2893
+ /// Maximum number of outstanding update information items
2894
+ int maximumNumberUpdateItems_;
2895
+ /// Update items
2896
+ CbcObjectUpdateData * updateItems_;
2897
+ /// Stored row cuts for donor/recipient CbcModel
2898
+ CglStored * storedRowCuts_;
2899
+ /**
2900
+ Parallel
2901
+ 0 - off
2902
+ 1 - testing
2903
+ 2-99 threads
2904
+ other special meanings
2905
+ */
2906
+ int numberThreads_;
2907
+ /** thread mode
2908
+ always use numberThreads for branching
2909
+ 1 set then deterministic
2910
+ 2 set then use numberThreads for root cuts
2911
+ 4 set then use numberThreads in root mini branch and bound
2912
+ default is 0
2913
+ */
2914
+ int threadMode_;
2915
+ /// Number of global cuts on entry to a node
2916
+ int numberGlobalCutsIn_;
2917
+ /// Thread stuff for master
2918
+ CbcBaseModel * master_;
2919
+ /// Pointer to masterthread
2920
+ CbcThread * masterThread_;
2921
+ //@}
2922
+ };
2923
+ /// So we can use osiObject or CbcObject during transition
2924
+ void getIntegerInformation(const OsiObject * object, double & originalLower,
2925
+ double & originalUpper) ;
2926
+ // So we can call from other programs
2927
+ // Real main program
2928
+ class OsiClpSolverInterface;
2929
+ int CbcMain (int argc, const char *argv[], OsiClpSolverInterface & solver, CbcModel ** babSolver);
2930
+ int CbcMain (int argc, const char *argv[], CbcModel & babSolver);
2931
+ // four ways of calling
2932
+ int callCbc(const char * input2, OsiClpSolverInterface& solver1);
2933
+ int callCbc(const char * input2);
2934
+ int callCbc(const std::string input2, OsiClpSolverInterface& solver1);
2935
+ int callCbc(const std::string input2) ;
2936
+ // When we want to load up CbcModel with options first
2937
+ void CbcMain0 (CbcModel & babSolver);
2938
+ int CbcMain1 (int argc, const char *argv[], CbcModel & babSolver);
2939
+ // two ways of calling
2940
+ int callCbc(const char * input2, CbcModel & babSolver);
2941
+ int callCbc(const std::string input2, CbcModel & babSolver);
2942
+ // And when CbcMain0 already called to initialize
2943
+ int callCbc1(const char * input2, CbcModel & babSolver);
2944
+ int callCbc1(const std::string input2, CbcModel & babSolver);
2945
+ // And when CbcMain0 already called to initialize (with call back) (see CbcMain1 for whereFrom)
2946
+ int callCbc1(const char * input2, CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
2947
+ int callCbc1(const std::string input2, CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
2948
+ int CbcMain1 (int argc, const char *argv[], CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
2949
+ // For uniform setting of cut and heuristic options
2950
+ void setCutAndHeuristicOptions(CbcModel & model);
2951
+ #endif
2952
+