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,678 @@
1
+ /* $Id: CoinSort.hpp 1594 2013-04-19 14:33:00Z forrest $ */
2
+ // Copyright (C) 2000, 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 CoinSort_H
7
+ #define CoinSort_H
8
+
9
+ #include <functional>
10
+ #include <new>
11
+ #include <algorithm>
12
+ #include "CoinDistance.hpp"
13
+
14
+ // Uncomment the next three lines to get thorough initialisation of memory.
15
+ // #ifndef ZEROFAULT
16
+ // #define ZEROFAULT
17
+ // #endif
18
+
19
+ #ifdef COIN_FAST_CODE
20
+ #ifndef COIN_USE_EKK_SORT
21
+ #define COIN_USE_EKK_SORT
22
+ #endif
23
+ #endif
24
+
25
+ //#############################################################################
26
+
27
+ /** An ordered pair. It's the same as std::pair, just this way it'll have the
28
+ same look as the triple sorting. */
29
+ template <class S, class T>
30
+ struct CoinPair {
31
+ public:
32
+ /// First member of pair
33
+ S first;
34
+ /// Second member of pair
35
+ T second;
36
+ public:
37
+ /// Construct from ordered pair
38
+ CoinPair(const S& s, const T& t) : first(s), second(t) {}
39
+ };
40
+
41
+ //#############################################################################
42
+
43
+ /**@name Comparisons on first element of two ordered pairs */
44
+ //@{
45
+ /** Function operator.
46
+ Returns true if t1.first &lt; t2.first (i.e., increasing). */
47
+ template < class S, class T>
48
+ class CoinFirstLess_2 {
49
+ public:
50
+ /// Compare function
51
+ inline bool operator()(const CoinPair<S,T>& t1,
52
+ const CoinPair<S,T>& t2) const
53
+ { return t1.first < t2.first; }
54
+ };
55
+ //-----------------------------------------------------------------------------
56
+ /** Function operator.
57
+ Returns true if t1.first &gt; t2.first (i.e, decreasing). */
58
+ template < class S, class T>
59
+ class CoinFirstGreater_2 {
60
+ public:
61
+ /// Compare function
62
+ inline bool operator()(const CoinPair<S,T>& t1,
63
+ const CoinPair<S,T>& t2) const
64
+ { return t1.first > t2.first; }
65
+ };
66
+ //-----------------------------------------------------------------------------
67
+ /** Function operator.
68
+ Returns true if abs(t1.first) &lt; abs(t2.first) (i.e., increasing). */
69
+ template < class S, class T>
70
+ class CoinFirstAbsLess_2 {
71
+ public:
72
+ /// Compare function
73
+ inline bool operator()(const CoinPair<S,T>& t1,
74
+ const CoinPair<S,T>& t2) const
75
+ {
76
+ const T t1Abs = t1.first < static_cast<T>(0) ? -t1.first : t1.first;
77
+ const T t2Abs = t2.first < static_cast<T>(0) ? -t2.first : t2.first;
78
+ return t1Abs < t2Abs;
79
+ }
80
+ };
81
+ //-----------------------------------------------------------------------------
82
+ /** Function operator.
83
+ Returns true if abs(t1.first) &gt; abs(t2.first) (i.e., decreasing). */
84
+ template < class S, class T>
85
+ class CoinFirstAbsGreater_2 {
86
+ public:
87
+ /// Compare function
88
+ inline bool operator()(CoinPair<S,T> t1, CoinPair<S,T> t2) const
89
+ {
90
+ const T t1Abs = t1.first < static_cast<T>(0) ? -t1.first : t1.first;
91
+ const T t2Abs = t2.first < static_cast<T>(0) ? -t2.first : t2.first;
92
+ return t1Abs > t2Abs;
93
+ }
94
+ };
95
+ //-----------------------------------------------------------------------------
96
+ /** Function operator.
97
+ Compare based on the entries of an external vector, i.e., returns true if
98
+ vec[t1.first &lt; vec[t2.first] (i.e., increasing wrt. vec). Note that to
99
+ use this comparison operator .first must be a data type automatically
100
+ convertible to int. */
101
+ template < class S, class T, class V>
102
+ class CoinExternalVectorFirstLess_2 {
103
+ private:
104
+ CoinExternalVectorFirstLess_2();
105
+ private:
106
+ const V* vec_;
107
+ public:
108
+ inline bool operator()(const CoinPair<S,T>& t1,
109
+ const CoinPair<S,T>& t2) const
110
+ { return vec_[t1.first] < vec_[t2.first]; }
111
+ CoinExternalVectorFirstLess_2(const V* v) : vec_(v) {}
112
+ };
113
+ //-----------------------------------------------------------------------------
114
+ /** Function operator.
115
+ Compare based on the entries of an external vector, i.e., returns true if
116
+ vec[t1.first &gt; vec[t2.first] (i.e., decreasing wrt. vec). Note that to
117
+ use this comparison operator .first must be a data type automatically
118
+ convertible to int. */
119
+ template < class S, class T, class V>
120
+ class CoinExternalVectorFirstGreater_2 {
121
+ private:
122
+ CoinExternalVectorFirstGreater_2();
123
+ private:
124
+ const V* vec_;
125
+ public:
126
+ inline bool operator()(const CoinPair<S,T>& t1,
127
+ const CoinPair<S,T>& t2) const
128
+ { return vec_[t1.first] > vec_[t2.first]; }
129
+ CoinExternalVectorFirstGreater_2(const V* v) : vec_(v) {}
130
+ };
131
+ //@}
132
+
133
+ //#############################################################################
134
+
135
+ /** Sort a pair of containers.<br>
136
+
137
+ Iter_S - iterator for first container<br>
138
+ Iter_T - iterator for 2nd container<br>
139
+ CoinCompare2 - class comparing CoinPairs<br>
140
+ */
141
+
142
+ #ifdef COIN_SORT_ARBITRARY_CONTAINERS
143
+ template <class Iter_S, class Iter_T, class CoinCompare2> void
144
+ CoinSort_2(Iter_S sfirst, Iter_S slast, Iter_T tfirst, const CoinCompare2& pc)
145
+ {
146
+ typedef typename std::iterator_traits<Iter_S>::value_type S;
147
+ typedef typename std::iterator_traits<Iter_T>::value_type T;
148
+ const size_t len = coinDistance(sfirst, slast);
149
+ if (len <= 1)
150
+ return;
151
+
152
+ typedef CoinPair<S,T> ST_pair;
153
+ ST_pair* x = static_cast<ST_pair*>(::operator new(len * sizeof(ST_pair)));
154
+ # ifdef ZEROFAULT
155
+ memset(x,0,(len*sizeof(ST_pair))) ;
156
+ # endif
157
+
158
+ int i = 0;
159
+ Iter_S scurrent = sfirst;
160
+ Iter_T tcurrent = tfirst;
161
+ while (scurrent != slast) {
162
+ new (x+i++) ST_pair(*scurrent++, *tcurrent++);
163
+ }
164
+
165
+ std::sort(x.begin(), x.end(), pc);
166
+
167
+ scurrent = sfirst;
168
+ tcurrent = tfirst;
169
+ for (i = 0; i < len; ++i) {
170
+ *scurrent++ = x[i].first;
171
+ *tcurrent++ = x[i].second;
172
+ }
173
+
174
+ ::operator delete(x);
175
+ }
176
+ //-----------------------------------------------------------------------------
177
+ template <class Iter_S, class Iter_T> void
178
+ CoinSort_2(Iter_S sfirst, Iter_S slast, Iter_T tfirst)
179
+ {
180
+ typedef typename std::iterator_traits<Iter_S>::value_type S;
181
+ typedef typename std::iterator_traits<Iter_T>::value_type T;
182
+ CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2<S,T>());
183
+ }
184
+
185
+ #else //=======================================================================
186
+
187
+ template <class S, class T, class CoinCompare2> void
188
+ CoinSort_2(S* sfirst, S* slast, T* tfirst, const CoinCompare2& pc)
189
+ {
190
+ const size_t len = coinDistance(sfirst, slast);
191
+ if (len <= 1)
192
+ return;
193
+
194
+ typedef CoinPair<S,T> ST_pair;
195
+ ST_pair* x = static_cast<ST_pair*>(::operator new(len * sizeof(ST_pair)));
196
+ # ifdef ZEROFAULT
197
+ // Can show RUI errors on some systems due to copy of ST_pair with gaps.
198
+ // E.g., <int, double> has 4 byte alignment gap on Solaris/SUNWspro.
199
+ memset(x,0,(len*sizeof(ST_pair))) ;
200
+ # endif
201
+
202
+ size_t i = 0;
203
+ S* scurrent = sfirst;
204
+ T* tcurrent = tfirst;
205
+ while (scurrent != slast) {
206
+ new (x+i++) ST_pair(*scurrent++, *tcurrent++);
207
+ }
208
+
209
+ std::sort(x, x + len, pc);
210
+
211
+ scurrent = sfirst;
212
+ tcurrent = tfirst;
213
+ for (i = 0; i < len; ++i) {
214
+ *scurrent++ = x[i].first;
215
+ *tcurrent++ = x[i].second;
216
+ }
217
+
218
+ ::operator delete(x);
219
+ }
220
+ template <class S, class T> void
221
+ // This Always uses std::sort
222
+ CoinSort_2Std(S* sfirst, S* slast, T* tfirst)
223
+ {
224
+ CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2<S,T>());
225
+ }
226
+ #ifndef COIN_USE_EKK_SORT
227
+ //-----------------------------------------------------------------------------
228
+ template <class S, class T> void
229
+ CoinSort_2(S* sfirst, S* slast, T* tfirst)
230
+ {
231
+ CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2<S,T>());
232
+ }
233
+ #else
234
+ //-----------------------------------------------------------------------------
235
+ extern int boundary_sort;
236
+ extern int boundary_sort2;
237
+ extern int boundary_sort3;
238
+ /// Sort without new and delete
239
+ template <class S, class T> void
240
+ CoinSort_2(S* key, S* lastKey, T* array2)
241
+ {
242
+ const size_t number = coinDistance(key, lastKey);
243
+ if (number <= 1) {
244
+ return;
245
+ } else if (number>10000) {
246
+ CoinSort_2Std(key, lastKey, array2);
247
+ return;
248
+ }
249
+ #if 0
250
+ if (number==boundary_sort3) {
251
+ printf("before sort %d entries\n",number);
252
+ for (int j=0;j<number;j++) {
253
+ std::cout<<" ( "<<key[j]<<","<<array2[j]<<")";
254
+ }
255
+ std::cout<<std::endl;
256
+ }
257
+ #endif
258
+ int minsize=10;
259
+ int n = static_cast<int>(number);
260
+ int sp;
261
+ S *v = key;
262
+ S *m, t;
263
+ S * ls[32] , * rs[32];
264
+ S *l , *r , c;
265
+ T it;
266
+ int j;
267
+ /*check already sorted */
268
+ S last=key[0];
269
+ for (j=1;j<n;j++) {
270
+ if (key[j]>=last) {
271
+ last=key[j];
272
+ } else {
273
+ break;
274
+ } /* endif */
275
+ } /* endfor */
276
+ if (j==n) {
277
+ return;
278
+ } /* endif */
279
+ sp = 0 ; ls[sp] = v ; rs[sp] = v + (n-1) ;
280
+ while( sp >= 0 )
281
+ {
282
+ if ( rs[sp] - ls[sp] > minsize )
283
+ {
284
+ l = ls[sp] ; r = rs[sp] ; m = l + (r-l)/2 ;
285
+ if ( *l > *m )
286
+ {
287
+ t = *l ; *l = *m ; *m = t ;
288
+ it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ;
289
+ }
290
+ if ( *m > *r )
291
+ {
292
+ t = *m ; *m = *r ; *r = t ;
293
+ it = array2[m-v] ; array2[m-v] = array2[r-v] ; array2[r-v] = it ;
294
+ if ( *l > *m )
295
+ {
296
+ t = *l ; *l = *m ; *m = t ;
297
+ it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ;
298
+ }
299
+ }
300
+ c = *m ;
301
+ while ( r - l > 1 )
302
+ {
303
+ while ( *(++l) < c ) ;
304
+ while ( *(--r) > c ) ;
305
+ t = *l ; *l = *r ; *r = t ;
306
+ it = array2[l-v] ; array2[l-v] = array2[r-v] ; array2[r-v] = it ;
307
+ }
308
+ l = r - 1 ;
309
+ if ( l < m )
310
+ { ls[sp+1] = ls[sp] ;
311
+ rs[sp+1] = l ;
312
+ ls[sp ] = r ;
313
+ }
314
+ else
315
+ { ls[sp+1] = r ;
316
+ rs[sp+1] = rs[sp] ;
317
+ rs[sp ] = l ;
318
+ }
319
+ sp++ ;
320
+ }
321
+ else sp-- ;
322
+ }
323
+ for ( l = v , m = v + (n-1) ; l < m ; l++ )
324
+ { if ( *l > *(l+1) )
325
+ {
326
+ c = *(l+1) ;
327
+ it = array2[(l-v)+1] ;
328
+ for ( r = l ; r >= v && *r > c ; r-- )
329
+ {
330
+ *(r+1) = *r ;
331
+ array2[(r-v)+1] = array2[(r-v)] ;
332
+ }
333
+ *(r+1) = c ;
334
+ array2[(r-v)+1] = it ;
335
+ }
336
+ }
337
+ #if 0
338
+ if (number==boundary_sort3) {
339
+ printf("after sort %d entries\n",number);
340
+ for (int j=0;j<number;j++) {
341
+ std::cout<<" ( "<<key[j]<<","<<array2[j]<<")";
342
+ }
343
+ std::cout<<std::endl;
344
+ CoinSort_2Many(key, lastKey, array2);
345
+ printf("after2 sort %d entries\n",number);
346
+ for (int j=0;j<number;j++) {
347
+ std::cout<<" ( "<<key[j]<<","<<array2[j]<<")";
348
+ }
349
+ std::cout<<std::endl;
350
+ }
351
+ #endif
352
+ }
353
+ #endif
354
+ #endif
355
+ /// Sort without new and delete
356
+ template <class S, class T> void
357
+ CoinShortSort_2(S* key, S* lastKey, T* array2)
358
+ {
359
+ const size_t number = coinDistance(key, lastKey);
360
+ if (number <= 2) {
361
+ if (number == 2 && key[0] > key[1]) {
362
+ S tempS = key[0];
363
+ T tempT = array2[0];
364
+ key[0] = key[1];
365
+ array2[0] = array2[1];
366
+ key[1] = tempS;
367
+ array2[1] = tempT;
368
+ }
369
+ return;
370
+ } else if (number>10000) {
371
+ CoinSort_2Std(key, lastKey, array2);
372
+ return;
373
+ }
374
+ int minsize=10;
375
+ size_t n = number;
376
+ int sp;
377
+ S *v = key;
378
+ S *m, t;
379
+ S * ls[32] , * rs[32];
380
+ S *l , *r , c;
381
+ T it;
382
+ size_t j;
383
+ /*check already sorted */
384
+ S last=key[0];
385
+ for (j=1;j<n;j++) {
386
+ if (key[j]>=last) {
387
+ last=key[j];
388
+ } else {
389
+ break;
390
+ } /* endif */
391
+ } /* endfor */
392
+ if (j==n) {
393
+ return;
394
+ } /* endif */
395
+ sp = 0 ; ls[sp] = v ; rs[sp] = v + (n-1) ;
396
+ while( sp >= 0 )
397
+ {
398
+ if ( rs[sp] - ls[sp] > minsize )
399
+ {
400
+ l = ls[sp] ; r = rs[sp] ; m = l + (r-l)/2 ;
401
+ if ( *l > *m )
402
+ {
403
+ t = *l ; *l = *m ; *m = t ;
404
+ it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ;
405
+ }
406
+ if ( *m > *r )
407
+ {
408
+ t = *m ; *m = *r ; *r = t ;
409
+ it = array2[m-v] ; array2[m-v] = array2[r-v] ; array2[r-v] = it ;
410
+ if ( *l > *m )
411
+ {
412
+ t = *l ; *l = *m ; *m = t ;
413
+ it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ;
414
+ }
415
+ }
416
+ c = *m ;
417
+ while ( r - l > 1 )
418
+ {
419
+ while ( *(++l) < c ) ;
420
+ while ( *(--r) > c ) ;
421
+ t = *l ; *l = *r ; *r = t ;
422
+ it = array2[l-v] ; array2[l-v] = array2[r-v] ; array2[r-v] = it ;
423
+ }
424
+ l = r - 1 ;
425
+ if ( l < m )
426
+ { ls[sp+1] = ls[sp] ;
427
+ rs[sp+1] = l ;
428
+ ls[sp ] = r ;
429
+ }
430
+ else
431
+ { ls[sp+1] = r ;
432
+ rs[sp+1] = rs[sp] ;
433
+ rs[sp ] = l ;
434
+ }
435
+ sp++ ;
436
+ }
437
+ else sp-- ;
438
+ }
439
+ for ( l = v , m = v + (n-1) ; l < m ; l++ )
440
+ { if ( *l > *(l+1) )
441
+ {
442
+ c = *(l+1) ;
443
+ it = array2[(l-v)+1] ;
444
+ for ( r = l ; r >= v && *r > c ; r-- )
445
+ {
446
+ *(r+1) = *r ;
447
+ array2[(r-v)+1] = array2[(r-v)] ;
448
+ }
449
+ *(r+1) = c ;
450
+ array2[(r-v)+1] = it ;
451
+ }
452
+ }
453
+ }
454
+ //#############################################################################
455
+ //#############################################################################
456
+
457
+ /**@name Ordered Triple Struct */
458
+ template <class S, class T, class U>
459
+ class CoinTriple {
460
+ public:
461
+ /// First member of triple
462
+ S first;
463
+ /// Second member of triple
464
+ T second;
465
+ /// Third member of triple
466
+ U third;
467
+ public:
468
+ /// Construct from ordered triple
469
+ CoinTriple(const S& s, const T& t, const U& u):first(s),second(t),third(u) {}
470
+ };
471
+
472
+ //#############################################################################
473
+ /**@name Comparisons on first element of two ordered triples */
474
+ //@{
475
+ /** Function operator.
476
+ Returns true if t1.first &lt; t2.first (i.e., increasing). */
477
+ template < class S, class T, class U >
478
+ class CoinFirstLess_3 {
479
+ public:
480
+ /// Compare function
481
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
482
+ const CoinTriple<S,T,U>& t2) const
483
+ { return t1.first < t2.first; }
484
+ };
485
+ //-----------------------------------------------------------------------------
486
+ /** Function operator.
487
+ Returns true if t1.first &gt; t2.first (i.e, decreasing). */
488
+ template < class S, class T, class U >
489
+ class CoinFirstGreater_3 {
490
+ public:
491
+ /// Compare function
492
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
493
+ const CoinTriple<S,T,U>& t2) const
494
+ { return t1.first>t2.first; }
495
+ };
496
+ //-----------------------------------------------------------------------------
497
+ /** Function operator.
498
+ Returns true if abs(t1.first) &lt; abs(t2.first) (i.e., increasing). */
499
+ template < class S, class T, class U >
500
+ class CoinFirstAbsLess_3 {
501
+ public:
502
+ /// Compare function
503
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
504
+ const CoinTriple<S,T,U>& t2) const
505
+ {
506
+ const T t1Abs = t1.first < static_cast<T>(0) ? -t1.first : t1.first;
507
+ const T t2Abs = t2.first < static_cast<T>(0) ? -t2.first : t2.first;
508
+ return t1Abs < t2Abs;
509
+ }
510
+ };
511
+ //-----------------------------------------------------------------------------
512
+ /** Function operator.
513
+ Returns true if abs(t1.first) &gt; abs(t2.first) (i.e., decreasing). */
514
+ template < class S, class T, class U >
515
+ class CoinFirstAbsGreater_3 {
516
+ public:
517
+ /// Compare function
518
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
519
+ const CoinTriple<S,T,U>& t2) const
520
+ {
521
+ const T t1Abs = t1.first < static_cast<T>(0) ? -t1.first : t1.first;
522
+ const T t2Abs = t2.first < static_cast<T>(0) ? -t2.first : t2.first;
523
+ return t1Abs > t2Abs;
524
+ }
525
+ };
526
+ //-----------------------------------------------------------------------------
527
+ /** Function operator.
528
+ Compare based on the entries of an external vector, i.e., returns true if
529
+ vec[t1.first &lt; vec[t2.first] (i.e., increasing wrt. vec). Note that to
530
+ use this comparison operator .first must be a data type automatically
531
+ convertible to int. */
532
+ template < class S, class T, class U, class V>
533
+ class CoinExternalVectorFirstLess_3 {
534
+ private:
535
+ CoinExternalVectorFirstLess_3();
536
+ private:
537
+ const V* vec_;
538
+ public:
539
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
540
+ const CoinTriple<S,T,U>& t2) const
541
+ { return vec_[t1.first] < vec_[t2.first]; }
542
+ CoinExternalVectorFirstLess_3(const V* v) : vec_(v) {}
543
+ };
544
+ //-----------------------------------------------------------------------------
545
+ /** Function operator.
546
+ Compare based on the entries of an external vector, i.e., returns true if
547
+ vec[t1.first &gt; vec[t2.first] (i.e., decreasing wrt. vec). Note that to
548
+ use this comparison operator .first must be a data type automatically
549
+ convertible to int. */
550
+ template < class S, class T, class U, class V>
551
+ class CoinExternalVectorFirstGreater_3 {
552
+ private:
553
+ CoinExternalVectorFirstGreater_3();
554
+ private:
555
+ const V* vec_;
556
+ public:
557
+ inline bool operator()(const CoinTriple<S,T,U>& t1,
558
+ const CoinTriple<S,T,U>& t2) const
559
+ { return vec_[t1.first] > vec_[t2.first]; }
560
+ CoinExternalVectorFirstGreater_3(const V* v) : vec_(v) {}
561
+ };
562
+ //@}
563
+
564
+ //#############################################################################
565
+
566
+ /**@name Typedefs for sorting the entries of a packed vector based on an
567
+ external vector. */
568
+ //@{
569
+ /// Sort packed vector in increasing order of the external vector
570
+ typedef CoinExternalVectorFirstLess_3<int, int, double, double>
571
+ CoinIncrSolutionOrdered;
572
+ /// Sort packed vector in decreasing order of the external vector
573
+ typedef CoinExternalVectorFirstGreater_3<int, int, double, double>
574
+ CoinDecrSolutionOrdered;
575
+ //@}
576
+
577
+ //#############################################################################
578
+
579
+ /** Sort a triple of containers.<br>
580
+
581
+ Iter_S - iterator for first container<br>
582
+ Iter_T - iterator for 2nd container<br>
583
+ Iter_U - iterator for 3rd container<br>
584
+ CoinCompare3 - class comparing CoinTriples<br>
585
+ */
586
+ #ifdef COIN_SORT_ARBITRARY_CONTAINERS
587
+ template <class Iter_S, class Iter_T, class Iter_U, class CoinCompare3> void
588
+ CoinSort_3(Iter_S sfirst, Iter_S slast, Iter_T tfirst, Iter_U, ufirst,
589
+ const CoinCompare3& tc)
590
+ {
591
+ typedef typename std::iterator_traits<Iter_S>::value_type S;
592
+ typedef typename std::iterator_traits<Iter_T>::value_type T;
593
+ typedef typename std::iterator_traits<Iter_U>::value_type U;
594
+ const size_t len = coinDistance(sfirst, slast);
595
+ if (len <= 1)
596
+ return;
597
+
598
+ typedef CoinTriple<S,T,U> STU_triple;
599
+ STU_triple* x =
600
+ static_cast<STU_triple*>(::operator new(len * sizeof(STU_triple)));
601
+
602
+ int i = 0;
603
+ Iter_S scurrent = sfirst;
604
+ Iter_T tcurrent = tfirst;
605
+ Iter_U ucurrent = ufirst;
606
+ while (scurrent != slast) {
607
+ new (x+i++) STU_triple(*scurrent++, *tcurrent++, *ucurrent++);
608
+ }
609
+
610
+ std::sort(x, x+len, tc);
611
+
612
+ scurrent = sfirst;
613
+ tcurrent = tfirst;
614
+ ucurrent = ufirst;
615
+ for (i = 0; i < len; ++i) {
616
+ *scurrent++ = x[i].first;
617
+ *tcurrent++ = x[i].second;
618
+ *ucurrent++ = x[i].third;
619
+ }
620
+
621
+ ::operator delete(x);
622
+ }
623
+ //-----------------------------------------------------------------------------
624
+ template <class Iter_S, class Iter_T, class Iter_U> void
625
+ CoinSort_3(Iter_S sfirst, Iter_S slast, Iter_T tfirst, Iter_U, ufirst)
626
+ {
627
+ typedef typename std::iterator_traits<Iter_S>::value_type S;
628
+ typedef typename std::iterator_traits<Iter_T>::value_type T;
629
+ typedef typename std::iterator_traits<Iter_U>::value_type U;
630
+ CoinSort_3(sfirts, slast, tfirst, ufirst, CoinFirstLess_3<S,T,U>());
631
+ }
632
+
633
+ #else //=======================================================================
634
+
635
+ template <class S, class T, class U, class CoinCompare3> void
636
+ CoinSort_3(S* sfirst, S* slast, T* tfirst, U* ufirst, const CoinCompare3& tc)
637
+ {
638
+ const size_t len = coinDistance(sfirst,slast);
639
+ if (len <= 1)
640
+ return;
641
+
642
+ typedef CoinTriple<S,T,U> STU_triple;
643
+ STU_triple* x =
644
+ static_cast<STU_triple*>(::operator new(len * sizeof(STU_triple)));
645
+
646
+ size_t i = 0;
647
+ S* scurrent = sfirst;
648
+ T* tcurrent = tfirst;
649
+ U* ucurrent = ufirst;
650
+ while (scurrent != slast) {
651
+ new (x+i++) STU_triple(*scurrent++, *tcurrent++, *ucurrent++);
652
+ }
653
+
654
+ std::sort(x, x+len, tc);
655
+
656
+ scurrent = sfirst;
657
+ tcurrent = tfirst;
658
+ ucurrent = ufirst;
659
+ for (i = 0; i < len; ++i) {
660
+ *scurrent++ = x[i].first;
661
+ *tcurrent++ = x[i].second;
662
+ *ucurrent++ = x[i].third;
663
+ }
664
+
665
+ ::operator delete(x);
666
+ }
667
+ //-----------------------------------------------------------------------------
668
+ template <class S, class T, class U> void
669
+ CoinSort_3(S* sfirst, S* slast, T* tfirst, U* ufirst)
670
+ {
671
+ CoinSort_3(sfirst, slast, tfirst, ufirst, CoinFirstLess_3<S,T,U>());
672
+ }
673
+
674
+ #endif
675
+
676
+ //#############################################################################
677
+
678
+ #endif