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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/README.md +203 -0
- data/Rakefile +40 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/ext/ruby-cbc/cbc.i +15 -0
- data/ext/ruby-cbc/cbc_wrap.c +4618 -0
- data/ext/ruby-cbc/extconf.rb +60 -0
- data/ext/ruby-cbc/install/bin/cbc +0 -0
- data/ext/ruby-cbc/install/bin/clp +0 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchActual.hpp +24 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchAllDifferent.hpp +62 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchBase.hpp +78 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchCut.hpp +183 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchDecision.hpp +129 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchDefaultDecision.hpp +100 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchDynamic.hpp +206 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchLotsize.hpp +242 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchToFixLots.hpp +94 -0
- data/ext/ruby-cbc/install/include/coin/CbcBranchingObject.hpp +236 -0
- data/ext/ruby-cbc/install/include/coin/CbcClique.hpp +303 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompare.hpp +39 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareActual.hpp +14 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareBase.hpp +142 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareDefault.hpp +120 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareDepth.hpp +47 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareEstimate.hpp +48 -0
- data/ext/ruby-cbc/install/include/coin/CbcCompareObjective.hpp +49 -0
- data/ext/ruby-cbc/install/include/coin/CbcConfig.h +14 -0
- data/ext/ruby-cbc/install/include/coin/CbcConsequence.hpp +49 -0
- data/ext/ruby-cbc/install/include/coin/CbcCountRowCut.hpp +168 -0
- data/ext/ruby-cbc/install/include/coin/CbcCutGenerator.hpp +482 -0
- data/ext/ruby-cbc/install/include/coin/CbcCutModifier.hpp +57 -0
- data/ext/ruby-cbc/install/include/coin/CbcCutSubsetModifier.hpp +66 -0
- data/ext/ruby-cbc/install/include/coin/CbcDummyBranchingObject.hpp +83 -0
- data/ext/ruby-cbc/install/include/coin/CbcEventHandler.hpp +245 -0
- data/ext/ruby-cbc/install/include/coin/CbcFathom.hpp +137 -0
- data/ext/ruby-cbc/install/include/coin/CbcFathomDynamicProgramming.hpp +169 -0
- data/ext/ruby-cbc/install/include/coin/CbcFeasibilityBase.hpp +56 -0
- data/ext/ruby-cbc/install/include/coin/CbcFixVariable.hpp +67 -0
- data/ext/ruby-cbc/install/include/coin/CbcFollowOn.hpp +207 -0
- data/ext/ruby-cbc/install/include/coin/CbcFullNodeInfo.hpp +161 -0
- data/ext/ruby-cbc/install/include/coin/CbcGeneral.hpp +60 -0
- data/ext/ruby-cbc/install/include/coin/CbcGeneralDepth.hpp +279 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristic.hpp +682 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDINS.hpp +96 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDW.hpp +309 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDive.hpp +192 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveCoefficient.hpp +52 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveFractional.hpp +52 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveGuided.hpp +55 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveLineSearch.hpp +52 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDivePseudoCost.hpp +60 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveVectorLength.hpp +52 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicFPump.hpp +340 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicGreedy.hpp +280 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicLocal.hpp +271 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicPivotAndFix.hpp +58 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicRENS.hpp +77 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicRINS.hpp +102 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicRandRound.hpp +58 -0
- data/ext/ruby-cbc/install/include/coin/CbcHeuristicVND.hpp +94 -0
- data/ext/ruby-cbc/install/include/coin/CbcLinked.hpp +1406 -0
- data/ext/ruby-cbc/install/include/coin/CbcMessage.hpp +94 -0
- data/ext/ruby-cbc/install/include/coin/CbcMipStartIO.hpp +26 -0
- data/ext/ruby-cbc/install/include/coin/CbcModel.hpp +2952 -0
- data/ext/ruby-cbc/install/include/coin/CbcNWay.hpp +166 -0
- data/ext/ruby-cbc/install/include/coin/CbcNode.hpp +351 -0
- data/ext/ruby-cbc/install/include/coin/CbcNodeInfo.hpp +349 -0
- data/ext/ruby-cbc/install/include/coin/CbcObject.hpp +272 -0
- data/ext/ruby-cbc/install/include/coin/CbcObjectUpdateData.hpp +64 -0
- data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.cpp +4134 -0
- data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.hpp +532 -0
- data/ext/ruby-cbc/install/include/coin/CbcParam.hpp +324 -0
- data/ext/ruby-cbc/install/include/coin/CbcPartialNodeInfo.hpp +110 -0
- data/ext/ruby-cbc/install/include/coin/CbcSOS.hpp +279 -0
- data/ext/ruby-cbc/install/include/coin/CbcSimpleInteger.hpp +286 -0
- data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerDynamicPseudoCost.hpp +564 -0
- data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerPseudoCost.hpp +114 -0
- data/ext/ruby-cbc/install/include/coin/CbcSolver.hpp +447 -0
- data/ext/ruby-cbc/install/include/coin/CbcStrategy.hpp +258 -0
- data/ext/ruby-cbc/install/include/coin/CbcSubProblem.hpp +83 -0
- data/ext/ruby-cbc/install/include/coin/CbcTree.hpp +490 -0
- data/ext/ruby-cbc/install/include/coin/CbcTreeLocal.hpp +372 -0
- data/ext/ruby-cbc/install/include/coin/Cbc_C_Interface.h +381 -0
- data/ext/ruby-cbc/install/include/coin/Cgl012cut.hpp +464 -0
- data/ext/ruby-cbc/install/include/coin/CglAllDifferent.hpp +115 -0
- data/ext/ruby-cbc/install/include/coin/CglClique.hpp +308 -0
- data/ext/ruby-cbc/install/include/coin/CglConfig.h +19 -0
- data/ext/ruby-cbc/install/include/coin/CglCutGenerator.hpp +121 -0
- data/ext/ruby-cbc/install/include/coin/CglDuplicateRow.hpp +189 -0
- data/ext/ruby-cbc/install/include/coin/CglFlowCover.hpp +371 -0
- data/ext/ruby-cbc/install/include/coin/CglGMI.hpp +364 -0
- data/ext/ruby-cbc/install/include/coin/CglGMIParam.hpp +313 -0
- data/ext/ruby-cbc/install/include/coin/CglGomory.hpp +204 -0
- data/ext/ruby-cbc/install/include/coin/CglKnapsackCover.hpp +310 -0
- data/ext/ruby-cbc/install/include/coin/CglLandP.hpp +306 -0
- data/ext/ruby-cbc/install/include/coin/CglLandPValidator.hpp +130 -0
- data/ext/ruby-cbc/install/include/coin/CglLiftAndProject.hpp +104 -0
- data/ext/ruby-cbc/install/include/coin/CglMessage.hpp +50 -0
- data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding.hpp +429 -0
- data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding2.hpp +427 -0
- data/ext/ruby-cbc/install/include/coin/CglOddHole.hpp +160 -0
- data/ext/ruby-cbc/install/include/coin/CglParam.hpp +93 -0
- data/ext/ruby-cbc/install/include/coin/CglPreProcess.hpp +492 -0
- data/ext/ruby-cbc/install/include/coin/CglProbing.hpp +543 -0
- data/ext/ruby-cbc/install/include/coin/CglRedSplit.hpp +448 -0
- data/ext/ruby-cbc/install/include/coin/CglRedSplit2.hpp +494 -0
- data/ext/ruby-cbc/install/include/coin/CglRedSplit2Param.hpp +495 -0
- data/ext/ruby-cbc/install/include/coin/CglRedSplitParam.hpp +272 -0
- data/ext/ruby-cbc/install/include/coin/CglResidualCapacity.hpp +240 -0
- data/ext/ruby-cbc/install/include/coin/CglSimpleRounding.hpp +174 -0
- data/ext/ruby-cbc/install/include/coin/CglStored.hpp +125 -0
- data/ext/ruby-cbc/install/include/coin/CglTreeInfo.hpp +180 -0
- data/ext/ruby-cbc/install/include/coin/CglTwomir.hpp +565 -0
- data/ext/ruby-cbc/install/include/coin/CglZeroHalf.hpp +133 -0
- data/ext/ruby-cbc/install/include/coin/ClpAmplObjective.hpp +113 -0
- data/ext/ruby-cbc/install/include/coin/ClpCholeskyBase.hpp +294 -0
- data/ext/ruby-cbc/install/include/coin/ClpCholeskyDense.hpp +162 -0
- data/ext/ruby-cbc/install/include/coin/ClpConfig.h +17 -0
- data/ext/ruby-cbc/install/include/coin/ClpConstraint.hpp +125 -0
- data/ext/ruby-cbc/install/include/coin/ClpConstraintAmpl.hpp +108 -0
- data/ext/ruby-cbc/install/include/coin/ClpConstraintLinear.hpp +110 -0
- data/ext/ruby-cbc/install/include/coin/ClpConstraintQuadratic.hpp +119 -0
- data/ext/ruby-cbc/install/include/coin/ClpDualRowDantzig.hpp +71 -0
- data/ext/ruby-cbc/install/include/coin/ClpDualRowPivot.hpp +129 -0
- data/ext/ruby-cbc/install/include/coin/ClpDualRowSteepest.hpp +153 -0
- data/ext/ruby-cbc/install/include/coin/ClpDummyMatrix.hpp +183 -0
- data/ext/ruby-cbc/install/include/coin/ClpDynamicExampleMatrix.hpp +186 -0
- data/ext/ruby-cbc/install/include/coin/ClpDynamicMatrix.hpp +381 -0
- data/ext/ruby-cbc/install/include/coin/ClpEventHandler.hpp +187 -0
- data/ext/ruby-cbc/install/include/coin/ClpFactorization.hpp +432 -0
- data/ext/ruby-cbc/install/include/coin/ClpGubDynamicMatrix.hpp +247 -0
- data/ext/ruby-cbc/install/include/coin/ClpGubMatrix.hpp +358 -0
- data/ext/ruby-cbc/install/include/coin/ClpInterior.hpp +570 -0
- data/ext/ruby-cbc/install/include/coin/ClpLinearObjective.hpp +103 -0
- data/ext/ruby-cbc/install/include/coin/ClpMatrixBase.hpp +524 -0
- data/ext/ruby-cbc/install/include/coin/ClpMessage.hpp +131 -0
- data/ext/ruby-cbc/install/include/coin/ClpModel.hpp +1307 -0
- data/ext/ruby-cbc/install/include/coin/ClpNetworkMatrix.hpp +229 -0
- data/ext/ruby-cbc/install/include/coin/ClpNode.hpp +349 -0
- data/ext/ruby-cbc/install/include/coin/ClpNonLinearCost.hpp +401 -0
- data/ext/ruby-cbc/install/include/coin/ClpObjective.hpp +134 -0
- data/ext/ruby-cbc/install/include/coin/ClpPackedMatrix.hpp +638 -0
- data/ext/ruby-cbc/install/include/coin/ClpParameters.hpp +126 -0
- data/ext/ruby-cbc/install/include/coin/ClpPdcoBase.hpp +103 -0
- data/ext/ruby-cbc/install/include/coin/ClpPlusMinusOneMatrix.hpp +290 -0
- data/ext/ruby-cbc/install/include/coin/ClpPresolve.hpp +299 -0
- data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnDantzig.hpp +72 -0
- data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnPivot.hpp +155 -0
- data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnSteepest.hpp +247 -0
- data/ext/ruby-cbc/install/include/coin/ClpQuadraticObjective.hpp +155 -0
- data/ext/ruby-cbc/install/include/coin/ClpSimplex.hpp +1797 -0
- data/ext/ruby-cbc/install/include/coin/ClpSimplexDual.hpp +300 -0
- data/ext/ruby-cbc/install/include/coin/ClpSimplexNonlinear.hpp +117 -0
- data/ext/ruby-cbc/install/include/coin/ClpSimplexOther.hpp +277 -0
- data/ext/ruby-cbc/install/include/coin/ClpSimplexPrimal.hpp +244 -0
- data/ext/ruby-cbc/install/include/coin/ClpSolve.hpp +446 -0
- data/ext/ruby-cbc/install/include/coin/Clp_C_Interface.h +525 -0
- data/ext/ruby-cbc/install/include/coin/CoinAlloc.hpp +176 -0
- data/ext/ruby-cbc/install/include/coin/CoinBuild.hpp +149 -0
- data/ext/ruby-cbc/install/include/coin/CoinDenseFactorization.hpp +419 -0
- data/ext/ruby-cbc/install/include/coin/CoinDenseVector.hpp +383 -0
- data/ext/ruby-cbc/install/include/coin/CoinDistance.hpp +48 -0
- data/ext/ruby-cbc/install/include/coin/CoinError.hpp +257 -0
- data/ext/ruby-cbc/install/include/coin/CoinFactorization.hpp +2044 -0
- data/ext/ruby-cbc/install/include/coin/CoinFileIO.hpp +166 -0
- data/ext/ruby-cbc/install/include/coin/CoinFinite.hpp +34 -0
- data/ext/ruby-cbc/install/include/coin/CoinFloatEqual.hpp +177 -0
- data/ext/ruby-cbc/install/include/coin/CoinHelperFunctions.hpp +1111 -0
- data/ext/ruby-cbc/install/include/coin/CoinIndexedVector.hpp +1164 -0
- data/ext/ruby-cbc/install/include/coin/CoinLpIO.hpp +805 -0
- data/ext/ruby-cbc/install/include/coin/CoinMessage.hpp +96 -0
- data/ext/ruby-cbc/install/include/coin/CoinMessageHandler.hpp +666 -0
- data/ext/ruby-cbc/install/include/coin/CoinModel.hpp +1054 -0
- data/ext/ruby-cbc/install/include/coin/CoinModelUseful.hpp +441 -0
- data/ext/ruby-cbc/install/include/coin/CoinMpsIO.hpp +1056 -0
- data/ext/ruby-cbc/install/include/coin/CoinOslFactorization.hpp +280 -0
- data/ext/ruby-cbc/install/include/coin/CoinPackedMatrix.hpp +947 -0
- data/ext/ruby-cbc/install/include/coin/CoinPackedVector.hpp +657 -0
- data/ext/ruby-cbc/install/include/coin/CoinPackedVectorBase.hpp +269 -0
- data/ext/ruby-cbc/install/include/coin/CoinParam.hpp +644 -0
- data/ext/ruby-cbc/install/include/coin/CoinPragma.hpp +26 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveDoubleton.hpp +73 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveDual.hpp +85 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveDupcol.hpp +226 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveEmpty.hpp +116 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveFixed.hpp +181 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveForcing.hpp +61 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveImpliedFree.hpp +60 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveIsolated.hpp +51 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveMatrix.hpp +1842 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveMonitor.hpp +105 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolvePsdebug.hpp +166 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveSingleton.hpp +112 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveSubst.hpp +101 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveTighten.hpp +55 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveTripleton.hpp +66 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveUseless.hpp +63 -0
- data/ext/ruby-cbc/install/include/coin/CoinPresolveZeros.hpp +60 -0
- data/ext/ruby-cbc/install/include/coin/CoinRational.hpp +44 -0
- data/ext/ruby-cbc/install/include/coin/CoinSearchTree.hpp +465 -0
- data/ext/ruby-cbc/install/include/coin/CoinShallowPackedVector.hpp +148 -0
- data/ext/ruby-cbc/install/include/coin/CoinSignal.hpp +117 -0
- data/ext/ruby-cbc/install/include/coin/CoinSimpFactorization.hpp +431 -0
- data/ext/ruby-cbc/install/include/coin/CoinSmartPtr.hpp +528 -0
- data/ext/ruby-cbc/install/include/coin/CoinSnapshot.hpp +476 -0
- data/ext/ruby-cbc/install/include/coin/CoinSort.hpp +678 -0
- data/ext/ruby-cbc/install/include/coin/CoinStructuredModel.hpp +247 -0
- data/ext/ruby-cbc/install/include/coin/CoinTime.hpp +310 -0
- data/ext/ruby-cbc/install/include/coin/CoinTypes.hpp +64 -0
- data/ext/ruby-cbc/install/include/coin/CoinUtility.hpp +19 -0
- data/ext/ruby-cbc/install/include/coin/CoinUtilsConfig.h +34 -0
- data/ext/ruby-cbc/install/include/coin/CoinWarmStart.hpp +58 -0
- data/ext/ruby-cbc/install/include/coin/CoinWarmStartBasis.hpp +456 -0
- data/ext/ruby-cbc/install/include/coin/CoinWarmStartDual.hpp +166 -0
- data/ext/ruby-cbc/install/include/coin/CoinWarmStartPrimalDual.hpp +211 -0
- data/ext/ruby-cbc/install/include/coin/CoinWarmStartVector.hpp +488 -0
- data/ext/ruby-cbc/install/include/coin/Coin_C_defines.h +115 -0
- data/ext/ruby-cbc/install/include/coin/Idiot.hpp +298 -0
- data/ext/ruby-cbc/install/include/coin/OsiAuxInfo.hpp +206 -0
- data/ext/ruby-cbc/install/include/coin/OsiBranchingObject.hpp +1005 -0
- data/ext/ruby-cbc/install/include/coin/OsiCbcSolverInterface.hpp +764 -0
- data/ext/ruby-cbc/install/include/coin/OsiChooseVariable.hpp +534 -0
- data/ext/ruby-cbc/install/include/coin/OsiClpSolverInterface.hpp +1509 -0
- data/ext/ruby-cbc/install/include/coin/OsiColCut.hpp +324 -0
- data/ext/ruby-cbc/install/include/coin/OsiCollections.hpp +35 -0
- data/ext/ruby-cbc/install/include/coin/OsiConfig.h +19 -0
- data/ext/ruby-cbc/install/include/coin/OsiCut.hpp +245 -0
- data/ext/ruby-cbc/install/include/coin/OsiCuts.hpp +474 -0
- data/ext/ruby-cbc/install/include/coin/OsiPresolve.hpp +252 -0
- data/ext/ruby-cbc/install/include/coin/OsiRowCut.hpp +331 -0
- data/ext/ruby-cbc/install/include/coin/OsiRowCutDebugger.hpp +187 -0
- data/ext/ruby-cbc/install/include/coin/OsiSolverBranch.hpp +152 -0
- data/ext/ruby-cbc/install/include/coin/OsiSolverInterface.hpp +2143 -0
- data/ext/ruby-cbc/install/include/coin/OsiSolverParameters.hpp +142 -0
- data/ext/ruby-cbc/install/include/coin/OsiUnitTests.hpp +374 -0
- data/ext/ruby-cbc/install/lib/libCbc.la +35 -0
- data/ext/ruby-cbc/install/lib/libCbc.so +0 -0
- data/ext/ruby-cbc/install/lib/libCbc.so.3 +0 -0
- data/ext/ruby-cbc/install/lib/libCbc.so.3.9.7 +0 -0
- data/ext/ruby-cbc/install/lib/libCbcSolver.la +35 -0
- data/ext/ruby-cbc/install/lib/libCbcSolver.so +0 -0
- data/ext/ruby-cbc/install/lib/libCbcSolver.so.3 +0 -0
- data/ext/ruby-cbc/install/lib/libCbcSolver.so.3.9.7 +0 -0
- data/ext/ruby-cbc/install/lib/libCgl.la +35 -0
- data/ext/ruby-cbc/install/lib/libCgl.so +0 -0
- data/ext/ruby-cbc/install/lib/libCgl.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libCgl.so.1.9.7 +0 -0
- data/ext/ruby-cbc/install/lib/libClp.la +35 -0
- data/ext/ruby-cbc/install/lib/libClp.so +0 -0
- data/ext/ruby-cbc/install/lib/libClp.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libClp.so.1.13.9 +0 -0
- data/ext/ruby-cbc/install/lib/libClpSolver.la +35 -0
- data/ext/ruby-cbc/install/lib/libClpSolver.so +0 -0
- data/ext/ruby-cbc/install/lib/libClpSolver.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libClpSolver.so.1.13.9 +0 -0
- data/ext/ruby-cbc/install/lib/libCoinUtils.la +35 -0
- data/ext/ruby-cbc/install/lib/libCoinUtils.so +0 -0
- data/ext/ruby-cbc/install/lib/libCoinUtils.so.3 +0 -0
- data/ext/ruby-cbc/install/lib/libCoinUtils.so.3.10.11 +0 -0
- data/ext/ruby-cbc/install/lib/libOsi.la +35 -0
- data/ext/ruby-cbc/install/lib/libOsi.so +0 -0
- data/ext/ruby-cbc/install/lib/libOsi.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libOsi.so.1.12.6 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCbc.la +35 -0
- data/ext/ruby-cbc/install/lib/libOsiCbc.so +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCbc.so.3 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCbc.so.3.9.7 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiClp.la +35 -0
- data/ext/ruby-cbc/install/lib/libOsiClp.so +0 -0
- data/ext/ruby-cbc/install/lib/libOsiClp.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiClp.so.1.13.9 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCommonTests.la +35 -0
- data/ext/ruby-cbc/install/lib/libOsiCommonTests.so +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1 +0 -0
- data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1.12.6 +0 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/cbc.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/cgl.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/clp.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/coindatamiplib3.pc +9 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/coindatasample.pc +9 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/coinutils.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/osi-cbc.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/osi-clp.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/osi-unittests.pc +12 -0
- data/ext/ruby-cbc/install/lib/pkgconfig/osi.pc +12 -0
- data/lib/ruby-cbc/ilp/constant.rb +44 -0
- data/lib/ruby-cbc/ilp/constraint.rb +32 -0
- data/lib/ruby-cbc/ilp/objective.rb +26 -0
- data/lib/ruby-cbc/ilp/term.rb +47 -0
- data/lib/ruby-cbc/ilp/term_array.rb +80 -0
- data/lib/ruby-cbc/ilp/var.rb +62 -0
- data/lib/ruby-cbc/model.rb +125 -0
- data/lib/ruby-cbc/problem.rb +170 -0
- data/lib/ruby-cbc/version.rb +3 -0
- data/lib/ruby-cbc.rb +21 -0
- data/ruby-cbc.gemspec +36 -0
- metadata +431 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/* $Id: ClpSimplexPrimal.hpp 1665 2011-01-04 17:55:54Z lou $ */
|
|
2
|
+
// Copyright (C) 2002, International Business Machines
|
|
3
|
+
// Corporation and others. All Rights Reserved.
|
|
4
|
+
// This code is licensed under the terms of the Eclipse Public License (EPL).
|
|
5
|
+
/*
|
|
6
|
+
Authors
|
|
7
|
+
|
|
8
|
+
John Forrest
|
|
9
|
+
|
|
10
|
+
*/
|
|
11
|
+
#ifndef ClpSimplexPrimal_H
|
|
12
|
+
#define ClpSimplexPrimal_H
|
|
13
|
+
|
|
14
|
+
#include "ClpSimplex.hpp"
|
|
15
|
+
|
|
16
|
+
/** This solves LPs using the primal simplex method
|
|
17
|
+
|
|
18
|
+
It inherits from ClpSimplex. It has no data of its own and
|
|
19
|
+
is never created - only cast from a ClpSimplex object at algorithm time.
|
|
20
|
+
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
class ClpSimplexPrimal : public ClpSimplex {
|
|
24
|
+
|
|
25
|
+
public:
|
|
26
|
+
|
|
27
|
+
/**@name Description of algorithm */
|
|
28
|
+
//@{
|
|
29
|
+
/** Primal algorithm
|
|
30
|
+
|
|
31
|
+
Method
|
|
32
|
+
|
|
33
|
+
It tries to be a single phase approach with a weight of 1.0 being
|
|
34
|
+
given to getting optimal and a weight of infeasibilityCost_ being
|
|
35
|
+
given to getting primal feasible. In this version I have tried to
|
|
36
|
+
be clever in a stupid way. The idea of fake bounds in dual
|
|
37
|
+
seems to work so the primal analogue would be that of getting
|
|
38
|
+
bounds on reduced costs (by a presolve approach) and using
|
|
39
|
+
these for being above or below feasible region. I decided to waste
|
|
40
|
+
memory and keep these explicitly. This allows for non-linear
|
|
41
|
+
costs! I have not tested non-linear costs but will be glad
|
|
42
|
+
to do something if a reasonable example is provided.
|
|
43
|
+
|
|
44
|
+
The code is designed to take advantage of sparsity so arrays are
|
|
45
|
+
seldom zeroed out from scratch or gone over in their entirety.
|
|
46
|
+
The only exception is a full scan to find incoming variable for
|
|
47
|
+
Dantzig row choice. For steepest edge we keep an updated list
|
|
48
|
+
of dual infeasibilities (actually squares).
|
|
49
|
+
On easy problems we don't need full scan - just
|
|
50
|
+
pick first reasonable. This method has not been coded.
|
|
51
|
+
|
|
52
|
+
One problem is how to tackle degeneracy and accuracy. At present
|
|
53
|
+
I am using the modification of costs which I put in OSL and which was
|
|
54
|
+
extended by Gill et al. I am still not sure whether we will also
|
|
55
|
+
need explicit perturbation.
|
|
56
|
+
|
|
57
|
+
The flow of primal is three while loops as follows:
|
|
58
|
+
|
|
59
|
+
while (not finished) {
|
|
60
|
+
|
|
61
|
+
while (not clean solution) {
|
|
62
|
+
|
|
63
|
+
Factorize and/or clean up solution by changing bounds so
|
|
64
|
+
primal feasible. If looks finished check fake primal bounds.
|
|
65
|
+
Repeat until status is iterating (-1) or finished (0,1,2)
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
while (status==-1) {
|
|
70
|
+
|
|
71
|
+
Iterate until no pivot in or out or time to re-factorize.
|
|
72
|
+
|
|
73
|
+
Flow is:
|
|
74
|
+
|
|
75
|
+
choose pivot column (incoming variable). if none then
|
|
76
|
+
we are primal feasible so looks as if done but we need to
|
|
77
|
+
break and check bounds etc.
|
|
78
|
+
|
|
79
|
+
Get pivot column in tableau
|
|
80
|
+
|
|
81
|
+
Choose outgoing row. If we don't find one then we look
|
|
82
|
+
primal unbounded so break and check bounds etc. (Also the
|
|
83
|
+
pivot tolerance is larger after any iterations so that may be
|
|
84
|
+
reason)
|
|
85
|
+
|
|
86
|
+
If we do find outgoing row, we may have to adjust costs to
|
|
87
|
+
keep going forwards (anti-degeneracy). Check pivot will be stable
|
|
88
|
+
and if unstable throw away iteration and break to re-factorize.
|
|
89
|
+
If minor error re-factorize after iteration.
|
|
90
|
+
|
|
91
|
+
Update everything (this may involve changing bounds on
|
|
92
|
+
variables to stay primal feasible.
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
TODO's (or maybe not)
|
|
99
|
+
|
|
100
|
+
At present we never check we are going forwards. I overdid that in
|
|
101
|
+
OSL so will try and make a last resort.
|
|
102
|
+
|
|
103
|
+
Needs partial scan pivot in option.
|
|
104
|
+
|
|
105
|
+
May need other anti-degeneracy measures, especially if we try and use
|
|
106
|
+
loose tolerances as a way to solve in fewer iterations.
|
|
107
|
+
|
|
108
|
+
I like idea of dynamic scaling. This gives opportunity to decouple
|
|
109
|
+
different implications of scaling for accuracy, iteration count and
|
|
110
|
+
feasibility tolerance.
|
|
111
|
+
|
|
112
|
+
for use of exotic parameter startFinishoptions see Clpsimplex.hpp
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
int primal(int ifValuesPass = 0, int startFinishOptions = 0);
|
|
116
|
+
//@}
|
|
117
|
+
|
|
118
|
+
/**@name For advanced users */
|
|
119
|
+
//@{
|
|
120
|
+
/// Do not change infeasibility cost and always say optimal
|
|
121
|
+
void alwaysOptimal(bool onOff);
|
|
122
|
+
bool alwaysOptimal() const;
|
|
123
|
+
/** Normally outgoing variables can go out to slightly negative
|
|
124
|
+
values (but within tolerance) - this is to help stability and
|
|
125
|
+
and degeneracy. This can be switched off
|
|
126
|
+
*/
|
|
127
|
+
void exactOutgoing(bool onOff);
|
|
128
|
+
bool exactOutgoing() const;
|
|
129
|
+
//@}
|
|
130
|
+
|
|
131
|
+
/**@name Functions used in primal */
|
|
132
|
+
//@{
|
|
133
|
+
/** This has the flow between re-factorizations
|
|
134
|
+
|
|
135
|
+
Returns a code to say where decision to exit was made
|
|
136
|
+
Problem status set to:
|
|
137
|
+
|
|
138
|
+
-2 re-factorize
|
|
139
|
+
-4 Looks optimal/infeasible
|
|
140
|
+
-5 Looks unbounded
|
|
141
|
+
+3 max iterations
|
|
142
|
+
|
|
143
|
+
valuesOption has original value of valuesPass
|
|
144
|
+
*/
|
|
145
|
+
int whileIterating(int valuesOption);
|
|
146
|
+
|
|
147
|
+
/** Do last half of an iteration. This is split out so people can
|
|
148
|
+
force incoming variable. If solveType_ is 2 then this may
|
|
149
|
+
re-factorize while normally it would exit to re-factorize.
|
|
150
|
+
Return codes
|
|
151
|
+
Reasons to come out (normal mode/user mode):
|
|
152
|
+
-1 normal
|
|
153
|
+
-2 factorize now - good iteration/ NA
|
|
154
|
+
-3 slight inaccuracy - refactorize - iteration done/ same but factor done
|
|
155
|
+
-4 inaccuracy - refactorize - no iteration/ NA
|
|
156
|
+
-5 something flagged - go round again/ pivot not possible
|
|
157
|
+
+2 looks unbounded
|
|
158
|
+
+3 max iterations (iteration done)
|
|
159
|
+
|
|
160
|
+
With solveType_ ==2 this should
|
|
161
|
+
Pivot in a variable and choose an outgoing one. Assumes primal
|
|
162
|
+
feasible - will not go through a bound. Returns step length in theta
|
|
163
|
+
Returns ray in ray_
|
|
164
|
+
*/
|
|
165
|
+
int pivotResult(int ifValuesPass = 0);
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
/** The primals are updated by the given array.
|
|
169
|
+
Returns number of infeasibilities.
|
|
170
|
+
After rowArray will have cost changes for use next iteration
|
|
171
|
+
*/
|
|
172
|
+
int updatePrimalsInPrimal(CoinIndexedVector * rowArray,
|
|
173
|
+
double theta,
|
|
174
|
+
double & objectiveChange,
|
|
175
|
+
int valuesPass);
|
|
176
|
+
/**
|
|
177
|
+
Row array has pivot column
|
|
178
|
+
This chooses pivot row.
|
|
179
|
+
Rhs array is used for distance to next bound (for speed)
|
|
180
|
+
For speed, we may need to go to a bucket approach when many
|
|
181
|
+
variables go through bounds
|
|
182
|
+
If valuesPass non-zero then compute dj for direction
|
|
183
|
+
*/
|
|
184
|
+
void primalRow(CoinIndexedVector * rowArray,
|
|
185
|
+
CoinIndexedVector * rhsArray,
|
|
186
|
+
CoinIndexedVector * spareArray,
|
|
187
|
+
int valuesPass);
|
|
188
|
+
/**
|
|
189
|
+
Chooses primal pivot column
|
|
190
|
+
updateArray has cost updates (also use pivotRow_ from last iteration)
|
|
191
|
+
Would be faster with separate region to scan
|
|
192
|
+
and will have this (with square of infeasibility) when steepest
|
|
193
|
+
For easy problems we can just choose one of the first columns we look at
|
|
194
|
+
*/
|
|
195
|
+
void primalColumn(CoinIndexedVector * updateArray,
|
|
196
|
+
CoinIndexedVector * spareRow1,
|
|
197
|
+
CoinIndexedVector * spareRow2,
|
|
198
|
+
CoinIndexedVector * spareColumn1,
|
|
199
|
+
CoinIndexedVector * spareColumn2);
|
|
200
|
+
|
|
201
|
+
/** Checks if tentative optimal actually means unbounded in primal
|
|
202
|
+
Returns -3 if not, 2 if is unbounded */
|
|
203
|
+
int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare,
|
|
204
|
+
double changeCost);
|
|
205
|
+
/** Refactorizes if necessary
|
|
206
|
+
Checks if finished. Updates status.
|
|
207
|
+
lastCleaned refers to iteration at which some objective/feasibility
|
|
208
|
+
cleaning too place.
|
|
209
|
+
|
|
210
|
+
type - 0 initial so set up save arrays etc
|
|
211
|
+
- 1 normal -if good update save
|
|
212
|
+
- 2 restoring from saved
|
|
213
|
+
saveModel is normally NULL but may not be if doing Sprint
|
|
214
|
+
*/
|
|
215
|
+
void statusOfProblemInPrimal(int & lastCleaned, int type,
|
|
216
|
+
ClpSimplexProgress * progress,
|
|
217
|
+
bool doFactorization,
|
|
218
|
+
int ifValuesPass,
|
|
219
|
+
ClpSimplex * saveModel = NULL);
|
|
220
|
+
/// Perturbs problem (method depends on perturbation())
|
|
221
|
+
void perturb(int type);
|
|
222
|
+
/// Take off effect of perturbation and say whether to try dual
|
|
223
|
+
bool unPerturb();
|
|
224
|
+
/// Unflag all variables and return number unflagged
|
|
225
|
+
int unflag();
|
|
226
|
+
/** Get next superbasic -1 if none,
|
|
227
|
+
Normal type is 1
|
|
228
|
+
If type is 3 then initializes sorted list
|
|
229
|
+
if 2 uses list.
|
|
230
|
+
*/
|
|
231
|
+
int nextSuperBasic(int superBasicType, CoinIndexedVector * columnArray);
|
|
232
|
+
|
|
233
|
+
/// Create primal ray
|
|
234
|
+
void primalRay(CoinIndexedVector * rowArray);
|
|
235
|
+
/// Clears all bits and clears rowArray[1] etc
|
|
236
|
+
void clearAll();
|
|
237
|
+
|
|
238
|
+
/// Sort of lexicographic resolve
|
|
239
|
+
int lexSolve();
|
|
240
|
+
|
|
241
|
+
//@}
|
|
242
|
+
};
|
|
243
|
+
#endif
|
|
244
|
+
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/* $Id: ClpSolve.hpp 2078 2015-01-05 12:39:49Z forrest $ */
|
|
2
|
+
// Copyright (C) 2003, 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
|
+
Authors
|
|
7
|
+
|
|
8
|
+
John Forrest
|
|
9
|
+
|
|
10
|
+
*/
|
|
11
|
+
#ifndef ClpSolve_H
|
|
12
|
+
#define ClpSolve_H
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
This is a very simple class to guide algorithms. It is used to tidy up
|
|
16
|
+
passing parameters to initialSolve and maybe for output from that
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
class ClpSolve {
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
|
|
24
|
+
/** enums for solve function */
|
|
25
|
+
enum SolveType {
|
|
26
|
+
useDual = 0,
|
|
27
|
+
usePrimal,
|
|
28
|
+
usePrimalorSprint,
|
|
29
|
+
useBarrier,
|
|
30
|
+
useBarrierNoCross,
|
|
31
|
+
automatic,
|
|
32
|
+
tryDantzigWolfe,
|
|
33
|
+
tryBenders,
|
|
34
|
+
notImplemented
|
|
35
|
+
};
|
|
36
|
+
enum PresolveType {
|
|
37
|
+
presolveOn = 0,
|
|
38
|
+
presolveOff,
|
|
39
|
+
presolveNumber,
|
|
40
|
+
presolveNumberCost
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**@name Constructors and destructor and copy */
|
|
44
|
+
//@{
|
|
45
|
+
/// Default constructor
|
|
46
|
+
ClpSolve ( );
|
|
47
|
+
/// Constructor when you really know what you are doing
|
|
48
|
+
ClpSolve ( SolveType method, PresolveType presolveType,
|
|
49
|
+
int numberPasses, int options[6],
|
|
50
|
+
int extraInfo[6], int independentOptions[3]);
|
|
51
|
+
/// Generates code for above constructor
|
|
52
|
+
void generateCpp(FILE * fp);
|
|
53
|
+
/// Copy constructor.
|
|
54
|
+
ClpSolve(const ClpSolve &);
|
|
55
|
+
/// Assignment operator. This copies the data
|
|
56
|
+
ClpSolve & operator=(const ClpSolve & rhs);
|
|
57
|
+
/// Destructor
|
|
58
|
+
~ClpSolve ( );
|
|
59
|
+
//@}
|
|
60
|
+
|
|
61
|
+
/**@name Functions most useful to user */
|
|
62
|
+
//@{
|
|
63
|
+
/** Special options - bits
|
|
64
|
+
0 4 - use crash (default allslack in dual, idiot in primal)
|
|
65
|
+
8 - all slack basis in primal
|
|
66
|
+
2 16 - switch off interrupt handling
|
|
67
|
+
3 32 - do not try and make plus minus one matrix
|
|
68
|
+
64 - do not use sprint even if problem looks good
|
|
69
|
+
*/
|
|
70
|
+
/** which translation is:
|
|
71
|
+
which:
|
|
72
|
+
0 - startup in Dual (nothing if basis exists).:
|
|
73
|
+
0 - no basis
|
|
74
|
+
1 - crash
|
|
75
|
+
2 - use initiative about idiot! but no crash
|
|
76
|
+
1 - startup in Primal (nothing if basis exists):
|
|
77
|
+
0 - use initiative
|
|
78
|
+
1 - use crash
|
|
79
|
+
2 - use idiot and look at further info
|
|
80
|
+
3 - use sprint and look at further info
|
|
81
|
+
4 - use all slack
|
|
82
|
+
5 - use initiative but no idiot
|
|
83
|
+
6 - use initiative but no sprint
|
|
84
|
+
7 - use initiative but no crash
|
|
85
|
+
8 - do allslack or idiot
|
|
86
|
+
9 - do allslack or sprint
|
|
87
|
+
10 - slp before
|
|
88
|
+
11 - no nothing and primal(0)
|
|
89
|
+
2 - interrupt handling - 0 yes, 1 no (for threadsafe)
|
|
90
|
+
3 - whether to make +- 1matrix - 0 yes, 1 no
|
|
91
|
+
4 - for barrier
|
|
92
|
+
0 - dense cholesky
|
|
93
|
+
1 - Wssmp allowing some long columns
|
|
94
|
+
2 - Wssmp not allowing long columns
|
|
95
|
+
3 - Wssmp using KKT
|
|
96
|
+
4 - Using Florida ordering
|
|
97
|
+
8 - bit set to do scaling
|
|
98
|
+
16 - set to be aggressive with gamma/delta?
|
|
99
|
+
32 - Use KKT
|
|
100
|
+
5 - for presolve
|
|
101
|
+
1 - switch off dual stuff
|
|
102
|
+
6 - extra switches
|
|
103
|
+
|
|
104
|
+
*/
|
|
105
|
+
void setSpecialOption(int which, int value, int extraInfo = -1);
|
|
106
|
+
int getSpecialOption(int which) const;
|
|
107
|
+
|
|
108
|
+
/// Solve types
|
|
109
|
+
void setSolveType(SolveType method, int extraInfo = -1);
|
|
110
|
+
SolveType getSolveType();
|
|
111
|
+
|
|
112
|
+
// Presolve types
|
|
113
|
+
void setPresolveType(PresolveType amount, int extraInfo = -1);
|
|
114
|
+
PresolveType getPresolveType();
|
|
115
|
+
int getPresolvePasses() const;
|
|
116
|
+
/// Extra info for idiot (or sprint)
|
|
117
|
+
int getExtraInfo(int which) const;
|
|
118
|
+
/** Say to return at once if infeasible,
|
|
119
|
+
default is to solve */
|
|
120
|
+
void setInfeasibleReturn(bool trueFalse);
|
|
121
|
+
inline bool infeasibleReturn() const {
|
|
122
|
+
return independentOptions_[0] != 0;
|
|
123
|
+
}
|
|
124
|
+
/// Whether we want to do dual part of presolve
|
|
125
|
+
inline bool doDual() const {
|
|
126
|
+
return (independentOptions_[1] & 1) == 0;
|
|
127
|
+
}
|
|
128
|
+
inline void setDoDual(bool doDual_) {
|
|
129
|
+
if (doDual_) independentOptions_[1] &= ~1;
|
|
130
|
+
else independentOptions_[1] |= 1;
|
|
131
|
+
}
|
|
132
|
+
/// Whether we want to do singleton part of presolve
|
|
133
|
+
inline bool doSingleton() const {
|
|
134
|
+
return (independentOptions_[1] & 2) == 0;
|
|
135
|
+
}
|
|
136
|
+
inline void setDoSingleton(bool doSingleton_) {
|
|
137
|
+
if (doSingleton_) independentOptions_[1] &= ~2;
|
|
138
|
+
else independentOptions_[1] |= 2;
|
|
139
|
+
}
|
|
140
|
+
/// Whether we want to do doubleton part of presolve
|
|
141
|
+
inline bool doDoubleton() const {
|
|
142
|
+
return (independentOptions_[1] & 4) == 0;
|
|
143
|
+
}
|
|
144
|
+
inline void setDoDoubleton(bool doDoubleton_) {
|
|
145
|
+
if (doDoubleton_) independentOptions_[1] &= ~4;
|
|
146
|
+
else independentOptions_[1] |= 4;
|
|
147
|
+
}
|
|
148
|
+
/// Whether we want to do tripleton part of presolve
|
|
149
|
+
inline bool doTripleton() const {
|
|
150
|
+
return (independentOptions_[1] & 8) == 0;
|
|
151
|
+
}
|
|
152
|
+
inline void setDoTripleton(bool doTripleton_) {
|
|
153
|
+
if (doTripleton_) independentOptions_[1] &= ~8;
|
|
154
|
+
else independentOptions_[1] |= 8;
|
|
155
|
+
}
|
|
156
|
+
/// Whether we want to do tighten part of presolve
|
|
157
|
+
inline bool doTighten() const {
|
|
158
|
+
return (independentOptions_[1] & 16) == 0;
|
|
159
|
+
}
|
|
160
|
+
inline void setDoTighten(bool doTighten_) {
|
|
161
|
+
if (doTighten_) independentOptions_[1] &= ~16;
|
|
162
|
+
else independentOptions_[1] |= 16;
|
|
163
|
+
}
|
|
164
|
+
/// Whether we want to do forcing part of presolve
|
|
165
|
+
inline bool doForcing() const {
|
|
166
|
+
return (independentOptions_[1] & 32) == 0;
|
|
167
|
+
}
|
|
168
|
+
inline void setDoForcing(bool doForcing_) {
|
|
169
|
+
if (doForcing_) independentOptions_[1] &= ~32;
|
|
170
|
+
else independentOptions_[1] |= 32;
|
|
171
|
+
}
|
|
172
|
+
/// Whether we want to do impliedfree part of presolve
|
|
173
|
+
inline bool doImpliedFree() const {
|
|
174
|
+
return (independentOptions_[1] & 64) == 0;
|
|
175
|
+
}
|
|
176
|
+
inline void setDoImpliedFree(bool doImpliedfree) {
|
|
177
|
+
if (doImpliedfree) independentOptions_[1] &= ~64;
|
|
178
|
+
else independentOptions_[1] |= 64;
|
|
179
|
+
}
|
|
180
|
+
/// Whether we want to do dupcol part of presolve
|
|
181
|
+
inline bool doDupcol() const {
|
|
182
|
+
return (independentOptions_[1] & 128) == 0;
|
|
183
|
+
}
|
|
184
|
+
inline void setDoDupcol(bool doDupcol_) {
|
|
185
|
+
if (doDupcol_) independentOptions_[1] &= ~128;
|
|
186
|
+
else independentOptions_[1] |= 128;
|
|
187
|
+
}
|
|
188
|
+
/// Whether we want to do duprow part of presolve
|
|
189
|
+
inline bool doDuprow() const {
|
|
190
|
+
return (independentOptions_[1] & 256) == 0;
|
|
191
|
+
}
|
|
192
|
+
inline void setDoDuprow(bool doDuprow_) {
|
|
193
|
+
if (doDuprow_) independentOptions_[1] &= ~256;
|
|
194
|
+
else independentOptions_[1] |= 256;
|
|
195
|
+
}
|
|
196
|
+
/// Whether we want to do singleton column part of presolve
|
|
197
|
+
inline bool doSingletonColumn() const {
|
|
198
|
+
return (independentOptions_[1] & 512) == 0;
|
|
199
|
+
}
|
|
200
|
+
inline void setDoSingletonColumn(bool doSingleton_) {
|
|
201
|
+
if (doSingleton_) independentOptions_[1] &= ~512;
|
|
202
|
+
else independentOptions_[1] |= 512;
|
|
203
|
+
}
|
|
204
|
+
/// Whether we want to kill small substitutions
|
|
205
|
+
inline bool doKillSmall() const {
|
|
206
|
+
return (independentOptions_[1] & 8192) == 0;
|
|
207
|
+
}
|
|
208
|
+
inline void setDoKillSmall(bool doKill) {
|
|
209
|
+
if (doKill) independentOptions_[1] &= ~8192;
|
|
210
|
+
else independentOptions_[1] |= 8192;
|
|
211
|
+
}
|
|
212
|
+
/// Set whole group
|
|
213
|
+
inline int presolveActions() const {
|
|
214
|
+
return independentOptions_[1] & 0xffff;
|
|
215
|
+
}
|
|
216
|
+
inline void setPresolveActions(int action) {
|
|
217
|
+
independentOptions_[1] = (independentOptions_[1] & 0xffff0000) | (action & 0xffff);
|
|
218
|
+
}
|
|
219
|
+
/// Largest column for substitution (normally 3)
|
|
220
|
+
inline int substitution() const {
|
|
221
|
+
return independentOptions_[2];
|
|
222
|
+
}
|
|
223
|
+
inline void setSubstitution(int value) {
|
|
224
|
+
independentOptions_[2] = value;
|
|
225
|
+
}
|
|
226
|
+
inline void setIndependentOption(int type,int value) {
|
|
227
|
+
independentOptions_[type] = value;
|
|
228
|
+
}
|
|
229
|
+
inline int independentOption(int type) const {
|
|
230
|
+
return independentOptions_[type];
|
|
231
|
+
}
|
|
232
|
+
//@}
|
|
233
|
+
|
|
234
|
+
////////////////// data //////////////////
|
|
235
|
+
private:
|
|
236
|
+
|
|
237
|
+
/**@name data.
|
|
238
|
+
*/
|
|
239
|
+
//@{
|
|
240
|
+
/// Solve type
|
|
241
|
+
SolveType method_;
|
|
242
|
+
/// Presolve type
|
|
243
|
+
PresolveType presolveType_;
|
|
244
|
+
/// Amount of presolve
|
|
245
|
+
int numberPasses_;
|
|
246
|
+
/// Options - last is switch for OsiClp
|
|
247
|
+
int options_[7];
|
|
248
|
+
/// Extra information
|
|
249
|
+
int extraInfo_[7];
|
|
250
|
+
/** Extra algorithm dependent options
|
|
251
|
+
0 - if set return from clpsolve if infeasible
|
|
252
|
+
1 - To be copied over to presolve options
|
|
253
|
+
2 - max substitution level
|
|
254
|
+
If Dantzig Wolfe/benders 0 is number blocks, 2 is #passes (notional)
|
|
255
|
+
*/
|
|
256
|
+
int independentOptions_[3];
|
|
257
|
+
//@}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/// For saving extra information to see if looping.
|
|
261
|
+
class ClpSimplexProgress {
|
|
262
|
+
|
|
263
|
+
public:
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
/**@name Constructors and destructor and copy */
|
|
267
|
+
//@{
|
|
268
|
+
/// Default constructor
|
|
269
|
+
ClpSimplexProgress ( );
|
|
270
|
+
|
|
271
|
+
/// Constructor from model
|
|
272
|
+
ClpSimplexProgress ( ClpSimplex * model );
|
|
273
|
+
|
|
274
|
+
/// Copy constructor.
|
|
275
|
+
ClpSimplexProgress(const ClpSimplexProgress &);
|
|
276
|
+
|
|
277
|
+
/// Assignment operator. This copies the data
|
|
278
|
+
ClpSimplexProgress & operator=(const ClpSimplexProgress & rhs);
|
|
279
|
+
/// Destructor
|
|
280
|
+
~ClpSimplexProgress ( );
|
|
281
|
+
/// Resets as much as possible
|
|
282
|
+
void reset();
|
|
283
|
+
/// Fill from model
|
|
284
|
+
void fillFromModel ( ClpSimplex * model );
|
|
285
|
+
|
|
286
|
+
//@}
|
|
287
|
+
|
|
288
|
+
/**@name Check progress */
|
|
289
|
+
//@{
|
|
290
|
+
/** Returns -1 if okay, -n+1 (n number of times bad) if bad but action taken,
|
|
291
|
+
>=0 if give up and use as problem status
|
|
292
|
+
*/
|
|
293
|
+
int looping ( );
|
|
294
|
+
/// Start check at beginning of whileIterating
|
|
295
|
+
void startCheck();
|
|
296
|
+
/// Returns cycle length in whileIterating
|
|
297
|
+
int cycle(int in, int out, int wayIn, int wayOut);
|
|
298
|
+
|
|
299
|
+
/// Returns previous objective (if -1) - current if (0)
|
|
300
|
+
double lastObjective(int back = 1) const;
|
|
301
|
+
/// Set real primal infeasibility and move back
|
|
302
|
+
void setInfeasibility(double value);
|
|
303
|
+
/// Returns real primal infeasibility (if -1) - current if (0)
|
|
304
|
+
double lastInfeasibility(int back = 1) const;
|
|
305
|
+
/// Returns number of primal infeasibilities (if -1) - current if (0)
|
|
306
|
+
int numberInfeasibilities(int back = 1) const;
|
|
307
|
+
/// Modify objective e.g. if dual infeasible in dual
|
|
308
|
+
void modifyObjective(double value);
|
|
309
|
+
/// Returns previous iteration number (if -1) - current if (0)
|
|
310
|
+
int lastIterationNumber(int back = 1) const;
|
|
311
|
+
/// clears all iteration numbers (to switch off panic)
|
|
312
|
+
void clearIterationNumbers();
|
|
313
|
+
/// Odd state
|
|
314
|
+
inline void newOddState() {
|
|
315
|
+
oddState_ = - oddState_ - 1;
|
|
316
|
+
}
|
|
317
|
+
inline void endOddState() {
|
|
318
|
+
oddState_ = abs(oddState_);
|
|
319
|
+
}
|
|
320
|
+
inline void clearOddState() {
|
|
321
|
+
oddState_ = 0;
|
|
322
|
+
}
|
|
323
|
+
inline int oddState() const {
|
|
324
|
+
return oddState_;
|
|
325
|
+
}
|
|
326
|
+
/// number of bad times
|
|
327
|
+
inline int badTimes() const {
|
|
328
|
+
return numberBadTimes_;
|
|
329
|
+
}
|
|
330
|
+
inline void clearBadTimes() {
|
|
331
|
+
numberBadTimes_ = 0;
|
|
332
|
+
}
|
|
333
|
+
/// number of really bad times
|
|
334
|
+
inline int reallyBadTimes() const {
|
|
335
|
+
return numberReallyBadTimes_;
|
|
336
|
+
}
|
|
337
|
+
inline void incrementReallyBadTimes() {
|
|
338
|
+
numberReallyBadTimes_++;
|
|
339
|
+
}
|
|
340
|
+
/// number of times flagged
|
|
341
|
+
inline int timesFlagged() const {
|
|
342
|
+
return numberTimesFlagged_;
|
|
343
|
+
}
|
|
344
|
+
inline void clearTimesFlagged() {
|
|
345
|
+
numberTimesFlagged_ = 0;
|
|
346
|
+
}
|
|
347
|
+
inline void incrementTimesFlagged() {
|
|
348
|
+
numberTimesFlagged_++;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
//@}
|
|
352
|
+
/**@name Data */
|
|
353
|
+
#define CLP_PROGRESS 5
|
|
354
|
+
//#define CLP_PROGRESS_WEIGHT 10
|
|
355
|
+
//@{
|
|
356
|
+
/// Objective values
|
|
357
|
+
double objective_[CLP_PROGRESS];
|
|
358
|
+
/// Sum of infeasibilities for algorithm
|
|
359
|
+
double infeasibility_[CLP_PROGRESS];
|
|
360
|
+
/// Sum of real primal infeasibilities for primal
|
|
361
|
+
double realInfeasibility_[CLP_PROGRESS];
|
|
362
|
+
#ifdef CLP_PROGRESS_WEIGHT
|
|
363
|
+
/// Objective values for weights
|
|
364
|
+
double objectiveWeight_[CLP_PROGRESS_WEIGHT];
|
|
365
|
+
/// Sum of infeasibilities for algorithm for weights
|
|
366
|
+
double infeasibilityWeight_[CLP_PROGRESS_WEIGHT];
|
|
367
|
+
/// Sum of real primal infeasibilities for primal for weights
|
|
368
|
+
double realInfeasibilityWeight_[CLP_PROGRESS_WEIGHT];
|
|
369
|
+
/// Drop for weights
|
|
370
|
+
double drop_;
|
|
371
|
+
/// Best? for weights
|
|
372
|
+
double best_;
|
|
373
|
+
#endif
|
|
374
|
+
/// Initial weight for weights
|
|
375
|
+
double initialWeight_;
|
|
376
|
+
#define CLP_CYCLE 12
|
|
377
|
+
/// For cycle checking
|
|
378
|
+
//double obj_[CLP_CYCLE];
|
|
379
|
+
int in_[CLP_CYCLE];
|
|
380
|
+
int out_[CLP_CYCLE];
|
|
381
|
+
char way_[CLP_CYCLE];
|
|
382
|
+
/// Pointer back to model so we can get information
|
|
383
|
+
ClpSimplex * model_;
|
|
384
|
+
/// Number of infeasibilities
|
|
385
|
+
int numberInfeasibilities_[CLP_PROGRESS];
|
|
386
|
+
/// Iteration number at which occurred
|
|
387
|
+
int iterationNumber_[CLP_PROGRESS];
|
|
388
|
+
#ifdef CLP_PROGRESS_WEIGHT
|
|
389
|
+
/// Number of infeasibilities for weights
|
|
390
|
+
int numberInfeasibilitiesWeight_[CLP_PROGRESS_WEIGHT];
|
|
391
|
+
/// Iteration number at which occurred for weights
|
|
392
|
+
int iterationNumberWeight_[CLP_PROGRESS_WEIGHT];
|
|
393
|
+
#endif
|
|
394
|
+
/// Number of times checked (so won't stop too early)
|
|
395
|
+
int numberTimes_;
|
|
396
|
+
/// Number of times it looked like loop
|
|
397
|
+
int numberBadTimes_;
|
|
398
|
+
/// Number really bad times
|
|
399
|
+
int numberReallyBadTimes_;
|
|
400
|
+
/// Number of times no iterations as flagged
|
|
401
|
+
int numberTimesFlagged_;
|
|
402
|
+
/// If things are in an odd state
|
|
403
|
+
int oddState_;
|
|
404
|
+
//@}
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
#include "ClpConfig.h"
|
|
408
|
+
#if CLP_HAS_ABC
|
|
409
|
+
#include "AbcCommon.hpp"
|
|
410
|
+
/// For saving extra information to see if looping.
|
|
411
|
+
class AbcSimplexProgress : public ClpSimplexProgress {
|
|
412
|
+
|
|
413
|
+
public:
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
/**@name Constructors and destructor and copy */
|
|
417
|
+
//@{
|
|
418
|
+
/// Default constructor
|
|
419
|
+
AbcSimplexProgress ( );
|
|
420
|
+
|
|
421
|
+
/// Constructor from model
|
|
422
|
+
AbcSimplexProgress ( ClpSimplex * model );
|
|
423
|
+
|
|
424
|
+
/// Copy constructor.
|
|
425
|
+
AbcSimplexProgress(const AbcSimplexProgress &);
|
|
426
|
+
|
|
427
|
+
/// Assignment operator. This copies the data
|
|
428
|
+
AbcSimplexProgress & operator=(const AbcSimplexProgress & rhs);
|
|
429
|
+
/// Destructor
|
|
430
|
+
~AbcSimplexProgress ( );
|
|
431
|
+
|
|
432
|
+
//@}
|
|
433
|
+
|
|
434
|
+
/**@name Check progress */
|
|
435
|
+
//@{
|
|
436
|
+
/** Returns -1 if okay, -n+1 (n number of times bad) if bad but action taken,
|
|
437
|
+
>=0 if give up and use as problem status
|
|
438
|
+
*/
|
|
439
|
+
int looping ( );
|
|
440
|
+
|
|
441
|
+
//@}
|
|
442
|
+
/**@name Data */
|
|
443
|
+
//@}
|
|
444
|
+
};
|
|
445
|
+
#endif
|
|
446
|
+
#endif
|