From 00e2f61cbf41725a500794d8eb1b50905841ad2a Mon Sep 17 00:00:00 2001 From: souvikdas95 Date: Fri, 15 Sep 2017 00:49:46 +0530 Subject: [PATCH 1/3] Cleanup 1. Remove compiled toolbox files 2. Remove redundant library include 'coin1' --- sci_gateway/cpp/FOSSEE_Optimization_Toolbox.c | 154 - .../cpp/FOSSEE_Optimization_Toolbox.def | 53 - .../cpp/FOSSEE_Optimization_Toolbox.dll | Bin 2103296 -> 0 bytes .../cpp/FOSSEE_Optimization_Toolbox.exp | Bin 7780 -> 0 bytes .../cpp/FOSSEE_Optimization_Toolbox.lib | Bin 14304 -> 0 bytes sci_gateway/cpp/Makelib.mak | 70 - .../Release/FOSSEE_Optimization_Toolbox.obj | Bin 26940 -> 0 bytes sci_gateway/cpp/Release/globals.obj | Bin 11783 -> 0 bytes sci_gateway/cpp/Release/read_mps.obj | Bin 393249 -> 0 bytes sci_gateway/cpp/Release/sci_LinProg.obj | Bin 399390 -> 0 bytes sci_gateway/cpp/Release/sci_QuadNLP.obj | Bin 692583 -> 0 bytes sci_gateway/cpp/Release/sci_iofunc.obj | Bin 31140 -> 0 bytes sci_gateway/cpp/Release/sci_ipopt.obj | Bin 598069 -> 0 bytes sci_gateway/cpp/Release/sci_ipoptfminbnd.obj | Bin 596247 -> 0 bytes sci_gateway/cpp/Release/sci_ipoptfmincon.obj | Bin 599135 -> 0 bytes sci_gateway/cpp/Release/sci_ipoptfminunc.obj | Bin 596475 -> 0 bytes sci_gateway/cpp/Release/sci_minbndNLP.obj | Bin 274084 -> 0 bytes sci_gateway/cpp/Release/sci_minconNLP.obj | Bin 281852 -> 0 bytes sci_gateway/cpp/Release/sci_minuncNLP.obj | Bin 275205 -> 0 bytes .../sci_solver_status_query_functions.obj | Bin 20073 -> 0 bytes sci_gateway/cpp/Release/sci_sym_addrowcol.obj | Bin 22899 -> 0 bytes .../cpp/Release/sci_sym_get_dbl_arr.obj | Bin 19494 -> 0 bytes .../Release/sci_sym_get_iteration_count.obj | Bin 14375 -> 0 bytes .../cpp/Release/sci_sym_get_matrix.obj | Bin 18868 -> 0 bytes .../cpp/Release/sci_sym_get_num_int.obj | Bin 16064 -> 0 bytes .../cpp/Release/sci_sym_getinfinity.obj | Bin 12922 -> 0 bytes .../cpp/Release/sci_sym_getobjsense.obj | Bin 14492 -> 0 bytes sci_gateway/cpp/Release/sci_sym_getrowact.obj | Bin 15303 -> 0 bytes .../cpp/Release/sci_sym_isenvactive.obj | Bin 13960 -> 0 bytes sci_gateway/cpp/Release/sci_sym_load_mps.obj | Bin 15847 -> 0 bytes .../cpp/Release/sci_sym_loadproblem.obj | Bin 27758 -> 0 bytes sci_gateway/cpp/Release/sci_sym_openclose.obj | Bin 16349 -> 0 bytes .../cpp/Release/sci_sym_primalbound.obj | Bin 15153 -> 0 bytes sci_gateway/cpp/Release/sci_sym_remove.obj | Bin 22214 -> 0 bytes sci_gateway/cpp/Release/sci_sym_rowmod.obj | Bin 19805 -> 0 bytes .../cpp/Release/sci_sym_set_indices.obj | Bin 15804 -> 0 bytes .../cpp/Release/sci_sym_set_variables.obj | Bin 29801 -> 0 bytes .../cpp/Release/sci_sym_setcolsoln.obj | Bin 14593 -> 0 bytes sci_gateway/cpp/Release/sci_sym_setobj.obj | Bin 18206 -> 0 bytes sci_gateway/cpp/Release/sci_sym_solution.obj | Bin 16509 -> 0 bytes sci_gateway/cpp/Release/sci_sym_solve.obj | Bin 14722 -> 0 bytes sci_gateway/cpp/Release/sci_sym_varbounds.obj | Bin 15371 -> 0 bytes sci_gateway/cpp/Release/sci_vartype.obj | Bin 19837 -> 0 bytes .../cpp/libFOSSEE_Optimization_Toolbox.c | 168 - .../cpp/libFOSSEE_Optimization_Toolbox.so | Bin 291600 -> 0 bytes .../linux/include/coin/SuiteSparse_config.h | 179 - thirdparty/linux/include/coin/amd.h | 411 -- thirdparty/linux/include/coin/amd_internal.h | 347 -- thirdparty/linux/include/coin/ctrlc.h | 66 - thirdparty/linux/include/coin/data1.h | 37 - thirdparty/linux/include/coin/ecos.h | 323 -- thirdparty/linux/include/coin/ecos_bb.h | 204 - thirdparty/linux/include/coin/equil.h | 50 - thirdparty/linux/include/coin/expcone.h | 87 - thirdparty/linux/include/coin/glblopts.h | 105 - thirdparty/linux/include/coin/ldl.h | 98 - thirdparty/linux/include/coin/splamm.h | 123 - thirdparty/linux/include/coin/timer.h | 75 - thirdparty/linux/include/coin/wright_omega.h | 26 - .../linux/include/coin1/CbcOrClpParam.cpp | 4104 ----------------- .../linux/include/coin1/CbcOrClpParam.hpp | 531 --- thirdparty/linux/include/coin1/Cgl012cut.hpp | 464 -- .../linux/include/coin1/CglAllDifferent.hpp | 115 - thirdparty/linux/include/coin1/CglClique.hpp | 308 -- thirdparty/linux/include/coin1/CglConfig.h | 19 - .../linux/include/coin1/CglCutGenerator.hpp | 121 - .../linux/include/coin1/CglDuplicateRow.hpp | 189 - .../linux/include/coin1/CglFlowCover.hpp | 371 -- thirdparty/linux/include/coin1/CglGMI.hpp | 364 -- .../linux/include/coin1/CglGMIParam.hpp | 313 -- thirdparty/linux/include/coin1/CglGomory.hpp | 204 - .../linux/include/coin1/CglKnapsackCover.hpp | 310 -- thirdparty/linux/include/coin1/CglLandP.hpp | 306 -- .../linux/include/coin1/CglLandPValidator.hpp | 131 - .../linux/include/coin1/CglLiftAndProject.hpp | 104 - thirdparty/linux/include/coin1/CglMessage.hpp | 50 - .../include/coin1/CglMixedIntegerRounding.hpp | 429 -- .../coin1/CglMixedIntegerRounding2.hpp | 427 -- thirdparty/linux/include/coin1/CglOddHole.hpp | 160 - thirdparty/linux/include/coin1/CglParam.hpp | 93 - .../linux/include/coin1/CglPreProcess.hpp | 492 -- thirdparty/linux/include/coin1/CglProbing.hpp | 543 --- .../linux/include/coin1/CglRedSplit.hpp | 448 -- .../linux/include/coin1/CglRedSplit2.hpp | 494 -- .../linux/include/coin1/CglRedSplit2Param.hpp | 495 -- .../linux/include/coin1/CglRedSplitParam.hpp | 272 -- .../include/coin1/CglResidualCapacity.hpp | 240 - .../linux/include/coin1/CglSimpleRounding.hpp | 174 - thirdparty/linux/include/coin1/CglStored.hpp | 125 - .../linux/include/coin1/CglTreeInfo.hpp | 180 - thirdparty/linux/include/coin1/CglTwomir.hpp | 565 --- .../linux/include/coin1/CglZeroHalf.hpp | 133 - .../linux/include/coin1/ClpCholeskyBase.hpp | 294 -- .../linux/include/coin1/ClpCholeskyDense.hpp | 162 - thirdparty/linux/include/coin1/ClpConfig.h | 17 - .../linux/include/coin1/ClpConstraint.hpp | 125 - .../include/coin1/ClpConstraintLinear.hpp | 110 - .../include/coin1/ClpConstraintQuadratic.hpp | 119 - .../linux/include/coin1/ClpDualRowDantzig.hpp | 71 - .../linux/include/coin1/ClpDualRowPivot.hpp | 129 - .../include/coin1/ClpDualRowSteepest.hpp | 153 - .../linux/include/coin1/ClpDummyMatrix.hpp | 183 - .../include/coin1/ClpDynamicExampleMatrix.hpp | 186 - .../linux/include/coin1/ClpDynamicMatrix.hpp | 381 -- .../linux/include/coin1/ClpEventHandler.hpp | 186 - .../linux/include/coin1/ClpFactorization.hpp | 432 -- .../include/coin1/ClpGubDynamicMatrix.hpp | 247 - .../linux/include/coin1/ClpGubMatrix.hpp | 358 -- .../linux/include/coin1/ClpInterior.hpp | 570 --- .../include/coin1/ClpLinearObjective.hpp | 103 - .../linux/include/coin1/ClpMatrixBase.hpp | 524 --- thirdparty/linux/include/coin1/ClpMessage.hpp | 131 - thirdparty/linux/include/coin1/ClpModel.hpp | 1307 ------ .../linux/include/coin1/ClpNetworkMatrix.hpp | 229 - thirdparty/linux/include/coin1/ClpNode.hpp | 349 -- .../linux/include/coin1/ClpNonLinearCost.hpp | 401 -- .../linux/include/coin1/ClpObjective.hpp | 134 - .../linux/include/coin1/ClpPackedMatrix.hpp | 638 --- .../linux/include/coin1/ClpParameters.hpp | 126 - .../linux/include/coin1/ClpPdcoBase.hpp | 103 - .../include/coin1/ClpPlusMinusOneMatrix.hpp | 290 -- .../linux/include/coin1/ClpPresolve.hpp | 299 -- .../include/coin1/ClpPrimalColumnDantzig.hpp | 72 - .../include/coin1/ClpPrimalColumnPivot.hpp | 155 - .../include/coin1/ClpPrimalColumnSteepest.hpp | 247 - .../include/coin1/ClpQuadraticObjective.hpp | 155 - thirdparty/linux/include/coin1/ClpSimplex.hpp | 1797 -------- .../linux/include/coin1/ClpSimplexDual.hpp | 300 -- .../include/coin1/ClpSimplexNonlinear.hpp | 117 - .../linux/include/coin1/ClpSimplexOther.hpp | 277 -- .../linux/include/coin1/ClpSimplexPrimal.hpp | 244 - thirdparty/linux/include/coin1/ClpSolve.hpp | 446 -- .../linux/include/coin1/Clp_C_Interface.h | 525 --- thirdparty/linux/include/coin1/CoinAlloc.hpp | 176 - thirdparty/linux/include/coin1/CoinBuild.hpp | 149 - .../include/coin1/CoinDenseFactorization.hpp | 419 -- .../linux/include/coin1/CoinDenseVector.hpp | 383 -- .../linux/include/coin1/CoinDistance.hpp | 48 - thirdparty/linux/include/coin1/CoinError.hpp | 257 -- .../linux/include/coin1/CoinFactorization.hpp | 2044 -------- thirdparty/linux/include/coin1/CoinFileIO.hpp | 166 - thirdparty/linux/include/coin1/CoinFinite.hpp | 34 - .../linux/include/coin1/CoinFloatEqual.hpp | 177 - .../include/coin1/CoinHelperFunctions.hpp | 1111 ----- .../linux/include/coin1/CoinIndexedVector.hpp | 1164 ----- thirdparty/linux/include/coin1/CoinLpIO.hpp | 805 ---- .../linux/include/coin1/CoinMessage.hpp | 96 - .../include/coin1/CoinMessageHandler.hpp | 666 --- thirdparty/linux/include/coin1/CoinModel.hpp | 1054 ----- .../linux/include/coin1/CoinModelUseful.hpp | 441 -- thirdparty/linux/include/coin1/CoinMpsIO.hpp | 1056 ----- .../include/coin1/CoinOslFactorization.hpp | 280 -- .../linux/include/coin1/CoinPackedMatrix.hpp | 947 ---- .../linux/include/coin1/CoinPackedVector.hpp | 657 --- .../include/coin1/CoinPackedVectorBase.hpp | 269 -- thirdparty/linux/include/coin1/CoinParam.hpp | 644 --- thirdparty/linux/include/coin1/CoinPragma.hpp | 26 - .../include/coin1/CoinPresolveDoubleton.hpp | 73 - .../linux/include/coin1/CoinPresolveDual.hpp | 85 - .../include/coin1/CoinPresolveDupcol.hpp | 226 - .../linux/include/coin1/CoinPresolveEmpty.hpp | 116 - .../linux/include/coin1/CoinPresolveFixed.hpp | 181 - .../include/coin1/CoinPresolveForcing.hpp | 61 - .../include/coin1/CoinPresolveImpliedFree.hpp | 60 - .../include/coin1/CoinPresolveIsolated.hpp | 51 - .../include/coin1/CoinPresolveMatrix.hpp | 1842 -------- .../include/coin1/CoinPresolveMonitor.hpp | 105 - .../include/coin1/CoinPresolvePsdebug.hpp | 166 - .../include/coin1/CoinPresolveSingleton.hpp | 112 - .../linux/include/coin1/CoinPresolveSubst.hpp | 101 - .../include/coin1/CoinPresolveTighten.hpp | 55 - .../include/coin1/CoinPresolveTripleton.hpp | 66 - .../include/coin1/CoinPresolveUseless.hpp | 63 - .../linux/include/coin1/CoinPresolveZeros.hpp | 60 - .../linux/include/coin1/CoinRational.hpp | 44 - .../linux/include/coin1/CoinSearchTree.hpp | 465 -- .../include/coin1/CoinShallowPackedVector.hpp | 148 - thirdparty/linux/include/coin1/CoinSignal.hpp | 117 - .../include/coin1/CoinSimpFactorization.hpp | 431 -- .../linux/include/coin1/CoinSmartPtr.hpp | 528 --- .../linux/include/coin1/CoinSnapshot.hpp | 476 -- thirdparty/linux/include/coin1/CoinSort.hpp | 678 --- .../include/coin1/CoinStructuredModel.hpp | 247 - thirdparty/linux/include/coin1/CoinTime.hpp | 310 -- thirdparty/linux/include/coin1/CoinTypes.hpp | 64 - .../linux/include/coin1/CoinUtility.hpp | 19 - .../linux/include/coin1/CoinUtilsConfig.h | 34 - .../linux/include/coin1/CoinWarmStart.hpp | 58 - .../include/coin1/CoinWarmStartBasis.hpp | 456 -- .../linux/include/coin1/CoinWarmStartDual.hpp | 166 - .../include/coin1/CoinWarmStartPrimalDual.hpp | 211 - .../include/coin1/CoinWarmStartVector.hpp | 488 -- .../linux/include/coin1/Coin_C_defines.h | 115 - thirdparty/linux/include/coin1/HSLLoader.h | 378 -- thirdparty/linux/include/coin1/Idiot.hpp | 297 -- .../linux/include/coin1/IpAlgBuilder.hpp | 360 -- .../linux/include/coin1/IpAlgStrategy.hpp | 185 - thirdparty/linux/include/coin1/IpAlgTypes.hpp | 66 - .../linux/include/coin1/IpAugSystemSolver.hpp | 200 - thirdparty/linux/include/coin1/IpBlas.hpp | 78 - .../linux/include/coin1/IpCachedResults.hpp | 779 ---- .../linux/include/coin1/IpCompoundMatrix.hpp | 340 -- .../include/coin1/IpCompoundSymMatrix.hpp | 283 -- .../linux/include/coin1/IpCompoundVector.hpp | 339 -- .../linux/include/coin1/IpConvCheck.hpp | 87 - thirdparty/linux/include/coin1/IpDebug.hpp | 150 - .../linux/include/coin1/IpDenseVector.hpp | 550 --- .../linux/include/coin1/IpDiagMatrix.hpp | 141 - .../include/coin1/IpEqMultCalculator.hpp | 64 - .../linux/include/coin1/IpException.hpp | 147 - .../linux/include/coin1/IpExpansionMatrix.hpp | 212 - .../linux/include/coin1/IpGenTMatrix.hpp | 264 -- .../linux/include/coin1/IpHessianUpdater.hpp | 65 - .../linux/include/coin1/IpIdentityMatrix.hpp | 149 - thirdparty/linux/include/coin1/IpIpoptAlg.hpp | 224 - .../include/coin1/IpIpoptApplication.hpp | 296 -- .../coin1/IpIpoptCalculatedQuantities.hpp | 751 --- .../linux/include/coin1/IpIpoptData.hpp | 819 ---- thirdparty/linux/include/coin1/IpIpoptNLP.hpp | 261 -- .../include/coin1/IpIterateInitializer.hpp | 64 - .../linux/include/coin1/IpIteratesVector.hpp | 689 --- .../linux/include/coin1/IpIterationOutput.hpp | 71 - .../linux/include/coin1/IpJournalist.hpp | 497 -- thirdparty/linux/include/coin1/IpLapack.hpp | 55 - .../linux/include/coin1/IpLineSearch.hpp | 96 - thirdparty/linux/include/coin1/IpMatrix.hpp | 345 -- thirdparty/linux/include/coin1/IpMuUpdate.hpp | 69 - thirdparty/linux/include/coin1/IpNLP.hpp | 243 - .../linux/include/coin1/IpNLPScaling.hpp | 451 -- thirdparty/linux/include/coin1/IpObserver.hpp | 366 -- .../linux/include/coin1/IpOptionsList.hpp | 289 -- .../linux/include/coin1/IpOrigIpoptNLP.hpp | 488 -- .../linux/include/coin1/IpPDSystemSolver.hpp | 130 - .../linux/include/coin1/IpReferenced.hpp | 258 -- .../linux/include/coin1/IpRegOptions.hpp | 658 --- .../linux/include/coin1/IpReturnCodes.h | 18 - .../linux/include/coin1/IpReturnCodes.hpp | 21 - .../linux/include/coin1/IpReturnCodes.inc | 70 - .../linux/include/coin1/IpReturnCodes_inc.h | 46 - .../linux/include/coin1/IpScaledMatrix.hpp | 254 - .../include/coin1/IpSearchDirCalculator.hpp | 65 - thirdparty/linux/include/coin1/IpSmartPtr.hpp | 734 --- .../linux/include/coin1/IpSolveStatistics.hpp | 150 - .../linux/include/coin1/IpStdCInterface.h | 271 -- .../linux/include/coin1/IpSumSymMatrix.hpp | 152 - .../linux/include/coin1/IpSymLinearSolver.hpp | 130 - .../linux/include/coin1/IpSymMatrix.hpp | 162 - .../linux/include/coin1/IpSymScaledMatrix.hpp | 230 - .../linux/include/coin1/IpSymTMatrix.hpp | 253 - thirdparty/linux/include/coin1/IpTNLP.hpp | 301 -- .../linux/include/coin1/IpTNLPAdapter.hpp | 427 -- .../linux/include/coin1/IpTNLPReducer.hpp | 180 - .../linux/include/coin1/IpTaggedObject.hpp | 162 - .../linux/include/coin1/IpTimedTask.hpp | 146 - .../include/coin1/IpTimingStatistics.hpp | 213 - .../linux/include/coin1/IpTripletHelper.hpp | 135 - thirdparty/linux/include/coin1/IpTypes.hpp | 28 - thirdparty/linux/include/coin1/IpUtils.hpp | 128 - thirdparty/linux/include/coin1/IpVector.hpp | 774 ---- .../linux/include/coin1/IpZeroSymMatrix.hpp | 135 - thirdparty/linux/include/coin1/IpoptConfig.h | 22 - thirdparty/linux/include/coin1/OsiAuxInfo.hpp | 206 - .../include/coin1/OsiBranchingObject.hpp | 1005 ---- .../linux/include/coin1/OsiChooseVariable.hpp | 534 --- .../include/coin1/OsiClpSolverInterface.hpp | 1509 ------ thirdparty/linux/include/coin1/OsiColCut.hpp | 324 -- .../linux/include/coin1/OsiCollections.hpp | 35 - thirdparty/linux/include/coin1/OsiConfig.h | 19 - thirdparty/linux/include/coin1/OsiCut.hpp | 245 - thirdparty/linux/include/coin1/OsiCuts.hpp | 474 -- .../linux/include/coin1/OsiPresolve.hpp | 252 - thirdparty/linux/include/coin1/OsiRowCut.hpp | 331 -- .../linux/include/coin1/OsiRowCutDebugger.hpp | 187 - .../linux/include/coin1/OsiSolverBranch.hpp | 152 - .../include/coin1/OsiSolverInterface.hpp | 2143 --------- .../include/coin1/OsiSolverParameters.hpp | 142 - .../include/coin1/OsiSymSolverInterface.hpp | 806 ---- .../include/coin1/OsiSymSolverParameters.hpp | 64 - .../linux/include/coin1/OsiUnitTests.hpp | 374 -- .../linux/include/coin1/PardisoLoader.h | 41 - thirdparty/linux/include/coin1/SymConfig.h | 19 - .../linux/include/coin1/SymWarmStart.hpp | 72 - .../linux/include/coin1/ThirdParty/defs.h | 161 - .../linux/include/coin1/ThirdParty/dmumps_c.h | 159 - .../linux/include/coin1/ThirdParty/macros.h | 143 - .../linux/include/coin1/ThirdParty/mpi.h | 77 - .../include/coin1/ThirdParty/mumps_c_types.h | 92 - .../include/coin1/ThirdParty/mumps_compat.h | 78 - .../linux/include/coin1/ThirdParty/proto.h | 505 -- .../linux/include/coin1/ThirdParty/rename.h | 418 -- .../linux/include/coin1/ThirdParty/struct.h | 251 - thirdparty/linux/include/coin1/symphony.h | 327 -- 292 files changed, 78695 deletions(-) delete mode 100644 sci_gateway/cpp/FOSSEE_Optimization_Toolbox.c delete mode 100644 sci_gateway/cpp/FOSSEE_Optimization_Toolbox.def delete mode 100644 sci_gateway/cpp/FOSSEE_Optimization_Toolbox.dll delete mode 100644 sci_gateway/cpp/FOSSEE_Optimization_Toolbox.exp delete mode 100644 sci_gateway/cpp/FOSSEE_Optimization_Toolbox.lib delete mode 100644 sci_gateway/cpp/Makelib.mak delete mode 100644 sci_gateway/cpp/Release/FOSSEE_Optimization_Toolbox.obj delete mode 100644 sci_gateway/cpp/Release/globals.obj delete mode 100644 sci_gateway/cpp/Release/read_mps.obj delete mode 100644 sci_gateway/cpp/Release/sci_LinProg.obj delete mode 100644 sci_gateway/cpp/Release/sci_QuadNLP.obj delete mode 100644 sci_gateway/cpp/Release/sci_iofunc.obj delete mode 100644 sci_gateway/cpp/Release/sci_ipopt.obj delete mode 100644 sci_gateway/cpp/Release/sci_ipoptfminbnd.obj delete mode 100644 sci_gateway/cpp/Release/sci_ipoptfmincon.obj delete mode 100644 sci_gateway/cpp/Release/sci_ipoptfminunc.obj delete mode 100644 sci_gateway/cpp/Release/sci_minbndNLP.obj delete mode 100644 sci_gateway/cpp/Release/sci_minconNLP.obj delete mode 100644 sci_gateway/cpp/Release/sci_minuncNLP.obj delete mode 100644 sci_gateway/cpp/Release/sci_solver_status_query_functions.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_addrowcol.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_get_dbl_arr.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_get_iteration_count.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_get_matrix.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_get_num_int.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_getinfinity.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_getobjsense.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_getrowact.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_isenvactive.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_load_mps.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_loadproblem.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_openclose.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_primalbound.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_remove.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_rowmod.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_set_indices.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_set_variables.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_setcolsoln.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_setobj.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_solution.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_solve.obj delete mode 100644 sci_gateway/cpp/Release/sci_sym_varbounds.obj delete mode 100644 sci_gateway/cpp/Release/sci_vartype.obj delete mode 100644 sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.c delete mode 100644 sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.so delete mode 100644 thirdparty/linux/include/coin/SuiteSparse_config.h delete mode 100644 thirdparty/linux/include/coin/amd.h delete mode 100644 thirdparty/linux/include/coin/amd_internal.h delete mode 100644 thirdparty/linux/include/coin/ctrlc.h delete mode 100644 thirdparty/linux/include/coin/data1.h delete mode 100644 thirdparty/linux/include/coin/ecos.h delete mode 100644 thirdparty/linux/include/coin/ecos_bb.h delete mode 100644 thirdparty/linux/include/coin/equil.h delete mode 100644 thirdparty/linux/include/coin/expcone.h delete mode 100644 thirdparty/linux/include/coin/glblopts.h delete mode 100644 thirdparty/linux/include/coin/ldl.h delete mode 100644 thirdparty/linux/include/coin/splamm.h delete mode 100644 thirdparty/linux/include/coin/timer.h delete mode 100644 thirdparty/linux/include/coin/wright_omega.h delete mode 100644 thirdparty/linux/include/coin1/CbcOrClpParam.cpp delete mode 100644 thirdparty/linux/include/coin1/CbcOrClpParam.hpp delete mode 100644 thirdparty/linux/include/coin1/Cgl012cut.hpp delete mode 100644 thirdparty/linux/include/coin1/CglAllDifferent.hpp delete mode 100644 thirdparty/linux/include/coin1/CglClique.hpp delete mode 100644 thirdparty/linux/include/coin1/CglConfig.h delete mode 100644 thirdparty/linux/include/coin1/CglCutGenerator.hpp delete mode 100644 thirdparty/linux/include/coin1/CglDuplicateRow.hpp delete mode 100644 thirdparty/linux/include/coin1/CglFlowCover.hpp delete mode 100644 thirdparty/linux/include/coin1/CglGMI.hpp delete mode 100644 thirdparty/linux/include/coin1/CglGMIParam.hpp delete mode 100644 thirdparty/linux/include/coin1/CglGomory.hpp delete mode 100644 thirdparty/linux/include/coin1/CglKnapsackCover.hpp delete mode 100644 thirdparty/linux/include/coin1/CglLandP.hpp delete mode 100644 thirdparty/linux/include/coin1/CglLandPValidator.hpp delete mode 100644 thirdparty/linux/include/coin1/CglLiftAndProject.hpp delete mode 100644 thirdparty/linux/include/coin1/CglMessage.hpp delete mode 100644 thirdparty/linux/include/coin1/CglMixedIntegerRounding.hpp delete mode 100644 thirdparty/linux/include/coin1/CglMixedIntegerRounding2.hpp delete mode 100644 thirdparty/linux/include/coin1/CglOddHole.hpp delete mode 100644 thirdparty/linux/include/coin1/CglParam.hpp delete mode 100644 thirdparty/linux/include/coin1/CglPreProcess.hpp delete mode 100644 thirdparty/linux/include/coin1/CglProbing.hpp delete mode 100644 thirdparty/linux/include/coin1/CglRedSplit.hpp delete mode 100644 thirdparty/linux/include/coin1/CglRedSplit2.hpp delete mode 100644 thirdparty/linux/include/coin1/CglRedSplit2Param.hpp delete mode 100644 thirdparty/linux/include/coin1/CglRedSplitParam.hpp delete mode 100644 thirdparty/linux/include/coin1/CglResidualCapacity.hpp delete mode 100644 thirdparty/linux/include/coin1/CglSimpleRounding.hpp delete mode 100644 thirdparty/linux/include/coin1/CglStored.hpp delete mode 100644 thirdparty/linux/include/coin1/CglTreeInfo.hpp delete mode 100644 thirdparty/linux/include/coin1/CglTwomir.hpp delete mode 100644 thirdparty/linux/include/coin1/CglZeroHalf.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpCholeskyBase.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpCholeskyDense.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpConfig.h delete mode 100644 thirdparty/linux/include/coin1/ClpConstraint.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpConstraintLinear.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpConstraintQuadratic.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDualRowDantzig.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDualRowPivot.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDualRowSteepest.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDummyMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDynamicExampleMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpDynamicMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpEventHandler.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpFactorization.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpGubDynamicMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpGubMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpInterior.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpLinearObjective.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpMatrixBase.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpMessage.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpModel.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpNetworkMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpNode.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpNonLinearCost.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpObjective.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPackedMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpParameters.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPdcoBase.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPlusMinusOneMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPresolve.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPrimalColumnDantzig.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPrimalColumnPivot.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpPrimalColumnSteepest.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpQuadraticObjective.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSimplex.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSimplexDual.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSimplexNonlinear.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSimplexOther.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSimplexPrimal.hpp delete mode 100644 thirdparty/linux/include/coin1/ClpSolve.hpp delete mode 100644 thirdparty/linux/include/coin1/Clp_C_Interface.h delete mode 100644 thirdparty/linux/include/coin1/CoinAlloc.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinBuild.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinDenseFactorization.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinDenseVector.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinDistance.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinError.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinFactorization.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinFileIO.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinFinite.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinFloatEqual.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinHelperFunctions.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinIndexedVector.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinLpIO.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinMessage.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinMessageHandler.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinModel.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinModelUseful.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinMpsIO.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinOslFactorization.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPackedMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPackedVector.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPackedVectorBase.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinParam.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPragma.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveDoubleton.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveDual.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveDupcol.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveEmpty.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveFixed.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveForcing.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveImpliedFree.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveIsolated.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveMonitor.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolvePsdebug.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveSingleton.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveSubst.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveTighten.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveTripleton.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveUseless.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinPresolveZeros.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinRational.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSearchTree.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinShallowPackedVector.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSignal.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSimpFactorization.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSmartPtr.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSnapshot.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinSort.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinStructuredModel.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinTime.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinTypes.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinUtility.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinUtilsConfig.h delete mode 100644 thirdparty/linux/include/coin1/CoinWarmStart.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinWarmStartBasis.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinWarmStartDual.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinWarmStartPrimalDual.hpp delete mode 100644 thirdparty/linux/include/coin1/CoinWarmStartVector.hpp delete mode 100644 thirdparty/linux/include/coin1/Coin_C_defines.h delete mode 100644 thirdparty/linux/include/coin1/HSLLoader.h delete mode 100644 thirdparty/linux/include/coin1/Idiot.hpp delete mode 100644 thirdparty/linux/include/coin1/IpAlgBuilder.hpp delete mode 100644 thirdparty/linux/include/coin1/IpAlgStrategy.hpp delete mode 100644 thirdparty/linux/include/coin1/IpAlgTypes.hpp delete mode 100644 thirdparty/linux/include/coin1/IpAugSystemSolver.hpp delete mode 100644 thirdparty/linux/include/coin1/IpBlas.hpp delete mode 100644 thirdparty/linux/include/coin1/IpCachedResults.hpp delete mode 100644 thirdparty/linux/include/coin1/IpCompoundMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpCompoundSymMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpCompoundVector.hpp delete mode 100644 thirdparty/linux/include/coin1/IpConvCheck.hpp delete mode 100644 thirdparty/linux/include/coin1/IpDebug.hpp delete mode 100644 thirdparty/linux/include/coin1/IpDenseVector.hpp delete mode 100644 thirdparty/linux/include/coin1/IpDiagMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpEqMultCalculator.hpp delete mode 100644 thirdparty/linux/include/coin1/IpException.hpp delete mode 100644 thirdparty/linux/include/coin1/IpExpansionMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpGenTMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpHessianUpdater.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIdentityMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIpoptAlg.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIpoptApplication.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIpoptCalculatedQuantities.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIpoptData.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIpoptNLP.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIterateInitializer.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIteratesVector.hpp delete mode 100644 thirdparty/linux/include/coin1/IpIterationOutput.hpp delete mode 100644 thirdparty/linux/include/coin1/IpJournalist.hpp delete mode 100644 thirdparty/linux/include/coin1/IpLapack.hpp delete mode 100644 thirdparty/linux/include/coin1/IpLineSearch.hpp delete mode 100644 thirdparty/linux/include/coin1/IpMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpMuUpdate.hpp delete mode 100644 thirdparty/linux/include/coin1/IpNLP.hpp delete mode 100644 thirdparty/linux/include/coin1/IpNLPScaling.hpp delete mode 100644 thirdparty/linux/include/coin1/IpObserver.hpp delete mode 100644 thirdparty/linux/include/coin1/IpOptionsList.hpp delete mode 100644 thirdparty/linux/include/coin1/IpOrigIpoptNLP.hpp delete mode 100644 thirdparty/linux/include/coin1/IpPDSystemSolver.hpp delete mode 100644 thirdparty/linux/include/coin1/IpReferenced.hpp delete mode 100644 thirdparty/linux/include/coin1/IpRegOptions.hpp delete mode 100644 thirdparty/linux/include/coin1/IpReturnCodes.h delete mode 100644 thirdparty/linux/include/coin1/IpReturnCodes.hpp delete mode 100644 thirdparty/linux/include/coin1/IpReturnCodes.inc delete mode 100644 thirdparty/linux/include/coin1/IpReturnCodes_inc.h delete mode 100644 thirdparty/linux/include/coin1/IpScaledMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSearchDirCalculator.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSmartPtr.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSolveStatistics.hpp delete mode 100644 thirdparty/linux/include/coin1/IpStdCInterface.h delete mode 100644 thirdparty/linux/include/coin1/IpSumSymMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSymLinearSolver.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSymMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSymScaledMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpSymTMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTNLP.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTNLPAdapter.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTNLPReducer.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTaggedObject.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTimedTask.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTimingStatistics.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTripletHelper.hpp delete mode 100644 thirdparty/linux/include/coin1/IpTypes.hpp delete mode 100644 thirdparty/linux/include/coin1/IpUtils.hpp delete mode 100644 thirdparty/linux/include/coin1/IpVector.hpp delete mode 100644 thirdparty/linux/include/coin1/IpZeroSymMatrix.hpp delete mode 100644 thirdparty/linux/include/coin1/IpoptConfig.h delete mode 100644 thirdparty/linux/include/coin1/OsiAuxInfo.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiBranchingObject.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiChooseVariable.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiClpSolverInterface.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiColCut.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiCollections.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiConfig.h delete mode 100644 thirdparty/linux/include/coin1/OsiCut.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiCuts.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiPresolve.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiRowCut.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiRowCutDebugger.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiSolverBranch.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiSolverInterface.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiSolverParameters.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiSymSolverInterface.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiSymSolverParameters.hpp delete mode 100644 thirdparty/linux/include/coin1/OsiUnitTests.hpp delete mode 100644 thirdparty/linux/include/coin1/PardisoLoader.h delete mode 100644 thirdparty/linux/include/coin1/SymConfig.h delete mode 100644 thirdparty/linux/include/coin1/SymWarmStart.hpp delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/defs.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/dmumps_c.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/macros.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/mpi.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/mumps_c_types.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/mumps_compat.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/proto.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/rename.h delete mode 100644 thirdparty/linux/include/coin1/ThirdParty/struct.h delete mode 100644 thirdparty/linux/include/coin1/symphony.h diff --git a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.c b/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.c deleted file mode 100644 index 46e2b1d0..00000000 --- a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.c +++ /dev/null @@ -1,154 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -static int direct_gateway(char *fname,void F(void)) { F();return 0;}; -extern Gatefunc sci_sym_open; -extern Gatefunc sci_sym_close; -extern Gatefunc sci_sym_isEnvActive; -extern Gatefunc sci_sym_set_defaults; -extern Gatefunc sci_sym_set_int_param; -extern Gatefunc sci_sym_get_int_param; -extern Gatefunc sci_sym_set_dbl_param; -extern Gatefunc sci_sym_get_dbl_param; -extern Gatefunc sci_sym_set_str_param; -extern Gatefunc sci_sym_get_str_param; -extern Gatefunc sci_sym_getInfinity; -extern Gatefunc sci_sym_loadProblemBasic; -extern Gatefunc sci_sym_loadProblem; -extern Gatefunc sci_sym_load_mps; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_isContinuous; -extern Gatefunc sci_sym_isBinary; -extern Gatefunc sci_sym_isInteger; -extern Gatefunc sci_sym_set_continuous; -extern Gatefunc sci_sym_set_integer; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setVarBound; -extern Gatefunc sci_sym_setVarBound; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setObjCoeff; -extern Gatefunc sci_sym_getObjSense; -extern Gatefunc sci_sym_setObjSense; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setConstrBound; -extern Gatefunc sci_sym_setConstrBound; -extern Gatefunc sci_sym_setConstrType; -extern Gatefunc sci_sym_get_matrix; -extern Gatefunc sci_sym_addConstr; -extern Gatefunc sci_sym_addVar; -extern Gatefunc sci_sym_delete_cols; -extern Gatefunc sci_sym_delete_rows; -extern Gatefunc sci_sym_getPrimalBound; -extern Gatefunc sci_sym_setPrimalBound; -extern Gatefunc sci_sym_setColSoln; -extern Gatefunc sci_sym_solve; -extern Gatefunc sci_sym_get_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_getVarSoln; -extern Gatefunc sci_sym_getObjVal; -extern Gatefunc sci_sym_get_iteration_count; -extern Gatefunc sci_sym_getRowActivity; -extern Gatefunc sci_linearprog; -extern Gatefunc sci_rmps; -extern Gatefunc sci_solveqp; -extern Gatefunc sci_solveminuncp; -extern Gatefunc sci_solveminbndp; -extern Gatefunc sci_solveminconp; -static GenericTable Tab[]={ - {(Myinterfun)sci_gateway,sci_sym_open,"sym_open"}, - {(Myinterfun)sci_gateway,sci_sym_close,"sym_close"}, - {(Myinterfun)sci_gateway,sci_sym_isEnvActive,"sym_isEnvActive"}, - {(Myinterfun)sci_gateway,sci_sym_set_defaults,"sym_resetParams"}, - {(Myinterfun)sci_gateway,sci_sym_set_int_param,"sym_setIntParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_int_param,"sym_getIntParam"}, - {(Myinterfun)sci_gateway,sci_sym_set_dbl_param,"sym_setDblParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_param,"sym_getDblParam"}, - {(Myinterfun)sci_gateway,sci_sym_set_str_param,"sym_setStrParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_str_param,"sym_getStrParam"}, - {(Myinterfun)sci_gateway,sci_sym_getInfinity,"sym_getInfinity"}, - {(Myinterfun)sci_gateway,sci_sym_loadProblemBasic,"sym_loadProblemBasic"}, - {(Myinterfun)sci_gateway,sci_sym_loadProblem,"sym_loadProblem"}, - {(Myinterfun)sci_gateway,sci_sym_load_mps,"sym_loadMPS"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumConstr"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumVar"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumElements"}, - {(Myinterfun)sci_gateway,sci_sym_isContinuous,"sym_isContinuous"}, - {(Myinterfun)sci_gateway,sci_sym_isBinary,"sym_isBinary"}, - {(Myinterfun)sci_gateway,sci_sym_isInteger,"sym_isInteger"}, - {(Myinterfun)sci_gateway,sci_sym_set_continuous,"sym_setContinuous"}, - {(Myinterfun)sci_gateway,sci_sym_set_integer,"sym_setInteger"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getVarLower"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getVarUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setVarBound,"sym_setVarLower"}, - {(Myinterfun)sci_gateway,sci_sym_setVarBound,"sym_setVarUpper"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getObjCoeff"}, - {(Myinterfun)sci_gateway,sci_sym_setObjCoeff,"sym_setObjCoeff"}, - {(Myinterfun)sci_gateway,sci_sym_getObjSense,"sym_getObjSense"}, - {(Myinterfun)sci_gateway,sci_sym_setObjSense,"sym_setObjSense"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getRhs"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrRange"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrLower"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrBound,"sym_setConstrLower"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrBound,"sym_setConstrUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrType,"sym_setConstrType"}, - {(Myinterfun)sci_gateway,sci_sym_get_matrix,"sym_getMatrix"}, - {(Myinterfun)sci_gateway,sci_sym_addConstr,"sym_addConstr"}, - {(Myinterfun)sci_gateway,sci_sym_addVar,"sym_addVar"}, - {(Myinterfun)sci_gateway,sci_sym_delete_cols,"sym_deleteVars"}, - {(Myinterfun)sci_gateway,sci_sym_delete_rows,"sym_deleteConstrs"}, - {(Myinterfun)sci_gateway,sci_sym_getPrimalBound,"sym_getPrimalBound"}, - {(Myinterfun)sci_gateway,sci_sym_setPrimalBound,"sym_setPrimalBound"}, - {(Myinterfun)sci_gateway,sci_sym_setColSoln,"sym_setVarSoln"}, - {(Myinterfun)sci_gateway,sci_sym_solve,"sym_solve"}, - {(Myinterfun)sci_gateway,sci_sym_get_status,"sym_getStatus"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isOptimal"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isInfeasible"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isAbandoned"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isIterLimitReached"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isTimeLimitReached"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isTargetGapAchieved"}, - {(Myinterfun)sci_gateway,sci_sym_getVarSoln,"sym_getVarSoln"}, - {(Myinterfun)sci_gateway,sci_sym_getObjVal,"sym_getObjVal"}, - {(Myinterfun)sci_gateway,sci_sym_get_iteration_count,"sym_getIterCount"}, - {(Myinterfun)sci_gateway,sci_sym_getRowActivity,"sym_getConstrActivity"}, - {(Myinterfun)sci_gateway,sci_linearprog,"linearprog"}, - {(Myinterfun)sci_gateway,sci_rmps,"rmps"}, - {(Myinterfun)sci_gateway,sci_solveqp,"solveqp"}, - {(Myinterfun)sci_gateway,sci_solveminuncp,"solveminuncp"}, - {(Myinterfun)sci_gateway,sci_solveminbndp,"solveminbndp"}, - {(Myinterfun)sci_gateway,sci_solveminconp,"solveminconp"}, -}; - -int C2F(FOSSEE_Optimization_Toolbox)() -{ - Rhs = Max(0, Rhs); - if (*(Tab[Fin-1].f) != NULL) - { - if(pvApiCtx == NULL) - { - pvApiCtx = (StrCtx*)MALLOC(sizeof(StrCtx)); - } - pvApiCtx->pstName = (char*)Tab[Fin-1].name; - (*(Tab[Fin-1].f))(Tab[Fin-1].name,Tab[Fin-1].F); - } - return 0; -} -#ifdef __cplusplus -} -#endif diff --git a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.def b/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.def deleted file mode 100644 index a7ea8ca3..00000000 --- a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.def +++ /dev/null @@ -1,53 +0,0 @@ -LIBRARY FOSSEE_Optimization_Toolbox.dll -EXPORTS - FOSSEE_Optimization_Toolbox_ - process_ret_val - sci_rmps - sci_linearprog - sci_solveqp - sci_solveminbndp - sci_solveminconp - sci_solveminuncp - sci_sym_get_status - sci_sym_get_solver_status - sci_sym_addConstr - sci_sym_addVar - sci_sym_get_dbl_arr - sci_sym_get_iteration_count - column_major_to_row_major - sci_sym_get_matrix - sci_sym_get_num_int - sci_sym_getInfinity - sci_sym_getObjSense - sci_sym_getRowActivity - sci_sym_isEnvActive - sci_sym_load_mps - sci_sym_loadProblemBasic - sci_sym_loadProblem - sci_sym_open - sci_sym_close - sci_sym_getPrimalBound - sci_sym_setPrimalBound - sci_sym_delete_cols - sci_sym_delete_rows - sci_sym_setConstrBound - sci_sym_setConstrType - sci_sym_set_continuous - sci_sym_set_integer - sci_sym_set_defaults - sci_sym_set_int_param - sci_sym_get_int_param - sci_sym_set_dbl_param - sci_sym_get_dbl_param - sci_sym_set_str_param - sci_sym_get_str_param - sci_sym_setColSoln - sci_sym_setObjCoeff - sci_sym_setObjSense - sci_sym_getVarSoln - sci_sym_getObjVal - sci_sym_solve - sci_sym_setVarBound - sci_sym_isContinuous - sci_sym_isBinary - sci_sym_isInteger diff --git a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.dll b/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.dll deleted file mode 100644 index 9cc560cc31ce1f81ae2b90131faaca59dedf24e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103296 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

28w!_ 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

wK4NaE^L~%nH(}mL%Y@wQ*i(*t zQs?cY5@I10P?qGXOkR~xE7}xGQVmZ7(IZOeRXxeYZKAK`N@zQMnjYTb2PJfX3*p1W zSK-5y_X6kPiYd36c{;dft}@qvnzC~bvX%Q&l^37GgLe8*G@5mPilccFctyc=GX|7U zFBRI^g}=k}T;jV~YeyB?oM4EPywLn8p=0>KYt(auZ;G?0 zmMe$6ShKcHrFA5>QemuZL|u7wIy@ZneDMmOkB(D^!NWsPEmZ1uPpgs*3l3459Zvm7 zEX{`JIuo(WVb@9US)w!tj#N`Wk^>b>b3NfzCkNbs!=@>KuwWozLaWW*QI%96F( zueyz>3 zn|ZZ+#p~L3OcJgDjK|VliivNF6b8?k5w^7y^B+##EtclMmEl%eAjs^rK5`MdDwcXX ztTuDxOTlvq{ux|UsItgzQR?lqZnzkwI;>7uh3};AnH-_Hm;!}|g*azQ0;mZLQFitt zGwUIjqxlRqtI`@3yh1bD6vkmCM5t+KB#iZR|NgPzv69j+43G2aom@}5@NopSi(gN; zQkZX!ttMVa{pGlpaq}ggMmwxGm;`qncq|u{zK*u)>u4T~mBi9{nSs~^ zRyk(5T-_M?rYmXnEO7~y2$QmOdFJVIte_=#X#avuQhAXUvhpJ5y~xnIAJCdgM13n! zKnf|i^#p+^em#}GX~02J^{pCKK*j;0=P-T5eL*!uDb?2uQykE91K%v##Z-Sl*-7Ju z@vWmC9{Nn;d0L>=<_#URI?+k32F@j5{ZS>Bri!hvQb!S3kHH^C^p&3Xjy+a~8hor@ zp9)$Hm7&V?mUxQDL72sGnmhCJ1(Td82xF?1GRC3yodfK>4MXJ&z?5&$!sai}|~aK`Ri>2?H} zJw#@p7Z=VJU1SyUk=RPp4BH3_h7H>YmFTp}J*2DNuWQ>NB^Eq26z7WKrvkJ>B_vSH z;xU>e@mpH;5UqEkr{$U0d*iqzy6tiu^4_AnQ8|`K3UUsN&apsKsjsUJ%Ltw#LHqmb zgd=AEOk?JO_##AOz|2Xa6*fn%2}Ujcsj(tU<_T36>55DPhWTBwEUt=WL&QfC1jc(M z`!_l{Ow@ez$q)_L>QOk?ja9MfQ?m6pSWGX<5R0h+Zw!A35`z&Mt@;`aoRNk_(E#Hw zQLGw~>s|-TrTy$M;Rp4PT6huwRUa@{FVySMChNr1ho9<3iRy%^H{!ts>6U*w?V%yc z)d2y|h8#uD7a^I!HbAQ%XS$_!l?)ItKG1lqM_)V znWO$a>hHZ~8lz;^^q^23xKBAI|0!8Y(1IgWZDBb`LG;MTQR*zSF;=vjhK^q$mKgnE zatH^~(x{k5%l!lej1EcA>E!E%i3J5INP>SRSRRv9_u9w(xBOG@n)|VRzH>(iJecQtcaZ z6!?=_l2WtJ{LotYA@f5iMn9}Q8Vp)mGh5%?n|Vm0UihhBP=~iNU&+XxwFIR9O6t~5 zBK{WGc+Q#8x7}uu5Ho^_AnE zRP#r{Ul5bTPNpEdENSnu4g$TzQkY5(O6HDVmszi@9Lb zdF&#&VUg`Cwg61}G1orTwNLJM3E_(txtFHY!1=yBBY2~4OL~S+h#*OR=;I-R6apO7 zUxazpk=0S3h!1S%%+qzcGT2BKo`QStSV!3`L-tlRBHK9Gq)L$J zmrk_hb?4w?ON{j1!8eHCIE(ebw_`|P1$og3e-IFPLA>a5tKNP9)>98mckDW}NVV3fxr+~w>Be8d zJtoNjKIF^9Z-;H;2?RQR7MF!Ia5v4fun;P=0!&+l=&m-El1qqwtXnc}b#~_UV*DoV zl%tt^7LdyZy+e-B^OP{UQ;yJ&kUY9$j*SgS9o4z_(7F3W;W09?_9yXy=NoY4qGP?t z(;T}BA#zj8`m2`V(5f?pD)|v~!GQtEPxO06Z7gg9G32v3RzqQbd9ikGJeES)aSR+| ziRNjvAjof5-U)^R;zMkjLrY-wu~IFE<|(fiq=|&TY+g6{3{M?9o`9dB%+{6Kxj~r} zCtt;VHi#gDf!QX%k8T81sM%o*)ui7XfuRtQJI`!)8}`Bv!nj9ggGT6+aCatL!3Ay* zMYDC2c1stVukd9Oh@+zLFEfvP&LEy1E)0k_$!2Z{JQvxm?-iceYgV#fJ3Ni@Z|9O4 z027Hm;za*bh`xOx>3;`yb`t$xyoF@{aoU2lq%By%@^+V)L9pf%esSI%^U_rhXH%|9JPClS`RwzYxxQ{sM2^AE?mD=xUCSyubI|N@Voe0oPHc=M3 zvuB+Tr3-{$*TrKzPK*_xc!$YtArvPSUTwxWOfX&whdQjVtu~9n$kgg_{OyveRU|c2 zk|iaDl$T<%6KR6$ms+SVTs7Mw>F)i3%eg|~P=#K>xeBUfw=lF=n>@2Cx_+D@z%zpgv~4-gjWc&;(sH0 z#G84vl;a;Lc?Yzu$uyP&jgU<#Nyr<{c_=Q&V;zxoM|_rTL{^^6Lc|Sj(qkWydnIzQ zW6<})l?By_&=4qCdLYX%%cCQ2B29P9n(P0=y!tS%axze!_K*Cx-BhJa@7Jq#s~5S1cRp~d=L0qM5BQ1+h=u^psXBf|kKh_Q z^xyL!W%tYnTR?=>(h5?Cm7#dDkwP3J?zkwP96Xezx1F_Ej?(|&jmQM%Tk+(=>K|@$ z4ukB9ve~#GMt3bNd)o#r@&Sw!Wu`#c4bAHXGDjzqXMRsktY)h4lP<)xa(kdJ*8t)oN)o6rzl z2|3Ap#d1*w=eBcT2`CC@XY9^+Cu5(IH%BR)4Qxen;q0(=uE5WpFsDcnj&lLFavwMA8}vdyE_^ zf>$mjI!08IbQ=9FCY`fRwC=Nt$&mzckYeVD-4&f4mjjeTzc>ZqD+GU)Y-g6u_tZ${{udfac0ArJ`yb_E@!n_FHeYO`Br_`gCd6yZ9%711f2d z(otteDsHWO;ZHg0&!NQ~>HobtbPb5SgFQ=QBxQcgKiY0b{iBpP!ow1dr~r?8FZ>q5 z`N{u5KI?N6SpFY6y)Fg%HS3MpUxiDTRlW(?*Es4QL6M>d-&c21#arq80-r_jO_m9)?SK+SSt%TO% z!-6LllZYA2R72Dk=+VB2KMF@Z!qngpu}T*^$;zNUfYr$R5#ZHtHA9NQ=du2B*-w~m zej6fW5hCOw9glMFDsb6yYCDL3{=)tED*EvXEd~Tsc`6&tb%y5SFULn(nIcnXD2vD@#0 zv)etk;7+RHZ0aU4#(fUKmAu-i6U=tNTSa2ACA z>NhQQoI#`127Lv72W1=XPin80kP-!};B2&!_$_q{t&|e1l!QcHA`>R_&+-ZQ8F@(& zhgb?Rwk*PYAZ%I4hyth}$J803{xdZR(WucX04GQOyJ@kJqjNALHEE|-#`RwxyOJfUNH#eL}PrNYw!4`88o|o+bcE=x8X2nV-U^B1UI*?OupN6$kvVO%)d}) z{X;+q{R@#k{=#;kRloC3Q zC4rYMm~bUz$Aol-dXco2DutZ-1hKnNv0n+fkf8mk6SGL6!#9Cu$o)_bOl%~JcA#cG z1s*P-G8<{Hl?yJ* z3l2S8f+3=0Z;5(bGK~FGgtJQ&{t2F4TkD3*@NQ5FiE^P}a zdf!3-Xv0~WGDq{Zcs3?g-6jdYT^lFs-bwVoz3+Lf4SgB={{`3IN0CAvI#zo8=x>sv z*ZCDzq{ANqk9W-R|8vy%m4LNx8_ymgL>421|EtEN!Lh&U;wgjvpQe;?1LwynG_|ad zA!L!}KhVI0PN5Kv+}DoWuMsNlyICJDL3zeEvvZ4Kx?{Za@ z{$Ao@{dzj1@x~F{P8$a<`n1jfTs@&2PDA_y7+(jLE1o;FBfmvE0oV3#-hKDopL}@mjM&|#%~Cfd&~gx+PiE{sIH0Do zS#e?`%z#Q2l>n`;59YW^l~4-0ZkVc3wh@#}LP_QX+pQ2D5Q_%kLG-W^8X`C|Er=QY zVZG5lsDuWn5i4CGH(}4zms}^id&t}yXSDq3UvMf7nNWvR2&q`zfvG~JcksI~Ttc_t zrw!uQk29lHU1&{OUQ~EHLYJeENeQHC-~Bt_#1n~)u9E>q)pY6)B_#Ty-P=x6jQM;D zdw{<98)@+e+lGRJNsf(QLV7e^ZM@m)R2yma%P)Ol9&;1cUoenj@?}XR6I&TR)+W8D zZcl3MOtF;!BX-gNVSj6XB&XB5nL3NyntqbD$YsEkO<`npclp0#ESGp1XDk?+I@k?^ zFCqLR%Eyz5ncxLglq=`Zn2chgiPSU5w?P(ZCS`v~tjSYq5D2iC)KaIlkuT|7EVgpP zAp&QowaJFbkZ{yFCt7yHoYM$;iS@Z;*m}!YpT&sDI|R-ii<8HTl`6LKBH}qD-3u>8 zZeN=ENSi5nW)elYkn3_$vTP}b%?*u9aczitQXshCHszKAe;)50W0@?gh#jG?W6v@6 zlT?460bg}HuNsNHF4j=MW5`ZIX=5vi1+bJjPJ5cMqwuy2O8#^`(5e*Y>l4qhy1229 zNOO@ZoE+ZTj~=?)93cW!-A+bfM|~ZEa`c{%BZ+w!YPR^jK|lOjwXc#Sqf4uzPy$`r zwUWVK4{{$4(MKZJ%Z(v$bzD1oWxMv#0M}YdyF+{5kFc#vEHwkDVk^)sq4nY!V;`{@+O_$z=Z}&oyR+}lml9-C#ZFpQL`vzI zcKmSaemo<d?Ls`^(Z*7w)UFXW;wj`mKqypl6K$|hENX}bKYhb%1$k% zrgYZHC~Vh$Dhm%0m&G6GyBQtBd~+B8-Du6xLP{S%?ZdEFj?4#ORmozkYso?J%VZa{t6?ad27&-ymwT|fKu1!K>q$oe1u60$8Z zaS#4_s}6wcEY{lodX{)>(G{KY9FnCOQN$~!R-ac)szWUT&yFq?*hC%8tIoA}4cJ(; zji(uqtsn7^A`b(HhDclvQw+KP9^NU5bNx3kjiMYfWMeT~AC(AJqWvKZDlfNY+{fnK z+3E;gHWe`Pq=<#I1!IrCT1{nkLej2Mk}NY_EH&sNE)%6#4$=QgA~S_bB(2&?H-nh+ zU^mz4=aFg{gD^4jkkFrZ?Z{-QE2xH48-3Mv0r)&! zFA1a({e?d@XoY)v5p1e$fHcLPbsTmI+v)MR%@l^<`W~gF_r`6d`Ua|9|0>N6fc+CJ zR(%S#)7EMARgFf7+AHFbLDxeKv$E@P8?rAARgFdNrY6r@Po*dZqV~%(`04EX6b=y7 z?X)F}BM^~*7VGw2P38p&aR1o~_n(W*3lwptY z(EIRH^Z`=*&@NdH23CIZn5O`T_&zeJbEsr$VjytX+GAM$eoKBY+#N^CFOyv72+D|< z5K>H>*w+H+=;ZqiJfhgBJ>@v8(=hghw6)05G)=)B-%-Q39PAm5L8sGl5XCft$A4pt zfZQ#nz7wfBZ#VbEcg_$U>HVlq(uwyf*^j&AVZHeu+^Y)t_6!Jn#HkKj19s3lDD+y9;QyA_)yT;5>)K1!cqoA3*)U)=tbCn;kiIgfY! zLhJYN-{RJ=~v9Ao@GepWJmKLfgjlW~0U-!cZ;UJ+YY!yJgQZ(6lmu`c6KcXI=D zV|~xjLML~bY}x8rXRL|^V>CZ49_1=xoI+w`fzA|s8OQ>!^V1@$W$m~Xl{2cYzLpF` zeID_uuwY&#`rM`c^?m;NFZuQfXm@0S{)sJwkCMuM_#)4eqy9&9#`aWswX=W3X7d!u zUC8Li3ipv&0axIgVCulyNcY8?n~eG3J`CdoP@f}{170!MuWa3~1(IO=~*558|p z2WXN@k^FBsMD=<;=-Jn^mzPNY}`axzoPldbTX@}3$ffRh3Ece-{Gxbw6NRblg zoLdT2x_&C=b8p{YkO!L7)7!IKhy40+;hvs0q(#P2#$Nhd&u%;#Ods1Gf^6*Vd9S;z z?_O+PdIQ5A29uDz8|KFUA8p?PA60d&KOqB*FfxM%3>cNR_%FRsOB-y76Ez44sDP6M z5`6H`Qad-by*_3XF~s0xFo(@SY>l;7W37+Y_S#$9N(*W*h$aE7B3ex#qtse^(r|55 zicygKzi;hx&dekMv9~w;ICCERx%S#?uf6tq?2v+-A-yWO2U)th&Udpo(acs3!>4C6 zldl{}5Og$mQA@L9d;2R|7Z$BUtr!?MMeEqwvHgu_yFgX?l6$%={&aM`i66bG2OseY z`G`Vn*Gq~tAJJDc9-}e8Fqwn>RS_Dl!&XA0=x?AsHMuy@%dYIEt54(!1CHQ5`f4U= zwo3KI3s=MCY&dozHuBs<(gLa5i>n7)dgvLEaTD&$n7;_NRxcVQ%Prr7nG|dof-T}0 zQByFP+Eoa7TK#%I3U=pjiCsu+BC)1mGPTt%%`qIWr|?xan-EA$LqQp|BxCPcLRqok z&v8?dK_yhiTWOResD+PaTsVO&Yy@mh;2{E~7f4z^aTvN6CuvT?(ZYdbgBQG|&Ama# zGjKZ(0pKzFVTduffH91jgQ~-ivOfPCSqnOQgg1%R+qgoPCmUHV;%*M%ZsZ9tBFO~b zs75l(%KsF6e#CM+-nE^A#L9sis-h6iwDUghF2RvU^yK(QInhx#)sB9{uD1Iu=#g~h z^qM)nS|$4g=fjxfnp&Vo=Mbkjx-K39*X!7d=vPBm4#g|hQ55eQiAp}~fN%Fdoe^^=7@w#9@8H=UO%d=Y@1}U~$msXrswaAtnh(ADfXB=WM4{>7qZa8Lkm(Kx z=X^R-XBTN%=V?8FpY$1L`W3LX_*nZ}oDqf656mrk`ACQPLvJ||y6vFFP_zM&?63g@ zs-pL3$sAB-7~_20>fLlA;MHZ32a%S+`D5Xxkx>V4IsWs3V@SxONFnJYO32&wTV|5o z90-$lGdcwG0Te6tv_wjHdGtqNyMJ;<^_$Hk7OZ^YQ{>?NqQ-18LAP=4A=yr9*3G z#L{TZXPB22g_*sKH|MaU=wz&z9YidR!4Q>{5XQR1XqxB3rfEJ99B7WYb&4l8qQ!ek zR-edGT@fG|J7MVi%X_}07c*DD;vONpQnPGpA|jG>&$n5wOSm;yK7ea4Q6|Nh;Ol1k z)V*>{SZ?pj9iDTzwfAk|I|hEr4HV3R?2_%29zn zLIh*er&Zb7cJk0b#M_dTqUf|Ug`dl33Nce9rF~wD&$^M=1KA5~*?+MQXvXWn*p$Bj z*-7d1$awE5fx1^w5q;y;l>%-J@6rC~)BeOIDM0>gk)^kfk!VQJV} zE^xu&1ZPm0HIqpN{leBaBpY$9)S4{Gp!Ii6*g6CE_O1rzY+U|gV=({i?WgQ^!d+(p z*~B=2F3-f?BCHpzTEr_2)Meu>nQ!k$rvD>w@B0|4g^@zQN`O{$=mVMLxOm}{BV#A* zExDEpZysVZfbubmlX#pE7A}V5@H+E8HuG$5We%7~Eb?+H(K)oX5Jt3E@GJiS*I06h zfJGlC0M1_LmND&r;>y3tUipV&BXX()a%cw!19nYH$7!R@-wj^+M=yNl(r1TYL9y-) zZdGK7ho)GH^;V+c1Bk{y8V*m3AR}0m5Z_#G;CpgAZZK;G2&lJEJXBegZM~x>$Qhk7 zPb`o*pwn01!H+HWs)UNfR-I@(UkiyI%JYD(tALlbZqC~0K(V0tSmcX{CPG6Ik)>~! zI+u2UrW})$nNV{!OLD?yf?p$#gBhd+&=DyVNQREI1eIufT!A_ zY!B1kT%%D0=OuZ%1qCHAqdA1Grs(tW^>-E+LASq{Q0OwPr$kQxohRvbI=?}8USLc* z4(%0w764zi;nU!YQwuo^F#X#~P48_^p|uV~SrpEr0945L`4AH7U;Q%;?9>tFg4I|U zh!7CT@CUnPZGQ=y$<5nr%1FS2%5t3qNju9vZ#H}J8e3$ohybgwyfU14;5VlX!N-Bw zzrPvlIBB*%iWZZvGMie%W`QHmQ6O5%!G(BD15ckT+6R6XJr>&9GB;cyYnJtZo<2W^ zTmhBrZkL~(`sX?QlZ3;1J$bsnoURP#@E;?s%XJ~kbs@h*dT|w#rm!vMcGOgS@L3RH zv6NJO?O*Z++s;b;|1IvHv7di@jyL$tLY(P`yur)P^#y9djTK{lEO8+pvfBMmspWla#m|8qlt(syKHyeweHs&E#K@|{bVX(}c*9N<`*5XcX zQxLVjzPQbL;O~d}s1iz#7&Li=tCs2$;z!__c|D#)RXC+T9IiwW)~Y|#PKvHA*V9M0 zTJ@az09Kb-kts_+P>|pXCZLkBa~|U8C+Ym>;&WQ+vzQuQC*5#sTcPHPQpVzaymfiJ zCHLakgI#|?YfM-{;@|`AaZWyLf05Ng--aOzG~ayHA0UQ6uW!{U5`m9i9_J2yn{FQ8 zdR`)~s;t<*YytIR)pbX$wtkqKVW+mLf2l3@6)Je_1P zwC#RI&^A3@N=FLc291}((DCpw2SZl+8+pkN0$^RTi)`l2W1-NQQ4uFa&{K1>`aSt@ zBZe?~(P?TuS0~JJHdgxO7+gurW_$Wux3s}z+gjW#J&ZgGNsx6B8ccSj*pEcOLed(9 zh3kQ6q0QQx&`g&@K5l1~G#H|35qu|2hJUj`8fUBfYWrry2dFfQdoghi=N~MCxr!0% zwcdxv4;p&Hb$0QA(2<&PqA#xezfEs@N$A7s{pHpZ1ZnXBG*TOiq>R|~d>;3rt4}<* z{aS}wg`pJyqgOi}0Kfa90Qi*t0G1HSK0;U=@EjGwb_^sl1H$843E@Lq(jaU#4Gv*! z&)Te;>oOrM-h3c-y=n6m!0Y3-aEOit21OPi3ph~M89mhKU?^t7ObiY>e)TJ^8>+`z zt{XQ%L0l8tomL6?u#^c+nz5*c_mwGluij53j-!##;t4QRfkFn$Lo}WaqwyZxJ_&ve zo2;x=hGf( z#3o!xfoc4GFMd<@-_-AC8tdb~9RdZNV^56DBmmKC=0t~AdAgp(y-F}ufyt6?7-q^7 zoNwW2^P+zT?U)rje4P4W(UV|BDtUCpKS`1Xb}u_d4GVM)pB#S;*%8U3YdD`ZzyS+; z5Vl_a8dUP(eB*`%aDW1~KE5iLRaI67Uwe1qyRmUOujVzlwu**7x71Jze+VzE*fZFl zNfeB)YTs@+q>fA{^^TK=4p*IMJ@~4u_y4s|eqP-rKmW4_KlH?~sA?u$-kmjAF;g>& zxm*{sTo+^NVt$HZ@^=@M=hS>%dGAg)V!{G+lkb91c~12^-Q)Q!ZM89^8%zObD+|yK z7Li*sT}daE_s(?h7@<}vC%5`f-KVGop#X0t>7}XOc%SdaoZ2P=Br7^HUL5qb2z0XI zPdyDFco6GCKigPaH7YWT1E>e%`xfvlfAfQvV$QZ4=YYm?;QDfUs*LaL{iLtEN>;r7 z>pi-8JsfB{SUrm=iw3NXx+!18N0p7vrP;e|=5SAL!}@Kv_kF6F$Aa;9hU+eSqNnLE zU|XUmR1J$vMZ3CBtr`)T$eWYscy2OY=cSta%pR~6c%9Q>B^$Z3uWjP>{8)A$e5T&u z{Vc#}O+=722Zdwx8D?zclahDz%EHm*raoi9GW?zBv~W?P6I&;5w@+Qp^Pmg9RHH|r z(ZYUY+9!dZ(!l#$hp<$_IOsR+coT0Tfq?5d&NY`#Y`lx@Iv5=Rei=N3dJ%iUi*rh? z5u34Il|#wLt9s!-%xJm->8!^UrfH@1(I$L^!>*arwIc*`E-kaQG zNbik}bMU$QL>nKJJUT3&ZeQ*@z&w*xto0VuCvL$_VHx~uVZh-B2Tx+>2-BFrngiI( zVphbD90}YmdXPf*LNDGBaOvemZyoCEJ{|rEKd(D$Y?LBC3Oc=Raf$_>+px86I|90c zhC2X~CLyW(u5Dmr>T|N3uL3?@qFbDIs;4W45|Tqb7$w!fk?+hKE253S+TWoUkeDF+ zSm$^-i-?_q-q(uV634pRqmB&@tMQg(eV88s-H~ zOXXdQcbLav(xvIvyRTtxXp=xYNVelo1#z40`LP3O9L8Gb+JrY51MCc~GG%_G@z`;} zY2R#d7&Vnz0?rf~rN&|gMGlbV;WU~#3+}z(;K@kPNKVb1YKY~Wnlr%=3{l~UhMCJx zb0!%LoFghc1x_6ea~kf=IU|gQFkhDE8fFwX`P+-)&yIi=95K>kG}Pk9Fze-7jjL6$ zk<&6~Mk$@9iVdWmsp2=YB%)hw+*5Wqt8ma*=L2(zPb;!u?tg|rTfTYpI;FtSFb23OSb|2*DWlNoYC9S zI59C!dS6c|PfSn=4rRP>gC~~52E)u9`sCtFP(UW!4 zC8BHe#M;83hew6Ph%D5Ye{fHiv5{?O>RADG6{w1CD84G;Hq3@zeAlbpp~wBKx7a=1XK;%>-rZualib{8SO1QC z27gNemRo)BBNI#}xVW0d&0z?1;i!^!`S8X!;y#RJ14l%y%*hr*Vo3CA&-aM!rS4Cl z?uQ&9!8CK>)|TStb0_bz*FUHIed5PYhPyss2pSlI!zuh;u|SDaYLyTK*dPc{q}tS- zf&fy0D!k1Uqyridl{6aQG=w73swtHY8l+G^6w8S%wRtufPIeL88@idNUN9cnfKsZw ztuwT#`wUWCPh>y0{7r;(OP0qP`zBYwy9k4Y!O{wBOLN{OLpvq^pay`Fd7(5($h%Dm zkx>5C5JNT+XAP6JNQmZj0;yb<)ij;g22Mb8TANCc%9#FobLQc#)(}kGiFnR#j<*Km z&%!;2-oK7BF6&JWOD^qEmwJuM4kr=LVrj3s)Mt!OA`0ml>QcXPnKxOIn_TLPZ$-vn zyk$bXbwZ!X!eY%z8lnUXl{7814RfqPw}%bLZiB-+(|?C;PgkHC**>E%o*beZoXl%2 zLRf6HDI^oNdap92BTek7Y9zTag^`7$Ip!@jb2gQMGLrH2SXFC}0CK@rnWls_oq|y~ zrTb^kUKR+4i^^mH0A#XZ9d0@tSFQo&<=hc6T3ZO)wZs7d>vBn5uU`Ak?&apwV|w}c z`r54eAu}$3)%!s`hep*FPWME=AoJ%y_t)+D^EEwx_({*51Kp=`?u>Qkj(P2pKmVZ#CeMorwkM4<$EBh#Z)2wUHZSnzq>p8718DnZ3Kh{rRt+Kg8N5jPW({-&5O=Yn-cI8Nb9~TO5 z2%c&39^aRpEz6T8?0OE^%fGx=z;&T_{YU6jS3d93vq?6&JKr9z^K5ydLk>Tc-mUv} zI=#bzx-1DcxwC2A=|3c#wqnpo!qm3OucYLc$ABe4pTF0oA;zUaO+Pjg|LVtCukT3* zB-PZcSG$0jG8gN|ZRQe)!JM7G>KihTR#a%x8+uY`;T-j>s&6KyPupw?i-E%jQo(S) z#Za9s{$pR0B@zA-$t#$Pa3V56ms=pi6sY?i-WxJ-T5~`aZXx!-C_aQPz_G!Xcq&g- zVVTZhEAbdu8JY8?*3G;ZXAfo8cjZ0Fq%15l-yv=Diw~#B+aRe3&%N;;d{36l$xoln zAEQrrH`p4OwgN7O_mo%;%%`0}pJ*dR$ebx_Abc#j-#!%~ZuwO@LS(FdY9|l^OCXLr ztPu^cNdt;wvCJu0l@nXYi4@s|4MN6D%I~vR5aZ_b(dX*X-tG*4m}9SAv0nQtMqdDd zVTa&paS*Oua8N{uqb4v{%Y=EKi)SS}H%(UQLY+ib^N+O8(EBpYLCB!@F9byX|;J-tdGS$EulHSqq7o?Lwakd}v zy^mAAL5Qth_+I+X_T}aiCknmw-=<#cKcPW#r+T6jY?7OA&*86NxcL5P^mZ!g?W@1k z!&H(%Z*T2SZ?mi`e?VXnge1B$EdmKD?rZed@D9xfK9eD}*%W7vYai-qJjzoXhjcc@ zo{(Y9qJ-|233&lToc4sg^OziY=7db2inBvNs`-N>)nH7C5EY`;>en2!B6(&I(p&$c z7X=#(ni-ADAo`s73^r$7D>p`%OnuRd|A~4}aO-8Iz-FJW))w=?TRX8sxFz~9#PlD{ zomVHP|1RAoqlv>*a5J1A)19ai5rsx{qB!ZPM)3`*;R-zHVXZA3QWi*zWd_Y92)-u0 zzRn36Lpx97KHlEgzsr%=drevYu-K^A$re1J*@D+Jf9moEAT2=~A6-1P$;xrz>6HI+ z@zkazUKdH#E2JlHWtV}TJh_2xu7IH!_IX@>BCi568MNe>!@l-a47)(LRD<96bLOZE z`Hl;O+)=*(qyB3EQilAq*EzO-onv&JdUVRH=ug>qxc89FZ=h~J!q~Z+bDR9Xpvk|m z_VE?D8Px7+rk4dztqQ7*L=J8L6WYj?E0A~`M^DP$g}vwQ!UAiLkW4mQ!}QQv{7rvu z0)C$cUoK{U_T^&k&(oKS4$I~o)Jx7%F~oXveSh{r&OeWrwgl?0AkND8DcS6VZnKyD z9rhMz+F+X>+fOw1z?oD=12Ub~nDd$)h~CI)v~9z236f2rIq?5-uHfr)pMtMX<2wn| zzL#B0?c(8y(3(%n{DhtPA!ZilQ!kpYTR%a_RdXJgvne)nwiEl^wZZxv9P#ds9Yo(s zBcE3KV<=tsrhc?l#3~xdu3%n*lD%%7hbm-;ic0iaaFk^rQ2#%a5ePCXk@AGjBh9hY`WHxKPRu5br-#hHJ7DG(?XV>(umq@R~{TB7V--iuR zbMkLmnSIvEv5vgyacJm0#FRquT>9o1TNG&Nk|VKxU(1-jU}IfTnEq|97Q#q^NuSn% zx(YtOr^J64D%Mgez33(zrfN)qcuKFA5H?O12JCBEXAp{d`)Kx)+)JJN5gj{{jm!ep ze~)c~aLWiSnu5w6Y=t5{(>=k+g#R}rST&?7&unN$Vv!1!85_B5TYq^Nih3e;PbOFr zwO6QtNTq&+f&B$$47J)t`Ys1N(#4fuPwOJs2U)(wW%p?~0ezU0!(>&~t$#Sga93FK zyU6e2<9(@*SII{$@|P`#cx_V`0Blh(!!F1YkE0dHO62PLFKN*htSX*l<1EynJJR(N z6t7qHj^_5a5a4!bJ8E^i68l1OPZd-uBP4ygamjXT-wSA-^t%h*%pgilcBAWiMD({! zDn$;?^<=xE+=E()kJ9kAX6YA=cV8vY{D_JXS&5B9m7vPc0kQZ+GY;w+AA0SlS`1=al%i zypS9j2G;Ed3}hP143=qCN)LlpE1KuBWXBQ?%sU7uA_6p&(!#Q7<${{p_19v=uPj9fY~XXrq*jr^1B0;n^`RWNIX4&alN`3=NmzM9b_(4mIH#2u zKiP%qq`4|5EBlrFgP}bElQR}lsT2}CJduTK$t;Y)m9E%(kDlkYe9pf*Q*^jtkd5qc zNA`Z8`y6{C`*jGTboo@fKI(pUIQO&OAM0_4{4gp05A}xIOor!(AlT5a4+_$Vf=<>V4r>l>x|{G z5ifB#rS*bZvZGu<)Y`>4|7(72%tLZ`n6iCqZe)u$#BcFtZMqf-qeC}E@Z*-@s^zI{ zb+J#C`{^2teKAayV>A#isW(}~vKPZss*6fcK*cwO6HLJ&eIkfeWhgAYx`%;?A^u{r zF$Zb#o7dJ;VWVCjyU_L7yVz%*0fI72%hz3T)nqNo>N+3L*4xg&?dRbBvq-dleqSa@ zVG{-;Dc`t_?`0y2rV4hWdQe^IFuzr0XVMm}2I-0)hO{_?>PWRba7Tun?UYax;TTx= zDytVqr}1q$eOe7c9s`MQ@l(H}*<~Ca9?hBy@YPn($F5TAKPZM$#8>+u7>*z1aJbZZ z|A*`}%!d0Zl!-IaXYK|SgVtFdZ6m6#@&+66e;xiu@xNj@%!s{NUi=N=#hY!%OQC8L zooCxRT{q4{7!!JRQKhPv zdiK6hZ*{?~lM$)7sDv@Bi-XtyVd)YC_MoSH@tEz0)NaVq58IcVs$VW$B2n8V!O|sA z9F#jp-BJ8Y+wqm5@Os~tM}Z>IFmA}j)SR(F)yXS~p&=Fy5_DRBu6|41C0|n}Bsiba z8SujrpozyI$c8Q$KWQ(e4babn1|&Gl`O_*zy5n;^HNz;tsF?C-pzjNhm)PH&d`=2#ocGN3@Ib8*D_=_7`{`I z9i0;LK_^9ux!u`l8f%!<2B!c;$yqymz!P1ExgZOXZvS<)z#e(ljv&pUX0-*~o|p?p zBM#`lt`_M_uI>w5R;Buq{V%Kqhqa-dfpu2`UoQ{6wCdYpYrR8EtT9sm7h^Od^iuVY zmZCpPGLYZFr@6qVe-LNX62u}(0v$X~*mCNdKpEF4nJb6o|IWp?q7ZGho#x?OLRHK~ zc%tl=^|+_tG%g*phG8O&?>-HfKVC2?4e1!%jh6H$5e~CP1BEcgSwN_{4knHE{Vz&2 zOJU}Mf=AGbPX9OsU(nmJFT2gbo&oJ0C+!_Ku)X7?y`yDr4PmL?5ulj%+}d%BwtiZP zpq%E+PeQ$cbw31hgbuA*LSWA?vI9gVy+KIVQ&k~C-ap-V29bJjX|nxtRWdgXD?ksq zvd&t)i0h7HKcliv3oic&@gh8Ee1>?TcuP`m1$PRxlk*HSzJm5-HGC$Rx^}N3TxGBN{3RC+D$&ql4OMH}cWwIU{J5`?qRJ zpupbEuZCNN*lHVn32mW|S=M(PEhyG5FbG5-i`{pHJ@Xu-^EyQ^$opq*>Db!bux@RXAHa`S95D;m9UQQSYYs%_eXe9!Zfte!;H^-1$a7dMWhoza9zJ+A7MAhhO6^)%<;w;=AsD|);n+rA>$nzks3pL zlFmN5X|MKRWM?Y`lc(lJ9~tC*{JRF$B8{H7Z$4KGmFYAIykB z-9OjyF8ph4R{=V*8riYED7gR*F-Nq_^7VNT%l0qHb}ViP+M zBjYUj^sw_OwssSA=AGUIVyA~A(Oa|A zem#9PJYbf5m+(QA>gmtl>NXFU9|?u9?rOS8_o zEai`NFZ{7??;Z-5T^*Dze?iScaLwMn=;NpWrT>0Os(7b#7=khmmR*J*a%FPsdgPzJ#0Rc&KDKv=AV`@gy0Obx;x*^f)D}43XLYXwtDEAGghHhuA>grk z|23HCsU@~{m0v~_Q{v^#IjCyOJ=fq=Yt?-pJYqE51J$9{#9g>9$Cs-giH^`u%kTuh zD`ODq;ab;T8zH0PN3w1Rsf)abiWgxi7x=?fr(3_f4~=TGo_SP$d{7jG*oza`4utEA z>owZv32kIuH(pw9nsoXYnTkSe<_3p^cmw2uYmNqfEHmf$OVu1NDp;s1SfVTV*@IF6 z_L5EoKfBGT;3vXKj3HNHa}qEYhM}~vutzfz;c~JTE;Au)LCkHB1xj-q?RoxQ>FJ9< zlb=&`dq`gG4xi$-$6R<{8GJ`h1K)zGLM_oH5D;dEo&Mi5u)g46{nzy^(e?f8C(?h? zUAw-Yt#;duJved*$1Wz^Ye*ibh3Pe=B!npro-Y>Z}6_1rdQYRAYqjFE%I6D&S{Upi8{X(Yg zIIXE!?96MD0qgU%_7*5TLhD{&a(aZ;60f!5Z=etW1l8a0YZ0Td z7ELt^pGO%UcwC><_XsgWzL`Lp=D@F&|4CIbrGGJ{6x0{{yg2;{hF0ZPZ;h|Y^F+t18rb9L={zqFQ3;Ha z6%?jRVAd4`j9SCVfm$Kdn{+|wS=a?5DvkA59x1QkDu+)OhDxSHXUUS;_YU6Q&6O~H z;VjcDr@dr$t&(8}6DKRFu|_7F6qdFO+Jb@!j0Xw;Ls%Y$I2;Zqii0qCUzmeUqk8rsV^x;ps$jK4 zmbC!DO!T~oMQ_4)>EmgPPu7HBq#g^0tuNa1hFBhq+ahjauFIk6ffuP^ba2%#5Pm^h zI2}ML_~q4~d$EFo5kZQgREl1v7-^^2j}+9@L6XzlB-iEW#-Ik$9pjP1$WlL!t9`KO zoL7Y9GaK04GV8BDKh$TM9^5-z$ny_>(g$0`75WtyBJ2G}KIx0>`swLGGr`wkYaTjp zuNMR0I|fV3(ctT;git1Rh%$5~;JaaP_&&b!c;I{Qalv;8I(cmP?t9ctA@Chx!*@Cc z$cAr|o8+^=_jcsUgzvW=8UWw#1LPU-{U3DxXz<;L1!8dcViHg+Sn~yAHJ8RgkoNMM zHBh}+lr+9BNXJ)yTa zg9CtB4ESaM^8s|4T#n{%2H@+ru#S8xJjq}T0?&~vJ_Vjzj{}~|fBI?gydae#WA{WbVVBD8p`=9QSa8kZi2xO?ZNuGf~Zi3epRFEJswUW=Sx|Xn0KC6dH*q1A&2Re7%*Y@q`+IU8G4oEhFrUsR2kf?1EL07Iw&`s^ zZ#?Ka!PT$p_u-Y(btbM^xgoQ^)BYFzy(-bazpQSM{<7xk+o2f9)+E>gs0f`)i9f`b zXh22Z>yaG&3&olEEz4la@ElUHUxD=s*lJ!JG0PVj=Bq5BVHd94Q)6?S;JunNr!*3D z3h;wdNx;Pfsv@`x1SbRQsqaMjd%TI?JT+f}4_w?pO%PW#M1!R>uT3A0kBs=8@_ag> zlLUwHroRm?H)Ucl^^8DbDhf|#B^&BkqD-A+LlpOL5Nc`P-1aeFKy5{*+MiA7Zk}YH zfdB~Do_0No&-Pixa!|x%f<@wkoOmQyrgP{q&OP*S4m6~QV0Wbd5yw9> zaJJ7TZ6H>_iPlB1rs|Wn=!RhjGSY4p&JZ)3M6`!i^=~0PawKRMJV+@F;V7M~5T5 zSTq19WwLT5c>zMu-o*Am{gnvZ5SlYJU@pRqDw?FcLo^tvFEVqwe7XgDZZ&5LzS{H_ z=ltf=C@h;d0`sBTrEWoWNOuZvIKbN9GLsyQ7901C6{TS3TnW#pJ&b$#e zby|aWksceNWUbOAK@|aTMA&PIDZr_6##=yeI#NQnbSX-(zhj>&FYL^F7Rd!G0&8hb z+YgBmGLI;phQyYxQzNcMWx>tU=;$PjkR+1cJK9FxdpQ??zp6oITo?#`HcfBfCMIVD z5IH-?XJhV;fcfKe%(YQcXt_(n2fG%&c9WOJB_X!=hH@PXSowpBpO8a4LgJ7*jIv5)ZYo)wvKO;eRu$F_`1?f&-lyw^nUCSwLF^}R-?4A<)?_0oieZu(8=AHWjd7Noo9zrXUDUHG_D#K* zBt7Z#=gl`bOZ%;gyBsKJ(#UF{bcIQgp7Rmpbh?gM)kp&XfTfU@I7)q2I(V+5^_b){Qb>0R2LBryex4|_h zI;$>(W1Fd^I67x%Qd|kWPRsYOU(E@sA}_Zh4SZwBJkoqcYK~F2pW$)3{kE!;_CF&z z>>W`CajCaqCxy8z1Ga3McLtrZuKXTJXB1Up7!dDfzYlspf{Hd597r7Ef(O$%`~xwp zMVVc>XhfBWlAaSW9`>Hs<`^r2#v^Qei!19RF{lbs>;VrG-o>W{AzbqVT(l95-R*Ao zpJp-pze3WCVwx`_jcM+~XGd~3^3G5CaFB}KBW**h z!tcBLc0Px#A4cHh?VoJD&u;zi8!}rjf=IN!SGVj0w(JL~G=sH%1k?Nn(qy)N-Ug98 zu&L+}*iYzhqeEJhBRwj${`l>Gz6Zclf&V}5%IrZu_zz|4UQVSMtOvuG=9fs5*#mV) zdJm}cZf!!RbPpQXu`=uAf3^out7om>NVQC`ryu;YnC9eEn!#E>glYc%gZ{1m!}?DM zcwo4vYcsH_|6VUw@AWu&CVodV2%Hlzw=3q#&mG+0+q2-Yw`c4|VBJ?3Ixu}(H(&$x zDAHle#Gg>S7Of1dTg#{lE9}WGuI(|I<09knM5n68hmm$>{y_xDJ%#%h^DaC?e*tlL zVXWm1eNeq$%S7P)9?x+R3wfebR3q1T$%jY{_YIPX?{ucYZCO6}rX#$j;L-lm^2gkl zU3r;4kN68r!;dC2!zmGcCR2Vd{$2C;!b$o$J0Zb;Rxjx=T@k%G^gGlVTcVnn6bCs) za{l1OS#ShTh0aqTQHdu6axcwBSGmL|FK6cJ^Emp08|c`>6rfnx2L8l z2O#y>#JUTHFY*IyThm4Fg9((sd8a!g+5AC{KW3y-@EE1aZ%dR{pfX!Lf4ZAwfB=*- z)1w@JSQ|JE(vLq{lsgUVQxNNebjGC-ml9;kz}%)B(uxIj(Otqk30Hz`IWWOWfH6|A0!$P-%~j1F*z2k zf_p{mWY{Lyt;LaE(lJ?TZ?_o_->84Y8X^{ zcUmvQoDss3FIDp4ZA^VTe_HOEllkpYNf>)wG@pDPT_8M|I|V*>rIzj6?ScNnHEHw9 z_XUvP#MQ@`Up|;eEt!O6Jki?;?xX22uZ=ypTEBdOvcMpCy90Q{fo-5}7$%Q-aaL$+ zpzaWWrEZ*r)5C_IBtSOtKV0!Hn3>2&DLi2Av~v_P1fW=?!QWY*LIfrfMBrM=V?Ryq z=cJObX;q_bMj(jli1;jKqMJt00IdPnfsZ)&W2cY=Cx4)SDSa=T{UBA?`kN`JfP069 zXsg%afBlMUf%Ol=!G3cEUYA4Z8&qgRNs&iFd{`DV=#3?ktLhfV&#x^Dt;5$1%IrOt6(3O0L*rq%v5RZu~5 zO|N^?@agb{fXCU(kAY7J-H=N?xm7tZhDEfo-=WUp35MzC&Aedb6M)o6c=2SIy$F#D zJ*Hj^rP1KQtF>c3#=V*N0LvOY&t7eqJ-DlHcpq151*Q&mc2F+jO9aDWk=BaCPzXvR z_jX*{h91nDNLxBi`XXmQ;$hPrR&C=XaNlNAZLIvGa)kYhm1vKPm4u4M$_$i5lCV{YY^E7R3I`?6ULz>!`Mtanl)MV!QkyU2>r$&}F$i*k zfJr}6fx#}qu=Jf{*2%AyBgW4gQtt~SMsm}Bww%T^^q`E$Isw*eD1}dp@D%QQjZ^u{ z#|O6i!Hn3@9RN0)s&lg5lu9-j=!E+$chd;y&>jss(DfAP;BVH|-^4UQqB3hdGMZ+6 z8t{7S^nAu=G(uR?GXYQMd=#(4R_ztCnh~q4IrD(0V-cPTWfAXjeLxSR7RO zhM61RLw22@!a7^p9z72%5~KF100O}wCo+DBI`VczIAL8C4}ZC8WWne^J~Oh$U+97H zi|Q1(t(5tn%-e-d;G=4p{92li%6{3-dJ!pl5(jI>60EE->D|?75=6<%Bi&zvHhY2( zx;35t9j13jGFP`MY;Cw0U(ixcY>blOUE4Q&aQ(7HmuhmCM}3;r`zK*z=W?Hip+NxE zA?OI_RvL-@Y;!SmYY>vg2C=O2VZ*fW$!KWD)lqfvI|%TSwE#Ua5^v)plzszutWL*) ziey74KG;Ywok$?h8Sx1?{@+y%tRLQ(IJAr|W4if{fdO`5T0hx|C&cnjQzpy9X{_KA z$~!kzo`V4=Qo-~mTEBD*Eme$p2WY5L-1C6gsZ?BTEbOf>wry3wbA!MBHwRCoy=o&t zgAqvPy}`EQfo*^JAaLSLIx^*FjSk7Yj(!*+d6V8ZbiPj0?hJ~`?2pQbc2KF4SA?y} z5gwazRFnq)bHNtxc^;$iN3?x{DbeNDWtDpLbFkRy^=e4^tKR#TlE9-9{$+h=FP&1#1VOg9HARo4gF!ubX*BG^ z)x{uXO6IJBVX+IqJK&S)tu?ajsB&ruG}p9+h^|elf|lD5b+YLfJCaiH2$O{S48mGu zn9}JG(kZ(PtUSjZ%O-nJX?egu==;85~1peS@0RS;cn7`fQ=3*5WoHl@{_2*kIK@zdQii}Y?VAgm6a@>su~Cq zl+g7RBm=PaVj1#Zn?`DUkrP3{?KOtgRgHUwx@2%{eRGa+U5c+fxz1gR*gCA>`n&Lz zF%cv5#N8xpFII4!be@x+gt@kOg$ z7b)8gr%VpnwsM8~eU)VlX7H|~rL3%lamAje{<*y-Sk2mXWr`gMsTcxw{9 zKo5A;IqL3gBTNR_y%?n$$NeN3Z-QhLWs;1|IIOox21`8})4%UlmmZ{K5}8}krc@FU zNH{X-X{gZIivGw=<4Po)ttcTo2+2T`%dD%AEmI0pv{I7{dxMYMGOZA#@Y)*NJVF9w4<1>l}Jv zXpCqgDrLl1tSq+{ZO54PD*qAAxR3gxvq9vMjFVvJ+T+9j=two|h~R#%F6pDb*k%Xu zk93{E$th?IO0hi}h!?itIO;GOUliIJdk?FVg9T|)xbq=Sx3NHmSBs?vZ2k7Ea$ zco2ca?^8+GfA{nvl7<;K8?U?uQ4>mtYEr zw8{YB41WtHx6#QkZ%PXghB;c91^z&Y1IR+T^~sXd?9^mVmoW{>6*7lSf~v2s{%BKg z)OiY@}EZ0jbDo7#k1Zs@uXX)n4EiUV!d@6Wja4 zxD{W7rnZZ=2_R136aDozc) zbZiEbS>os;s&>0w6{S|oV${%}Yd9V5Fj=$+Wz@z@u?>L7 zGZ*%bPGU7mYAMO~7{7mjQ_q&)2h-&BET+G_p6?i~mWJX80ZFDdF;@m6%~Z~j->lvr z#B@m?5A_~A<4iHVO{fy%v9ad}#-r%~u9@S37m2=_e`mjO8=*F1YCQ1fQ^x~oFdp|@ zA>)CE%<;erjtA>i(grb_*unkXdNG<1pXJ)HqSTPU$Htl`&}8cgcDAt>8PWf$EEvbY z@N1v}g*6J>0IrfX<6V8!oZn)=>EuaHKR&E}7m_21tepnSf{R^P0-xcOphD~Lz~t4x z3#}{82}4+S<;%F8hd9G8T0h;5TW$wnfI)i@gz|(*X0E%xsQzP$9*h0OKf*_+$1z`I z+T}PZHe@RHjX69OOL;HNXMLeVfy6-opu%3~s?*mwf20d*giYbNvZe`KFLli<4y_o3 zyy3I(#bRdBkxC(Sa=3lY5Vffrgzmp{leomqF|#0XlXC`r9zM|6VkPos(ziu744`j3 zly>AZpo(E@-$fXbc@T99P%5oDK)h1*^o{8Sbbthd@AI#{PzDkvzs?$|*T-wp)<-Y* zd*1^2bZ1Ea{T??5G}M<}c)H|6zrnbGD&_BW_NV&rNcG4w!X3x1Ly$s}yhslqSZZDP z8<{x}{h!8hK?@;H&{c86oJe zq9SowN0Vfs@g!zHZw99H_Ql4}4mGiP)lbPW!C@S9PAJiY5vfi_Td|5_RLdZIIgE4> zk5e2^CrrNL$%I+qFT?4?4NIl{)!&hy=f8y?ZH#-lwWC;noXpGb#GVfU7+0 zH?D!1+srKNvQCA%v3e1c=ijUipzZ+Iq#M$~HB#4;qw86Wdb$_GIq9rtm{y8F;}6nt zLC%lMti|7uC4`H|0|1*f5B=%>a(oLPJh6%Hf}JuV*trl3wrw~d$#C$8h){JuMFv%T z7)KV2Y!Q3gZsjOzr5@C_>!BtPK|F=O{Wm^+%KG*yA+nH*I~KRSWpw5@(4hXS?1UH! z(&F$-s5OA9$|K8AQwn_!Ef#=#tK?@Me3o)F#SMZDZ=4tArL9jZz6Urg1i5uFHj^Gw zJSujrj#nZ?B>XZEZnm_R;5Hy)bl7M|iC4GAQ^DZ3)J%S^nAWhE?fMpVtyXz~yK(6(Do z)yKyT>~vYH^j%J+Z=K20BW6oyv9)I;{XQ~x1=pdq|3y%W%EbHVi)p_4I_7>JzS+DX z*2BodDIpyz8k7^c?pl|ov&SyQwmA{(kgWNsB*dSpVKyt0gW8D?PN|4JUDAQ5Y z;>`xO0@I1p7SqWT5&=myu^KSuJi<%P6ue|VO6lXF*y1skI|4U?>4Yjh66wjI8krqJ zb3z-3%y=;JM$??F9xv2sG8YS90o}D9H_|X>AH;~$tBRju2lKDxR2&Kkl4Nkf!^!u|&5W}j@K306Ink!pGe6bL*j?4y(c1V8e~uOF&q=XrRx@&t0x;CVEWeO$;J)1 zaXMr)wc$yRbvX|32@fqaXs3`5Y6b3R2!L^)-wdQN5(HeRwe635#u(!3u@9VsK%s%#^G=3Td17K#7mo{w zI%ybP-HB$qdCo%~97jEw(#KdUxF3HBD-f}uHQ`5o&`FQkNMtJfa@1QmId*aW?!qqz z8lJT$-GY-K-(te_>8B6SWUX^B5v@GD7pbHu^q}#NC~`0dE$wFUtH#1t(;T#P)-Qa+ z)mlT7Pr^2oC#`!-){7CuVP}Tyh7Rk#t^JXeTf=^8)8N>Gz0#vjQzn^AtYjkx6`OXM zEokE+w$Ys{PyQNs(yPIt`wRA^z6A~mA*XoJnvBHYwcO120yU|U5-`>iYPuNY!}=N7 zbQAeU+sPDasPuK{yX?Z5VMGy!h^NhcuZ46F~i3vk-%u%`n`Ez;*SnQ+?2wAeoaI_+tr}B9lZJ{a(=teG8evW%zJz7 zi9En9tGwDM-d{iO-E{Pu00qeu`f0cV2^~c5zF5Tl)SpV7C&Rbd_0Z?mI9X|3|BwyM zK;m+|)_9rGV2z|eGEHr)=5{n!rlqE}aT*VQ3@j61{sK3lj{=ENz|44GRxFfE5U&xK zCP7-I?LIq&=hTK+b$>-lWpeOfJlQ~eN#=AU^Y(Oq9&xn_barSJ@OvJtD>Ws)xC{hlvdzBdKf@TZMF!ET+%T2Y!R^y`T=pT26gU5>O1Mei&0<{FZat3pGg7 zM7zCI=KBV{_2{USY3~xCOA$;my_y24CM0VProG8&kNLxCkJ-r({{*eJ#DCU-^|D$}a*YT@Rw!0|0YwM*2P!PS))vChZ3pn;%MVc%Sp5?#f1wb^fYzP#Xi|qP9@$^%G3K^D6YSzW6s`~CY6-Tu(W z*C*9!dB}@s)mgQMOODnh+LqkO7LXqPC?bp ze(oBJs%o1Abb*8i4~S8Zgz7ZzGj+@L*3+pqu>SVZbbUDv*k^e!t=j7=$L?zgz<5<(?|g&nCqSo}DLAB7B6 zodfwJ0jqieT8eM(1pMKZE53yX51!aa;EmD9ZE1II`dlAC8sxA7^XV%jr%2{x8_%*yoSZ+}H_vUB9Fo9t(+8Y}aginNBu7jyI}-a|g?G zfiSCq#Dhqpo;CBRcCjrr$Bag%)AOq~AA5yf`QC40UCl2IoOx8v5boFiJS#0NtF#vK zqr6lNoOt%us8=2i&0w;YsI| z`!AUbbUll8JwL?);mokQe@0P6EsMuIU@tt<_W|rU z1+ZPBb|qj|GB8T-Z-nxNOHJ?V;YynfS{*o!Ne*Y6TM*h{fiR*qUrY||sh~;;YwpSeR=B;Z|Z+7i*kB}3z- zHIc4eN*7B#(KT$OEePr^W;b*r$N&?xZLu`*7Fiy_n=-Qm znxUe6e-}asq5MXK0>aNb^MP9K7V1&#*0^Y1OSVF0Sef-c+6?nwG&pR%!+U7~i4hWh z*u#}F1t<-o=b0?6-Pzl-x0jZ|NnN$|JApv3YYQ^6$zb;)_hmFWG901``)rV4I+_kl z=M}C{P6T)9+7EyaX$A#z8&k4sLI%aInm(0(@ohCAk9n7haUnP9!>ARKXL;?RUgN^e|ym} z`#;9%e=6Bv{U0m+chgA!(I#!VamrEqk0j_nvYFPA3QqH;sS*ZPN7MjH7^{ zfz2+n%8<=8H>9l#Q!fz^EW2As!~}w1F`#0v4Sd~o8IEG%VuMo>e`-m!lIVE$xs#lt z0x3(Xb+jLSD1}pA@*^L%Q@IE^Pi_8!$ee951j9@bI-7Esfy68wd>3Zl-ycC=mQ+J` zQED+7Sx!MCDMDcVLu`P3Aom>JnBF_}^iy?>b$G_!@618;3%+wUmE|~1sbydkbk9gX zgvij~#5Ro;f?BY=^2)GvRw}di439BRNsHn#>%G*1)J+WOCa$}l1fXF*GFN#>{chzk znm%k=|1_EpWd_RJ9)$`%6)tf5%h!rBCP<`oQ{3B1C$u#=%t7-}yXfyhPYheYd{o4LpfC9Rq@(L&Kwq$S#qsG2hLO(Y6#bFKsZ;u+>I?1+yM!R64xOPd`14c>(HHE0 zNDs}cHEt4;fSxxoZH`-C@FL{R)EAs|vCx4PCGVn8tGbI$1W*Z0iB-VGWrob4~;s1aJ7nI_Wx)9(jKu+x7PvVy_VuPye~&j{Af z7|nn{$PZptRKkX-un$2!+F`U6_TuPvac|#lLrxNc-MqW-qP55g)V|%>Y&p@aZ+ECQdJ2Yna+}cSU??XmR>tPH#@=^x17y80Knwdc zGuyX2%(I1+A&?RCw8yV9c-%6LFG+nzrHGMPWV?7ePRJKoLiO)i%HN`sTdz3B1@ zogT2Q=;Vi5AI=_U)Q5NzF#h$|-ZI)#QHiiz@L{?Oj-C3(G*88nH_wlWX<-}Ir$!Qq zqeIm#zV1`hOkeE^JbBee-6LpFwE}SkW7pT-I@+Ud@WSToCNHPd3~#|AZ)~Ws!rMKv z;PjZ+IIla~sPXZAZtPU1MhPw5{z~f=s81pX7CTkyMToBpy|BYAxYQS0A*o>4Y|QX= zf2Y!_ihY8F2au32E;D9$)kwn^n(2#qp@TeLT5zpy0b)*E?87`&SAxfI5Y{0yeLVPdohXEmIv3)3D$>$^%nzVsA>lp_Sf1 zT@P^1(chT96yM(@5)K2he@m4BEJ07~F)CPpSuosEgdF2;a&oM#kftnww=`b`O0@1rVck)w;Uu?)F4i#2so-S0 z#M5;}r?5zXTOCn1dP6I`fy6~%g1V>buVawdt#^h~PO4gu)LM@Z^-F_lUT>*2F%K&T z2Nu3QVTo}$_$2Qff{#Yzeh?&A(^5}!;Fpe{CF9beK8&3XXoO)h58t4D>g$!(?o(x3 zR9gegITC#fWlG>Un@Xh72Tco_0c%)uKnFECNzL|}^A2OyTW1PVV1)dL0fpDfhuft_ zg-;@xa9Tr)%3W;Ssggz&R2wGASfK;afEpbNt{S4+G+B5Llwd3(Pr>S#;m^l{wp`$K z%D^*90e10I+vOOOwhoLcNygN1#O%J04?%z z!mAH39`k*rFxV*r#Zg}`w=Ni;8jm-kZvmJ_5kYErCiQ`wW0YKAaqy20|nm<2Gm6pha6{yL;% z$X;ri2S9y|Mm|7m1*SZa7w(6zrUt%-N-KY^Iq$Tf^;j;V&XE*gb+k8gMvWiKVuD$@ zfXVuY4T_Xib2g5i_(5Oi`^zDt>}8qO|EvC_Z+hcl+(*9}m(N}($Fr2`msN>>Foyph zV>L_Z^I&q;FBxq}a&-JG^hfz{<|5_5Gz?7xJ@r_BLh<+(wsrv~mDUb{jL%r&Pj^>H zSBr~+^|=L&gm<9sW#oiM6lpeLuSIxu;TxS!A~GE!^_F7;WF!Q zvksxlEG;cBgtytoBTOS19V;Fz^^!7dJ%L=dSdm$)#@L#gKKwu@)qfGau}%snU`S>cU_?!ms&uMv(D zvBz~Ih9ikTm4smE-%cNrbj@Tt>(koVdY;~3=ypP2;;{~(=~~dxumZ2ktV_^N%y-OZ z=+D=u<_oxyib{LBgiSZ19t@MnUX z;Ist8nX-i1+`KIr1tl*1KpGv!!04tPVD{$Hb-xiwz5(Lp`Ekesie8 zyCl%itQj{Jjz0~bMVas!2%hWwty!{fI0lHevKoTu@f?Ea7q|jMX@E#uMs(%6ey4wx znH}864xX6NLB2wNdRbAg+rgKtZ}Z?T7^?KfMs&O@s}&IGiTVt z;L44PJQ@O64^))T1@v|o)xV6lmY47KjX2UBdR@HoV(K1WDN6f^_R!>q?b4jnQ1 zuGAWSQicIP;8j{txd}y5aJKpYT39nu-ANYPSa=wm`KrSOtKa5ZpZfJa{NgnGV8Ln_ z40vjWsm&hzg6~xRyMdnNPqCQEdyKr>FE_k*C$`^w5?Ixxt=`pm-6tC?tWFCLBYukE zy+e;|CUwyCpr}ZelIs(a>p8hnPspgb!q~D-9yuh&77mxOg@a+#Tw~N!8(VUuz=?95Cf8YV zT_D%xa$P6a`{X(c;w)p!M7d6r>jJq}O9L2M$Xx$4Qd&Pa_(`9+{sB~I)ywUEzFj4^ zFYxwyxn05AZ_8~bZ?BMBKgzL6*g@ixHQ z`HQUK@~WP%4*!GA+Q-}XQ*EsA%GD>=BDv0zD>c;&!D(X+k=a-?SFT~XUW=X4FhK zY6^{-BBN%OQ4=<578v)lV@AzfV~ccci*#*^bZv`tZHshmi*#*^bZv`tZHsj6|Ficl z@J(G;zOZZ^8vzPZ5|KDWN!*mSZk@I?=r$#7v29_=SY^p zNz+byzq!9#`1$DU$Jx)d*IsMwwbwe#T|3NOJIq}>%-uQ6-8oG5#FfKNetw%ec$m9< zn7Zjc{B6YBYGrCbXg~=KDxq^qnWp;Asf{#YMLoEX5JX%!10l0Ez= zN{TMdiWJW7K#|c5a_JYT+lF_E!nZ1iD^O)LV+OX1NZmu|0)qI$(q8AqTbgdMPvOo* z7u#VLaB=odNK!tJa+gVJ;~mJv>xTlo7S90~DX;_OXm1z+UYaM2z%+cTy<`MXN9)acq`YMjNH6(*BAjt6G0;ors`<@P~E)dA4C9yv`o^9jc7YnTwnxv z_1=X5ZvSlBfo>>=`|ylz+R5+d_`QXnt^5r0vxA>q{OsnZ#?L{1#`sB^rqN9ndOmB% za}-sQ*emq)@adl9dMN$~_twkOG0mT%?i~OTq&5;Fzz&_Qz4#tF*hq*2!P~SSbC56w zg12hhI7qkz!CN$yg9Kj)I<+be5?ms9v-VvM()=MfMSF;YG`9%eq!n|J@GpW{+Dr~w z_27-#bPf_yN9qmQR1VVIAUIi@%t6BQ2s*S(4j$5j*J~fbGA!b+Gp1fc5Q{)hy;ket z;0irx*G_PdFeyH0%=w@JI!;s(hdl`7R4rv%2VOX(+dvrcLpk>mL{K zokJ!QlVm8DO3oYTgfY(-DHUQl_xf!{S%jS^y+;#|<-PSDwXiel93;{|I24iUxErAkTjNPA zjb`EN6|Pp{8$zp<;2Am%c>(dW6`v;ZbIk4T^+bcA-mTPslzUbw8*s0uv7+(m!>p)#^Cb&D6QSRP{Nsl zNO)U%!sd%TZ>x`|tKUrXd}vc?Wr;{`J8tK}?i&Rlv7M8yN*#(Xh69Ia-XQdhPwJOf zGNV1>ExNtJ39*rcanT<20qFJWDW;JG`l2ThpJy3K;4jiBMfSzA<#tJ(^?SKZ@(fn4 z75+n>4@0+7v!$^rFZ6s^`AZQTL}k*mO2HL_ru${Sp}4h0_`2c} zo_+KTbu#qN0)Tq}(Cel_;5Qb$b{O!Q0u?fY1g$4#@c<}v$}C*6km_s0#8k;(s+_e1 zoVaaU)}h?VOqH}B*&-60&qL&KC8?iNd+=*Nsz}VPYD1?jb1HQf>stkxpx_> zWuy_Vdf{B7lpR8C8H#gvKdho!Rp(C=?Kq@N5rK}{v*7Ps+YPo3=rGX~-!b3|G}$B{ zn1)q+SyU6*NR6Uhk{Tr*D^R4}@%#euje;eMp{m`ImSVkv`BQlyN9T0Gp>8FB!uLs3 zO|Bz=8h|W(eeSK#>#6H^;Fn9!pC%5p0%CJ%y$`v!GRgy*C6os&MLlPEgL`WMVh8~f z>Vqv@O3^XwRzlGusCj@=22egg*(%EV)B@<5qeg+_LXV@4#YKF8%K(WBNM*$#FX)TI(3sx?p z@@Z6f*|6d|C?1%mxV9+X7QN*PAj-QNK!sTm!9K_{ZvnPZy$2N-NFx0nn8W=#xmE{$ z%9|4$BBaZX4sc`C9oW+jtp1k3#Z@9PPY<^Mq z+ucXry6{%pTgOS*iM3~(7%fZJF8nSYPoC0$V)_r8>+v{T$SZ~4Rtgs?a~7d;rSMUu zutF&;SLQsTYltazHJCK`fmh~0XN*8qsoTI$qBfL9X8!ATa?A_-+`;h#Xi8lxKM(P< zh2sf46*l*yu%4At7v}h598X)4QrFARE{;FL?;1Y|sFb=sdN!WpciKY0Q1X+2QE43F zcMHL2ot2-wg*4K-RqC?%>Ex%Ko{bKE&*A4C{LJR~sr){JpI(0QifE+uq14Uh=l%TT z_0UMGL#bQH&qe$!qG#g*elO?eBm8`b6W zj-MJodpW+3--q}a{#e12=4eS4iZImTzCZhX-J|%#UU4HL_0yj6JP5bqle_uI$9k5F?46UP zO^Icg⪙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�UdkF8HNltsA?IOv||3<5E({AYN{g|F0 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/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

3UdH>6u~qRPSIiEC;QkPt~_a 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

  • UHzk1Ue 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≫o=OFUK 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

    SR4z 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 z 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’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�US@Vo)*T%0Q*0auEFi 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%0A1_h-{|b-;kEKJ65g8Q;ECJr_~-iS#A=C4 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 S$iLc4)nfFGtCbi_mGU1%@rw2U diff --git a/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.lib b/sci_gateway/cpp/FOSSEE_Optimization_Toolbox.lib deleted file mode 100644 index 96756518928c7d9c590186ef2fe800a92ec62896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14304 zcmc&)&2Jn<7JqgK39|u=lZD`5d+a#=jKA%fWZ6Z|r`E!WE!#otsXd+gwvQkDhL~)ShkWxu;*fSMS%= zRj=NA<)J^98s!IX6fbN=JP)k1;)+{qD~I?UkciR55~u#} zU=K9$Ij70n&;yM;=5z@V8I69xX&SZ}%|78Y^Ba*zhq#00PIDUm8TLSRS9Zrj%03Yb`GoLEBgQkCBWLc|sHr6+{t(&*DZfve@Y_D%xx7W9} zZr!rh_gi+|eq3tVu48SxZf)27J6YDecmoVhf+G)oMTEJIAu+eb0o<}b?ZJxq1h_64*d6QYP<+(_D+px zCACS_EmbNvT&LM;_@ea&mTg^x%;Yq|da`&rFD9E4G9?LaX9!39AmBHlN zXxQ~q?K&o1CG1bQ&pl&V`eF6G-oaj^VMsWWI{BL3Z3Hs<;Ao>W@2m4Q8Yo|!`3Hp0>nWzH#1$L3D z&~wy9-T2!}C+QSDPcKl8{y?YcC3>0qDNjT6M|zd!X@Fj%IqIQF8mCw2ES;kl=?q<_ zWm=;1RGFk!EO?25FH-Xo5y*3@A~DL&DDqDct|vxVG2wf3 zP|kyTX$i2XH8JEi<&AJ!1pAWcQG#4mJTiVb>h`U61qXGc0MO79p3Z1cf*7MUCKQZy ztYHvubSdv;W}~zTM>Oh@zA18q;M-L4+^ZD#vzT(6reh?Q*ywGv! zOf6&w1eSj25w^$H-IUywa8NQYC;`Y!%_%8Ok=32R5ed=I1%({h`Gj1_?S#z0;Ru%G zPr|P)F(dMJHTPFDZ`q{?6M?%h!)Wegj9fExAW|P-YBL5MM@|p$Lw6zdpg0PdFS!VX z9hq)MOb{3h(^k0$$rS`_&k3Zesm^M_eNwf4aY0n^cXBbc+nGwOMzf;C@2e#Byoazx)GCc2dgs?U z+`b3>*MB~N`wGo{=F71Z#k=zOdlvSD9AmCf{4bw z6y(y*yoI8es%++Udo%AVz~`?OJ@arFqFmC5Q`$u&bXO#=HCW|COBLmU^}=Jizfj{`!xz}<_3ys*k*kDUhJQ><-oCO zZ_YO7lftr+YjhI9^Ev`Ax9KE;Q#t~#q?9#+!gBO#L=hAA{qOI61>|l?##67q;(WAq zwoSeeSXYw8%rS)jePXV_oQ8pAr%3=(ufSsT7@&0R)r*581)dEjnNR->L};z8L$<-5 zk>6iVzdMTJ#RwE$zTZ(4FUcs7oCnp@j-q&3LlNYs*`tVAn>{89Rzk@hgMV6-*XHIG z%*|Ic402MQ1SIVm6{l8FIC?c4a*Zf+9Bp=M7UZ7QaEO{z<``o9#W@W_Pyk=|>y z*|%^QhjTTtZ(-+PWwfx;(or0*>Nvt8PUbkSv{|ix!Far8;Lys7nWHJj%+vEa8o!R2 z1S0jCjhUyf>lj4cGzmoddDXBHAj{8`>Z9qjJmD)2$5wl7LRTN=qKM6$ouhGVP zu{(yiiFZ1aH3IS9 z|9aGgf9Apezesz$cN&zn^|(Fkl5E{OY2yF6mN|x)_;=L6zz)axX;RrqnK|prQrw;NIN_;H XM-d+4XO5!~Q*m5SaCrYUkZAvZ*UaqW diff --git a/sci_gateway/cpp/Makelib.mak b/sci_gateway/cpp/Makelib.mak deleted file mode 100644 index e8dc6b1d..00000000 --- a/sci_gateway/cpp/Makelib.mak +++ /dev/null @@ -1,70 +0,0 @@ -# ------------------------------------------------------ -# generated by builder.sce : Please do not edit this file -# see TEMPLATE makefile for Visual Studio -# see SCI/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC -# ------------------------------------------------------ -SCIDIR = C:/PROGRA~1/SCILAB~1.2 -# ------------------------------------------------------ -# default include options -INCLUDES = -I"$(SCIDIR)/libs/MALLOC/includes" \ --I"$(SCIDIR)/libs/f2c" \ --I"$(SCIDIR)/libs/hashtable" \ --I"$(SCIDIR)/libs/intl" \ --I"$(SCIDIR)/modules/core/includes" \ --I"$(SCIDIR)/modules/api_scilab/includes" \ --I"$(SCIDIR)/modules/call_scilab/includes" \ --I"$(SCIDIR)/modules/output_stream/includes" \ --I"$(SCIDIR)/modules/jvm/includes" \ --I"$(SCIDIR)/modules/localization/includes" \ --I"$(SCIDIR)/modules/dynamic_link/includes" \ --I"$(SCIDIR)/modules/mexlib/includes" \ --I"$(SCIDIR)/modules/time/includes" \ --I"$(SCIDIR)/modules/windows_tools/includes" -# ------------------------------------------------------ -# SCILAB_LIBS is used by the binary version of Scilab for linking external codes -SCILAB_LIBS = "$(SCIDIR)/bin/blasplus.lib" \ -"$(SCIDIR)/bin/libf2c.lib" \ -"$(SCIDIR)/bin/core.lib" \ -"$(SCIDIR)/bin/core_f.lib" \ -"$(SCIDIR)/bin/lapack.lib" \ -"$(SCIDIR)/bin/libintl.lib" \ -"$(SCIDIR)/bin/intersci.lib" \ -"$(SCIDIR)/bin/output_stream.lib" \ -"$(SCIDIR)/bin/dynamic_link.lib" \ -"$(SCIDIR)/bin/integer.lib" \ -"$(SCIDIR)/bin/optimization_f.lib" \ -"$(SCIDIR)/bin/libjvm.lib" \ -"$(SCIDIR)/bin/scilocalization.lib" \ -"$(SCIDIR)/bin/linpack_f.lib" \ -"$(SCIDIR)/bin/call_scilab.lib" \ -"$(SCIDIR)/bin/time.lib" \ -"$(SCIDIR)/bin/api_scilab.lib" \ -"$(SCIDIR)/bin/libintl.lib" \ -"$(SCIDIR)/bin/scilab_windows.lib" -# ------------------------------------------------------ -# name of the dll to be built -LIBRARY = FOSSEE_Optimization_Toolbox -# ------------------------------------------------------ -# list of files -FILES_SRC = FOSSEE_Optimization_Toolbox.c globals.cpp read_mps.cpp sci_LinProg.cpp sci_QuadNLP.cpp sci_iofunc.cpp sci_ipopt.cpp sci_ipoptfminbnd.cpp sci_ipoptfmincon.cpp sci_ipoptfminunc.cpp sci_minbndNLP.cpp sci_minconNLP.cpp sci_minuncNLP.cpp sci_solver_status_query_functions.cpp sci_sym_addrowcol.cpp sci_sym_get_dbl_arr.cpp sci_sym_get_iteration_count.cpp sci_sym_get_matrix.cpp sci_sym_get_num_int.cpp sci_sym_getinfinity.cpp sci_sym_getobjsense.cpp sci_sym_getrowact.cpp sci_sym_isenvactive.cpp sci_sym_load_mps.cpp sci_sym_loadproblem.cpp sci_sym_openclose.cpp sci_sym_primalbound.cpp sci_sym_remove.cpp sci_sym_rowmod.cpp sci_sym_set_indices.cpp sci_sym_set_variables.cpp sci_sym_setcolsoln.cpp sci_sym_setobj.cpp sci_sym_solution.cpp sci_sym_solve.cpp sci_sym_varbounds.cpp sci_vartype.cpp -# ------------------------------------------------------ -# list of objects file -OBJS = FOSSEE_Optimization_Toolbox.obj globals.obj read_mps.obj sci_LinProg.obj sci_QuadNLP.obj sci_iofunc.obj sci_ipopt.obj sci_ipoptfminbnd.obj sci_ipoptfmincon.obj sci_ipoptfminunc.obj sci_minbndNLP.obj sci_minconNLP.obj sci_minuncNLP.obj sci_solver_status_query_functions.obj sci_sym_addrowcol.obj sci_sym_get_dbl_arr.obj sci_sym_get_iteration_count.obj sci_sym_get_matrix.obj sci_sym_get_num_int.obj sci_sym_getinfinity.obj sci_sym_getobjsense.obj sci_sym_getrowact.obj sci_sym_isenvactive.obj sci_sym_load_mps.obj sci_sym_loadproblem.obj sci_sym_openclose.obj sci_sym_primalbound.obj sci_sym_remove.obj sci_sym_rowmod.obj sci_sym_set_indices.obj sci_sym_set_variables.obj sci_sym_setcolsoln.obj sci_sym_setobj.obj sci_sym_solution.obj sci_sym_solve.obj sci_sym_varbounds.obj sci_vartype.obj -OBJS_WITH_PATH = Release/FOSSEE_Optimization_Toolbox.obj Release/globals.obj Release/read_mps.obj Release/sci_LinProg.obj Release/sci_QuadNLP.obj Release/sci_iofunc.obj Release/sci_ipopt.obj Release/sci_ipoptfminbnd.obj Release/sci_ipoptfmincon.obj Release/sci_ipoptfminunc.obj Release/sci_minbndNLP.obj Release/sci_minconNLP.obj Release/sci_minuncNLP.obj Release/sci_solver_status_query_functions.obj Release/sci_sym_addrowcol.obj Release/sci_sym_get_dbl_arr.obj Release/sci_sym_get_iteration_count.obj Release/sci_sym_get_matrix.obj Release/sci_sym_get_num_int.obj Release/sci_sym_getinfinity.obj Release/sci_sym_getobjsense.obj Release/sci_sym_getrowact.obj Release/sci_sym_isenvactive.obj Release/sci_sym_load_mps.obj Release/sci_sym_loadproblem.obj Release/sci_sym_openclose.obj Release/sci_sym_primalbound.obj Release/sci_sym_remove.obj Release/sci_sym_rowmod.obj Release/sci_sym_set_indices.obj Release/sci_sym_set_variables.obj Release/sci_sym_setcolsoln.obj Release/sci_sym_setobj.obj Release/sci_sym_solution.obj Release/sci_sym_solve.obj Release/sci_sym_varbounds.obj Release/sci_vartype.obj -# ------------------------------------------------------ -# added libraries -FORTRAN_RUNTIME_LIBRARIES = -OTHERLIBS = -# ------------------------------------------------------ -!include $(SCIDIR)\modules\dynamic_link\src\scripts\Makefile.incl.mak -# ------------------------------------------------------ -#CC = -# ------------------------------------------------------ -CFLAGS = $(CC_OPTIONS) -D__SCILAB_TOOLBOX__ -DFORDLL -D__USE_DEPRECATED_STACK_FUNCTIONS__ -w -I C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\ -I C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\include\coin -# ------------------------------------------------------ -FFLAGS = $(FC_OPTIONS) -DFORDLL -# ------------------------------------------------------ -EXTRA_LDFLAGS = C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libClp.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libCgl.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libOsi.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libOsiClp.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libCoinUtils.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\libSymphony.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\IpOptFSS.lib C:\Users\FOSSEE\Downloads\FOSSEE-Optimization-toolbox-master\FOSSEE-Optimization-toolbox-master\sci_gateway\cpp\\..\..\thirdparty\windows\lib\x86\IpOpt-vc10.lib -# ------------------------------------------------------ -!include $(SCIDIR)\modules\dynamic_link\src\scripts\Makedll.incl -# ------------------------------------------------------ diff --git a/sci_gateway/cpp/Release/FOSSEE_Optimization_Toolbox.obj b/sci_gateway/cpp/Release/FOSSEE_Optimization_Toolbox.obj deleted file mode 100644 index 9fa3085c85a7f4f80d0e0d652966b2a4131ecc91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26940 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 AaR2}S diff --git a/sci_gateway/cpp/Release/globals.obj b/sci_gateway/cpp/Release/globals.obj deleted file mode 100644 index 6f52656e4537cca82a3e02f581d7d8d211932204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11783 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

      |5G@I0>;jy}!PLVlT6$Y4CI_K_W|IE;r6 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

      ^OgRk1uI8?@ik*HM-u+` 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∾%&`{nVA!YmbOP`6?2$@ObG`;mI*nw0)&XgggnK9w>it|NI2_$Tt=i_L1oEHOnVIE!Sn2$9k%X9(e>rMO>MP4#d zFHyAI6kgkxbvF|{weDt-KXh$u%XCe6OkUw~LaElF52)U8{V*B5qrB9+ZHn#DO7EU9 zd0CH?RqJs($YFJ`198IHRhp3oqjraCAk zoxEP)JS5PiF1FYQ8b$;CxTlSYf^prpBk4e=SVz3qI@%fcwvKi|TzwbB+X+8DtJoDG zFWm=1J5N6hpDz^gvG2MGKA)$R;qNK<>L+F2FQ=Wj`6amJbQ8Ca;4Xllz72!RZiv%I zvxkIxNw~L!`yyn0v0l^%!?iH$;z{_$J{ZzU>k0SPkHd7x^Ii01o|etW$o|X_H4}z8Mwb zjpYb>dX7IXp> zwe8p*k3e?zgEBnTha#-asa}=AR7Xkw$3nlwH`n^=!{P15m3k+#hv(O&=Ors9PfP6U zA8p`KmfUnINQn43N7C^$)S32E-fKTS3ir039*ww`iFili$A0>BguJvLu@6yyi@1q< zMuf{g)C~7n!R7NV_M=6JQ}>UN@Hm789+U(8d9jWur}l>vaG%PJQmWjZ2Ks}AX@6KP z{ek^RpJyMBd#zgPb0^|BcQe#==o^(2krwOnVo#&FE{EsVhbBt|?<9nx%i3_0YSUt! zBu?v+b;7b(z0S&=wNH44J%N7tJu@r$H`Xlwtok(af&Eu`7(X4q+1MbdZB&4vmK8=> zJ&kd;Wth_~M}C`!twN1G6Y0E|hvS5{`7@DD8hR;hPXle9$^;tP<~N|tY2VI3K3_z! zcgqkTlYK%wpYbfj{l1~_l`q&fo94gpWzM!oE&0>!Y3pXXv$MSTo(U)LVQ=j@Opo4| zVOz{_vyyWG(@VztOfM#AizASiZPDV{cXerfcy)GoJ!9#~^?245e6JPkL>e6!*o4!$ zMhB{V@WS&`xP}U6z?}y^-uh%^y;@_hCeKFRoFk5x||2q#yf{<$_q z%^>BnTBGjpo#Yvq_XVC8l=1{>Z-3XCVRF>_B0tVeE<}FXJY65|gwvRD%#VMqn0&Ns z7nSmX{5%tgY~;4U#oO6R$Hft!$M9W4tgZ`uo?XhvqjIzbBfT$h@@vShh))|&m#(cV z@aZn)Lsa;n$VP4pT%n-Dxf0=vL5xIDQMAS>v-<0>1%5n)BEA>zTj4d zeNcFB-$w8M)j05b`|II(r>3pO^XzcCK_&yVx~C6)M{&A(E*TvjfycVPC*{YohmZV>xf*Fa!-PC|PrsGkvlpiKLqq93p6bKAhVn2^b$PuT{vUrPnBpU?Q5)*#*OXG) ztKpi53)IU(UDy7gWv(G@b#0C3!+ZMpNRRh5e3Oi2ScChVYC{g%;00K-t_4glvFDl9 zbl8^`*+xA>fMeVx$jdRjg+1@Zr;bu{&PZy_p{K`*o#oR}GG%17*7r;KgT1E(Ym%9M7)k4 z$8J6Yq_yX4ZwP6`zm(xP?<+p9&QXVvPC7b27(tw4J86-}O8mIq9!1EDw3sKImtYP+ zybT^Nn|qMPLg1Idl-DTWIv26LE=zfZISb2FhWA{-(|I%T$g_x>xG}-?b79~-2XWTX z^CY|+A@h+&nao9+6{q}Tnpfm#V(xADDeU>c(R$GGDQ~UwtAN9+m0Y@y;cDS|4MJNV z<+Ky`BB8DMua*3yQ&v`$MP=rmIpQ(2ZFjxUwXj$>l;;h?^Cbw&(ny2n2dC{3?TJvB zudnFa9$J^IKVCX-rT+5$ed;{vzY@Hy{KtbIFXHj6V8y$+1)laTt@l?0SL>Z^pV3d; zEr9VNZ|xr;rQ&AzJ-?Y=un!V1Pov^qYiQ(Q`Eru4^m)G@^$ig{<$GH*dRUukzc0vP z)*!y^&^B)Z9lpEuW`w7CKj;MOAKGV}C*Z%(skgDQgRKqU`kaW?$=u8DNy%MIiE}$& z544qq^1#NuP3nPde>?8A?cag>tPS(u`Xyedj#gJ zhJj4dSPwcz5vQSXJdy10U)|M>=iW>o1wA~!2||cmOrsq5o*<^wfd|tl2Op|(jAvf1 zjdf|yIM<7IO}HL$&}npG$AW%`W}``)zrNnrGk<|U!(x+3-y1x+H+~#xcHa^0YNIEJ zO85&9$FucRcCJfFhjT5;sBz4-QXYN^Wnh?R;hoYpcO~-GHg?zi18>ZWxmWguNDB=X z&d9hf@at9DFGd_sk?_%+fd5j&`9aD)K2Y^#NZiYih8I>w)*?=MZbW=dZ3NFh!#>29 zBkpGu9zNT>0`ZM#A%)*WIQABBPXqJ63h^NmzZLO@e2gS(+JMXYmzfF5KijA&eooxph+m^ss_8S3aQ zz)7?DdQLn&eTRs8!hV&RhoDRBUsdhqK3~PXooS0v8NGx4St-BE@=lM3kMhDGgm$O| z`sN$T>}%ey8Z;x_4~g$RoaCDrvg#g5eDA?8fJuvK>|c1F_bfD{|9%AH^IdfncCh&P z9pHZ;Y609m{<{!ABuMFHB#niz_4p3xS!~4Y`+b8wwT+xVhwn^O&p|`@dY$Qfy~0L% zZ)W)72HU#Ac9_gQ>N|nQEB1}(oR~h;)7<*x-GcWXgh%IRrT9Xl@b5(H;)!rN7aaFv zR&Gz{`;lMmB5i;jhyDfMCg-U1Z99zH9|D~3=Pu|7XQiTQ{5qU%r1R8|W;FbqL(@N& zrY9Zzu9os-{qkPNWYS{0sBKT@uSln^eHuUR9sLwSUKe0~Prd&P;#Lp&ZCBDk>T+xd z@H$S~*fYD-x1QILHvbMJ^!|*x*CXsh!FT|DTRDU{$Hr;!N8K&FNKMWh)Eb7*2aT-* zn%>4E8hEihGfcUuYb>{}3n&}sBR(CtevG;@8~+&p0)DfTHg^v~Ui=<2%l<{gZGU6g zNoS(6lOM`{Rxj3>9J||5)-MTd=H5E5S17A?>J@qymo)ueNGdO8?6Ao(tafWx27cc0{&XYx_Ul*adQ zZ)yAhasDig9}*wDiL3d3Z0=bPntng-Exn&2&Yz|C0P#VOxSH=lbI-Z7rvC!zmfkNB z=g-o6hf4KA1w$YFv&b+wkqqeJljRT833*>O5x-Dmxa}s(HO(*~Z_KAV9!9y<7XKCZ)Ek{= z|BZEmwjz$Tw~YTCKR)|<1R*bN?+gZg!+5}pH2y*w$M7|dI3GlV9ScjCO9cdY_ ztgeWs`lj_UUHCDyd1fHaD{iZqNY^&eJhPBypOtHwwn94VZZ<;7#k#jVvO3RT&1h{S zw6+ymv^yy+vxe7l4S_FtGEDK%CUcOVmxVRsIahejL#Xzi^kUi}f8us%O1t9pj0tV4 zYsWL4+!^^O59`Xxx{J`$GO=CD@OCqNV;Wk=DnHv`p_D(5o47qK9gIO%7F~yq$vFl` zc-;>3YvS2+45(v>r|U)bLBxkwV-CYPx<8|EvERPtOTuHQ1xT3)XpJL&~#j{|o%F$!35oT+>xhf4Zh*ybbYq z4LOZC!K3TX8`>K2k-nP0-wyYU9zH1vYpf2$b^S(q+ar#>ul}7Y&a-wzTn-}e>$jZ{ z*Rvc5-xYCgh}Sjc?uch=u{O5{6m=3~R?@-mg>x*qqWRbOCwGSULp?6~9@v|h;g!0_pTn0WM9vU4n zd`lP@sF|Yp)Z^ykA0LAVq0S|^FCo!d#&oS$@nepT^#`DxI8LceI}q`7Tr%qm+K>f+ z&7NLy2O;F8c-D3v0+`xFo9D@rNA2F6j=bH=a1-|wLtp0$n(r{cti81P4wroU$Ud2a z5vNT(RKkT4J{6(L&azY9ry(t+g>fk^qv9PE;c2!ZXUnh|}&Zk?4&o?iEHQZGN;F6IXugW=kQNL-s)0Jab!-vKjX_W z?Ld4xc+xllcuaU^vleNrMdt6v{e}kS zk-%qs0P)^_e5l&zPh10WJ~yLpnDAl5M{523AwI7%f;g{u4o!d8p_n_53Y<7+*}3!N zYBrre3;F~D`NNyXn$KDDsv_rz7F}(6z-XDbt-305x9QoVIe*&*l$rf~LZ2U(iBpn; zUbl&5Xt8z(b&$Hzrp7(ZHVGMM12>@_)CN8W_X|)bYD1sPI>LBB9QF0k?l3-vAN_C7 zL&%GEC=bhQA!%Gj8si!5=ObRsQ*l?M^n(BGa>VI>8%Id`FDT20^w|HF%81g%{bOdJI>s|3?T|lluW3prLmn*OvI-h-b%c>X`Mvu@74R+a7p+Dqo`TVdlTZ>yr#{)neoUMcRSLoFOIqs z`{HN=VqYBFvorF=v8>VDs=~URj4$r3z~dFqBXkb{$5Q&@-X?f&M_BO1O{V428O7wr z(rcT~CuB;J^TSP2f|9J07*pTZTo(1m<@lFynaqHncg$5+HSx?%Fb^@lIob-H2fPdS zb{=pi;^~-Wd~?k69{lK=dpAN}if8TW`v6m$X!E>Z@)TitU!2Yz)OLOd`K;~CXeRE% zLQ{Ql??s&U^#c-qP{NNOR9SVrz6)t7E!0L_CdK=Bgs0_DU);xp$0t0Gu*PSeLOH?X zQ%L7kgoQZ`*J`(TotlI%E~i=6ohtzNbEo8yn?QZIzPaHEm2Cpg+$7{-JyJKab}Y^f z%V5+6)iWLE?~yi(+xrWq&0?7K&BZY5n~P!AHy6XyH^;KYF!jfk!PEy=22;OV8O-|H zVtzXRD9fk5wlbLd*UDh$wy00_qm|{mK=QHeIQOwO>wAdPKgN)j?fVFc_XCFGybt~I zhlrQa{*liYXs`}QgMF1We!|euxF7K{8b9^lVA{Fa3GO89LFza!y&5`I_0A4~WELM=Dv24ylo2pnF(^K*6`6Mn(GL1JNNa7w68b$h9UsO8QKNi#ZO(sjuKbFVCH}V8e{bRpHob~*Bgp`5)v9!;Z_{UNh z+F1Q#+lqgTdS(4%#IJ68vMdA$E@aPR5OY><-3_f9#`(Pu=Meo-=}MW7 z?<@N`($rV>E8JUO*{>0|zOp|cZhd8cMBMty{)9NMc#cb-6@6uY7C3QAePxrW-E@Ad z9sD-X+TC~5qSG{!U9|3SQ%r{W$>=>@;qzYu4I{Tm_a|Fn!+H{a5MUoC@WXHVQ-;#VV{9rLMUh^PD7*az*He}3dw zW1Yr+wSRUzv3|A3AVcO?o4UcJj}4WtbA>Il+E@?z{cfOReQwhbk9}@4h+}+i+aj($ zw>h}CKDW7uTc6vGh+CiA&WKx|+b)P(pWE(;Tc6vWh-Y)8Hn$h!k!q*5tN_}r$h4(SYKGUM+}-Um=R{+7A7wn&;1LKBX|_cWJFeQ{;7l(3rm zydm$PJEe(#uI0?e%(t*l9{Q*Ai38Ebc0O?s;_29D{Bz86Fktl0EkMXi@vMD*GGJaQZSY~pXKipsGjWFtP4&+mf;esZQzTp{;ZqT+tUB&L4QVMY)J9w; z#XBm(({iYP?nvQrwC5500L)V;CwMGEI8)4YpG1M zCzJLg=H-~ge0|ZP2|RZb%EtPo&SdRdoO_nRs3WR>I*&L(+A`LI6HQyjFzdIAVb*UK z!>r#fhFQN|46}Z_7-s!;G0ghyVwm;Y#W3r)i(%Gp7sJkm4dKQ1iDBoqfLXs?oX`60 zIJdI4>}<3V{dNp#@yx)Xq`t4#mJ((;yzg-@$;(7&7 z{dP6PSXm7Mk{-emUyTmOQ)n``;i( znNROH%4>Xj$0KfidYz0LpC04Zr}r$6pZDoqj5PJ>t;W6e>2)J+eR^vVw?4f-#H~;7 z62y7Mb7=b1=+j##aN?Bu^rl|h>HJwee60t-hc{2W4=wngCfGii^2H}O_^RrJd+}QM z?}S9|**Rw`#rXhJ#gkZ)X+jw$c!vc?S(s9nFfdR%n-ZzAnK%gfcUVeDw3g94Cm(>W zsBIm>y&bzQMV#Xdany%Id&c-Mew>Fl5b{#IYsYyX#R=uOCH=iwR6#9bydbsj!~IAz@+;YJCcgHUBQ(w%zo+sEJ@X9R>~c39H^x&qyO~?`x&a6z^t?=Vf>=PVthC6F}egsT-Qmeo2cw zFKd$LMw6#A;`53od0uJq>>K5|xk;W^nLL~)+49`dB+soT&puI}*EY%Xx-?JdJFjd~ zzi&wK68|j*E6*F7(0)^zC(wRo6WVV{@e)7pw6x#ag!bD^o;guj-_az`J53(yvE}ow zCVB3ZJY_m(*C2ey!P0v#@^KBqkkv`h0-~`vhswev!t9 z85$ZNLA;E{M}59*4RRgg?1$G&_)-a9F5yiQzFNZ9NcegQZ})9xbF&{*4urEv#!5~kTNh|S{Ehj!xV=8$MqrpyIW*^7{B*KT)RG; z=)I>w;+uUP@mU6S!k1&l>EF?5ch5y!p3h8bBG2b2&qtnkZTJGD*|p)7i0i)SNfDNH z;Ny7@>MHOoTL)fE*~~id8saVGi%{Xcq!%LIXWol?5#zEht!M0Mcl;wQE+LOVRqdg5T|bZ2_bccJXL4--C^?CjGrAth{trwMjn5`eJT&^waQcA z4?e0}9tM4|`BWcnfCQ3VmPwGw!W@dKhtS=lO7o&G%ic`0Z?e-Xf^rjJ`A1 ziH`i$)wTZ;545~r0`^4Pl5u<(*6ZD4QV(S?^=%Yk zRtKifS`av$%FL~^V(Nv5XL&C{Jz}4w`F6yXJyOI zkyc$|Uj30)9>2{UP{POe!-$W{7t3JVoqUQs5_hoh;Ml)Uq zNBW^i=Z|M(+WR8y>Fz1O`~TSc4){8X9l0LWO>DU z3o_5krlD?Ozv&$H`2(sJ^8D_9KnK#lLL6O#@T{^~;Mq+I&a%f&{N$#DotuhgHuCAb z=H@1RsRuA!H?SV~e~STwRqxNdJ`!(HVz{0Ol5p$j_HW=9Bz+4h*Nz9zn1B;xX?V5)zLA0y*;F97aXok z&7=5BgoZ1_^#{a>Cj<97Tg1Wm97?Hc5cRtfycf-bk*{o5HRR33HxIk-0&091!sX7C zaOuNQdf8@h`A-17&1?&iF^+3IGq>5bos?$@IQ)kqy|fM|8rymnjl}!Ww3Z)<<0x~2 zT%M&aPtYet!*YkET*}2Mu3R}sTU3+Le%UNj7Kzu&hiyv;r zw{@;|by#SY16~6-+NJkO`3?^8DJvMJhTkFLmzf>E3$1)$$YQZ}1O@e6g z2*VlYO@iq2;*9fk91d(>rFRtQg)ru=B|Qstc!Vt>y#Pj?eIn?&WwgU14CkV^rC{J0 z=b|?WqAizm%W~3_HMq6salSX6=j8e6Jp*q4pun*?oo6!70Uoc|wvTOPo~_%4_58yH ze+9yo;d*|$+SIS;eTFI5^g34;vBAzC=OM}qb-cTZW~K1OdAR^M=Vji1LC!wcIaTuy zBV&@kVCsVWTxT)=lxMr>9>$E`lTkO<9=#_cL{k3jX>yU1bzPdm8nyWlyLrsB5_i{H9B+EF!Y(64I8uEqUQD;Lh^u?}&{2yxU_r=7`o6Mpn@ zuSdvB@vfiXz03bdq^Z3W=Gh>5^3rr2NP2v~j&i2*-HLpa>ukQFX%m|2<31m8^4ct6 zi-Z>-R9;zE(&_-r^M}@m>!f&H5uVn=?pb5q(kW$h+cI1mFi(bGlyMQ@ys~L-9RRg$ zrhJA|x_&x>Gb2y;R6`Fse#&>jXT;kSI~>#ChwVt&2>UVic~?qH$uwx_I!xu5a!2}c z|6d;TVVrhDu-6f%-84y>`mOWIQ~z{cn);#h($wFam!^K@ytG>;;ZuFadHG&5Nxs`A zNmIXX9?j6d8@FfZ-{m{H9Ix7U!{{UWcNtRCU4@Y2e}rLxH;Q;(xnnk;qrq}XgJYL8 zwlNH7T#a}hjqNsH;@|B-oHDmj!d?mcBrHp~Ny5z%ZjrEG!Yd@aQo;cVw@NrD;gE#m z67E2#`ju^^`t`AZUj@Fhbtsz0A&r-|D{-@U1+&xR;oA+s5Bp-GLY`|RkM3<;1sjh0 z68XH~J57SGd@FvIpQ3rP;4k1mX*iP^~lSMX~awTNqE&Z&aZ#LJR_iy9t%mG*uR|5b>7ypo(WjEH%~rjTPJ)Z zG{X82C$B!w5nhyM?we%s3g&r&r|tG!#M#!*M@W3;^E_ZKRUOPU`hk2J#-I9k`Ticy zwd9x&pZ_JU?yYdIgX#48=<~m{D-ic*(>D-5@bAWFWi>KA@b9)Gp5DNpj%n%q5*H$G zdcUU1Tnw1**YMrEOAwFzywfRQkDvK{6v|Dx%`nfi{VpYcfv@+`#0z}AmmwbddP|H4 zzTU?mu60&l?{$E|D7L=dr@4FY>wP-&2fkj8yU^ErgTzB$FUMr)>%Ecjz}I^d;-Rni zS%`BPzP^-iak{rXT0tf_2$ ztnaA{I40a&RjgruQZEqBK35&V@yPhg@S~qFwo!c=@N|4C4bk(Ko~|ce2|A(ve-+{! z&#yq3&?=Z$BhE|5dYGpBr|R>4IdEec<$l~Pfam#q-JH$QkM*?Odn%aM09WNv{du>N zZshZ&{Y{_mYmuhctZ+>~BO5oxb^ht-)9q4>OXyqMkJ{F+1CL=_zaDYho?x8){Zjnc zr*A;WOLaTjCtOn{xJC0O!KKcIN;YpqoHFuegzR^gsj@@gFZ14xUpT)Ik8tuve(u1% zF9W(<`N{A~9=Qm@rE(GGQ@K#zFJ(r3zi+{PsIT6Nxc2u-4d*|VtM`Kcxf8CxdCz{NJ^g-L zFX#J+_rgf;PM@z}*YQg4LqbFCg%1-C_;#%iouqs+{t={6X757CD=$s=3$kgU{5b#A zM?r@^q>oAXafDj7%I7Bm^JSwIv~1;<>6x;C_i4a+Wz!Nq)V`%HHZDKn)AsRY!f*UJ zp%voO{!$w(#{YuHcYfo~BhGR9MT9!enTKU&%PX2MOa2fyzpSG9YE;%&q^z$Y)V8F& zD6P;o{|0b;J<${26k6noK46~~`Hcxz`S}jZ5joL3-vunsZ|v!z-k~mG-72NgZm*Qa zeoN94{#7>AUQg4&c^Ohq>TKd@U4Fv4OeAgfQ^Z*Y+aoUPXF`K%Y*X@K>ka&{ZtVAj z$E@F&dG$wHY5XeltDJJ|IE>0s{$d`&erGw^GVtt)l)-t00D(rL+f$?}@@8;AX- z^V_$@Z~Q^EUJlO* zrtg^T%PZqMo(?mz&R~D+&ijhA*T01FV;}O@6PWiQe@kJ35Bb{;mhvHg4=}7x;4*T) z=kFsP`;dPiwA6?EL&QTLvWVHc#L~);wCq z&xMBikeMIDCgnpWEcPM)0yq+CM@TX|3mQqiLinXc{*Cv?-V4S`Bfz5)vuD@@{dILugOWIKs@5doV#xQMq`b$2nc6jN_SS9OaOmyawWR zc6%4IAp>d$ABg*tXlO3;5=>l<`1Yh8ug#li?R-90@qDY?@m~aF|bd#*uXW%%x~XUg*h(DQw1R`^VGL zoITSZoepWAa>r##-q^mBnXrFje{`j^l&ph>uJ3ewP##G?mWu}keH*8R{^&R@^hd{O zp+7oK3;oe?TIi3C(?WlAoEG|{-*KE4`lI8t&>tPAh5qO`E%ZmnX`w$lPP+ta zG+rF<@tH?wppUqJ#*i9tIYQ!{$#8=AZv38wcwQf$ZSy%AESEGmrb*-B3OEfeo%J;p@-#>u-G4g{b}08d@_DH;YXx8V zR{ShKMYCRTnMQhv4oJrNGVw>(0hj%# zyo8^GS8e0``WH-FKqEaCk~*<}InV2Su4Q!q7Wxaw2lwX^J`x&XeTb9SzTLu$^3461 zEFOGYf~W0vA>wT7ixCo^`8*GWga@Y4AMMjP{xE5B-n^^Ac~r#JJsa++Om!YrHSq&~ zbbQ9_9Hs~U=)(|C`=iqn+B7CS>xW$oI_dqODsvQIx*tT}^wEe%zUi44wuk#YY{O%~ zN6MonG>;{}fv>ujc!96_IK)F=_3?}czUp%k*EUdJ^&>>K5h?eAOJ2 zp|84C;-Rma<2CeEU%+_at8Pa;^i_8v9{Q@g5Z5(3_r5M+Jn&UN3h}9Y)t3T?SG*?W zI*h*RM@u?!a(&e^?{&W(74vcO)q?n~IdVz;aNIK9gCG4xv5o7~ zfS1@(jt1u&=n6|u*CS=n5xDhxZbF>nz7JtSt6(-G&P#Pdn5O%;>bKqq+*n@ex9$Zz z&u{JK_O#!63vg97)fd@Mx{=?S_B;L7S0GKVT)*{<`*82t?`(JWskZw7?!$K9inwiC zRDyVyaj7zweM%@!`>F;Rk^tuu+WFS z9r0L>xW1wfdk50=%JpIIh8#)V;_tFgPc=Z-XWKgIYxY;7HwrbJKUKyakGjmAaDC5v z_9^Z0C)hex_Ge$?^A)U}s`Q>DG}PX>mUt-N?jb-|DW8l#1!(|%a8c9oqU<_ zXFpSDh4{4J)P{@kpY8FTKl@pTbId*mp^kaxVVT+TispHeKg7*13(t8)Wj$ZYx*4Ii zCFMnFg|_{RfaB|lo_Mj)B2V;9`?ScPO}NU>%UF)ciRO7ZV0r#*PY?AD^$P1&DUCLJ zr8M?il9uqVvZ3~Vng*Vql6q2qGfnIATGnMEX{*~1XBljdxUAO+4W_Y8$%m~s@WZ;X z-xD6Q{%q#eA8DoWtIV5n%CX}xDo6Q?c?kQR%)cKId07H-MJTnd;xZ5iniPuzbpI?B9;R z*Fpa_+nZO$zddv2_UJiX+WXH1FR`!tg$d02x?iHOz}Nj!2TS?7ZvhPJ8}I9W1>&)< z`;|gVeci7@JoI(jIEbhp`qfNFTz%a(J@9qk%Jj(B%{C5w-8N6)>()G4#_NTK`ns7P zLn`I#CM@=KzX7n&*Ufn7>t;Okb=!F0>$dp=U-uiCKk#*P{D;17iy!#9--7he*DZ1H z>y~)R*L}Oolk#=5+|bwkHdn6qbz3@tuiMgyeBJLN-N4uV9>nu}-R}jQdmOQ^o3e5! z;IXfpeTOMJ%Ix)PRG}M zC-8X1Yl+y`&F5q3>;9nNe+Xd(U-!&4tlw!!Jl~T$Y!bisUm@iDaeku=aV~II(cC4x za!&sX;GENWe@W!`*8H4XlKchp@gP6fdYWI)NjV&Q{}2On5@>%4>9p%;BXE7P5ckw> zp9Xw^sXA;aaE=EA?sNF;=hW~%FCDBQJ;6tIi%)we!Jkv}pj14;#~4oKKN|6vPx7XG z)(M@jT0ZC0)K3yuI;=l!dDfd3>%+Q}zi&!?hY@2P>mq)T)$*t51Bi!qQ9`R=z6V;i z?+$Touj`SOP+;RA#4;27D)U2&@BA@8L?xN_7vwdt=kFF;glj+kgs_RkMr2ww8hRcq zL3Uh^dR3pKn~Tl$xvwG^~iCcwBHKa9J+PU4Pq5_f&6arZ3!bX*_7R`OVIQ5H(?@@>bgB+J3u)vH^M_xbhi$M}+JN%NXF`ZOA^oR$F<0CE z)bwv6ein2EFpEGBuBPFk;jtAf&L0{d8SEJ_-EvcB;dOPge|RtZ}(Q z_ElN=C*o?;67TQ$ajpI@guJq8Xgg_(#f7ScMcA%p;@{_&np!%#+S=M1J35+HZ)h|Y zZq6^Yw6-+zYz)Q=h&Q&kx3+^v#*2t|bhfv)th=zjy``yToxrOI?`m$YZ@<{mnT5Dw zFy8@)H+43)hd8qVYiR7OZ`#n@=KEQqdLDzF!`+i4eP1^>a zj`m^0>UFk`?7xoA`p%|~&ZadTu3gxN&Gk(!+UD%Lrk1A8ruq#{mjJc3#o@6JSJ$_< zH#N4Gy4o7*I~yIGec92vp}Vov)==uWxTCYN*_OrrT-#p1rqtP5THV^!(jcOj((^_B+vbv*^LzNJ(T*=)V23EfAQocytmQFfOFiHx$J z8(PdJ$~#Qi2S)@2byOt(s-#J%*QL3`5v!WL*1!+R;M8^$ISwy z&kN}3+^S`BZqJNejLsUNtMg2VAD%ns$0lrog_0*rFVWYWW2kdn6m-rrSl1O6Mviw7-sX#G7pzLYCkSVoMY)630EM@ z$wW|tf$(&=ONBHneE0l(0P~qv3=_CGKd}iyAw3ki8*zj&$rTz}Vy2rDvcF?$JL2VY{pjT~qmzs`)|@KZMrkS_$+*adOe-ur01(Yjd9X48*^Tqf!|M4_ljPH~<9r7B9xeIu_zi7Vwh4Kh2OdjP zl$D?F0MjG+R3B*F$QNzzq>Q5J^<_9eXp)w+@gGr6zgM}3D0>EYi0CxX^{7Tiyly%T2pms-S{d96 zHS$_bU_beGLp!Su|9EDNQ#9RZ(_ngnO;T+x1WeaCoU^$8xCAgv4XL%prGRmrW9=rG z6a9mmTXDqh1}NWA+H%Zy8F0AXach(&oSZx8*EE+Sjcc85muSn`2pGFkU_JwB^&!oz zcZT}Ld&|y-vv$-XQ$|{L-LuH_16~Vy^?iM6(_6l-1bm5uuf-&iN*h2L*FNjYV<|Y> zeg-rvlZ#_yfp~e9CL-+pp-Qb=}c$t83G=!c<$jEXuewmbl*C!U5w4GwT<;|kFz@q z^GbobdmMa)^9bYH@Qdv|!ga3Nj(gfcx-YQx)rv$eIfw(&x2RIWAMLBva+TdO~fv;y0K@$2!6<&SWczZ-BL%HJ~( z*ZL&+3+6_^d1cd*x~i-_9k`UWn=jg7tqpV7eP%iI6TO`%(pkMN6S zig1;wALBlhsh=ROd?)$wO;f;mWz(`UbvJM+Q$LgN=Xo^2K}DL#8_SgEC6Fn7=ZtGG zU61|(_pngHCbMhNUjiP>)2{%7Jf)B+ON38HmVOO9UX^5t{Yt&{8^QZ6!a$Z%$ zvE}}TvL}Rl0nJ^W$>SZ_b-HA2B+Yod-8NI z7n%MFWHhwzjurck@<5s0G&7m4Z)r&F*k!p(V|e~3w^hfa<(BbT_{DNdxXSHp+=p^o zjkwk|$&c@o0nRI%mX+HBfJ?bOP{O%+G{Hedn#dc=t>-0>+dFgQb{@)_s?l^UG9S3H z>>dPIj_jseU7iad?sVjL0q}TLl3&UQ<@aF0t3f!4{6@UwNN^g%%Sfj0D#$RNXR~V* z$_8b)eKHwdYad~apP}r|1$$1MeRvq@2YQzA!|{vdm2j2UBXA$e>jM$jdL{V_W-;Kr zvT0d)eE@JNuSZIFR31%mP?09`#`5ZU3FP(G9C|e^;=QKlccQ?-<)L zP;SJ-9%x9q3ll)PNT(O*6LRf`=N~|i_xjAha>T>mnbIEgvHP}#@Bb{odA(>>-a84_ zpS-nac%{AZ@3F!;I@!m3W7jg@N5vs@4lLg3y+_ddnD+{k^m98#2k;cnULqMch^_o^ zPyfi?q2D_+I67AQ|4s9PVcyn<+N{TeB(el7F7rR?~v9hYPfG?wk0LAExx1w z|B=~BHSkqQWR~lJbHsM!{lkO%6>@(9oGg-quustPB@WL@zi?m zk)Y?=#yz9DA(#JxX_j*F44Q3EU5B*-&Nk5Jf60FvV5}3{Hd}{T<^rLWmxpbTm#0JW z=o%#~hxhsU4lrGkFO);&kNND6?T%kQjXCB*p|K2o$FuOlvMF0(d}@00%*8_QE|3C>o4NV%%#SQ)->W(Gh9sthF!W+V%e& z)6mr2*uIW0!mJPQ3P>++7F0XzZRULL~> z`B;yKQ9t~4@tIXq>0N$HsG(=9M_wu7t%+N3>(hsO(Mxt-QTV0+&N)WmTLd1C^DL>Gz3w&KT#-)K(wbmS=fA3~;+)hW6m|_opGg(*oSLcTYz=+)CrP zCOz(7rFXpOH#^dt4LI21d0wT#f#FjB;HDwXLs@f=>Nl6idN{b6dxq^cq@zh&rU{Se zZ!V9-2)0bhUd#B_@<@MgCY{gdpNDkXJuG`$&qxXTETyd|sgEPt*6&DD4;;P|K%9+3 z~aF_ogz$nKSc12HbX|pT)62O-$ ze2c^F1?(KaHudAclm5q)OQS;ryq40ya^p90U7S|sm7bai#Laex0XK=-x1?G@QZy%gsUEYEbc{bFD!t^$04q|HpyQwj|ZGrHZAKrdJJ%>dv;3rgglzy zpdwA=)xCRL9+ZOT1^M*7puFcmCQw$abJ%~^0G{r@>cSHN^UoED-l7kl@agpHlYqx7 z?$`AD2&WdW6}%@S^u8jNhc_+daWU7sVJz(g@MjVw?U1y4=xfKEWc`%vSIWiGT$=@! zL?6mG-Evb`M;%8Qx}N#2rLU>5a4zb`xrjg7+LQfME|~x6_{}TMH8&vSMO%SzmAM;n zAIjWKh-dQ`%rhlF{XLYYXIL7>JPV=nN;=H@9Kd|pC`t2X=z>ltThw1kzQjkueCf1g zjhanM)_K{qWc`$vmaLQF@{+YsHea&F$)+Xi6{fM>lKLg~8`IdINm{yHXv%r1r50*ZX5E|n5&w5 z@Vef1!6ocaGmwEDVK8$lG{}Dx;a#g!G;0alkcKTWm?6A6p(P9|*KIJW-X*&%Gt z)7%Vqk)EAE*m4KEWI*^P>>PoO2e6e6wxMV1#=ahfqqXWBymjLh-I%D8c3N*R^N)?& za~f!mJsa(zBbz$!xrj$P&pZ#Xor+}bnricW!0enE*j%*dULf$aty67o7I@a~s5UP| zT4GOBn-^)^+Y;60#U4i6pxV4dq+lgcg{u8blG{} zjlPUR4bxS3zZv(T?tTm6$~*DifFJ$%wx~TUz~MuL7Y*>%Z0Q-?3;=NHldqCz8{UDkWX-2-vSLNc z&{+Q_eYhcs)G3B4XU$z~J z=DmRP%BCgl{rcSb-a4Vh8!xpM)@q^t;80!~dlvGs#Fr~>*tXSi1yj4}*<{(11~)J` zk~4F>+@Mv|wmV+V?RXRFOx^Z2gxU=<4$a%8J$Cv8w-#g@CcQ@;Q#9`bti5~{l=WEs z*jP{R7CXjM@CGdR1iskfV`w2yZ$FNKvgG>l_B_vwp>BOY=!LqKbJPa_!?#LY=i7It z3zkmX$WSjPiHJs3f&5R$&b$+NykdPrJCoy;WB(wYM=N+ALU?E_-4(_@c~)I=m)ze` zS%yk(iyBL*0X<}3PXs9-SCzw`l-dOxPMN^$rY;j*svR zqpHH!Z5k9j4vT0&BJ)rmEHn#?->`g;7uw=>Z0*e+z;F-9<&49b=!2h4t;5`27*0>w z+cl}R8b#}(#qjYUg`qR{tbU@B?%8$E)b(^Csch`y+NKNJH+4R|kmrZ7y*ProdStXL z`i9Y-F8WL+CGqwsaq$_!oF)G&V96buAfNe;O`-> z@NnKH-VgBOy#0NIylB4@t~S7raPQ_zH=o~)xX$Nc{vZ4NGC#{a{L>_V4Ry8B{kg#P zY#7c>IYz+=+Dk{s35}OjyK!1e}-lDf@?be+Jz530hkF zBri?-TlXISg1qGWueoKWQh?6ga zm#kD)z71H#{s(puxV%(Wh_C#93-`W_3Pm$ZaJ9TD#97_}2vvUAu6cE>j`Gfty!Ynf zC$f@9E0D$1_?u5YFqW8ybtdlz0TzA(k!h@>PlG+J_A=AbbxzW>&Ib$MH3;)y+72uu zq-XiS_ZAi*A1|hTcM?9nBWYIW1Uzb)a1PnFKRnzbq~t%nM&r3mw2q!IU# z>Sygw%2g~|PDYC6RM6!`I%zph2a6P z(Q%=ATFcY^K1*n*-eOs#rTFQ7sxs#UWonz{jrDX|(S*FxKM~5N?l+x^Z@bYy!8NX~ zV~MBVcjMZOX^7+1gR))kaXfGza;Vq%b+6w?a0|%)$TcPFLRnFZlxsY~C}U|m%+-r} zDYk4i5A~VLlfl5+zuMe`bhlktVfSVF8;{t>t1^EAz0w-%8yfG0o1c7ekKu2Chx>8F zy_dN4qoer7b!lXqv3Lc@&@hgeFZt&NAT5BEakP977WWn`G-m_eKZvb!thrgnfr#t( z_eg&(;yd?JbVv-3lQ(^8Sd%D8+TgILjc=Y-rUdc#*wFmh;zA5{6leH zYVNtxEq@%(4*+b$Ww7{1FfRK8%)_~@SJHhvNay_0D+HMC;zZyx7p@IPx8MlPD@$WT zrA__Ziy&V|+H$y)!u?lQ7aK#{YJ6+Y_EHEt3VF~EcHf9NM@Mw(V?PSEYpS2G7Adl~R!cGBBj};w9^K``VkS<1k zQt#dYJh)@yMT@Vp=Dz7yG|P~uw0hk39rvJ@GcGO)_9tOy61Hw+=xQ{d!phb3 zPq7h)a#6x#Z1mwM4rQ;@+26-KHsa7OV;%@A28Dw?oUksOH9g?=z*jJS(Lh<#U3{cR z&P%XCM7^|s2o`*Qsfor6`*|hZB5A(=00GD%7V;(KQ)wW{! z^ns8UoqOrSSdV-5UXdr9d& zRewuGw^4!+d5r2a9?0~jUN+tBZTS5z%RlCD-zVT-=kU9YJL|n3b>+BUi%`517)OiD zI%$KQ3KU)RNWh&_Ncna;i*V-@3gJc547l?z5f5)rBd$7#-)f~Vs1>kTW=I^ba0a=u z3glrrKA$$=@ruWtK3hbe&ph~+FA%(Tgx=?)^^4teG8V|2%6+HYPvSQWHZ64y*Y=pc z00czp+OoYoBPqD7vYh&DXCZH6&RoN!z+{wVyY zCoVzAOULDfi0jx3@g6OB)<%cYxD;`Y@yqh?0ngJJtX_Uj`_!pkQe4&n_uVgQNZ1t=X^C|i0hmj<{$U@#V(h*^y(yk z4Rx^6-63$@#~Mf3+W~tFep&ie=COeDQd?i~v$#d`c)?XWg1A{coVg$2<(G};-~}&B zBe5;iS2F@!+9KN|e4K zeS((OKFLed{?>iYry(!-zCO3ilzdoU4f`s~Tfsa7a9-q1*Jr%H3Gh%RpIIUQvn0Rr zbtB^B>)8lZRt9iivHyYnT%n<|LVV@-O5FQ4g0JTJf~(~{4{?_F0)#3*Y}dTHzA(!B zBFTG0E`A~_d9(sqOpU*nftHS0)|tG&9KYCC!#eu3z|X+4(sfSw&^o^Yd0FRIBFuwn zJFtw9p5+6+n%4l%i)n+nuf)ezNwYd9;8DwbEz-%yZ3y#V+MjHPn}CyT$D(-y;Jh^d z8-?ae1)uxroC3srKyQJLrAk6Za;4>{<*Cb78y-#SpA7LJh zG+0NrtK%op&)T1qt5~)yF2?7Fkj9I2(sG>0otFDy;Igc{5E5Ve+LfF1la|YN;xCWK zj{(k$Y3Xs7(9vr$+GcrUJ)KrGA+Pk+ByFAS z^Bg0-8m?2-S3|teSHrZ>SHtlT`f3>Wn+3b+tGO@Mid;WZR@4^dJ`!P+v9u-Td^OZd z8BdJlp+0kYG8oviuQt~reUCQ!WIyexpp)mLc{EzkR`rij6&jT=dOyo2j}GW0>y9z3CN05sY}QF(Qtdn&id zzOX(ta@y(3+!_~6(l@lV)Pt{#0xi%_rx-vvM*X(5{eFYqcRZvGa3E@(IpG zT~b!yCmb!Gw#wj)C=UaBbzPNNbBq1#8xHH+R$s8X`;6sv^%8b@imsHp@NB$pQ?Z>Y z7j33w%dT(2XVLVT8rovKr>&^p<+>nv&i^ZrFW&)pH>QlUGw6@x{Pb0%g?pZaReFxz z!SObsf4bh$_!?;Ft}F9@9r0vm^`2dnn`%>2{0889;Z6Oqz7;EcGwzogH`b==U-q@W z?*Ut|hVOIe{>JyvzO={H*8DEw-zN-t_{@l|>1fL_{zIhAD;CWU5b{!+G)c?a-ai5^ z^WQCWLm6Z~%Am?4c~N`yXTT@@pCa`1!THY-=f%1Zu66k(=|kr*5A!nZR|vy3sFuSr ziT9fdcuf1rBx$7WdBWQAJjgJwEWg?I_#No7J${c+*90L<>(8;1rB^V2Kt5hfQ$B1x z!H1^BZS!a3aqaB($Nqvi^RtYkoeJi!LRQs?j(pVgoq`4;F*S2ukdxSqM!N4 zfT<%QZIf5rmfhW#=CD2M>Oi?Gbq)4zDfeDk?sE$m+S9)v94{?8xbtKGI)&?CzXeQf zv!$TPy#E)#PFdxid)XDhPCCiK?g?P0oZ{&HF@T+Pu7gn?w2YIaj1cb>;IaMg4e(A8 zyuSx9+K%M!9|7!KDIe|3|qcaMg0c|J~nOa z`!~m#!;Am2Fv9ISpmq-GcCOHUFA{;jEnQe%5`!L!s8q4?3o4 z=Y0w7!#SadG+x=XtPZTIb$VqMLY7H7aha+ItARtBvl068p!Me<&WpN^aGeL{)+X}+ z^D=E7!gwACpKCs-0v^jPOp-?0o~LLYNb{R*gBsAKUOWV$>e~>e_1AeIO|M`MMLu5S zQTed-1Rt6f&jSyr)pmCCz!8WuKg&qksbC%mI4|XEajoO^aD>E9w^vf$z49ypb-3=| zkZ!2YMZf!JZ70+3GtuXq3qpNvz-z3}4**Q{x!Sk;LX&eYDzK~^J$@kJkshC)!gV@v z0br_QRgWJWz*LVf3}C9q7X>iY)#L0>EkpHqh^Kn|$N*3E_)!6jdYtcNJ`noy zXu$QtJM*Ew+?P!rXi6<+-{?rnKgX>f_qf;ndFnE&ev$i>GQo@g`bz@KWS#``F z5BLHz$BtoBs4@>iT=C~lxO?K}-E%A{oc8Zh!RNjrZQ;ZB?)p2}RS1^e2{c}HXHxdw zf;;=r0$1Givf{R3~?ggWe0 z#6um%{^Yv&VSwwk2kYXbf5NSl1o~gqpX}Qnj*AJ7x57ehN-eKV*1H2TW^{ZreiqVc z+nkAzS2isf`#M*iUF+t`a}cULu}t2RCS@xPcXRPd;FJC%5c;xV)trksFV5wJtDSRR zEnu?VWnQM$A&l)Dm1ojkT>+12D<(-JZO>C==cM_~wnroAQeUn`sBIL&Vml{IuV9*x zj~97VK5RX~ho;4Cv!Pbo*|lvm;>^!+m$Va}?**Kf^3_`Fczq7X-RowE$Mp>8+3-L11yuj5 z{*C8?3v1JBTiQ@d0i*uE2q7;W+eunh-(6hmbjT$LS*FFEaQ9lK>byq-hcqum=xIX3 zUxqj@>NUbu=U-l%=zQj7S`Wfl=d&EvleBv);4zJL&ZEIJ!uhjp5b69hzu7j}1iI9L zn-QvR4Pjb;>f^lnUx9qQLOyzGQBUxpX|c}VigeevPUjCI&ipJRsbj$m0nSVL8m@J` z4j?3cy1kO}?vb@E^|k75(hYUD=<;c;ZD*ppsrN(O-3?x2-Tf%QRCntNXzyulw>L?7 z$Q&n%51DNXVEdfmRc7FgQ@zc8)G}0Whj^;DuL|%~ zZ;u2p>TN!s&Nb~Q;Cjt;O}i(WQTuUU=|svq$EhFZxDVH|R^Ln{dTegaefUnwj#@Vc zb&X59{5=M6u5o$KHSS{(r*0&E9!-uTh11SmI$_Kz^hMT}EdJfjp3OK45@&qc!x_Vv zKcSK3UBmKVGmljEx7rW-e#vxp}bMSBoXEbrsuhxxoXRS89`Nt>XC^>MNG7 zy8K$)vtFtTpNzQn$2GWrB7S`4`6&o_Wz&+rqAn`{=c%<$mtBW2gOBvEZ&|*sAD)E! zYw&wIe)B*m!7J1-&GGE?>N5~0?bA$<2N*X3&MRAPREJqEpRFJA={tUlMZfagbLv;V zv(I+{=ir_;Bl$oR+xP#T=I)a&x6db4o9hAJ8TNzt18x9(U3rYzt$*Mq#Mk$X>ItHN z6>VN8KnkWW0q0EvSM`a$12}GYM*mpP=3aa(V9cEn%z363PY%IBQyL!W=f@^?@T_3? zBMRheI`0NP3wXTZ=RWk^K#qY0c>d$rwHD1h2jLPu4>DEnTxqmpj%~`ZwX^aVD7E49 zg!VB7ec3LgU3nxV`S@mUm`6upYCIHctPFw|j?M7?X4LC?3oqE`8g z{PJ*L4LGm3>|1NK>~tM(6S&fTE#j}kFOT-?0p~^C!uo1Ey%G0pC)F))LOh$lVBQQk zuWVYP1D478PA{u2r=RK-?aC7(b&~ z#(F^fo(CT`+q{+ec1IxP*~mMXzjMdw+eMFX>>|F5ar*qohj3zjfK106Z@D0^9480i zeY&?3VT%tJ`Ft}TC!szr*1WSe-OukroNZ5C8IA?U--93LlXoNJ74{MD z-&dPI<~{&;IOg7u_?`Hv%p|mn=7WIq^0Z}~eYjTn%#O3WkoFP$^5}gOa9%nVSav1c zk0Xs&T=pkxwe0jb`?SE7_NNg441Rfhd=_wC*|cb!VD5Zxts5sFlJH{^enP^}N%(n$ z2+!N~p+;Jh?XIKID9o1f>afb-I|&X;Q)Z(l>0rjzC4o4_F--$3a5 z7<_ySabDCpgsaZ^4(>yqzKb~XleaMc_Ymi$Jbk;?@$`L!Uxu#WyiZ-BYb?OJQ{y{|M^?gGyB6A911NBkcAGJN5Ev_AmOE0YGEHH|!z zrk4BL;GVoKoiOH#$<`rVEltgB8ycG%Tll5E4NWce8`j}tcAe{68%k^HH*CPC>bj@K zQESPL(Z7)g^qum}_`UeW-~J(7$KpS5PhM50{1fqP{(|`z;JmVF$v0>g%i7}awQijL zTS9YOPCjr@ktWK~b%iZ&mNC9A$fxT7+6&YHryY$9n4=HI99=+JQ#TuJ`+_L~Hyoe% z4n?5~u$|K&KwF)-)3McO0gqQDTb*(;2j_SkAb7J8`fmhHgO{1eNv8j>`}R27ejFQB zhb^t)cUFygkbFak@#!9GqhW?^uNMjZEGl?~}-;?H}k) z+A6$P**qTip=>?~ag`6^9fu!fa|uFT*|bDDjUh=3$`4OYH#S<+cyz)YAo* zbcmPml9ZQCOX{Qhgjxo}EKgPDOkYl6;Q_!2@yT0$z5~qJl27Xr;xbRdFMOYZtKULq zI`P9i={B8Z9wB+i^Jyu1NgbKSF`tx`qzz7{cRIG>#MKzXS1Gd8m80gJIY&PTpplda3`UHjy%@^*DbB zpW?-*B1gw6S0lku?lm;Z=NgnfT|OIxPhE4YMx1@wh;XucalEmuR41>;J>ynCq{mbZ z+m-sIWwJh9!|lO7ocK3BFgCifZ)hAJ3bnnMN~mk`wN1XI6PBy`{`zWXD_v8I%80GB z6nr>Qp+2rQCm}An-s>n*R^l#%yiSC*1 zD6JVS*grgw@Ehc726fIwCeDMyH7%TN65zvg)jy0+`JjTXtSG&Hqy5fnm2Jx)U&mEA zK$PV~_#K<29M-MAua8Y9=Sfx>wg(wxK6?+Q^u7bl6x?qZ+B|CGXE{2pgJtPiY4>v+ zyz}ZI2OkywR{*|tq^GxYXf?lPYiX=>xDN4xaeNR9tt|NGA`ScD-58a9_?GTQe%O|L ztODH4{Z*z8_pMhCmPedLXxGMT0c*n%p^naC+upPvC_7C!ch&XrVk_)ha9%pwiVQnm8}q$ZFmG}K*nPDQG`R*LOA=R7VwU8LYs231hAlQ zo$T3+lnGb26Vo^0Wk&vf1A2kp>y|^a$HPm{dmls|_&7bPBK2!6@4TUuY=D z7Xgm)5?S_TE;N+qOOYPPw9iYqzTD+a%XW~T^4$lVNXCW6VzUnETaa#L+2_OaUVz8; z?)iW%F+&^)rBN=9GvV_91^PwX;5vLiEmfT$&oea-QGz@-GtU4dr9xS^1oy{0`;}x%47GjlgWb(~teD=AkjqA!ztYMlZPYc3#o75U6 zcU^f+Eo}S=t|y8$lsCP$R?I)`4YThF`e0A-}Az+GLkc zg2()dw^8tH{b8wvb&1ooZPZ@uMPAmW523C5te`DHOYJfBVgHg76=ad??@N&BgN(65{1Wh0Kk?Za!g>N2pRwVdbvb~k51Z|a5za61B45GQ4Rhk! zk)f^aJy&DhA#m1R;L4etd0VjjwwG~O_Gr1yeJ-tJ$I>R`iN^=mItwrsHrsMpHuoB2 zEGT7NBjhy@p88X?>8y1qC)CM0cKYRBed$cU(x(?JuI>+P1w0%NgTzyMBA=88(jUf; z<7o&XFC806S}5c08H%x7JUq$oX}JA?s}L^$cLX8J8$+0(4|p<$3N`hJYdx+8KI?I3 z?wZ8U+*}l)5`v(S^v{SI^Q#pp4VSDNSyS@N%;=B-{mZ|mAGShrlnHPH+u1w;GWybg~_4uyLmmtnEUxrZkyTW>ExoO^K znOlTTm`BUaukS4L%BbvDNZGFn$`0$RWvA;f%e*EkJFK&o9p`y%RQ9b>_H77NJ~(#b zF`%;addZ)a(?nOR?7UHEZ$p@euk*u~E9)WdiK%*RC=cVjCoIw3W|8g{RXmryBEINk z(&n@B=Pijalg*}-Qkxt#rSY5}=q;%C+=+DEo$f(f*Fe~C*>;%~j-SMKIsxy-90yIn@xXOUq$^V*q@WbK|O0S9Z!5W_w{cs<~F9xwxcW)}Z+G?&fuylfty z_M&XQWt#8h*?d0j)!BS!Xuj8F^Vu}ocyB;j)1Y0v;BX!%AzW|L)_W7u*7)z2;2AH( z)kaj?kM_r`VBN)A z+dZWM`)xYwtUG|mE4Cxme&astv9KrKCU|d0=>0>fVs-3r0#79*q7UA6%pMLp$Kf{* zGr0O|IEQg9LHXwWyX0Q;Fs)ni=-PpJch{!J1lRTN!7pCV93Rjo4$D#f#Amwr1;`TUpi^r3*p2ZDRrfZ@0dc@5V<)b;a#J0CyReIY_#lln%Rd&Wlkx0`Mk z`dw@C_HmYbE%_|id$or?3HZ_p3tw0O{ZApT?Z`Zzz>oIyrxEhXrX~7hQvbE%N&MGA z#B=GM$^IP5QQkg}d)J=MPX7Yp+42kKi=H=Ur+>!Mz&E@RvK_yamk)5&gF1iK1NI=` zGF*?4?Z);|8;-QtCSSvE9!Bg}5%P-jlLqsLylS3rNFMc@)FVIf!(V>h+2&i4mvkw6 z2`@=qm_~h)m!>jI`plo@uV}s(l##CQWNC@-DNA#FI?LrlIJUAERvFPK9(E?oQoxoN+v{9eytK?HGbo>loq~WZ9H+ z+g@l4@}YRTe{rk4pL$I#8VI%_@* zqd@|3zX>?z+N?(AEQvv&yp4&c##t@TNK7x0$$p{v!` zVdHCt1~mSCr1MChaZHRuSJz{k+R^(#0tdE(bH2PA@Wh8vWqyKq=;z>GHtRz_MN%ER zNen(+8qJ%izOuKx(AF7dO;T^azr4`aoxY27{gw7Y+XnPuMC~B77n`4guUe$1>#O-) z`jRAF>Yb$j4EgEPi1)pJ0eEaP{1ULdeQ(ZJCr+~0dYal2!Cot6XgW5)uYkuZwgKis zQ_gdHt#*%(#j)b%fnv??{C%M&oGW%Ea66CP z!?@ksYm`Q;otITB39btTZD z;0U@k4)P;b?1uQ{Ui0G z?AYpB-E?>8ZD514j3q1!@=88=uY8_>`*7Sn1aakqcn`*plQtim#&+iTQaIMji+s(p{?f`;KTESdMV#w8#rE*wO}?aSvP5atNu7!=-a+Tt7~6c z8W`lhpOL2e6BNzEK*v|d+VR!qG{ANyKx@M<15BSET8?{XSF2z;**FC6 z_??NgeEWH}ISXlG-=^$W>Illm^5|I%%;|-501tHx_6rLS2aH#&6GB^(V~fumuMpfv zAUwxRe{4~fbsnQEhvR7#;@VflI~PBWr}Gf<%BE%eKg_q#_6PI1J%~EcfykJ8gd7X2 z5oTxtt}>;v;l^9B#*RJc1?Fi)UY4~Mzi?bIjdNV3G>)gdG?qoU%HjD!!?ppqPPGB# zkhq$ra;WcyQMc;abPe#l$T@L>+*O+fz!OvoR6wZR~vOH<*r%qS`hmA$aCrHktlW>Pw5Z#d)Rg= zBW!Zx?bFRT@=|}PZY3{_UxXj!{6d7hsPhR| zoqq}LDHniST8~0p9@ZsJ({|Ez&?e+%T{a`Mb;tPd?E+dlK8_JPFMRf-ggo&& zC@oHYy0ZHEa^PpyLKQM_?X(g2Iwo{2)EB^XEwm+o=~{?w9Ik~}zr3{&>tAUtM1J$u zLj8cpV~ukF^IV~Z_d1rZ z!hJZFM-bQXO1xqGs0&6B@=}|a?-zvc7$mqwGcLGl>y07K@vseHhBj#i>on5QF}MTw zo-R069&}8FX*#B^hwZ~X!mE)tY##S)XO;QOA*=;9w#MN;!+MG52@rOa=_`-+j`Z99 zvd>Xf6}E%M&J+>5|5od@M1;H+L)Y^?9_@DxX+LE19bm5Y`P_L$ zAx)j*RQEp#xRj44OZXIo8Jb8}Ik|pjW2Ujay|ulxrnRNJvAwgYWnHPGvzXva(ySh zRfKQ3;KK?ii?AYL9aalioGQk<2Cp2%88kjc?Ni>ph-G+442J?%VQxV zIMf@3nj1kwW#%T_>)3oI?(^!YHUZP~>ilfLc`=PV=F=$F)E=Ic^}GsYkw*O_G+K{w zG*oBZ3_7Hh<*R63D15O$xwjFHjTh(UDVUc?9;N>X^e2CL^k3%bJDZ8TWbq2-7Qtg0 z^^$KNEEH7!|If<*M3L>7TshAM#@(CNG4W$_6+|VSDgC_Q^kyK;!Twpqy6I&}J*~pF zcoo_uuPvCyy*Qr+X${*jPSZZi%ctWp+xE#=Wm;Np(`g*VAusKaC0>*(_9x{^<%RJ# zL~`KtM$x>nq8udeduHp9=zga0n~mhf>T6pq)$()3JYwFeql@V z*E;%nD3->vz{3*YSjB7GZ;^QpVD#mIFAFBE=K{v}k=F2-GN^sRo(~x17(T@fLsz@G zK;g>)w?NJby?nQAk$C~|&r!I{CxpKUaK2-N@@y7Kviz~!I?WTzIn4J`q%{QjG+B9A zk2LVsH4K|b`-435{UQsDcxzL5#9OB;!)A$jyGZkB;nIfWjqe$uPBxz=led>6?Q*2S zf8EU&OWd>x%rW$!wcA`<^#P}$yr~B+aVeJay~w-*`L{UQ>0~LJZ8nhP)uL@)@->{w ztI3Y`E0I2yumn{+bwIGJ`SPJ4BWK(5z%MO`@BH-hKwW(>BLi*sy0&TQ!!Ee&vZ z`!WcBJjx(!)DCZlPn%~#;2du(lepJe8si*>DH=~R4i?jRrofd3>E4WWkR1snNE_ZN z)#nJ`1fIFiW(CSNq3cpN-to+0CS8V-m4$+N3({FW7q3^1_Y9Qyp;(;DIo7|;>V4LM zbNnsxT!O<*d`oQ8+dXeW3FC$NXs>nVH}0*H_YQ<#tYkq?vZl9lFUk(*US0Fh4q*S!op3e*>#X2)t+jn|gFcz@t zCD$oOHyhIS+MXDBL1EK0+xFDbyJy!^D%aiHkkhNVefz`bnPvr?-3htkp69#KAG-E= zFYd!N!TZ=(=u6`0+K;v$;~&6}Yv=bPpFnt z({6L}lit_)sE0co$9u7caJ|>OYAbr40$cGIdA^L_pj2Ct^}zSL$M}6w?zMcFarZD; zY2OPb^?sGP3uW%S?+UdxGS8W`&s|e>qwchuIfwW4Z`y>-KL5p3!aoB3!t=jBhPXR5 zU!gAl#{mz|1!vw*c-$mKZFICRcCIV~cJJzwz(wmf@305z@g3nRL)a|B26{&Mp1;E8 z5GLQOCXD?!pFIhpPLEd=*si5g-=+b)6pihzQt!af==ew(wnJ6nQ#K7RR5g?b8j#35 z)Kv?iGe39P2E=Mk4oIHEtY2G{%p6)D!1E6c^gjsDEsejr&~-rJq_LG>e+rU z1|kzP7q+3Y7Q(>TeKT&IJo#Vwle3$EIP#LeOr%nu{H{IUz?Zo$jaNbJNFa=yb?fJ?jb z8xnp`!XHTZBME;j;ZG2iLIu{YTP@b~wSTys57o|C0X#P|1xo_j!3HQ3TBdzyT z;9ccc$5st!dKtplO8PEY?~&d@!E^nU;3;p12ycrJ=D}F5t}99J@D#m-cjb>dgLp>> zo^9u#j#|b8q}&H0%<`GgWm>wfNt)6+QfM88Fb_r=Rnq2;pF}5Xe^Rbu*>W;cG_|11 zi*(X*oXDM)dz|ocJVN4YU%PUX_SbURPW%M0#4`Ccgl*|y<9gFMj1<6X|7(>OR@c|d8p4^o(u-|Vyewg zk&YEQR_D{(CEM-&LA$S8WqyJ3@U6l@?8uJyj+N{)2;39;4dBr;GUm6$tsmvbm`Wqt zjNLo>17O4Bqg(Lpn%*n1SHZoVdjKorEJB{tX2B?nH2(@Xw~cXxqmBO^aXsgs`Tl|U z&ikbDj!)`vyl!6}!4@{l=V9HwJvd+v-w|Sek>@JFHo_AyD0^kI5a$*Q@n_?{#7%X( zgmZN|5U>%K!RDXKxa`?559h{SN%!#}o%2(#5Ma8C6T$J!HX7Z6efTR&V?(7){oEfS zp9k4;xVz=vy<}Z%O!}E|9w`^X7668RvipE6>tMt;m&ZzeObYEo0q>DMI}Gi%ctUGb&mv`> zUVp|y(c-HtvTyi3sU^r$T0Jgjq!!HyjKfnjHZtU44M>p7*9Qeo29OWQwcAn_v!e|NEg0o@i3(6CHr*u$%w(0fGg*|S>^jVbP(4dJ@}T!D1jb~>Lw0`YAAf>{YTuWVZKEdhPk;Nifn0`9pIu0oi}2M#LIMBdOg z<-G3ef_yr!zt?2H1#uqAn)+Fgf~fIU~*Wp$w*u$@z7b~?)9PUqSF)u72M9wT~A z37;>VgXcEa2wnq1{~d_zhV4|`?a}jv**;48HvCRRt$ZhfvZJ!MJh(p&&(kTKYZcy~ zpX+O@@EF)=*5Nto9~E@ZL2h7qkafy4?^T{#a39KZE8{;6y zYqbl2TLs*9gc*FmRaSS}I$np-7G9O=xMD?XTW3>iOR0WCdt-gW#ijPfbxj?ejqUsj zOvR+k1ENX8_%mvJJ<%%hb7np*ScB?$A^MzcJ=o`cwyv|xMbd71UPzdSYkAZ?A_8c;%sc*mBvPT`f-dr?^ng9 zw*}T_z)u6e+IO)j4aLh<|?7N3N#n&2F=Q}7no6@y%w}<_JDTfGHT4Yl+l7R7Vd>I zDwnm;TrFjFqb!KdwEI$NP8DYR=TNgl%DfC^V%py8WhzhEvJW?pm9jUX>?8JJ*_C-X z!aQDh*fyDc62BxD+hw(Om&7^371td?9Al~#qoJK+p8y{G{DD1XowK_u&jI!<$i1Ph z=~(0|KnTVXmjd(-4Eq=ZJr2NR!)oNNg^Y66)Qf2v9)K| zxn;u%YIi1Nu@+T|Ds8OE%so&Z9o;MCRxkzZCn)!dNVpMl@^q_55pv@RElYoL*se3T zA+$N`D!v@40}|E=8+8whgsi0`SHI0^Kf-k1RYsmaP-BXFNL(*H8S<>Q&r@U^a9@FI zC*41ID(jlrQt3WliuEM(A>ouh5y8ZdH((in05VrA*h zY^ye%NXxwYfp6|`U%Lxw6&Fi(?`o0h1`b%^bNgCE_*w<_zZRJbfx~r29s<)ZMmlXG zJm2pgHkP+-nf558(f&Z1eb>Q$Ri~WAyA*hw*MVo>AE<ougY*sA^m8=*aY%2=raxTMcOtzrn|}IfBFhsXCJQ5L$+g!dIICYrH^jFYv%TOck?vB`#?j- ziarhQP~3C!V@St44(085w$r^{l)URO-}H`;z|k;P8mai+0?R%T-UxlUy)jue^)9Pi1N1l$ncM6%e5BpmwF9jX3S8U(?a&J|uwYbxA&qm)b z`+aq3V?MPzIsJj`jq#bw{@_sGew}Xzf3R~r>BhF~$V_`^bF~@CJ{o<$?C*2g|N3Nl zf4_kBR+_Wj!|-tV+Wn%>9Dv=4iO3ghb=Y3pRGWczGr9wHANH|W zcK7T${61)lnU4YAB=^gv9M}7In2Iv87Z+Eo=ib=TgzVPUnH80N68=#T@w^hx)xyq${WdgZ;Qxx%I8|VdJwxloSpV-|;*9mJSh0`I zycH`}jt}zujlNUxP2*KKoGcZu+dnVvs}&EQy|C|1y^wod*z9Q@{@L1;@pD-FN7j8Zvan@&>`l8T#zoTM*~Gu6A}pqiAjioR_`}@g~Hp z5PvJerBxN5hw~IhrW*6z=3zJkPVDwO2;;*h|HBhA?RMJd z)XDaYyDjA&zS~R~+uELSXJ1lwu(tuvo^c0TM)R_d4hqh_<8uxN!@hqz;Cks9cK_qe zZ66ifjc2BJTS+>Df4}K7HahiNSbISeT6-n2Z;Cb4Y0d^J*n724-tFNI$Js+T{}gbw zjh>5p#eaVSx3;$gaYEaO@ekrh+vrY&ykgtv!+?jj(Orm#woyW(Xg(q|)HeDM z;#HveQG{wsd3?b2J<+uNm#+IKkyq+y>+&g~^$COtEqntMab7GZotBiNd!wHLZWVAp zi}0Al2hm>cGxj?l1)M~H12C?n&YE3Sja?h(kN7*r<8?%B-ig zKLdO7ogU`wP2E?X%9iCb<$32HzYFyAq+`;05903JB858J_q~88ryM)j`#f%vLKNijT;MDpnEm$q0+gRG5ax6^+H0Qq zGUNC{El#pd;!UH2{r3EwdFHE3e`HzC{+VaK&iID%CZ3tZ{5IYOml{qg^6~cm&0Fj{ z8S~6HiQl{fg6Zgg%f@@QyZ)MITpUM3x&AABo9WTHJzSd{i?zvjkfv8^ZSub>_V?r3 z1dYCb#^2{N{#ljxGM$!l6N(SPkbF?Y0oM-x9meyybcj zMchTnDAEo}Ap31LC-m@{drvUNnjS>4cUu zlJ42{^;s3)|4PIs-DUe{sQYP#a%Z0G?~MNl#fC+#zS6f}srdo1FOS6&TYFhue0YUR z=ssOdd-@lCHhsO8HthCmH{Y4}?H*C6-S&6Mf2@v6cg=qD?S3%d0!?SnZ+i}WrT>q; zFM+e8DE{yF-X??u!jgm=A%t*+D;#n}2%8fEAqly-eQb8$CQJ6>?QRaluwq1viijM_ z-&;9E#2fKOGz4e!Ht?dU|GdHza|dCiB_1JzZT@UEN(>UER|& zy{5Ic_#4+rZCpB1dqWZO1OO) zbPV}HPKHH<%7b;1Rh}B*q2(VWwExb;kM{?L`Zt7mt#)~^9$5A*0UK6`X_$YqUg9*( zf2ia?3}F_GJRa|Z|8FGC_7^X2lnoOqwJ(%9ocpTr#%7Z#X2G# z`=RRkUP7bo=x7RNZ=vz!XBpCUQ#AWV{9PZ+#w(a{f~R(BEaH@P9|`x9aDRl%C)qb* znbI=EX{x&i3a^8NmzK}=Gt{D%FAF~l#yo$I^2fRt^I+QVB+d1uI8AvSCh{DPQ0vs! zH{Sbgb_C+Q$eVQ(r^Pm!ys0Ng0+-=Y2o=VB2xGq5)~bIYzc&Gg7xPNW5tqYH%c?`> zb*$t$(dJpSyr^rWtphBoJK(CFP}~kGUUa6EiLZogpZhL~;kK*|h?9RkLO<_D#CcIh(y!@>>$fR~X0gzyOclgg z2TKH>_kJE)K5aLaKUKG=hou4EbA@jULh2LCs&o4`+-td+m%=-UyV~(@$34@|LpTf= zT2__23OHq@{AqdOwzg?C$uj9&YmB_N#`%@bwV0exVz65&E~c!@u1V{_QfP=_UT{CSGg(9t!+w zd|CIJ0cv)$+q%BnoMn5M_>T)0i7O(g-uZj>qRCUB+qahr9)G z9cyFyg1JEYMmjA%_nmA1cno4z0+;!}Rl-$SJRw0YPtdBoI<`l$fKJEun~hsX9gp)k zIksJ5LbPT=?mulfb&YH#r2@N zd?|3L%a=>|fh?YoAeSd-LtTz!@pSpB3|+ngc?DGlJuH|j0T1=}D!^2KwSGDF6Fv}~ zy&8DD@^qH%I>hW<{Gi}{2w|kNfshN6@u*!>^^Kan!1i6ITWmk-(8NA<$erzHPZ(V2 z9XA-|vbJ}jr4PR!D*ekNnJ~dc@K~iApP%+3bskp4*v`>EN*PyE-a;+!RrfxQdtdiH zfw-2Jcpt-$^Y2e0wu6aF}1Gx3&n}9RL9Xe_Ge-80UEm--T($cuO&|`M-f*y8K1+&8Ti%KmQuy?B};i_^m8D zr2GAl_)&eMb+o=|$C$TkFSm|(TPDAP`5xfBNJCkDn(yb(+#xi&Z|s;+`1U(~)NlS+ zUWT!3HRi4inn{A6M{`dG4f|qW`TRg=`jR0lP4mi1Q=V$yS=P^vab;#dVSiAYs^z{P zuwiJ?pNKp@?cuvQT0bwve=q}oN+0+SXW&on1OI1&kM_2HJUG;`u`tW{b}y%v};`xom|mo z3kSqIkjY0#d8M+)bQ(My+5nSnZ+y-2j{eU-7V1a-=%odjQmf9t3H_J4%YIB7r8@s> z(OtiB&5IwieBC-P zeK4;I@Ql1~+*JtZIU;K99ZUxx9 zN>}RGZ?_IN(%cE0T89%4kk-c;Y3@cEMF+h*6W%#&@P9^{dy&TT?vXYN2bNcx8(bpO zeuy-lbB{DRXg*H+5z&}rl&4^R3mErflyS(G;{6V= z<;^WEW!k^UMdq4z!TbSfkf@QT#&@+Zt+auU`sAZy?&U?@O-*#f={r-m2QnA_Bk*{I ze)e#9J|p8Z-{)|iItJ^;PYC{#2#+yozgwr4wnIhE-`ZZ<0v$`Wf2*%YUx9V!eClHD zu^2}=H&(m!4APXIcu(U;Kl;xId6AwzneTi574a;ZzX?q`&G#Xl@A((tQs%!)*qg-@ z>FRr`9P0B>Zp!-{e!~JhmXY#Oju-mCBfa9iD0sH~@JRi#glSqg`h4-9pk-P9h0vD0 z#>u9iAamTeHK?nh+@FV+3+Gjx9o(1cB$8t6rjhX6O#2QrY^UxorV><3$U zFzpAm9!&cI>(=iFELT=PV7c@90cFkV2ipQ3_5-d(upf*-nqIm6Afvo+%C!pX7N*j5 zkkHWBwMUM-LwlTlk3zn@zbk+4^jd5=7O#Ph#ilWzN*?^ap*P}r9{T_EBrCPuuJ_0N z=<#dtMfpu!ms!J`^|`(3e|xN-{unJ9yb68Z_-EK{>iUct-mK3XN}q4+%RXayvD{U) zn}s&S2TXO(-lnL)T&>-Zrz-Yi!Tx8KZDR{;de@o(d@E}M?JLdG(ZpAW{Jhrn-Hd)3 zP?oEEUw#eBJkX~O(Fd2tj-4`jJzq^3Sn=2Pjw$3mLyDiCSmP9bF3oS2SFyEtpw;2_ zJ4RB}>F20ktJ)D2S=&1TdyI;hXJa;da(7EtGuK&fFK&TVBX@?=8!)GoGn_VC^oAw% z)%Ab;hUwyj3CXk0Pdz*l-@xbG_tRhgC+)qiiSxY+uKn%AwUO2F8X@DO@#7ld?g)A5 zdS9FtuiNPw*&e`UZyAHot+RxC$~N~Far-u4Z^1NF-uA@_HfCWWy1BEg=k(OvF6+57 z?A|r^YW1~85Xm9Oc4{+zjvYz=?S8IpqqS&R*IJxOx>fkK8&1-C(w8^IU9wR}W0@ zqeafea>h+LPIn`JKOk?4_CLGl%RZyPv7obf#@xm~$9>atIb}vgUvnSWV0|X%-|q)F zpVPuOt=$p#x*vM~7;g7e9zc5VA&&2}GJX(#^jQx?$cwx<4k)kjfHM!>H+Bf(9DCKb zjd>K!p~A!Zws=YFV8rR$9)|Gc{I$Jk7}q|!xyv?An7|QcgO4`$Bwuz}yMH{Y_`1y< zxWAK^`Y}MRx7Ou-kJ|JOF1r1aoD1qV0`h#=EPpr4FD89|XVlVO_}_2aSL5FKx8ouh z-p?0*`EbJQxptfGLnQjkTVpMYcD9CJb6A4SfZ{86qZNk`WhR-?LGPKlfegd+dlYDVc?4F_64=L8t zPB~wtVDHtBm=M7oj`LfJwS=n=vjgrGe_{-`KFo2XhYv#>--ls*5`Oey>Jah@eV8eL z`##K6#C;zo=20}$gopYtlM$y6GaaG&JP|(N{yx0eH%pfNM9@kZZCOqdUNaEJyzmVm z#Cb8FWLlh$t{a{VT*@^I;coGoJ5G2uy$*Jq3;WIen7gn~xvOC2 z$~|od*BjXni8mkcJUq2$#9P=09&MfSJ1qy#@5`Y~Oym1Cz75blvBTw?Qk-9@zsP(4 zd%f%8KW449vYg?!e2=FBtdYnYkG_>}gR_A1|Rkob(ww&oTWU%>Q}Dl1+64l}1RKC{x~-szI~ z9IT_`t$otl^tsK8m)LJ(4Kt?`|KydN0a*TL*m(U4<>%tfZPI>)GnpQIAC>cl-7#-C z3u$^K<_(*!+P_xw2GsE8k$VG;+`U8d&&PFU+zk@?Np*EnH~Xv`Z)wo&A5J_t_)(F>SJx(wZ`UN&`|E|!Y67LZ`3VxcIM{y0S!>YqlL*#u7K0gjOu> zBgr<2;hX0g4fS0cX0G9SjrN`0N&|RrW3$)w+V_+L7U6R=i8or3t+2UoY_xHuJS$#L zziQxTW$TE)+5dViW+m?7c(PAyuKCxZ<}rrr>r{5z0M|iO_cvRmjb@d+ldZ8va^1k~ zQqrf|+(%xEKH^)a&GrAuv{J_}23I zzT%%JaQ&8Y8{+(R;8(>jop+7t1e}-d5zoghnr^|>v#pmP&V5WR5_Uz?@oEWPxxQv z@%Lfm-;Mku{W1q@P<9l{lY1A>@E2w(&LEz@;&4-Z2OTPn5 zJmT|58IpBhGXF0JU-d1-|A^qLENtg&-bM2@~8a#rR%0> zJ|no=f3ook=CgvQcIsNhDeDaq-YDTs2$>K0#BCkRl$Ie*Q{BB;czs@YY58nFLoI6g zvhcHD%(Jl%c^V|m)?Xpb|0^QTR}pHR`ufIuzs`_PgU5?x~|}w0qGbKkprD>L*`&@MU~0_y4i4C7oMi>yma& zC+1qe95=${cTMAX{)870h3eKE!{g2*E1$ba|z;Z zFXN_LsamJ+MO`eaEXGDbSI3tkUTJgZ#=jr;RhMY%@p8tQi1uJT(*J6Z^eFD7(^qN` z226KxA~^aFAl<&|B>Wg}tzS|0VOIcFY3=CZne^mwCE|-KUG~%J_HmBDuL68&Wo6lZ zX+Zd04OncKxKFZVt^uq(Q?$eCRmpsUuo?KEeznW?xz8b9u}9pyJgF~wP5|}r3yAZZ z?^+LEWIE4ck~;hn;`Tf7Wp`dZX}%0tH;&=0dazpntDM&j!(6RzTUK(Aw`|d*69t{63^{&E`i4d2znuudVzf%A=52TX{g>>Qmp3_=EVV-yHKUnuh=v z-gfRo+%#Un{4~b1vg(}c=YYF%y7K%YhyD?vPxFrbUOngj$H1jO{;-5Ulkiaqe~D1* zjCqsiuKzwzKv7L=Mf9LZdSM5pmYRQ-aTXKMyUR&SO~qRNbN;o(cFqEqwoskov^3YFqvl zFfBLpQuyDAyV~*p8}6Cbi;(BsYgtw9wSZGr%Ab}eZfl!XlPr_IlceX|Zx0?ipJAT< ze1>WMd?ssN!m`26CC<4gOy2V8_niB&$RqX@-1mz%)O_V`@b=$Vx(9JLM^LDnFWn1x z{8o~K{UE}PQz%!~yd-Z9vp(|`+BR1&@j3U80fxGEL$^Piyo#qn|E=H5RsZ>M)P+AM zp`Y|852okb{{=9egAnIg#Pyu}=WxHl&$<6E`+AW0(uLFbYa^X= z|6f*X>;Iuox0w*Vd9!QCW5E`387u1u3)%5^Xq`BO9PfGV%+MZ=t;O0Gp_{zdanL`L zrbhIZc=lW!q2YN@O8-(o&on*H>2J8_MS7l%r8M?T&K?J+Z>I3V-tqmvJ@_l$J;zky zAJo@bv9o5*F$?i8I?jdfMi*-blmBY`;8XBkeTN~qA7|xp{^6F0Ykd%J3;gKg4n@c- zofi8H^fB;Q#0eT=OTrtksRb<}fhIl}L?$(d#-!h{J6=1rSho;L+2xX(JiJZtv+ z@{E(`%$#=ev|00~;YjzsQtSLGz#M#fzj?_?=4D%fUL?UOIzyLd3-b&{mXFV2qPoHg z_O?=26Y-p5IMNpFk^JGXWedv+3FEJVUz+!DGg5f(4cF!QDNQuP|Z|WT6a`B;@^(nQb`8>>+fAqK)SB1XCz0ci(8vE(D0%SU>mTnk3qg$0Cpns)F10^Z=~yw z__Pf=uh2aA1#Fnv!t8^P*E*eB?bKynM}33)@R;gY-9j%#wMavE9@RMHN7>g&XHTxj z%VH}6opnIvt|4`nWj;XiQC-;|@dNRru4o-tn}~jX5a7JhX@R}0@!KnYE_AVc3rx>W zrH{Eac+vv#eAMB%U&RPy?+Z!sKo#HcbeRUTz z3Td<@IMdU%O{ZO--NkGVIL}rEd@`0w8#`yTHMLh;>pAE$FVgM=oLZsns;_q8-8_4) zpGzNUc1AjnG6auP>#MEvh%*DH{&888^t&RRXRJ=cgr(f%$Oi>vjGNFXlZ zqZQuZa7P0MQ|xfht#2p`oVYwY)$+i%a7a&Fo|S50#1;4$z-gl_dd~1h1_5+Tbl{&8hTu?Rj)%w;7 zC_1%%4hBvg_@I7H>8|f=o>f`i)!sI#qodlsqS;lo*Cqus9{B#;1?%Gl>d8RP8a)Jf zyh2}{XN_(foi#cKw!3D#o#4A4D)@&X9Ae^eIm^GGZu+)@@i*c(tQe2?^gRey-{VN! z`@Y9fh-+Vp=?ms)z*K(WSJ>8r=>eKK zz4X0?n1hOSf;S1_Sza4&NZ%{fZfGHGH`-k4!O$KzM$vZpdc^oN{6akl(M;r(wBPV| z01I_y7GSG57V@6bgg(XXes{^gtok}g+4E}g~Kz>ZLJ55x_8Mbgt&iBSIr{e zrOs^iyupd`thf<)s{eX!agztr^IDrdn4Z_ldi2k0WqGpBYh`)!&TFNdS?9H$3wYRn z^xWd5NYg9#yw*fn@u*KLZ2&$oeO2uXcLjZ+jcL#)i{teL#yjw1UuZ|ji+zD`?F&`h z`+cDkan*O9zDwxSX|Yc0-qrJfOI_-ga9I{lr2Bn=a%f**d6@S~{KCG#vTI*>OAa1o zq#qy2kJ9?`hiO_j+85pmTFSo)q4ouzm-dBXMqgMC8f{kX3pzF7{)QDuPxS#skbZJL za6c5sVq52M} zb2AO;GcN>hV|w6K`j_~oGv>^mGrv4(&YYPurc9bYWA?1_w7GL<&ov8k5+cTK?)P@c ztNO;aW_&e%q3=Ps_LYlq@As8=BCh=*rZ1RF0OyrXOZy)0050=?mxODwctV0)o}kr! zq`Df(0y@>z8#8>5cO$Qy+QJ;HVBUjt)kC+RYm35r0b7+vBt8jo2I7-k3Ort+PO0C@ z_8$V>dY|B3hA{F;@?;o5`={CkE#Uj8Y-ie9w~m;ne;w@|U6{MIG-I0+C&>$~VtSBB z<7k_&AWzt4+F#zQPF;n2U#G4{T;(I)mH5$qe-I(Bby|b*o|Xg)BVLM%siDDnZiNxl zNv@G!gM7Kxot6oE&P66&KjFNZzcg;qd_-{7=l&4l%;UoneiUJf4(Y1fJQqFJ7K8>j zY>A-oVX~H7L)sq7@(IWkwLu}4Wf9hL+9bOA>EYEK* zPeM{hSN)=v3cen=tYW_hPTC??6PhYm1YimlY7n%Rr((IFp)2B3f`zWHHY_PmZLR_i zB`Z&^U;|yH6P(-2D0NH3uf|MmURJ4Mqu}DQthv~A2j(@%EWqA5eEsme?n)=vm*;i0 zcZjTm&Gbl$_U5*(@^r5LxbF#@o>xw;$I3)^tFVLwo#kmOq_DQErsw6kVA_sF9?Cbp zzPTlm-}L-vTD96<#oj$+S?R#Oxz>(u>~dpwK^@yV?0HG^n9|Wbzqz#%XW-IbnAP4@ zp4Qghy%-fyS&Xf=o#ok0<>|O-Y;TSEJU^oi>q^ayUTtC%V6)9k^LkEkoc>E4n4V`9 zKC8QR5vnR`2$Au_3);{E?WkbelB|Lb%UII?->mjFt5sHbn^c~^q}smRE9W)X!Pwo@ z)ZEaFZ$_3+uC%sSSIT#rdyam^t}S8tscdV^^v*R~U{%Q!xySlb&_m08!UWH}%&l~F zSKF}2*45oipPB%><1y<^@7K~3>nRJh;vPm z_c!34>xg}h-C=*7kA=^mj}oM^Ysj{y{k#!*sQvsb?tS}t6XIDie-3b7bJxX=q{YgT z%F6V4Po^)3OzUK`CbcYXuQqorX`S5N+|pPHpT302S|=L1x+&IvN%B^k{6)mSj9?bVV*CRe#)^bdV z(mdNrI*vP8Y3o#<-Uv6^Zsu`M(pB~9>?x@pl2)XKunioyIX}qc447y8@s)f+d*zxT492wud zE`7opqIAblu;!>C^^$FR#|F!LYJFFIP{OC@XxD@zuh%A}!_?VcRj)=4*Po{@#fs+=fMbJtMY=Lb1*sBK`MWINJlqn^79 zdpqSmD^2%R_-WRkh4of{mTAfHCHAu{U5(eTK&SJW>q>4-K7O87G9QC1t|~mY9Qw!S zYad72s#GG=Mw(9|4cXuwg7!APZ^dVGpCK=L5B7+Rf34G*UTvzJWAUH~3ZBW_NeNWttAJ%E|Cer14qTiES-- zeZb*=3ot(Gnp;^c295986wUVlR{-VtKH_|i6;-Nt))Y8Xrsmw265^IkG5f7!Wzzt2ZU7IJ1!90wpW3Dqg-xmYUwI--$xn!ptHNmXSO9t zYiUPamX|fTiA(~?_OFqJ2f%|@IF}EfH*!wBKj!og3jRX~4|f_iVM3~Z_C2Tm2-=48 zbhS}G1uu@-Y#SZ3X|EXnIewf+{|q57`jLdIANdIGeLwP1#MN&3^uHAPbeeCs+%th+ z0GIhcCgHELcp_crxRjl8sO&5c^L`w^a2=For@WNocYWZIUh)1Qc(yK3a=$ELn%0x9 ziT)9^EXxxJ)h;E`VOUJ*Q77bv-3mM~50N&A)A$CagkQ2SL>FW{y9YUhk+4gW;Gee|nn z+QYu}FW~mow<2Wei!T8`>|-x`FzsVS$gOzV$5_99A7k0F`WVZe*T*PtRv#;YChTLJ z7xEcI4bt=)NFR&J?02;R&I{Q_>~F)(5UcM7-&CMI?Q_jIn5CJ80U+wqZtgh*<)O~9 zPw`&+)KJ{}eQFru+HZ)rC4TIaTOs6?PV@Ul!OqQ;_covr-nH~e6uzwor(dG*kpkB> z<66W=;5Q1tbiO6C9pFwTxA$Ue#4-Ih!x6GiZ=XfSbUNO+XopyS?aN#rW0`lt&+p63 zds1$i+rxP{_Cba}UuMU1kl7WydFl6&xPQ|BrD*u`6YWyt{4%pM(vXF5Yr=3=r`Q*vG2V_eyC9A0cJuM(af__J>R8M) z2cNTmtFjL6Xt=&-)8?)04Aa<5Htke6-*6-wmRby(-y6V_>qc&ob#@c?;C0*8;7&VV z+8ya!OVX9`<`z4_j?y@n;^w+aV~9b&z{xfmICdYOn|EMM+|6-V9t?3V%`u5FY+V)1 zXyAml%<7kE!xA{ZG69zvxSSVIw`xrnYp&eT(Ot%ju%f;^({_}!&Xt|1w9%5bT&qYh z$d~!;Yx8SgbZ)tV8jAB|8hn4qVi&Zknyhr=BRad0Qiz?rq&?iH<(^2vQ2L{6`V!2^ zG$k%;o$0hSU#3{xzbSJYmh}V^0i(K^qxg+{f4;e`N#-fUKh4BIt;=&1Uy8P@xjm7` z5|c=X^67}_T020Y{8j+p0=)L>QQW0VyUG>&WFo@9#CSlf52XV8)j*zO?g2br;kYyu z)@rERYuU?jVK0nPV+40kgqP{OC+xd@j0-3BwPxk!PmPWCp$EG3dHPV&0|jHuUXVk_ z7~ZR0-v{^p7_%?pYRibXH+~#r_Cv@kofg|{`Z@*Ri~}xh{Qd}2_<*a8*RkX{tRsi- zUPO6=(?NN8qZA3bU;tyf*r(Eco$(q{(HsDt>1w2X*}@!%G+9IPDwOtR7jrPutes7) z8DYHvaNnkIPE9@o(W^s%$1Bt;J|8cd1-;Y-J|90+@D4*5?cGfmLMGFm=z%VrgKJ0ZPb2=^7?{#|S@AjDG zyS6S}h1bx^HWhM4vZ2C#**JbgX@T6d=~-#(B)8iJlrMMAHX+vA34O?&EK|XZ-2=kn zIu!e1?DJ(aYxdle%ZG4WXT0Fzhibg&;wMi!&Ga6DXR^>g`%LyE0 zl^qp4g^li`iUnWQkC~vMyvh2)eqX?Ot<#$Syp^r}Rau0h!f1%Gn{v#~sWEhCqw*87PgsMT=t9)p1X@`*tJi=q&uw?NBslOa172#+iuIM!y*$=V}}~ zbgo7|v=iqb4CiWU7sE92;Cea7ALid6JnWc*eAGq}k7K;zRdVpigYr=hccq_U#kMRS z)7E6RzgU1N^$klZjo1g%-O|spjk{mf;!XaChPWp9*sIbixDucRMRV^&1Gik6p8e?HRuUs{$L^A@4EX>j19 z`h`@w7PD~I^t0w;L1%mal#DF__PN>?W+HIhd?6DF^M;a{1RSh^PHJq#Y|YI(&1Aq% zs9#obK=;gJ3iC_MElOq@U=7{XYPk~+^_G@blxMnUwki06On7GwerMUk$4j-CzsDI+ zX7W$M7w}nO3eF6&;SPT~_)Ka%x0`zs=QE#qEC<(uO1AD`P+2o+1Y1ud&GDe;oXggM zeV^39xTe+JChHZF$n_!ObM4B>&i70mjB8dAz9vdrM0FXxo9dTSfSx>~RGvlk)oL>y z&thrBwX4gE>su}hAHlV8GA}Q^ydtVcTO6CMpYH06^fqZ}eMd*VT~y-Z?bZ%%3SANF zKrT*ajAQe$@7KEWM)e~J$#!jsP^KBE1B)NMAM9Wb*8x*_A`@w2JeU8834ZgXQsIf&K3+0Rk7*iw1lzw8^o@S9 zYx5+10>RQp^=3s^dRsz#Ofzn;3>h4VSfMVHSCp0T^4cZl6(K3F=$o2}ay59>B6%g! z8^d(h7r35lb9YO7_1u2Ubw9U3nDyiEMn`=n6Vc+$LOYCAe%v0BiRyR~mwRX;UA02w z5=H#E$0nk2HIhq29h;-N<2Ge*VYRuwEp9WLt?i60_3WU@KIJ8Z?H47*{oaY=CFIg9 z$0k$HDhv!y-eGtBR@#iqtLZVvExWGp#}E%cJ?1$4j4?+Ug=2`q!!bu0W#cmgtzRoo zwbD|*0(;?=T{w1z>E4)_L7y&Hl3vO;(opv}*Rec0s(9_+u8!M1_VU(m174)#c}xX=F8EH>ylp*JTCumi9^05# z>X=8I6QaCBB-bB_Gc%QM7H-MR2QIy-Dafdby?I?LPey6ETPd~|b0V1{q;jiZsZE)$ zIPAgpSpfT`vp1)uWQma!=PaeyVc6rb05YDV>C$wz*6}c?3$J-NR3|TS8-bf>=QJ{8 zE16S)E9{!8FyUS8<*p^NnM-Xv`T4q)Mr6Jvb2{_oqnR{9l-}LeU?;Za97OVo^6LYK zc}2XOE1AwUv_tq}cxye3Vm3UoNA&4zdFz)|7rV}E`#IsRPQ3)-717XKPKKX0e`=+r ztKNR!xePk$7uWP=H`!G^TOakz2V4ERs&PfX)KRnW-;LD{f`B+1aSWu0-telO=L*M9>T4HJ%n77t~K?I zFm%{N7(dU$KE*P><<0ulXJ(^~a~vDJXLb7;*I=!9`99Hr(?!+PA~aa(n^? zC%9uZtlWtYq3|&G?gqTF0ybWrN10YUJgu)TuEcvTo58=%wQ4l+C|gx@{Fy#8nZ6)Q zKg~~vbq>=Tlj$k?4$+>J03thOxFEoZn0PpsByc=IJe(^6oRAOaydSsEX6t1#6i>*s zO^Ea9Y@7u?&J9^O6ial2d~V9diTIp^wSzCX`fKv*mGEy#S)v3f=eek_dmN2*QnJz? z7TP3&(@*k#+|jGWN(|j(UZf+TcPYcnQIExx>%8X+|CT#+JZ&P zoP8-e`x<4~H6J%(t+@L-8SuR$nq$`o$m8&Wvv5&@CwHBrLAOuR%oLg^!J|1%X=J7q z(l$o40fO*Y3Yj__4?A1&>6vzc&?gc-+Dl^ENIcd7X|M2TqeM^kkH@tBBuqt!+Wsbw zPZpxq`K>X(XcB~3Uy9!y9=|L^<#&I~&zmhNJEy;F)5l^wZ`PE=V_$g6;bqNo6xo)U zxX+1_q=&ciuYE zL)zJuB6vD;OwnbXMvB|xgn&=fIXyn}Lp~8w%;%hdPjVKf!o~P4ec@;DU*Yhh*^F}3 z`dFPzkA@gczsyhfhAB<|a56nbe}mLPN&v5(z7pU>Ogx<15;&e99?p*foGd=SaPlT+ zVVJFk_40>oyojZi|L<9No_LD)QZ`9$jqO7 zM?1dO8_(n_^+?>wpDMXJ~kK?7ozuP(HjjODm_c)xq*`8(}mF0uUHnr91PY;zq<^6Oi zZ|0|%aeaQFWZ9+WSc<8-`Yk83%(OH$wn6v!>4D8*nICrP@dQg*cy;%zHs;qxjarjo>vN+{YhM)79Dm-a0=a zkF6{$-h)Y4t%Wrt@J3k}W=>Le;_WE>d|7uDn4j-x3ros4R$#>Aw^&*+?#-ukcAX=R zyYF|#aknlV$K6>@ahwZw34V56EKY|MiF7VpQC~Qx+qcGkPr<$siRNj+MqFE7@@t2D zoHx(2kD?rpB#i5C_$Hg+v7zyJWIjHqY2oJydXGNY}r*>1{^wS|Ix4%duh z%e?PfbS$awl)ccU0-x^l zk4d;ceYL`ynV*IJ!?Rt zyL@yG`#hMw*Yg1nrtkHzZvFRqSgx%1 zdRXqf_j)Mn+)4|)or?W-FkfJWT!kwD5BrC{*K;M(^vZp&C!@UnMydSGuTcky`$rFT zx>$QP@^$^ASZj3*aK7(DTgYBOT_E0vBD_K^*T%Ged|2Q|^tBJg%FUHQCn4@4fyn!# zF>kxa^ka+z&h>&FrD(tcTsxb{6C?^A-8PK*1O_RCKKm-&2J!fUg5 zBHizo+W<#pq}5<;d!LEN5Qd zql{U7@AH6%eUIM+;X8F-K$>2C_dQ$AbeHoKI#O)-NRbZrIDP&S^3lGwmv>(n;oz#H zj1R_-=Uoj!$m>KiDC65;c5h~Rl5Vvu;~=DpJpgH?34cLUOWP_=i|vBucQ;oJeBD_#3|EH5NaE(=}F4>0Mb(BL!J)`FSZriR@>@fz*&zfH)Z%~4v(J+ z50&R3#3|3u5o%dTpU%Hv9uZomvAl6x$8~>(?I+*UkwD`vqWb zofQwe>^!7o9<{W1{?)#czK;1N;{G|hl=(5hjvK4BY@#{#-B;ax5jKFi(+Z zAm`JP58?57jqcv(^%vpwXW{i%;YAvj^T9sG1otj%dv*LFhq^QJaC$F3C0MS z%$YoO(&VWN0#jl^#tcWC^vokJ zW5H}Ayj8AR#3}1mf?q=D<7I@_eX&GC#n(>AV@AHmE z6dOgoDlcfm^X`VFSZ1{Lh-2p~gwL%A+^v5UQQtAHgVg}0b1lxRNIS@baqWY$5Ak68 z@9$t+dawfzbo_>Su>Fs9Ft)emvA^Wu;~fY*=CQ4Zcc9>n@L)WHl=6-AV8==xK5UN+ z*fGM-$J05f4?8A>>Oz+L`L-sJ+7q;rTs5XOWUNKfJ^$F5z;Ob*S8ny zo9~MBhz~698zc|f8^YBV?@m6eosA(a(?$ap+G6_6YKzAR?+}mj=kZ{gl}F1R*y5zT z>2mLdJX!9&5vtAeVWBNf^259MpyTDsVdaM$niksP13=@~?SY7sp0+ryr-C_1c&l6o zBTiZO7yM*>#rZug^A*}r^_j@mx2a-d>CkOd8_Ra{ZS0khBeb!*pgh_~)IohU)|F!g z^Na0eY+H9@9)WG$gRsaBJ3F-}U~2c&wvP2+YFqd5U}{_U^% zr?z#xho`pn5D!M%`bpTZongZc1zfMdhOJMPde%$Xth?P(dor}g*%s=a-qUB3zF_C} zYCnzy+~GK1@TFSUN4inSlAQ~%v^f7v%FR5U7QXCD>?e%>4L`0O;luy-n$^eLX_C&3 z-Fn(`H>_tasg+N46C1qG=hoED19yMk!F;%;HqmProg=)Od{{o_;p(bb`@EEuaNbKD z+I937nFf3O3_`8XsjN@2$1ecRv}u5`Zl*+a=<50(NMjwIhrZe(Tvs~@AunySI4y0fPX;dOXCc(FkTOyyQuJ82nj^dwmw39a zre(8o0C%q7s=Zg9NxXuYFL+u9^AM*@3lM4>t?5b1cPi4dOfdun=9khu~r^82jIQGz83Z`+Ip7DA6x1`&v4#&yQdp)-w?Yx(Uvb>ABBons%`N)D0R28A_=oPhOd3=GeXYc-wGL; zAUMj+}E_e?%??-%94#Boqf4H3Z{CI#}D;QyAgsW&8+woyOfl<~`4n~oY&j>@A z`Mx^vRCEic?0k0@a4CXaUnyJxxccmTZjJgVP`12pi@UV`zAZkYa3y%~3ZGH)>v}`% z{;9S0`+7Uz9OJ75_iBVg+&V>0&A^`L*stwTIYWD_t+2l0D~MCS*xtTheU0R$-|Jxi zrVma%CqCmbe#v}T@YQD_Kb{9dJ#IlotLA$e$};rGrt=UG7rj`h2LKq zX(BqT5ooz+7YSF{K8JjKyLNMCz6JAnzCi(Z<}p}*|GbWZNWIRB=-V_hm=&eJL1 zEgnqQF2Fv7}hk-*FCe;7hBTyrY0XY#FVGA9NdRW{jGH?-7KuNF}IRW z#`y)@cQwi^EPfs7dhvV)?AeH`4`zUoI`v>=Zwl+&*#POAJ=y(6^@Dn3`wH-=r!0%p zQ`cvo5gUSS(^#O#KYJC-Z6cf65c=y+cs7Lb7{6q07koY+h9?r7jcLn<55#uhbzA4K zSwBr7(JmL+e*<35Ps2B$aj*UAE`d`wJ0K_1?#9pW^GxG2hbRr>zCUK?rLmsK-|x3S zL|pp;`Q6F9;E((WAup|){iR;U1D3`wnI8xEZ$J&v7U$vLFZgL*u}?FG-<(I;?gK6> z`zHu#J06hmL4>4dK9t>EY2PL)7Z9|bbR3|ZnKB~Bp9xRuR0n9ajeY^R>L+=t{dyGl zab9s9+A>0y{517}mdW#_Z$l1U3uXIZHpNFe(X(LY@78rNS=(QyZ=Ro0TQQwxX>HF0Ft6 z?J@A>mF2$;rvC<+XwPrY$bk{uaCx-o7*L z0oOjuxVzGQmTA8SZD{w{|Kl`&K2oS9T>I#gpk=>Q-|H#F)z(DxuycO`oL4$6J@4}A z!g<%z;6vG-k?_w5S$>Y0&OW$rWwt>^{@O9d{S`P@bF2d%<<+{e>A?9rV8aT7%-<05 z+8I9RAcP^0OMy%IL%Oy7(7iv0?zw*GuE?Q#p&z=dbLd{|hwhpjx_|XU_mLdBm-?Z* z5^a)IpD*`A_sN|6%zn1{a@+6v9J*pZbf3$is}Z_0IDR7QUdYYxSqYz)@E;QXQ^J2s z_#X*hk+1-Mq%TQ02;s%xjb(Dno3@+xZ&_Olcw}Q>$r82+viNE0Ka9xm zALwUb&SD)=j_sVs&^`kOx5ACpe;|&mVTVj) z9uxcJT=)e=^91vf@qTN>w}m_yQ>QG$S_ju${(|%klU=-qwjz?0lvJl#`dl3+RTCl*I{hmA7lGS!5xLL*3H8mnN*&oXJY}Woz2T$)0 zr5*F1JMD=4;-^S!ds)|m@$7de(Fw4JwXyS873(#vYufNuvEk~k?E=}LHDr^Y4x{+TM_6w9x2!)NY6qXAgw5=j5+Gr_uQTf%r?*rNh5Bzj4sB;E!_e4^UTS@#01+E#ssYd;Uhy)T^G9tcZ)%W3;C%}^b1tC4}mPMzZ7eEPu=4C0f$)`@qP|; zAf$Pt;8Cx6uk_R%(app<$IlVQ*+C2ehUOpba;b@<)?!6Ou ziA`WR7;0ejU-n4$cOgS2`^{hxO^g zIqV$pp=_r}I2WO|-CmH3J~8XEyituwjK7Gan(ZEc!`+Q`V5?)K@`s zdLJ}w$EZtz20kzSZoaRBx*p9wsK2moOaWhM6dt;c%{)k(m*-N!*Eyk| zCux~iI-fzNRp@9-I)I~nxE*lXFwLL*IsnV&Q!?iXA0J=Kn$EXmItAbFXNpfb(lj-u zJ0lO`=E<~N@M%NYKD0^XyAtroo}k1DJ0xxC>|gvn{}W&3eDy@+l{a5K32An|ikX4u zG_=k~Wy{+Ft5L0gpOY zr)A324cglG&)y(7vjWu z4?@jP$AwD)i}C}G&O6CBnHIm7sC+LIzVEYq3$`3OmR?TSYA4@#Dboi4^Zn})GPk`D zaDARiSvKU{mUS-uKQWJeFY?T=3!dT0pU1MiYCClv`+g6m^Vll@YpQR?=fB(>l=Xnp zO?M#oe35O4d1^Fw<@|Fv=ATyru9wU|*IiuL!3?6lZJ(Wg7He($^~Cx@zesh*-6!X$ z*FavU+r?Vm6NhuMakXyl2K`IS(FP;VeZ@Jp3PZNro8fOOR$yJUtJv+&_!#qpuF;?4 zz3Sj61WsK(50%NZPvYn6Ak(AP?@l_zXh!^&2JpEJE_8zesv_rRTp9Zy@;PC$Bgy zxzB=is&)MZ@OFApv~9q8VZL7iJf;uo0)D5Trq4-MW%!+J2l$AIeHP5$_0sHp7N0`i z$xRAw9g6Ve<^%`-G~m&u1m`E2YXOTlBse_6!hIGu0jByHZ`UXOF!MR2sXxqps5c`X z@3n|D9JodEdE$EeEhsChDR;jG(>dRRf0-jGCuG)&|CkUZmk z4+SfCfBP-iCjNd4#)oI@xA>yXKfT|A@NmDymjP3ItG+7hFwa+YY5n`EUjYwZS-z_7 zx1f#Uev7XP?kxzz{T5LRI=|BzuFytNf3<(uzGCfFvG(iWr|@aJ;2v=8uZ+7Z-CvpZ zP0)t6jQurEORiTDuKo49pk*J0&9v)Pw;`@JD58h$`X1oC(rM}SDxXg6lkRoD9egO; z_a(f;=I8cEOod$hh5IZhqt*x0$^UM^xXztH1q`S8tI^Aax(*3X> zI^Aax(%sh&o$j*;>3-4=o$j*;=^p5ZPWM@abPx4Ir~52Ix}Ww#r~52Ix}Wz$r~52I zx<~q<(|r~p-7kes_gUP7IQ8)d68=cSA4_<@gbzyiu!KL8@D~z3D&b=Yb)N-!(`Iws zkov7Ce*W;M)Xu)URW96Rt<57X-Lm70R1jHa(GWluhKa9!nA3g>?;XVu6WPhKror9>SbXH9N`}zlF^7rz>BWlyv%$9S_7=Q}H6?$gl)S zd+%8UP2d^n+%NHO(5vm#^{7`on65{aP&fX*iW*W|-iy@9|#gRo|(H@Qny{Zv=T@nqcQg7h9Vd?}K1ns=n#7e)c#0h4sLF5J!VQuPpvc zg}=_veE$BP2fqys)=Q2No}pcu2smw*?qML^aez_2v}`3)CwzQ-Ems!)WWo3QkK(fr zrfF)-)QmicnCdR!z5XahhoIZ*1Iq@EdDH7K`5Yr^??}0d;FmDgU48+xM z(sgCFRos(qbnoDpm_5#R~(V9uc$#I@JZ(x~K|8?GQx(CyF!&!j!_Z*w;=s(A%zt88`X9KQR zAJ4H9<|#*HC~`(=`_o-{o^9K*C)OQ~d8$Y5KKbl;5#*+R5r_AR&ox86xBD@mAH-?$ zaIB6Ce2E92h<2nt5&u}ZSKViPDR9|eCg7e|Dh)8zZRO!)ELeW3x9#8~aQkeh199?d zLm1_Q@$fvvdD(nwl4-h@TE)H>>Pic6%ky}m;7a>NLwygu74TJw1nz4nnIml(&$NT-vzv zvv>jSw>|S$+jRd9#xT#f0_NK$>ImVKllfnW^hh?8Bq1Bx-%r!_ze@H!QE#|bLc8-8 z@WF=%pb8wzOXdQ^R|$aeRfualkH%uhXgiB9Pi}8-k<-m5V7PbtUt~RDHs9soxZmT^ zs*b!3uuw-XhK>v|ZN-a_rkB{4M9cQ4BO>-f7p}Wrq}mnrs_n}9=l-LiJ+9AxA9bkx z|8}`oddA<0vQTHfYwJ4Jrzi~t^>u)7(ZO2Yt8TsLP1{@Tz?HzI9k?os7vR1QFn`|; zFwYMG7TN*ADJS#)e@KsHLrD^{K@a>i)dRHy)Dg7jG&+7i)R1I(j|$_&Rz6;^cK5!YChLe+F@0HXr%}Dg)9~57Zuf z8n{{Z;99`5?7@+?3`u)%BXCtew2ePYzJWd9esTH(Hz7^0OnZQ@?=>%Ot2B=8T+&|c zO3$E^=~zBrC+l#0@LcYA_r%NnSKGig)q1}f^7{4udBn91iT6pw*}h+pa%H7Wu=U3E z8RsK>5xBGsU&`VIxUUb)-?t6S^Q(Y`wt;ZU$^5^D^hh?8Bq1Ap1eM#<3AGK>7qtyv z1|Q!xd2ewjrq(1Jav*EJeS%l4@(z zr?xfi#9GfzJkR^p&SrcEWf|Io=cOo{$=>Jh{Ga9lImrf-sw93tt}tc0jWSqy3ie+0 z{dT~8eg8hmUrdQ+#S(4yhBhYS-kHRJl%J8C*tfc z_el5ygqpAF{Eq;O1z@+sbr13Z<xb2%TmA9QL<#2%Oj0qa~|FYh~TVID$!)jBcfd}L(dVbJjkZ43L~D6HT8RMLra z4xR+#n~Cd`%ewZzJbhvQs|IWn2H*^3Scd-GANH$Xpgz<#@Lp}hqqz5N!!HrnvJmeP z{Ae2eA_@;-!_omw+(zY6WWHXy%Ku>@73Cd-$TZrV+}-!t$lb3w4r@?8Zh5JJcD>> z9|n>EZN#5J%PX`I?2oh&f014Y zFkxQzqH`+^U3#Wv<`FJ)CNC5;J-b|>G>}Ifz1AXH_F8GU0(L|ME0g_ zbeSmMPeeYwr%mJi10J0B4(@E%!%V|k$ejq)#t+^fF!+URrw0LN+7^JZ{s$rCrS1O^ z(uj9|fVZXKS-T1RA&ApP4@F3sn1?UNRsv^Unm6$oAC5H6ueL_Wi}@wf;`x&1w+(QK zQ;Sf)Swb0A{}S|g<7$NPR$St7Ux{BfD+h2#39i@GZ1wp|ftos34PvjLAv&PLRpyu>OfM8Od<%>gr6d?j3x|_EqOQ z^B&_Nh9`IanL#=I{!M?k0GR)da}jZWf2#GT0n0jHrY3^N6vSs84)lDPVc_APFS9M< z(fKlY6-FNz=Pd#^Ja1;lm_9mhW)Hx^^Jez6w0H*8?#^@`i+Fh6%wB*+=gp+69(#G* z8P9tIPcN~L{TBhlW`tCiX71Z*YeRZmpV$|94aI$0k7HeB-|=Z4f!_Nxj6Z-gZ-=4p z6-PVCN%K>|gaLVZo;I6ijn0f+$egXe!?us?b{K`LqB1*EtiwAZ$CkETR(YNclAX`^B6Z7!pI9uW1qj?jbd6$t!AK}did8t0cY0xF{Pc^@DfJ^#%ggRzYM%v>P zJ^Frw@K#*nsgIy#vvL5pBDh)y$}@>qFpC9GWokm4GA%*KI#6BW{kedx=}F4E6tFB= zTL9-3@emu-1~}_f%RqVBb9i(J50$MIamsccLM<2R)A>W2g_db7d#oREJ6yF6K7!W+ zLifN+@;!r$KAIRpGSUOz;AC3{=Ns_e_YF=#-0#yI$L9j(`v&t6k4JjPXFgzAzQKYB z9#gEVZ*UfP_`bm+#zWu0uPv;*(JyEOUg#Gz$Fz}OPz5aX3%V?A>=$$+9{L5#0E_*C zbiH%^@6F;HEC;S$dA@;Pgrr-L=I#3h)WM-Wu1~B)KD#z0xy&1o(&a zibr0@dHK)u?yr)2<;D0%@C$ie?a{3E?yp1n*7UeC5@(#fcVqAkNMl`GkC6KD8HAMO zT80*{Xzi@h)8_j0pA-6+j;`kRwh0qpE%^NpyYnd1zgp;H)P)QJmuqdW`dRIe(YMKzm44P&Y?+<>efwEq zRvTVcwi)HrHsif(C#-vUaNhgvcQ@1EgMA&L`e5H=8;TEhC*Vx`7GP|zZ%CQdzTAa0 zw(Iu;yzdB}j`80{oMZfV5mHv>;mh$ofio}7oA``>A8GW#Zb!&V^(an@`=sV~2XIM$ zCqnf}C?oYZMGwE~ZsD!C#8V$k%Vy;O?!AJmb)YuJeBDOh*PE?A=LI-)033% z$4JYP?5e{sr?hp=BD&8|y?| z_fM>Y-_=i#2z{}B&^`ZbfPLI|*#=1Byg2w2SIP5}FWWkC{ul3kKQ6Qx^to;Uj_=2P z4e{73b9`hdKd!%;7T@k3(1yOOwd zOB?%kzd$_n?H&Ov^6duJKzNtjtphy@TD|goz5a@s@c#yuzqo|%{dQ}|dR#w$4Dt-c zeY#)8eTViyY0`MH?Ni%He!Ty!@aFwJ=(~igzjGhr{O!1>%bVe+5PuNAVd(jPka}8F z7zFL?DVoG(pH-JyZLhDv8=@)MP^O4xVR^3dZ02821< z>J7d+urAnpyWKgF+;%hic;^jxWvN?`Uk=xf18egWuwr=F;cu*)F+g)W7lSaI-$d&Zqj0>#Yye6Sgt?v5x6~K|B1K^9iJ}Kl}a><9|as&$s=n zw3phCI4!m_I`;n^xE%X?5r(=+x^c)q33u~_=YdcD&moNXLpxqToEQBQ!qq={k^IG% zBrVhaiEtQj{dtu7rR4qZ96Y8y+eaFCM>2WenMlhU=dJbeGWfDSUO|`zQ~!v4D$Nhy zmEeb!Bu(Y8<%ArX7S_!m(71Ybbvqbw@@5`!Jr&Fr!dvAUf;eTZ5&UF*#rcuf_#9qL zBaf_nZjpCfpFmxxO(Gumbigdx{bGIDD2_wr`5pGX9{MQjVzZt>p1y7RGvdB&;(o5R zfRz{GnLEv6ds}DxrDSK4G!1jMV+J&KxG`g0T_O98CYFynSzgfAu%yzkw9@Fdta1J8 zAB4}X2;993^REQ1gS`Zp?myvsFQomC2RjhoGH1E@@h-*NA7`NuR`6g49_aX$JeZz2 zOkIg+B@Z8u=Maoq4v)W0(iivx$8e&n9L$eAqFPuMg9+Uwqgx8MG4x zwiWU%Pib%Mz&E(~9vN*TAai&Y+7X4C?e@Ssgcl7r8*x+Jl1Gj>2Wq+#~;FZ@7t(tQMX(#shp&Imc$?3zKZ{xs=#XFB9iyZ3=TaXvJDeD?YrLSEDR@PjAm zJjptg&dzkyH&@-A+j-_zm-^b18X6kzio~T;IYA2$ZRA z?AR%jp&GtadE2%V8ZTj>K29$y*fKlXlKTvOqd_)y4eR&ul~9j>zC_hd)hX0 zb*_Hp=K4)LlX>+^eP-QKpY>k*-mM;-_YUs-i*GUw{@FDM)ju1@ej)zZ*8ykR{(y0< zZ$D`#^?km9H1?mb1$YMvp86*TAYMZA9)ytcF%Msk@d9UFnm6$oKNM+P>pKJ?FYT{! zTH1Fz47j8}9HIKml(9RD9{v3Y;jOsD)3rV=o0S8&M+vUhf$~h^;oS_u(>gdBamw^2 zgxW@HdXn-Ti?mevkmp3<#kOKQYg^R;&U#e2DZ`{39+QQK%5xmzlxGS;Eeq+>`4`MI zp=BD&%er?u5!d~RMXnk2vk%KIA-t|uGFnG`{YCNCC|_SY?Js@4zLMB+!}Lz9`7hKZ z9Qj_Ul-t@HWzI3bwY~$NL$7b{>f9hc!GN6s=To#`HEx6CJ9=X1q`dxJ=Ya9`+ZyW@lnKF0`B7t7H`;3o#$PKp2z`mIu%21M1xxs3uWt`Mv~KM9NwS71 zbB6zG=3{N|gC%$N&KNsxxiwVY`_E%Ij{3eR=k0p|$6ssM8*zWFfjIjB<|d7b>GpFOH{|x8wM?$XfSp33r@LA6ZfJM)GURQm0?=sFv$g|nTB)&E+=V~Wx)cVaE(>4a{L=&)< zv%MKnJP~c7SL#{b>pwD?L_NH&x*N~G(>{Idw{tG?ci6(AJ@EbW*E=x0*5gY~P2Ft` z+*`9jJPYSn_@nWwSSmSS5xx>+eSkp3^&EB=9&%`1c~)G9bMah`_MB%wH8oeU##~=r z+}(=3MQ(jp(>g1#c#T0K>?YH>_Fk=YcDD!(>$}AL*=d~)3bX0eH|M&nYn|(!f;#f& zx^ofdk9Z$~{wm&l!esq|_06;efN@=K9ztGY(3X7veU^>8F>N94bv=CF{Y>wduy>_s zYKo@{4e7+*Y(UqVbHEMZBf5zb`|@9S+H7g<=}(p}m3E1Oa_W3sf&a?_(T(fMD_Rux1 zW01!2@aO<Uth!sycL&tx@M_mvvL5pD!5t)$}@?FbAbg~>jv^1H{R-EKl01!VS2KU<=be{t8N3% zpa&+8>-=kbKPqd8XW4PY&EI(MuOWs$Am?~x;ONRAf4Oamct{e7P+IZdYZHR~Kh8F?0 zG1d(Sq&e_u*;a2)$gt7Z3i}c5f7VEtF|r=G8uhK$Yr7uUm%4APRlt6lTWqS@u(V$s z`@Zz&&x21qw8#1O?cV*b#>Vg+JotWcZ~4}^Zvc+Nx4k&e((k=$8ovSdg`6~gt8#z& zhEzz$?+kY4r13jrGvu36Azk>*L+XUe5`Oc{PaBNyOl^gqUk26Qy!&gI-b0$wb{(L=Rym$0)O!ThrMQRj!&axu zle?RY{Wd<&>CrunOn;6aLo`@cXs++%GnuLx4Cs)-9|4`53Bp6z`0gW?D7;10cp#9C zX84}%phun@a|d9oTsy0Zj9iC zTEdm~CV{hEc(3h3nwuk zvMuh2Xo|H<&|WI9)m_nzyFHw)s2s)GgXFt)v=Lx-hz2yH_T zCG^mQb(3sDAS7Y4p&J(j!62ZhSV2X_UsObzbfjYe0R;r5h+qLlgHlAq|9xlXy>o8c zl4Li#l6ju*o0&6b&YWpy`nlvsGKu~yje7Dl@Yz0D2b57;G}0gC5B61DJ+7C^I$w9B z#k#u$->YHRg|I0re+zmv+Ct569=z z^FUnkFa~ol1+VF;w#T}!a|uk z{Xb}vq&dXEE&jp=es+#m;&~l6QP+;+FNYWPFw~P55Qm0%R!`OvAsv-N)V)wowjJ)G zxHy*Qr44U<>%x2~KK<^E722%cSTRlawh4H2yL;;)|H~O#_73_A2L3`WUp%|H8$XVX z_raziU3W*e)4Ny6?clOX(XTOfdcc8+X+OdG7lU>WcNPY94NX_Nqy5)r^PBM{K~|` zI&;Yp)nQ?Q$#JXf?Mm7E__Z+(YDmhzk1xCD$@zP4-p8*4`gTuuUHIb;t?$cxAHN>p zGJ40fpfBS+?(iO8UdI@>pf68vo|l&@d)}9;`W)fk3UfuS)j2oS8mS3wo^wd8JvV}X zW5N(;IBm>x^2KYCJEgqXX>8`mn#LHF;59w_Q zH`Ci1zr_((G!>sbGwp3F@EFGUDbGfKfbvEjh_{2qGiizc?GaA?cZ6LA%jaWf;D!9T z?>z1TKhxO)G-94=$*zFYFpT9M!(x7S4{!I^a=8ACf_V1repmAIA=I@y#o+V(aF4M! zGIax_Wo74v@LSo*H|ATAANPFbgS*hs-TG}%7P^P1xBuH2nBM-6FfhIS-^sxA_J216 z)4O~N)4Tj;;Gs?6{ZgBIN6+>Ih%PxM2MUmA1wfPXK-5a&6_YmI>%bLig(Vblk- zH*6Y?7um2lUTA#U7r4Y3W$4;5iDL-q><>FlBdH|^z)!<5jc|?4qe&->&5X;igJ3U? z@1W(!W{s0=J4i#YZs24U5&3T=vTzi_+_6n*0l7GMHt7|R@gKg8yaB8u;Lgr4!Fb_4|~_1pTB6EOGhmWPF^OO`z`*X zf?nr>yW!$Dgwv+wP;rV9_LzFJE9FmKY@d#6RaMG@e%&54Ud+=CEZ2Q8nJ;J_u>G2S z&Cby#pkJ{cPK2HIL(I`mfS-nQJi;|UJrQvAYsO{RNwD+tQ_2sfL)s@>JkZqqlyX9H zhImse@EFE)QvP!D*evgnzUHi_fNlfQZHHY3+b_&RIrr2&lxf*{XqcDc6|VmlSzpdW zj{~1}FX(CTlHUtz1CF1Es#ksRM4jfLY=?1f8TCj`B0M(_ot(k-^Ux`P*?A~+H%v1y z?Ile&FwIRn42*NrrmzPz18|wlob!WQUDyJe|9d`mWKvZu7?0-fc%*qIWvtxX2l3-n zz3~PEKNE1`Z0FvbmEQ{(sdpSk=cJdF3)D`vw)?qWpHBgCWja+mm3!IUyg>idZvCzs zCfpa0j#2KJ+IRWvPkfjE5i@S-Y<@w18UO>=g8no=b@W!Qs@+a zVca4<-5T4<;r>4N`HX}07so%*xqz^+uW}yT47(6E?<#*BHcb~ixpVT1fX6k}tX%w0 zhWJ_|eFFXl(7PBmX)^7QH%I5v0C(fF+3TVI(+Hz(hfl$#VS1z$!;0&)%YaLq&%oB6 z5_#0ymP~xy_x)U;EnMPBw}bNL_yF$b11`$b@h+NKyjt?bfTuF}0{l$(OR!b0vpTc< zeFb5K{2|RN0xi}d<*n-QtAMi{#W#8QS_O@-2O8q%O8CjoRj`#8#xJH{OTHQ6GK~3+ zZ6%idW?}7nw!`)J9_Y4bF8Q&7?>9dR9J@yCgx{`FiE}Psen(fB;q7M%k1>c(9(($J z_Y%;s?{_~-zvg{*Df|JN^675G|83K+2(yp*zu8q6FX0g+sJFXlrz74rQv@^Rn?C^#XJu*M zzg?+%EbbSr^H8H){=~!G((0@2sj6HJ=!YuZyrCcPZ&SMA->-*Dj!UYq8+~aoyhW*O zYkmI$r84RMxvSn?@&oa;Nq3F3$CuJ6>&x^3_Vyh}nXaDRz5}@tW+v<;$GAD{th1ct5dt;8SP(;{RcU zlmDN>E`#Os@d)rj{@i}eqwq5w-X)EBswKYwoQ7d6_ZSv=(A$n19IoGkAf7$n@9I2% z6zV$vwxc(4@)o3J<>9UHTY1QPkN1$D0rW_qYB24~iMaMJ9za>-&*L95FrCN$%)oRW z|8oQ5c|6bZA2TrB6}2$E?RXq`XcOt%4z?#i+}jSWpZK=p2?ry5K)&smAJxXsE&Eks zzmLTO`5{L)L(&Iu{nXVM`Xu@l_b)Vt{tEu52*Vh9JjY!#hSL9QgmDag8a55(KgX9C z7UjRjn`eMaoM#PPJH~KKAf4aBPU&D|eGYyaj!}ebtbKuW0$+^Fuoq$H@4`tpH)+3Q z@jz4KB*Pd#P1lUIMV?|j58W?&kBEsW#uP>ip9tMM1$%4F`%E!dSDF=8&i0h7DVUDYtPD`~IF zWlO(LFU);V$IWm-C%kFo`hw$OS7YYi(O2x4`8W7y6NWLfh4IapN&i0(#xe5^*ff;) z95Z5Aaa{Q)aEbFK>|s4WL(tXA1*Zpde*)N>e%jBEEf(}u^))+}dK-O(ed`_AY2U(J z>R<5Fa4tr;=8^vfTz!>s8TKCR{5+B}f$5O;`xXy0HIF1ek{!fLHZ$}L9>bVU%3p52 zndLpw*W9uWx|9nIu*+b2Q^7f+=8G=91J9srNVqQ?=8rvkQ!%%DFt4M$>>kWf;48le z^A^k0%@;qo;!E>I*ACM;V4N?$%QDK%7ym<8itFc#{{_s>7r75pLt7C{dpJW3OmoPE z42*Ng_v?P|WnsW&GIPTZZgo+w#{8QVs@xaM2k~$=bL%E**BH~y7+HA^ot+O-b`I_2 z*b(+af}48~O~LKH=@;CKqpt{`-}aMxNdxD1?gZx@lco??W0|x_RAo_t+iPViRxP6DYm757eXDb8n{YcNnd^-natF zYL+Y8TH}@L#&Lfoz?%S9Ij;!+%J{L4m!oaw@AR*VALs9@z@{M{X*YFxH)+p;Tl7{( z*c$k8tmjy5X{-r2jc}QE74BLAm+37JcT*?R%jRX>02jS=;9n2Fvb5I+oQ5>WljcDi z!rj#A;O@+4BlwH)Ye^H}G{rFFr_qOPl`K4rd0q{;w1)?K?O<;Z?2UuH32gGCZ)p~2 zgNA6kupy>Akpq2a;Y&6D{Zr-(dtn_KPg!pMd#D{}Ol$MsOJ;qA@1Q#1(#tQLY|40P z3--$=+kX3SIpOAHn=$>v&)D+x@SPU&2>({}^P39HN63lOf5q_CLN3DjO>J}F%$#4D z!1@_;joKE>N6V>gN0Kxr?&jD0;&#BuE6RNJ!);JL zO`WkHZVNyAz8e?Li~WxN?GeU%{@cN(v3-bfb_9G@r-!qxD2<%}ZvtHMVg&p<#-p3`X2C5Qy8*8mzcLyl0jCiz)2qVWBj7TPt>JF!Eb_m1fQ#N<@b80P zS=##oPE!nvGR4U&=y=)zxRh7B27C8l?-}e-!QKxx`C~cF>U8`$nRx)+Er2Leu` zI8B`~&OsG%4i0g&z8eicc{>DlmQIn6!voF3V5fBnK8}E&hV6uKwTB}CZ|aOZ9R)x0 zLEdcqqv59!Ph;RGPsap&x+8upUsonWY*>`p*Fa|TJI9pSTB`>64bki0`;(@X=WG`} zk>~pZuiuYFA*;DRe<;$Pep>4^%0Bv!g3&9DyGd;{GMn}%av1y63Cd>ZgLCp=fO`VP>N9U{ncjIW_iTLz?1Yukooei5t^YR!L=ch_yY)KI=l$*rp_#lPgc;lIM5J3v*0H`m%vtDn1^Eecz+(^GK~3+ zZ6%hy-awz=aQ*#Yy6s)2y!_|+)k(myXG)Xdw`WSknF5%O-#}jqn5!T22Kv)3ZhQlM8T|GQv_Fp; zR{sp(GV}Kh^nfY;*6EYRwV>qY$z-dIa1wT&wcVDGm46 zNn`u;Ta@+2dvi4CzaY@KJJ4X9J4~Ei@Lgo`kfsa&HF#guZHy@cV+IQmnmM`G9I7ZRy5JtoC zncuzC_-fCT{ss#13H+GWod~00TKs;b(z+Y)p`D)QkByr+O@NF3eem;l zFL2^nXG3xyqNMTNB5D&ZFS^rWZ<96(WU=;_)*Wmb+Bnj%YGO03G&qG;n#-v#L-!^cuemIftKzL z63^XR3h{ZLT(o$vM{d5Mk$a^87hU={!;d^}1)GL+?OxS$o5lEBg!shae5|RH_}O{o z?|>iRZjSpB;|F~97pDCpV2uAVY|5hF!=@2mX&C12)nQ&3V(w`J)mtuhyTtD{6ly$*xoj!Bb>z%XHne7nKbbPch1Q3 zIqp+0!I>*ID>xS-Y#JyXkhJVEb+SJP6YRjGWz_U3lN{bM(Ej!c__q7Q+%x_YVD9Z3 z(&T>dpW&bB0nYy_!*l0s&*FXW;>l+9*AOOia5!gk*Q@$oCyyDHM~pDz^#@|BFj+7K z>Q2pzX%b~qIKQ(|vgP4q$wfxjN{ex?9KKtxzEA%<}chEg6d=s4R zJ9`o7M8OPv70p~A{Qynb#WkUN_FomId6_ z+c5Z-!;f{dH0|@^SW5p2`0)z2l^CF_OwMcT+a))q8d zg*#9y0=EJFRfD~Hu-6Xu`oZ1+c7Yz^iJl8XpHIus%v-Jv_nsJL&&gR<`EzpCQU2c3 zhK!fC;l8-{)RT_n_vZ3v;^f!ffnuKQ9Vmw9??7z?oIbt-)sqalIa(9THaAD3JmX!c zja^=tAGFo}xC_-2t_P?*<5;17x*5vN_S4PbPsfwEfL0ZfGt8<=Vjy8fKz4> z&bFj9wgsGNNS%vh;*&QU|F95WJRJ-_c{)7c(;e|+`MNS0V#DIP^saD6it=4|q=KwZ z??{oRmHliNJ(2x;0k5wv@AO36aGiSqc(8Y+j)32;g?Tp9)wsa5@fgJEv%69~$w;{S zdL;PB%lj1|?|E8);faI&zIGPyRaj=0>9Ivr_HM$_h=&>2h< zb0>yrE`3(ugY>vZZsqJp5Jn#O#yIL{t|c=aJ)ftQ5oYs2|8V@6_cdYDkhZ%A)al*l zhBTGG^xhBRNRM+N40%@=>0N8`&hrBDVDo+f(qP_cGw&BNO~lh)B;8AJUownC7X_XO zU(@V8zG>V#V-j!l?*l%#kGVH&8pa=Ocysj<(zwi|p|c>-qTlIm00k(-;0sQ zTH|++7q$6o;I{4jyP+J2WB1kQ|2}?Pqka!Ijq+^6jtKioT31{P+y>zO0CoW%aLpN* zN75lL#Je8ulrFf&0hm<<3AAM z-yh;X7~+51#DCbte?Axgry>4NLj0eF_}@a$Q2LLU_%G+;|02YHG{k=_#9w{I82@PF zegOJ`1$FGo2l)--irzwP?3>3z6Nz3Jn9`_**ZJR!0a>vf&r_O+= z-gS7BUm(S+u-)Nf!I9t&VVXem!6V_#k#8QY3x1jFhFznE`L%yc(rw;&FQPkM=PGYV zppWu)W_7*wq8?ZaDS9`YhDi^`;#ct|5MMznn=AP$?W1xnu1{SH?Ylw_YqAwhzp?I> z0T2DWae27a|5lA~*MC=IeDrtX*m)rRYv9Lu;OekxBm-A~UvkOf4G(zQM_Lnp&I#9o zJ+xLihfOOvD2P+R^+ogV?wYXD?xwx-vWnEiPJl$*xy4UOBu!S(D-eZr78Ndzx2mk2w4>9_<*fp6mcW zO{VLz$XE%hCA8%?&b8s_`>VSOj zUV-PzVu;OC+;blhzTZfhEV)8AdS7}jN4}g4F*0NQ6y{|HdGy66nm!Dmk zpWSEpj}Ewfg~gMRgpF=Hy#un6@^cxSNI2NR?QN$T*dE05H+|hb5As~Kr?ICC%j(0S zyj=nEb}xjQ^G zY{R#uI^Rk#%Tj-rBj*4=z~0BK&NyG%AM#jmJI5m4fe7Oq>wqA$G1qYMHD5aj@Gy^a z^RL%}{i*e$RNbg_3A z^Wf`~bwIqaz)#B^rKxf+3saqHemO3rIleT_OdD`@&H5dPWR$I2(PSnP?#F%s*Mm|dDs{3wA^a-LVhNWO2K4t(`T@=E^BfNk}3GyN>@k)C)z6LHAd#mA@+=43{#$VVr_$;Uac#fOEJm8JTi@LL0o^I#L7^_}tqx7KV7 z14?BWWlb8-@X9u;wJB+Q!r~eF#N&EF{qCZG=kjjw#P=+OGw+{-T?Q-5yDfLdCBL42 zv3*_|=zj{fZQuDi^>tHEE(0D7)6KS@Sl{CFGlBMJVXuID5Lg-}q|5eCTWMr@9Fkm) zFdE5l8>g7xhU5zY-|}DH$Lh(K0`4k7u6`bVrvJrYe;M{F;B_IuY`S!p%KK!Yq+8aU6krxT@GP(JmtdA5k47b zGJUeW=+?pw3FQl3u19)PMHqsc| zHgVFFz|%+I#{n1bBqSe&yXC;vll+pz=i^+!+I<9`8fQ}7wFS(^`a2x0>Ii%p62$n>Aw*EiESM%Y2OL7F9zIK ziBIbi_+51b+AMFV(+Jh(_hbaKcx)f7uF8Fxd>a0iQNAKsub+dzt({stBaLyB+gjTl z9}US@5I%j{grLqoW0=b`Pg{t08+Er(AU&+`HLIp+y^Lr3s1j=O-3GxbvY zDq*>MtxsUD=WyKr{u;t$!d_3GwQ6i@kai#K@Vqhm(CRg)-^++!!^w)nepq+ow%_U!}TMu1!U zFW(Pv&Beb5|Fwi6&Q-Lrf1^1({nz2gchWzAO;ZeuYcs7Yeh6I7*{_Ff*Iir(lcspN ziQyr=8{uZy&G_ZNF|M}Gv~Q`vV;JM7Je%)ODQ{ZS-EQ%~r`DF@|2Bk^|2trp!SeaI z8+fFx_4be9CqJ-Eo@&WG1i&zipy(0de2`<{X3H{l4G92#??W9-u`z;O7`! z$+?G6&Xj+Wa}UD*Fkz5$T-QqOu%FZaQ~W6Begd0@eKZ?ZloLM#E^&SiTXd})V811u zM`5RFK>Gaxej3UV!X*zMhg*CxF2kO{&+ZE{9gX*-{VR(Hnv!JO*QHMaW@RJg`L7L3a_|`glN@}`z$6DPjB=3Y z<^2Bg^T3tSH}>XR(WR0sTW|faMvCX<=(ii9OemAOl3OnY9LcTU!T)>05Px6VW`0Kh zEBH}vy$qX%eUAM$h86qvAAn1oKf+$4=WAbW`Sru#Ztpn6IffYM?|NfdTG{qz_*u@c z!cNN>vh6kaX($^Bmt6lV+^RRmW!UTZ<>mT@fH57?{=3BkP04k(1LCnA5$}x(JccnH z{#+Z$$^R_xk-lX8KM{{@oMn`v439prg>f2=R%_lro|&RchfKR<8% z6ZvyONG+*q${!2Fu`(-vP_C3mtk-$+p4T#Hhbj~&e{k@P;iP&y^=~ zrSk0J9vUtwVw2H#ai^Ok?EW3zI&os#_=Coti12i0aK;oK_q2^4j{U@4^KWC^bJ^aJ zpz?tPE!#6eUEWSV$-%pivB~Qt&?rAo0DgMD(ZeXsTQ#S13|GE5-%Q&b%4yX`Uxt?j zdChlxl-El`ek_7I%-sdo+b5hkERrmW@R?Nz;hbV9a7Il(tfO_Zd-LkzjGBVohDqaF zJHlDV;=tLbExfJ@>+vOQ+S5nz_0=T2lXYhuOS-VJGbSDk{qHzOTL#~=TnaFV$w|0R zH+pKvqzORom^5_?@N3D^2$O8&_sEt6jBRka1pAeEbIUUo!q}fy!l=MUUM&Hy5wPLV z@E=})wRE&joUX8$Xt&VW0k&G(TT&DR`@Gj!J}oWXzwccJcr^L56us}|J^o>M-#aYe zEepFj>3Xl4Z7Wwb@nISAMtO7w_-9{!u=JgPYt$`cTqm)w;cWX%yN5$g+old`%TVvpMW))i@G1M{T@d~I5$>WvawsL=E_*u@xk<6qF zqkmQWDEC)^O#@m^Ca(y;a>yRt;(#XXMCRCGU@zC%r%7dU8$rWBqs4TJn;%3lYtR<0OMq!Hb=Dt_#0kWeV!o?dt(<=cAkxuAkz@5W-mxcE6T;i5mchQa$ht zrwA=^`nU;m@1rJDi-XtEO&H!s9e74KpJ!aw5A-3W@1rnxtg#HM?)Y!$!Z31~Z{AXd z48tA&jSwc&2>FWd#`jH4psO0fRh_lx9XfRDcdKQHlG8LaEDrjjA&2#CAgu)5yf-E{ zuksvn{>JQuyIAXoWV0J2{Z<0mWc#`tnySkoe?ci*0;;Gi6kT=Ri8#$0^NiRs5gQf; zCgyE>39V+kIW4PfmCol9%QDj+<)-=9tj;+0Zw}e1v7d9Z<>BWXVT&MBIo}{$^NpxX#z0G`$ zbH7gS9u2r{hX+-}KRCn}UkAcZz7Bz{wz3J_mGuwo!vYPp72=EEjp0tq2zT+12)Ih` zaQKKFRNKpqbzQV7}6@T9$q` zpD|4NYze%67wh|jQWUSpVO zoe^lA3A+qN8q6ch)$`rSAzC27h`!!v2tXPXK?qT``Am1^Q!s$~7z7isq%< zA0v!yEIae^?*}NC^7C88p*-_(3K-b4TqM~8;ivkI-7fYDdbzFO_w$myLA&gYz`&a>8-YUsb8iH~djR5b?8H6x$*s6Hsr%;KBRLXq`%d5(`0YD^W8t4U&ok=x zPbizQ3)%jx9tc=*S)PHP=E3D@mW7UZuLF#CpJEd1P3ApUr`^KS?y0%qS3oIt;M zBfv4wz9Dda6V9>7z9H~_B6yxz9@9_2e(*^x9aCE-OyYhA`8>&`6WkYD1f-TAxw_2gW_p!S-uG z;axx&-Z)Hxb_m8}yTDnbZx|sS(~oZl>Ivs)*|!7rUldpvTYxpr8j>*&^`E}yt()mV+N1n&5 zjqpy7(*(Ejc(uVv))P*>@wIiMn>qni4i6gllk0o9<`;Lu{|0{4tvnkx4b#3N&?3Lr zB0Z-58^%T0dicJY%Jn+K%cKD3nN2M@*wyO|X?U%X;mX5JfH!rLo?o}$48M3H-u3Wv z-Tx!lG{vwu?<WguF}fmJ`r#=Cx0A%=IfWRRW__6rls^4ZtLjDl!kwAPkg4Q zH1qgRr}(}spMsw_zlNXI-ZpvQ? zVrUm1&0{!a7zoM);c3Ii#Wm=TaE^LVHqj6n1271~S zTP{g%1RdVtxE=N$t>aE;8}F6ZPS;U{vMYaD?3|-5o3PGlX7(~N=iK)p?#S`uZA|b| zPkstG?s*j8zbN8wiMtCf&aaAb(y(WW@wQUD=Zo>uu-_NsZLN5JD#mkRoS*+0Ve#&Y zFHg|(zHkM_ z-7_JrzXjS;W=xC8t3KWO$K&kTraLjVh^KQ+R%3nkFQ!{Y=e;2Ew@lrc z+*}HfzLQ2hc=wE#Oe(yAQl?;O0898cW?x@@zaZVpoAWYtR|-=)b6pT&Tsq#p)t)oG z*WHiJ6?<{LZ%`QId#fqC7Xqj6I+~MX?*utUnP%PZ0?zdh*JN+Otu@(u5$?|X{=@i) zOB}6Zum*74*T5d^ZvBmg~NPzlYYR6 zh`H0wJrEj7=#7-iUKi1*Wmr#sFP(L%J9gY#=eb7yjvCvQ)j#wv`ORD4f2T0qIRkCZ z+Zs^se#9CuwVCkV8v6z~>sBZD5b&SZ3C{AeI>9-Apic0GfGd;HQ9E$5j<%TA#$1c| zz7uPHekS>KN$I#3Mu*^k1aZ%JY=Z=({iy60rpXcF=8#r;iEUq^aF1h?B z+LGk*(h=_DawFq|K5?vErhgd1D3_OkO;aY9E#7hgPjY!#_$il{hb=jt;sYM{^WvDI zJ)@Nnhd;)n9plxLmEor$-?l7P1)O=-9*$_NR!XNKSv}Cve!?p7lixL9leXH1@-2Rb zBb@wrQ%lwgbW~5|fqbu1f#=Es>*JWGxIVrz=rQMbC)r82J!d6fc^wIhAT1B`a*;B& zCo;E6U&>I>(+yzKS^|E5t|_RO>q`P2Z~uDOQYmf>Aq}=qtSM4`EtK6W0G6&c=6qr~ zFDGg4jBrKp)xF;H{+&H)Ex#tqET=1dZNhT8(j6?PD}7z!8C~hjXVpFG^;{T^l*~P9 zjziRyzCOZaGUL#Kb!_^BT=qu@Z@2)wk zv#gjHq&1h##Nezy&Rcn|GpjSs@i)QvF1TG65N|Vtab2)!m;-R{hj6Viwg5b=J=_{& zOZYYaxAC`1<7emb+r;>doWqLlb^)&WJ@*i{1#El#iu47n_9i^#qCyjiV>Qrl@Jwuv%m8O|#1Fo)FA4T43$-aQouua)@?S6pUcDH{;`~yOK z@ihv5mf3-@%VGXpenW&;);lO19O$Zz5MO!N2=27paJTr-fUEQlfuB4a23zfhR|U?^{O$U;UB1lD}hMTU{(nKg)ZhC*F@m9P<7l*kv%~hiO=PKCN2P z0yquBHio;3kERgjWCr$XwdPlvtq3O{V_}!U%F0rGQ24tC8f~zN&-zaJfm>-ZjQ0(y z!YFIfFvBa`toBn#<3yyB;u-qH;~H1}ZgRkLc{h0C`y_-j?32dQ=Z@Z=3Y~NkB4#6LyS4RPv0N=I^64FnP%rk zKA&t?n(cBwgSeCt`MI&eC|f+80*1R!KN8^s=n@a^rZgm!M`ic$_XgbFxgaj(zwSdz zSN~|h^1AvD5-i-!=ib@jfZ03vN5XIK;2#D5%mGw52 z*?alp={NW8IgZ(T`Oa^`TN!S2`+L8?mrs5sIC}B^{Y3cf{d@ZJ_wP>t%-+AB1b^B6 z`ze6i`}9-cw|D1RKY88$f>}JaCws@f9sY2K-Q7Vt6@Gi?o-}mlo_DN10>9PmKMH=U z+n@MWw?F45R<}RHt!{t%LvM6@r5}ag>h?GOjBbC|FLJv5Nh{vZ$9og{{dWse-ToZc z0n6z2?<6dD*Pi$MsN4S>gvs%MQ zTz?Gh^y_D>MSA?C3IisU42la``8QG9O})sGwbHMmhCd$|Ejrr1KOXvB*fKP?PB;ZB@A&sMjLk) zw8o?V)A&*M@26nX6vN`$UF*)vfXg-AXJC`A`U3Y!NK?FA&hU`l=ip}8=kc?85EP$z zWZGY>z+)KWr#wT4!ER{#G|C&xhIn7GcnH_tgZTe4!pZ*?u*+cie0&XfzTEv=tgpk* zbhwWZ^HfW&0-T0nEcX}|c^De*7M$mB{o0FoSeJ51*6p_$RwC}`?6(+i?-!6Kt^4#nhc6kJbl+ZSVA6g2RRfbA^KTfK^q5UV!=fya?D`&XiSvEfqHE<9LthO-9 zYTp0hHz)1}u1rRs`QRvOEQHEh#-KVAcQR}-)C1*aSF-iKfFs#@FZ}lt2HCU`Z8O)U z|3UmHTOWW;L%BfN62pq}=ON${=V92F^?Xl8+v@{zH^$x*i!(g2JowrQ>(9#kpTf_& z{Tb}EZXxr34nGaY48k?uJqowl3ga^D7x?AJyTt%wI;8!$#RE-^cWisaW7{R(FDvjE z#&q~|?J_qmW_geFH3mM3cx;zX!7hWn9^QX&EYrBgwCuPR#<^5?R9}v3_aJS%?pO!@ z{JP^OxOv=em?R0 zJ#41=N7#k*0k<-cc~c%Z_a^;U@w0nBq(NS)!m{y-dMT>nWy%G2vhv>mN%M+aWy*7i zDNlsyyB80ZeD~r{;5+xcNG~UJ93g+yn&9+dEt32haSPwX=x(v@-tadhuOY7eRt9Os z2mfBK`~|T5w=(_;SjuniTN$srFzE##jfIoH0ao>`jK3pHa!Yy(SXcRPWw70qeJf+N zF20qqNf+PBU|xHopI|odX!2*1`c?+tnekg0Zv?!5z}{K<3DQFHx*Jr9)s+gtm5W2k zCH(H5AxKBTi6y$B-U45oN3cILTyo4{r^4K>|6hVU5E#G?EkgKJq^Ff)}CL@(`)cs-B2md=&N;v(MVPaS2~%Pe#CD` zhNSpjr%wa?#90V7Whwb!St;#B0GDnkmZOzXq`MfxsT*oh*fiop@x%w)d&F-@7Ekd# zA4B0MA4|Yi+RV%O!^_I9o-7sOTU_b$$>zD9GzMJF`<8~EILp9ReDbTb#H(u;$lJ0Z zzQt8qdEDg#uF_f#ex|hoY?Y1jrS!7=HY6*hH2i%~;xj#^na5ux#rI{oGW^6@6}Hk; z{*-2xZ@eo^Y4|jWZ_~`gkYs~g+BVNhJ0EAGT-qCkw3}eFk7x0VV{q(?QEsTMY#M0&w^Uw4 z`E-2sx|+8%B!Y8NR$xh5`TcMk4iV>>iYQC3SDK>MU3ZV&=c%@+9uUmEZKE9A0(HT$ z#L8_i>!RFtVMDBZjdP$0*e9jVsJBsRCTtTlz0n;N>%i+y zT^M;P(;>Aa;AJ|bh86KsJy9zbX6z5VR25E z)giSR!mJLd&Ee0_#dvR^N{7^zz^~FFwN;?ql@2N5bfrUz_1cp;+SZ^$Q#MDVZp_Pq z4ykPd-nOvkM2D1VGnkcST5M*T)`MQ<<`XPG_M-{aGRtpa%<0Rw$nd;TDP`#e!Id)D z{r$Hd6bp(qy%0T52xg>Lx8*#iIyY>&%!^}COD|K-U~rxkOW&3=btL1fpmow~Z#~*V`$`M9wp;dl$gNI<;{} zxV3)WEyCS`2%&SPQ#2BjDFu#^UW6@Z1~}i`G5hC#}6; zUtTSZRnxH&#QRiqLyFc0i=dtAX0ONM>^E`aCffL8e@_HlTlIuIb zExCSZggY6182qG994pu9KLS6>^}}J)l*x6AcVxhmTpt5J<@!;uH4dcsfXBVaI3{Vo z>sZ9$kMU^7c=&z={50g-mc{XaGtb(85{;HpIt|H(10C&!90x!7ZG~;yi1ICd#vz>i zcvDNp2e;~pJdp1R6?m>Ju!fI$ifj1W!d)khmpT)s+um(r+s)rE-7kfC8Or-SJ(15< z_u3BxJ$n{>5d8jnjiCN~^|$ns_77V-VtcUG%Y)T@C;xEX){L@kVFR|de0}A!6KhPFi4bIEu=K6a z!=9M4ddv!!|B2enW@#|jDd*2T1Dn+u*BVpd7u>E-h<6HpT%SyXO~X4Fglnxc9qzCO za%-Iq__YqP@n@v*v+Ie|V*EzVrA7CQ0M|NW2GTwquru*1(r-x40-Q!`8{rpm@!h|G zt2GC4i+Husrmf5FZm&5$shLaFpS?{3mnLt-%(|RoG=P<%ell zdOj_@=LDRFVN>9);^X8H=41x;oVE9$G{1>(^6@R$Ww5fcR38-n`GLm&!6rWIJLLy% zrO7bf*{BMmtVzQRuWYm0*CCDXTRcObcwB3%-~Axqxx5=Z@qI1AnfL2pm%+;NZp)o< z$*-qhY@as-`ZvP1?K@wmzHaKt&A_8!y4m&<>sx&ODA2wIw(j$gF55qCrIF=vNOBv( zXe7gJoML_(k~;#v<-fd-)swpduJmi&4nNbsGuU^-mVPapF5RW_9{RQJK^TqW4SPqi zyyM={)j_}34i4Av&kzr5`c%Ib!|YxX+nW6r^-lDU=1W)~pL<^Uy(Y#<4`b#~zgBLd;pUU)YeFAWM zKZS1`I3DEnZG9TByuPi=1T*@!J`b4HxAi6Xt-h@=+Eol`YvEr z|JL{5FVnyEL%^;6t?S{pdbL>8;(78;O`P(+;?;vT(hEgi;hxg|kcmS( z{ra419qZhk&-;4=NC%gZ*UIacXq zi7aT3xNy_ltT$iXwMVYCcS61Uc3N}yD6~)bcz|oo_!#_85QaDp(#9PQtu^WY6@Jux z@JrY<#jv=Cp!M&Qz~$QVDcE*@fcrJ1DPEpocu4Qpa5L;#{Ons##b;ia_HQfj7{>T1 z&*ojc^2WYOycaAU_|zVV_|zwQ0J6?lG(4q{};j_vrnRJWH$Y; z<42kOSJ*U^Hlx929eGiuv0pad3zUenYVw#E`#NHe;;@@@Bf9L=}?}h z`9MySZ2*9g%w|4yKaO}-W;4w0adxFMr9Wi&Z1Uq|_@G;E;wpg|7gK#-QIE<$nYWxC zmA45?alO8Se*tFYJjb^83`{cpKL#e5UPIk0u4KA}QKs`w6m^5uLpx#X$mmuXj76W` zeabRFD9`xOjwpi;K>bp_(p@Ek7e*ZtM>2RJ_!l7zaV9gqk-_vYhA_(DMPbuWeozL* zu%etA3S8nW4*Qy(?-%LFU=ZvS*;`w2?x+k5<~GE7wPVJTs6*EIQn1rH$C$A+{4^YM z2-kSI4B%=*jLWcLu=C^P0U;gIUe4lyrp8O#rir&g1s=ng4u7t_=El`5?~%U7(3L=! z?R90?Ww3X{`y7si8W)+C9T&qm*&|(Ib2}~$0iSklGXcEh*EUN4$B&C@m4l;OaSw>? zCXR7&JZvO9Hy$pV!S&4DAIU7r0s7ZP81KKW6Y8BZCL0#z z2xXwv_p?DrNB18#gg>uuET++rY?P+q^^L6uKW630`mmX16YN6zfLl4qyeSWy-;@5P zfZ07L(jYHYVcB>^T_;uXGUb9hYI%KQXB6$Q$F>5jO83~- z2$O8&BihYQ@QU?cR!;aw3&#AF5V03!z1h|zYJHxL&O1vH5r~KFjHcc@s_TOSy)FmVx zWV?b6Wx{T-+25LB7vcdPWkRiSU&HSnz$d?&_wNb6)j^i>jQ+b9!e}JFge%=&Oh4k| z`*A70*B!Mt{KVN8Hp`HF*tGWpTsp{Dj#h4w?g4;N2ig9xX~c)(i4V7rk>WQbqf>m( z$AR#ZkAq;_e4jtOtnBK^AtAoSmENdqp6khBxwH-qX&r9TBEL#Yyt;OQyp0L*l@@W8 zRv!1LfUCLbk?@nBqhYITSVv4t>1FwCNRCZu_&c-2XL?FAkAGZ>@5}N-@Dt~F*h*9R zQ<_=6@dh-d;nP$em1Z7)Y>MyGYz=9SgRT3AHlIp2%lnX|Ezq%Xlvkylk25is_Jol3 z2_|iuU!|SR!;s{}T-r9zN;@BCaxU$YLfR+8W*^Vu7sut;7o*%zTbUMU?H*`l^Bv{W zywyQ=U~5PFq|>8>p4-=>MS8v0LFQ>RyQ=`r&3PL`NP6wEhZk|WCYX6u==W!)qYgNh zSh?+GU6k7{Y>1Vwab6@HWFtU_I><)C&S-S1dd!-(Nyi5n#5k>q|&)6}=IB8f*FOK{gd(ac-B@ zL3RqltPZkv`15nJ4wP$^4zdp5SLq;|5omX%gN!&`=^$gh_GGShD)4B^=4w_4*=Ygq zblAPqK~`up=w_J~%jKt@o;SNoFJ1R4H=khnu^)A-8>{!P2=fg0nc(t!Gd+JB*mbe= zt@P@)oO`cErk~3h49*jw-nZr42Rg`#Q$MS7S>%(V`( zu8XH{8%?;|H#5jYuD7ha6L7A*xJPw1+}aB}H^SYUzK=0J;u1&eG0qj~KOaA?WzU06 z16nT5N8s07#^PNN@Z1~}i`I|BPg)nk?&9r!I{&ge)dN(t%wrv7^RWSi&ReE~jP=`{ z4l=ei`=;rm@|$~G=cF*4Qef`MdE+MtbLaL0w1&Yab&#?DfYWYukj(;KUI!V=uS^Ho zMUE!v&b1D*qCD#Z`Itb0rFAt3#!<>K$-Q}@gDhXjERSyY8@uk(PS#$6cEEWo`MuP* z9sE2G|FnS<$IJ41BjJ+kXTdGG{<#QuGWv4(NuM}YuG9Yo{3zEy51Xb;u3Nk>1w6_1 zFTzi`{$z6^eU6Gl*fH|aBg z+p}fH{cMUGLkMU4wD)r<=f472y4KPDM6UA)tc9Tb`F__oi!pz;a|QUEV;yAu!>AiK zzs2&*=^*<*!g4yu94x1U>>A=39c0XNl@7A+y0CH`WZy%W%v|aq>z|TK$FIS$-tJc& zWc^YD_P*5I-?#HD=XY@B@6+X0m@W644zhl)ow>OeG7#!zzUm&cG;uGSpH zE#lRZdvkc@Y1fkb1749vTz^Ri*-gOZ`sdbQ-yQ6Gf_-1G9|-n?unTl?cOmA%*QeG) zKLLJP?kG)_J89&@RHs^-{WPTcv(hv(ZNSwv>!Zk9EqN4h8n!9BzJ3gF+wLB(i2p>0 zFTQ>OKg;Zwu*+foZo{<*udH`acq-6U8zH{(@B_Hha)S=CUk6;J_cZ+E;ThO!H!RPx z{Qo8w_qQSLBc=GUjpX~*3&2-@B(LP}Mf~hNZl<5*J<=2Jze61I{u1mmnDWCkEIpqV z-kJhV!>}L1UB$^W=iL23RG;pF2_u*+a&WvM+_dKfc@I>`ECe~Eie zEYs`^$?G6vyV6=ldd4Ut3L3_6envW!EuKyR!|5P<2;o%HqrIsCwS^V#CsRI^=^*<# z;P!qB?=o{d$m<~c6<~QCWKRlabdWs@nAJh{9Q;-X+4Jzv9I%Du&!2t|9<2_tm*JNV zvOmC`*FpAYz^o3kSLru8#yHMd9c0dL!a4p}9c11gb&&nV(Th6B{tCa_FH-|7})edTqK31;!wzN`+ici^`=$linB>L4QxtAnfoGS2EC z`vtrq^w>roc0)4B4%=j}p$Xq|k=^!I5tAmVluDlL1j{A8X zWD7IR3LRvNAWUY?b&&PTGL%PJ?6HI3bZ@@tAnTWk=uaII^Kq|d0O}wssovh}AS)6H zm!NyAgRGKJKkFdtx{dT+2iYZ%p+h_U`kZSW>*jirochm5snj-1PNK z+&v2I6E27L!1k*(sfmn5-AVF1!%>jh3m{UkUy|liF^x6FH zRYiIOqAF{Ah>_mY8ThM!F6WPwQB^W~Gt{}2*_*<@Ibn#yy(Gy{$}IY~L>OiE7O-h3 zZ?a)g-blV}1zh56ZRlE=Mj1pp+rm!MfF$1zej3U|!X?{xAe|uF8JA%@!nS+ylI@bq zJ6Sx?lw4-IjGv}!WP6dP7*BcI1$3FWU168O^1P1(p3VF2@G~9C^E4mG=^lX7NMiuPWcZ+y+^G&SSEffy8Fxb4xRct(N1ZF%GjBPaDv&71dye?P(ypZoTbb(AyoAAm5*;Qe9KP<~{?igM~e;1Xvv?0(ll zR$O)U!L59Ir!J1_I`bIJZHRSl$Bctfhph8MV5jW?W5%KI({RioT;t{8fU6BLF2jz1 zogXhR4e5~fkrod$HD1~_O}wKk@EFE)_;c+wH?C%RkMuQ$9t*l`uOEV429pjlj)fW* znU)|tH$M%gzYAdadA96jPTre zI3|PZ$HSulv*RJxLdO`G);-4=n8wKC4b18wYXMv)GxiOx;!Q_Au|1e&m6J7{X6!1s zYwjMBWYc)mp_OfI@KeTIg8n0!ML9tKM1=AF+k{Z>lrh<`C`Tv*t-hZVLpr+ua1#7^ z9b_?$hGcS@hSx!M0{pm|l1zflG*5LANcA*6%s6wt6b$VfBl zsqnI=9k9F(vgv@OyytX~b-1vs4zd}5Rp}r*6=9NXUFjfW8=RLq$e7oj=(RWvcr^KQ z*}M+2(*xcauzRb6tWZCYYH9ga=^*ow^iUyhJ2@~J`mET8tPZlX!JnT~L)R+8B}--k zZe__w;a49e-dXTdessd7DTc-VTMUc3grtM)9MGXmI2Shi+s9xR;sG9ILap&2!|%s| zPkuG;zW{!#gDmA4{r5tI(MWy?SGvELe#FN&^-_GVJL(hg6Xzn>l&|E&rhPHs(m}>@ zv~r7dF9nP`$S#3RBR&*Qd{ACR{D$PyDZc09Q}C0I%V67lpFg~;?CQy9Lwt)Xy;0db z*OSY0X?-rF^?8#P`Bhrt)wK)c?TaD4(ju1FwC zNUlt2_&c-2XL?FAkN>q4-9J?&2NS@ zuZFGrhc=%|H_Q8wsghJ+}`?OG)-# z6In_oKLW^)u_V2J*~7i~ZfW{mn#^9!&8QEKD^`Ykxff-)3mal(ZM=^<1>g8tY&pC` z1|8}nI}dh7yOYkU@(+7cX2W4Li_qO+TsC1Fq3M}UvNA&ce%~iSr%W%|X8vddYrRjF;*qyB=Y2zL(WYb|b>9Ub36u&(G63 zP_|Wi$$kXz|D22y|j3bmBYc_oGV zT(Wgr=Dk-plU93_R(&~;_%a8ZgQm+bZL zvEA8sQuoSl^qSqD!f^5t^qT#gFn1SVU=K9ZZN~ltZoAcO_6YFuy3JUIR<{|)-6fJ? z^+z2|(w%GFW~n@~g0635X9Cfd*4m&McPZl}6R#{CgM0Vg>yiRz!Q_VQIiD9lj<&&h zG5LPNxE=gF5C4^c6UWQ@dL!YI{dd7F+5hVZcXIq0_(`8QR`%2X8~iBypM_0RCi^Yk za{*7X|F`f{_CF6>V?~M&c-;4l|cZUn=liSzwPK<|*zGJQ%(M z%rRB+mu`E1i)}c6&-Sqt=4ET+@=4MYxy|)$+1>wNf}TCEeiD9v>qbyNHarEmJ;!Fc zPp7ysgmAV`dl#5@o?ZaVOOoE-)h+3NeYVixdGw3mb&hqO^(V8K7qV>s#InulK6{O@ zobEFR%jrJ*EAfo(Gv>WY_u1<%EUWvB;T2kgM zY(Nii!^5#mK2x#wl%)t6M6xk+n)Cde)oE7r{14S^He-XoemM{4S>3G8xMq11e!=ZJ zhj?$}$92wIuxYqoM!42Y|AITLrQDk7UHG-0vGM<%#?P)x{uARja!xL~{|#`hS7spX z_W?_`E2H0#)BvZ^8cFy?Ug}9hz}4D?xJA5LvQQ4MJndStNWd%7i0e4%O?wA<;5zEP zVAm0s{vp9$IM|B@dokDry0~u<^Wf`K>#8MypO!mHQ{_$?`7qU~)_6;XG?yw(Gt&lK zU9&!lyw#Fr5TAx^%B?{=y?a@}ZM$2pBAw+!eDO65ewNV+u*+foKE`bDGXr?#d^IF1 z2fAt_#24-xaHr)4y=klFcvvOyuo`T&8@k)FzG-H`rzu*+b|57V&pd|G%Pi+D5)`)3z?{3C=pnSuRn?O`a*rohL> zh7SuXD@*l3(O5jt*bFxDXMnG?T;Nuk4C6hMsxZo$G|ceIHmm(1(%2g5qznn(j3x|47YKL`E5vc5BQe<@;+8i_6)evn>G@DroTt9 z_ku0GX*ONDXM}ub`CTa4C#C82rp5A(dr;Rd)G#br4thF4M|)7j!+t=jH;rL-Pl|2L z>P@?c{?Soy8u!lfdsd8-9{kLq-n9PMr)pf@*MD}N)mFZ4f8gP4uhWln56Y{##Rs<}sJ8dPwjPA760kgW(hQn`l zr>zD5%mH3t+>2Wud|Lf!8^AC9X&b?v*PpftU{-(Hrt};AXdLgX{xs(|;T&_U{xt88 z`qMUd^rHT>E#SBM)9BCZPumhOt3Pck_{;RCZ4bEBpSA=1RxcXsEU!OJFpI}FX7#7- z1i#gvwj2Cbe;R36{b_r{Z}q2fj%D?y5#Q=h;~d87Ph+^%pGJS^wRoS9sBNJ z*}21+^{dr;2Y$~kJ}u1-7lUTMph7uGy3<;f!9lri(4}6Cm)!lP(tBDhqo5F{wPR}g z7F%xRYj*6U@srxy#&t}ZI;C}Ti>3rE9jy~Lnd?(!oND!6wOVOE4p#$ut6i-tTK%kG zEoG(Z)>ZFytUZo7+0ahEe&@Q#y1Dl0t&X+Pki*y;oe@4C<@DuNowIs)QODXrprMmi z&OZ-^Kc1$(F`I33k)*MHh>`hyuVXDO{LB@T1#PpvhZmmbecR+3oog-MW^3*qhxQkb zMB5--Yt1q6A4M4A96%d)NVGw2vB2dT^Fy%hz5@4oNK?GD zFg&DpJlqWXFn;!}tKySqraiU-k710T@@#YmC~xey#A~y7;8S}i;(t8C$^Qh{Ww3lc zCIOGMwV!k%{7i@YFfmWH?-ieHh~R zRQ4PWTq|RafZxg(u3L^HKkj~B)wn;{CpP|jcCE;#)~(XJHqOALe_*14N&mnJ1|}Un zlMPHddMr$O*G>i=>Km6Iz1}sp6+oQcHO@7cgNCOm4n}yt=v^xp@_leUefX{m=9(Sj zo13{eM7dQZ$4^21TRA=r{&vC;hkJdJtCVB(cOZ;%d^&6z%AjmmltGetGk{B+Qw?1! z=O~v*=XBU<8j$X1z)wRtNx0!>J>xR$Y}j^RU-DkEdZxt#P04De%lK)!M&1{B zit&`UPS9oE&VgM9%kzF7@NC}Cho9+C#;5r}PCpJf%_>2TGoRWoC7zYz472;CUFl%! z54nCC`Ehc6kSeRI$EowWBbXeMU%eqWqrDjS2p zJ+c1nc=8$4C+q*Su+z4I@#J&x({MZ@Tx03y0atrsT!wuCc77~y@C(w)<7sWw3e}GdWHo6}LyiwCtD}#?T(=XPetG za~AltYa!m<&##3p1CAdv)iwuH7xQJz_7lgzsHg36!gJ&07c;niy!{$Q1^r zb<)=iOk?QR4UA(b@4s?=a~0q+nXz#&7IQi(iuu7WznuK(G-F%AU2}J!B(J`W`n2-y z|KO+Gc^rL8a*VQp{%a7%yLaCSZGdto8x~~?<)YP(^!<>I?p|CAe_m%>Ors(BL7Ilw z+4f!daV;kK9&Dz09qdB-fLqzgyeSV{50L&1fZ2U4(jYHYVcB>^-7r=0GUbB%ae19> zXq;N=&9belFbHp zwt6FISiNne8TEL0S#%R%dA)5n1D5ii)7$nV7narAb_-xtdfRSAm}Fg7dfV6z=cV2@ z=Cvn!KW+maP5wMsdfWKMaTxS|+#c}mfZbcYZDsWX5tkNmmFl)MUez%T+8bp;eHi*v zrZ|_andR&kw-A)W+lW)j>ymz7o#A_{5egZWpazj>(ijEd|UW40j|3HHT=)wM?T3fIs6TAK(BSpY(0;K|2c%Io{xmT zCDiltE^aoSrGfFp-SPb$@R-(%4!@SX1ef}}6@b_o@R3~(^PF{n}bSRe<|F48~7U6#jaFyNb@c$h@TXwUF1A14R{7hXt(z_Mz zCeRjdkHF90KN0WEK#Okj_Ew<9IO69W!UAuWu648j*)-Tc`Fjs>m4A+JOyfTx4aN~& z)~k)rdgm|Mz8Jp-81u_Gim!e~xOM0GS_pCZ8-m}$_^}-6CSQxdW_-)nVuW>ixaycV z)}7~l3B=)Var~CVk7>}&G?s#$=e?1zkcKT&>(1BVvWUaqF#MLok7>}&G?s_WG;AHN zNLWZiw2tXQCXJptWqPGpst!!|S=83-&$eRcR{B%7*} zf_SVBO!;6r*m9Ix{b^04IXv)1{>afOTv(z zWa#upoFU-1IPgz{O+(r<;8q-s&x%9;1NbeDne=0@6-VQ>@aX>8XNUll**d3D${XLcb! zMoykQbsR5HwQze!ON_%?Cr)e|f6&+yagj<_m3B>zz$4!*e)GY*kFmJvBs0}b#XOxi z-1E2sWJn`sSI3~N?AbW^tKkmKv4G1+u4L2eTmH!FTA@7UW_zW39RsJ^!+l#=pJ7-N zuLxUf?{RDo=lQm{F5nCs4;brZY{;kPJ?kNi^|y8oZ$iM+zFiyql*toelP9KO`Ir>o zOiO7KpZ=2&#`XP)uxZp@Vi@{aqYqPhlYz_lC&O01Cy(rxh4^UGQv+?`5^rnJw0U!U z0QZ!Dt1=Kxm4U}YD+qYvsU3du)B&4ipteQ#sesMu%<_5~U}e0X4meFp19e6BnSirQ zl?U>3Rt1f-0}b(Z2K?mhBe0b(#xJH{OFkOnGK_hT?IYI1^{(HR>UB$>YjoKoMvQ20 z8#`&r_%4yytvy<0Z_cQ7?Xt(uo*DKsj&}L;d!2OKGuPwbxBZ_o;dsF8zHbZscHfsc z9|p{yaS7AYZ%yGb2Ju<0yi4zQS3Pdo{Xd>Ho&XxH|j?R#jI=*8TszyO{eca=Of*ra2MNrY}f2(HqHj< zBaB1%o5sD-R#{r~KZu{(JAh5YIPaP`8-_T9FJ|1=8~5$Ty~EZq?a9F{-sxX#8=u~y zu$A5}CeBI5eSmSlY25D{_gSE$yz)CZwye@`@IXH9zimvf)5N*fxGy#C9e^*oBaNHy z!vyEKj!iE;Q$l)|V6CV8QLmBW%r@>PjN9ES=>#6infEk=zmA!kToc;D3SHda9;rU& z=O2Ef!`+AILJ!^esWZk-ZrioTN`_MWsBW@!Hq%qBful9g$@Z0zB^z=ns$c2Yf2{NU zd}u|KnU#kuFV2U)U+lxV`IkNS`rj`vwl$WO+8W(Wt_@=D1-Is2KMd`T_;h<5?^fIh z_j9ky9GAqa5uxI>4GP>r*%8XlC)Sj~npB)5GwSr=P-Bxz6g$^7nIu74nBP9|^Qrhqf*J z0&te2_$CjJRnT}m&=5b5!cTslfUUeRelh)8@~aS+Va#uAE3xda3Uj0HIb1&zYhL5)A4k!2dr#vbVCY{F-U_v_H=G^7iieI(f#yGZuh4M!u*Ew zr3aCIey;Vi$WuDk`Xylbxz>{|Zk%g91;3qZ4RvSX!|G21E>oC4_2Vd&8DaW)d}1Hm z0PRsSvr69n24!Vs)o!l&dCiNEsZBoqWy6f8^(rt8(Z|h#^a5^W*RPMn& zo<8WF@}bD5>PGuUl1=pg6hF?Df8xs4*GUuHio^O~{jje75NM6)Vy-qS|JJU(b;|gu zC%3eY8;506=1fd)?d;~zaMu^JZ|KUxQ@rqAuM3?X)X&H&_ObX*X!kK&Z__+7 z*j>I;WI5XXh_XGSvNvqM#QBJBskC4-u5IGf_A|m=tUse(^5a1V+I5+(P!BJ@VS5!c z?D+8-{BbmRV>auYZ`l3={yVT!`jFA@!cW6F72%o} zzeoCkU&dwFe_$^TTc?(Soj-nZSl1P{H(i01Aex=VtS-S zab8A?VWd$Oc2&6N`6raM?s*c=-t+8A4snmB2JWb^5^gHTlvF% zv9|zg8H3{noJ9C}tR!NXV1_WH+0|}bg_`xUAq0B?;q3z3U)f#Ee-oa&i}`*A*WZ6i zP-mKl=*?Qqz;qXLh=J)Y=0XOh_Y8{|*v5Ffz&S75h0@qK>>FCVO@YU9T+-le8t|4f zuw#$&^p-X-y_v8uy^FK3odZ1!+qDF?bKp6H7hsJ@7y4>Wp4RH;d6a{IxOa97WA42c z?x8LN92wn1oexa|v$OIR*=$149;-G~U{M8B1$^79NTrWS@ z22Ao;GJhQdlgwY=z$EiGFfhsdjSNgOpLMG=B=aqvWd7y`PcnZC1Eb7;7w1ANL$+=S zxJ*vA_D}H}*{KBkL!PqD5AF1_jqP1-&SfR%ERJL@WuaTsg>~`{C_lyJ85ZN}4%PMu zbDX@L9lFal zW_m%)j_%%#Ig`$Q-a&oZc{J;ZXFvO(-ej~EUr9G#;B+{u%`6Y=Rk7GXSdItDh4teiM3ZdNxMCJsX=2 z{QTM28Gvc+z&CTpV_w0tu`>g0Qtav3*nDXuJw8qAMNRfuvq;<`%hYuus9}cyI}9nl5;9^YzaFkMicST>SrU z?@Qq1DvJN#%qAg(YY8FT5FlJ3K(e_YhA^9ikYKV2AqSu`Om=6JA+tNn>}*0%aD@mM zmBRxS74HiVyg*P?4n;&!5yT4-5%56JAc80Szu)ez_v#&U>?RxV_xF81GyS@{s=BJW z`hKt9I~=`?F|S6PW6XCVBv0n;bTfS3<>02>QR9Bb--9%c``?X_m$Yv|S}^vM{H_Hq z^LsBs852`R8KX1Jr$_tve#cvIi6`TJ(ap#K+z&Wh87m9VFkZ_0ki!$1K8QH;{V+nY z>*oHjd>=(xOh4rLF~^H#NWYLW`~={%qsUDeK3RpwryLKF=i`V|p6d~cE~Jm=pYlHA zXqiTRX*=sHf$bl4z2HJ??)W!bBODCz%_0j za0B3S4aGcQdzmaWJR8icpn+~WltQnH%t31U)xkT+a=@0Q~6O;46UXxxsojH@MmHCdX|u zH`qRoGpLzD10_48t|HIyy;IE@e^Bbyhr_Cw4$}I6gI7DrR32leW87@NkCCwS`RCRPH<_vLL zZ(S!D=l6fN?AUg*+@ucj-nH)rF5|@SsCvqKi<53nhTA#A_eg{BChN8ExtB0EKEDU| zO#1;s_7mSn$g74-rq8(#cx-Qe6rumIqnGjN4-x11^nQfo$-JFzhR;tN+_XDt&cOIj zk;Xa0g9v#^`xc}H<5tPSE899LaD~BuN zY~dNk!}H}1Ph@%+apwC7Lb2=S{;+(HA}yvL^8Bsi#WJK{NEtp3IPEBMQ-&w1@c5nM zA@V$iIOX|0LeYiv@%&TX9~~{zs4s12eI>BH%o*-5xOS}1dp&1}wo4q}e;YV@&Ttpv z!3@Cixf`&gIm35-ctA1GIl}|sq2~<0V0_!m8RE^?P&S8d&hQZAkIor>6X@j68U6rR zbk6Xkp$+B?e?mNI&hQlAa&6l=!}c{p27Cdd~1?;78{S ze*-LO&hVV$O^#bRXV{*OGx#|}?UEf*SCKix`_-I5-UpX9pYh4l?3`f|LSFQbs{z-( zC3A*!Dsc9f-_ zKd>CR=a4$V`UL-nV*cRE{J(O>QXhFgp&xOKA9*k1$KfbX!Qs8d zNjE3M?Ob9<(tr=^yYShGFgI==iF>B)jFA1uD1^Lf$YlDW-GIk-Xx9jRv!j=B>n@0M z+`2nL@?_plH^XNS2RH4JnoBUgC(<~V7=w_Pw0l8XFrJnC#sZi5?S)Xr*_5#_i5_G1 zeH?GWC7#SBL^mS`aQAb#GX55xVLY70zG3!WXM z=N63Xxy3QSkIpTo0H)^_7rXt4sg5@}Zspv!+R2A*uI%z*ha+}j{PXzHE;k_LMf%S;Ji|-f%R47R&-hr(y-2^On_H9S zKs8S@@1|_Bd{0wy>33G-UhKUbc>JA?AMMSM_F93E{P`ZH=qK;B2rbVr6XC7f zjrThq#JTf0Ye(MSt?utt_kUCOO@8~8YTgO+y2d-)s-vq`X;*m5@wZsM~DQ<0L#EJ*Rq} z!SLVlCTAa*ah$+|^RZ7uKe5MWac_O!&bvQHJ3wdR$asovDdV5VkMr6a5b}~a*k=$I z|Iv6~ba-a|mh!wWAWmLiO2P*`IF}>U+={r!coXo&{)Ah3)6InQ-sFwG)z2H0^4%Ia z&uroDAcX$SC^gE9LkcTAzlP@#e3|h96dKPuxDhlL4TK2$Cd`}lppi4ph}#OC^gQz` z$TMk9c{AX_Y|`d)i;o+m7@o*quetFYE9L_WEZ*2zDEC&pEds-sc=5(!4xndzm>C!6 zyE{1kA|7qIGpz}xguyl`+9sRr=qy&U_N$-4+0j;6JxBO0?tdy zSNhAJ1MZh8EG=b19?>)@Z&`=^1!yVvFB9_&`G;AfNwhukd|1gwKhVDSNEP0{aWo>! zuMwv#k0KQR_y+F9N8&bV@*ZlTDb zFwvcPFfZX}tBFGJLU ze}a~m(ErQvd0^$XI3*N%?YD1=Ec z@`#p;w7pV>^rfgjS-(hoyMiw-@)2LNX@RdvzPmYDnh_FT$~Rgzk}vJVUy_V_sC>h9 zO_#Cl@1zZu{A`^}d1D<9X`h%Ec?o{FoSMA7Ri0wAr1~9BOM6;Yesd@&`(Qrw^suJU z-k2scSCaV<@i5Y_a4gO_0_RbB4~%ud9_sG-^Cy39X+K=?vYgvc7y62f07XCgSa{rI z^(d8dkbs2v*q>n487k1*3;L!7M~<&Ux)b_@z@9EyLyVb_Phl&=|b`!nM0xt?5mp|Vl*cm}Z5`89=Z zH^=@f;+!^;{%^R?F3zp9(*Y~f-vKLI0wd!;7)#>xARo zgnEo41Wi7}a4+S`v#yx;NWeOBm7LgYC&W9;rEZaJXT(kMs&eWn_4s8=S#|+V&bWr< zxjW+dGCq@~^lmTab37AscjQTY@g4r{Bl$MF+s;EZs3oBuxKv!b(5EV2yJ z-oA{VQOrxajpKM^hrb`wmy~EnH^n(90Ut<8fj!117BvM9Muk(TxjRgq1DL7NHQ%Mw+?bm z_4&7732nYoA4?LAhYKOonxU^WVczZZc0j!Y^k#9ypR^in1k+jMv#`Gd=-7 z&ZUn+$V#>Zlv}fmX>0=Pyx2+u5^m)fYp3wU3ODGV> zDSarjM%RTWL3X_^+=93rn+Vj7y0m+ zr5aljZ>#~{n!d#KD9>zJR^N`{DZlDb|;9zd++Y(m>GM?YuAB^QrM873)J^tgk z|0JYw{5RY6Z5*2sE@QJ+!0i~!jwR%f|s0k%3I>_;yi-!t?Z>_fXnglJQtqo z!bL7@bKz1Ko`#TRLpzP?59@b2V6i;0j=UUjUQ(tkAL6Y9+%FSYTFN9TP0Cx=Dp!G) za-WfyXUIRyUJA=9E?dfb72v!m8~s50;cKeUob6~tmRBQAS+WSlKW5^-YMBE&=Xi*J z5MN|G0r$RLu$R*Aa3#Ohh%>(qgyJ)_Ws-iK5!yA5_N+wwz(10BDgO)Axpm+r^^`hO z_99@>eHH5Hr>Q*w<`vdCkVACt1}$|iAxwga9hisaXXL=XN*QooOq+%KYI3~7rI~g{ z$tZbNkWM-J5GKK-JZT5|Q{0Ye?|jhm68epf=eY=p&vkHLKHSTklxc?p$4^u8iT_I7 zy3pYnJy5rTvP(D1JeB-julXrFk?kU+Q{R4sNigOs^I`J4B*ZU}UF2h%LA*CQJS$&- zCwXjg`Cf`JE@yzxw6Ly0n((^Z@p==&Bp7*6N7~iO6ST=vp7g7zZy8+F&$l9t7x{$! zIPg2k_X;P=l?aJ1Wo`2f%1QF2o%lu1V)r{f{*7V{!6 z!4H>HllLx_r`Rm1u7}goo|ct+EP<_q^^lJbw|gvynLO;gn|OMUg=u<^h4n%2u`uqh zObv36WqYg>aP5G;B12)WixEa23lGrj9t+#0=%7w$*q&LM7zWnMckq@W-7VU_bTe7A z290OZAxqN!&6$A9IzP{}N|0WAq(*8{zaJ_%C7ID3QQ$SqyZ(c&f z7+u-+>%E~a#M>i#Lp^}$y`l3Em%X80+(-9@)&r*ZhBh#+_I}u>>b)ToSLy8Q^xlw- z2YW-bU((*t1ty;1gLvI00?+smrxZWEgjoup~zWAx^wOmb@+8cU1R#vNy!<=yGr9eMpll zyf^d`)+WqM-L})vui&7a;<$#-0dQQy`|Ds6dyjXp0hjsX2Yoo+n^5?Vj0x~391`Gv zRN)gY{1+W+@6Ge}#{Ma9*kOPn?-LIQ(mv(V{yg5M>1XlJINaiq<}M{mw}Su0zfU#4 zA3Q{l&nvkI7rD&+CY#rn6wYBsSRBfGqm$_}!jSjHE{*q(srPqoR`g?i`RsiDt4ss_ zUX%~{$+(E|Tam`Kfv=f-h=+GM02kT60r&({PL|g<5l^DO&C$oxg0bbk?pegI1D9i+ z+g*4^5>KSd7@o3I4w0SuP{wZ~)bl0cQFqEqIlfZ`k7qOpf)g)jJG9=Fa+Y){qr>U>%KUPvYgujsj%aXj>geDi zP1f$kr##BIERT);-u%)MwtMp+f()te10HSn&cc4`uHND4driK~n|nI7Ptf7{3|7-B2{Er|sa>MU6FY)_b6a4Y)B)O2*8%F2R0pVUwK_mKlj^{ufJf`VYF7t-i!{0F)B#^tT@`Aa z(Q5qp+-c(f>E_3gm(&IJS5g;#7r;$j_&wvO3k#H=v5Xo2BhpwG{(z7d`v$^=*Pj5V z&q*D53UTpgP5-o`kEaE`E_LKd;4=R|yYMebJdv*J2<4D^OnsR5UlB&@2z8e_^0yjz zq!+yB9iFiTG}pRB)5K0vU;YkS>hceSQeS+#fLE>hvIR8J`Vu}6%+{A@fETMT5k%IP zXMq>3FV88M)R%uMnA8{ARM!{klT=@*Z?*bDIg{$kzW}dRU;d3WxvJKeh_12vl6*dy z@%hiH_h4T@UQ%Dit1+eb3LkFjONw#SmnHBK@i~?;<4s6oeMuwa#ri_H)R*Ca>-sVR zaj6rUeg{V%PYe8B>dP?TGXIe-+%btK(sg~I93ngQVct6`I zYyr)+F3~ixlhl{pK}%gmBb55$+eOuvu?hXlD9}Xfi+^y0-U#Ny`kRK>J4R0syAZ*kJg)WT|cuY(&VaIZ{qsKs*aB$ z2W?2`=5YHQ4L|CqpQoG8Rre(|_qql5);Ch4heN1)5$A6o$ha?mcz>Pq9L7CwxVIld z@*@uEc(3^#h;+hbt@i-L55kW;$cyiKk8?bTEAo+_+*2mGzxlx6{xF5F;YTR=w}H?6 zDVN5X;BXG~Qlm#eiX#!{?{NH%!tZGOevI~pauViwBfNhlkyfi8to@Za)=Ku0{&vhgY6f6uq}bdepqv$?+D!qh@S>LY3KJxyohsM zcwWOYzE`9++ppl5zYu4og3Ea&QQ9*dj@WMn;@r1bh42jg&caX1*Xl9C zdlg_&KCdB6%i!*_4leqgjrckE(YEAEyX1%y(W%|h5iVy?$e1$k=sOUyC+&3f0bW2O z-yJRhhrhM>i9WpN%=27?%tve_G;*d(QPEf%4D-4ajp&_}e-hvGK+9hber5b<3*J+f zUW7s;eESINxA5K6853iU4dBfRzER=NA0ObnR>8ad_RjkIg)U!%ujapuzaD8E!(4=r z7soJ!%NXVjfKTW*a5Emd7;*7mO@E1_kEg)~&4xAT?7OM`z@@D>x$uoiJdrMRv>D}) zF%0!#-j^ecj$x=f<)s{(Yv7Sy@ZRF^j4hzK)+L%Ic9Jp7TR}@*u0UvXA7*6}UNYuS z8pB))n&=p28QyE@#R^NlV@Xe?Q0ktIzL(?q%YYjj!^Dvd?wf!c9mBj?!DI|`rGm*A zhPKsX80wWYhN0fo#xRsMX$*4};L$Nmw;RJ;jWoHcj$z{Z>M_j9XtE4nB$PFzJyqR$ zJMtaXPyfccG<-tt->Kj~SN$#bRt1OevhiMgp7GD)$8+K2e3CYAICd=i)1sRV&Dy`+ zlFi|@F1&Tqn|JSa&GxV+A4yVYtjPJctze{|sb)Sr-}ZgVj#bXLl~Y`5=0kfhj|u(O zHa9t43Fp0q+xF!arlH;7yL{4ae3UQhcpr0k zQrA9;IP2QS5mFB3q2>6bgOi8kO?<|$M;hC?Pa)(bWfr6b?TzI3Y2X@qgwn^!`;{?z z^mU(eyaktit(==Gx*0iu`+0{eHXyFHfyIL#IXsc+3y4#uFCmmN+T0(O??$90$#;|E z#j;}AN?F|uIPEBMQ`TFm@c63ZA@Y0$amw>GgrW=SdWOx z^~HZ=L2Am(ndSWILU)J6S#vA|6(;G3BCMw`b92e}8d>b~1iaVJOGN7ypE;mT@&*Ls z*MTN@%fa&b0AThR1HrWL5Bl(cf;?!0M&8Td+WsfNL!Zm~S;qZyS*1$bzTyU?MbA6^ za)9rjcX}&eMqa)q>iU^)7~0^x({CcK_n|5GZGZ)q_RQH)d*WS++X0s=b_S}5h!)$I zTeWNSWm9katzX{>UZZdy_oKj9qBOyohqhh%4tQ|-JOs*mBbIySMl5f%cy74PhB!D+)q(<_EW!rE^<}rr(QDIX=}pJ6fhu-@qpV+o#QUC+hTrgQ_8ZuQ@1c z)yFp2Bm`=^J1BRw$Vzd}6dc`cuZ0ZZzu zf9=Bqih=gkPk@K+tN+Bf-&YUL?3@EW4L;F+{jULUzhD0sV9|d4KZZ8w*Iz(9+ONL| znBT8AR#YC}pJw0h&4MGlE7tc9PUX-@p)qlS{)cS>$84keZTq0d7EO><;CDf1-b+38 z=L2XJWUfG7WiUjBB8@Y&Vz z(K<9MK1bkzWvv6_9-ay2nXSVS@}e9~xEDE2cQkAR^;}>q_);dZ$0@+O2fye#%YA?m z&)6CKBHY}g|Ka`qN?v&ei*R%Aa1K&9!E;mLXR8iTIP%;S`3!gGWAi>~?UwLw z9TK+p;ox-yen;Y`%k3!U;rNKXxRz`0ZC`)-v4M@4HUn|?>BoSUm)OrwL!T>Y?EwY*aiCr{#A8N+MHGpfK(r~-e5gUh<{OvL#+9zU)d&q65c ztb}ph{X~S6LF$IAvr64K3F)#{&wi5Yp&3WRHeBSEd+CGc0B0_K)K~U<<~cfDucR(X zzEYP?0j|g@`7SX0QfRbneIqXU%bNA6j=!#N!5)Pz|HXz!Ft=!PGzQQ4^HRe4tzBe4 zO8jCB>d$0TuTtI=guE_od|dAysG67W!K23c?g~yu=_^)bB0O$F;ut>h3kz+sIu>p_ zrA?7>{0iuz`&r7$ar{ca<*G7{-)^$f|Bh7c(ggqBmf10gv%MROP{w?(W*MQpST08c z&a~G6#=86}r<;uDCL)b^M@8_m4o}8{XCqEuI|m_UVjir=!e_OEGcU=T_>6ZTjpOrn zguKLGf;9MQvrUuy^1vm1Cqk(=l#y*kj2>g|wT`#onl=SIwQfcZ;GXMnMRwsSHn4ap zujueZrgex@rY?lEf%p^eOMq?e56jvESdy&g0nW?k;p$c|;IygeKzS-vc=S0QB3l`8 z%C;V%=tcT?{weQ#N6R$o9{5L44)>UPTW73Zw-)&0^17I63|^;7>#=toR5#{6yODWE zT?u_%%*Zdh2wNK2?ox+52w1h*iXOvKH=}X0XU@#Fl{)gK!E=j$jefAkZ~8(b%|`5G z+se=yVp9ICi0ihN^ACP=L(gf>1WqtRv3wo}PSTv_EZ|yr zKrzrcO%6QtoMsK<{+y<6Ihkjj3!sV4U%CT6{`_SFVA1)@MnfCSUoJpAI)8aBVE+82 zc6oTz|8*LFdpQk!-~!B<#$wKNA@Y|iHfO4D(gAy|?0=blr{A`zuZIjAqr}_3pnYT8 z8_=XoJ1G6xf;deEDdc6HM(nR>YgD}UR_ckv(?zqO$zY`%x9`7P9 z=mVRko8Lp2qu1Zvd9Q;@`7rHv)N|S=I!5r*)cAqpnaM--2bx_gmn0c3g{zwjI}6`EIm0yMOV(CG6+<$P$$%5%QO4r5fF=KXol6X!Du zevq15^IZp_=GVjIqUjxpq_=!#U%*THC@p+)H8$JnX=^%~#xnDoZ$PvuF z2#?OAZU?_R@C*Dn?cIquarHck<0|1N^?^9Sz18<_$Ll)?sqc3YiXPk}pMW2IbRt4t z(R{w|@(~)!VAq5pV{yA_y9TcTc9goZx%T#aZ?FHYfovtWW}-W4A8*FE+i|A%8aE*vJ=~6NvclTz z`cJYmHGv_!%!=w+*>OkPf~9lXTIaN_h_DJyHMH;CCGFY2&9m>1pSC+KV8;#j|$~;q(ePq&JXa$rVh0abqrP7V#U@IGY@}@tv@ZL(!hgu#F!rpr9@>9fv zk;pS!SPna2F8MQ8E|g5>lFBgur^-Rv0Q%;`d}b1UOuyChLB@Xto9u)-|B$nd)R!PF zs4p_Vc^J5y-~1XO`D#BP-Gu%q+}7#e0-yXJMd;BT6V56*3BJiIE^pi(e*$0H<0*tUQ9li0gKM&pA8-n4INl z=Pc4P#g7nk?XH<)26GYjpn*B%%j!qJ%C6{cUz=}Vm+!Fc757sfCwy7n!R`AszYpPB z*dGCt=jr(D9BH3aFus#X*`HRhqmQ<*KP%WV$5?(_6zu2|-FrP6=JL>Z#{iFcJg@MM zad>}MFuvnY`Tn6`C%QZ|?BE30EXPmd%}#*LN}!$XVE;tEIJ=^&2L}+yx1IpOi>BTd zeskzxZ*2Nsz>y12#a22nhqv#vooY!|~S6fXg+Q@zx;9@PB@jpA-z!YxoWQDLRL1MtR9t zaVF+VGWKF$&-iGhbF8?#D_0o@1ZnZH(H_7h{TPH%A10k0!)V{OgLib=efCjMi~Bgp4LH&)!y$q5BdZ8HXMa!nI?%g8++;L&qtY zj6)AqFd2uAS1=ie95Q(s$nt?)i4={ zYM6{eHB82#8Ybh=-v07c@-tm$i*Bzm#_h=y+*4jGmA~(xUy< zsi4vQ)hiJvJ@W{3OnHkOZ;@*;;*@ov!w=gl$Zxvqci7j+8YTJae#iAgd~vGon#Dl+ z9rjte-)VuY(SGN6z@*=)zB)08`n~O%2-Dxt=aTvxw41U1=A;m=?QdEElfFRKJ?1Ew z^fxCfnDjUE6-@e@1qvqp4ShlKkp4#FNq^I(@T9+4qG0TA`2C7~(5^29T&~Fa!ppR{ zREsVWMwcrZYnZoLTh976s^7M&tZQ=5alEv#8b{iDwiUdWc61f+g*N(Z;7X)%|M3ij zXW|#Ekqq^UG84im}oqQzbmMQHkW!gvH z{e-8R*Q3jUKeBSD4 zY}pO-u23{$=c@>Fd5UeKb?xm6N9r2wBlz+>@7sV!pLqwucj9*qe&J_xM|kf7Ow)$% zt*+Mshvo4eg!GR0IvQPPC2vhH&***t`21ampXASbj>bQTP}4;3ML*&75#aOpVf;Rd zALZgbd3_8a>9t&+Agn){ht=y-j-Krb^}62COBwEqGhc=yMVH}cfFnBCavbh`*3l79 z{Do<}7r(v%IG@Ll^2+ngUvPB96&cAx?)7uYVuz@GX!p&?N9y`b;Q1B&ZgzQD-I}~x zTwc1Iw4H>H@TctXyU{5R`a51uceRsUDqaQfhfG+L*Fo90%TFY(^I2rCo zNW1;S@ru$@FKJ7eb_;%drsC%adBxK3+>fNuPI|xMm&~Kz+E4ou-~AT2*o?Hny)ElU zoXo#=GXEwbv&eGIIL~`Oetd@IqX>DCAKRPF{lWbNb8mS+;dnppc>m7v?o%P{O}1p+rl61L7Q>Tv;}c{Vc!n;yrf+_4}6KMX$T8whI#*TG&&E`JPE$c zgR}uYzA@|Lj~LDM*H0X4=d~{)6rU%p&`$zRK%d4$7yw-4eK5ixE#)=sZ<4&T@SZ)_ zyv{>3dvY<~g|#G!x3A5W?Jlf^kq7pZEXb{u75C;mtTzPP19+v*&Jc|D!xJYJ`L^Kh zd+y}@6Z*At3$n~_$L{3aig$zX#n&~JwVc=N^=!=c8vGX! z@5H$RT(=Yat`a^-j5yaFUqrf`ea`e0?2$ju^5%UJ-{mEI7;J$L0tf0kezzlkzj5`^UKo}JukKPMn=f@5xt>9p@P0m?m)R5hH%+b_U;=ownQz*>%DF_~NI}Azg6UrU$tA9&v=X$U}cKz8jLI$=l7xxAkII#92R@5lVi{ zOY)l($#1lymwFM%lJf3~)C>jmS1qYO>G7yqOt{4B95Uv-akgn^+&WP)J zL3~{=c1OCd7keNs^@8_OFTPWyUOW$e(Ry)bLcJIRUbUvfB53Fjj0gBl-abCQ z^|g<?IN!~+!9BRwzQ%ae*T}+3Z%X9{2ffMg0sHpFs z)9cVHTHg9}r+Q7J(|AV6>wgjN4wlNysUwf4zq$(D=t(`3hBq}#Qf_rG-Y+z;l)!rU z6&3*DCv&_V$SF<#ITW@qy-;Vdl&fSNgWk%2QAkZHV3kmOMTrP z5z)3-*=$m!v>{jS$X<{ymz;b8&vxUh^!UiUXYkXWzzu$(8;(_|Y&0}Y;k54j8szBG zsT<~bMz_Pmx><%{)fCKW2K#W1euUHQ8PvyJVXeauUz_W72J*HLHg2qjWs9ZWUQfe) zp}O zb@WHVUdp%z=N8nQj=~y@bF3^u9BUMt2d<9?NpfGwGc%d6c zO2AiejbF}n6wZhItfPCuhmL{{a>=tctkl)&=%uI!-k2uu5JMM~E$rQJ`88Tr(Q=`_ zB0t-x9U%YFRpe)%p>&X_-`0$B=WQMA^xz!8^he7#nlbGJw5Moxg8SV0{(Z5u!PH@n zkBOJ>=`9pX0j~9le7RgI`!uf6Axkp`C!MZ4!b{g1fz_xpA%CWQ2IG6D;`ztjFh0S) ziGMj?=%Yg~D<@if%dn|MkpEdW+w!GK2 zWn9~q@u+PHi`tg3sBH<0+Lo{ywyoPPZ;c-}!;dG|wfE{$sW_XTcZv9Mw$1PR6KvhA zY&{7&imlDPvo-Ivtr^$0W;|+Z!lJe&ENW}QqP8ZihOM_r`>@RU@szrDwb_lU)=bP* zK zzfi?*E2bhM_BHp;zP#7=Wn9~r@u+;?aO%7zJx{XOIXytghlO3*ihS7{Pv`}_QkAeO_JlD zTGOtFD7(&vK4MpM@9fHZZCA#%T^Wzsm9VH?35(j5u&7-L8*00X-?rAZtM9kf4E)Mk z{TcVOq`l2RFR`z=clPDIwlCw_zKlohOIXytghlO3Sk%6R4Yhq`zBae6eY0F}nm#qj zb+fg7_fTcqInYULYwn$Gd9Q8DxVA0hQQHz0wJl*$+Y%PFEn!1#+m&t(adKVT`o3Gs z$iDw_y}Q<0wO!p+D?tIkZ(~-wxrkoV`rle;u$H!D#^~v13`ow!(pBUHmiScNCA}m^;2#eMy!lLzwu%!Al z*maGhHQ?x4vaA8?wO-hwp|xT5*Q2p+a%#M6!s{cmOra#TdW)q$Nh+gORYvn+8!01m z@5+exx{MgtWyE;2j0lUC5n<6XA}m@)g#9;`(W1I#q&{d6EWbR!V z@m`k^EpfF8`$gPGZ^EAb zGyCA%ef!$y?DoS#y*n9`^9W;HoI*3@`ZD-?K-!Jed>An z-u7~#2L}qZpxv#Jn#p)(&u|%Z<9_JOWd6%>=1#y9EW-eBflhqBZ8`Xi>i4`ulKCuM zJP*Y9XTE18<2Y%J9t#RM7OC96c4H{>IvAqUDyI|WI>X6zk=Hbu=R~YP96Li{HK0G! z4nfK=50z|gsk@RZbmu#0*IskJ#7fYO^fs);SwtpI+%aCRQYjZ!_f>!dJCMhjz}wsF zi4=ynh2_UR-m^^pl!1?8)heO-<#&iTLXDNO^UR?Z-g0*XYe1%DPVawk65wT5mC7AP z{tTmDc0PB|MRvC9fXyrQt;SBe)yKgW!NIfE!M!ca7cM;FHPEFQ_(}P$tX;-})~*BHMn6NPU`x6VYHjgL7=Yq^};I37a*Y+ldV z2?zm; z(|`Zk#cNEafykcRc8rg-OCjU5OkoD$8XrM`RZv%`e-EUm{@6>$p1N%__)QVC87t>6 z&#__{zhN7WcfQQCpRD)iLhq4YcdiTRl#$P>tW&l)2)3vxLW436LjTEA>+qgDHLm}z z1JoZM5RBdrt$)KZ4!({UD@1$5cvVuikh*}P_Ui(kvclC^UFcQ%4{xY03{1vB z_`=i~b$ns!jJPl0v!Da23+oenVS}>8jM~1?u#AJyzhzn-{adER^~X?cK>A;hp#N)? z{s-6AzhN2KcHfS+N!o69`s!jHqx}-jNXF;fX3m_|*Ue_HJYw~Jk-!nmI@%%es)_`4^!M#e;hkF@Y&k*@@__n0x&Mc}zJ;cIb*Cprr9=m%^( zVTBI!{y6ojZWWvF#lTr$_y=cXij1E$@M2+|>xU@!XS}Y}+4jD277wAxSgwLb>+`@Z zb+6~zW-;rlX2*3*|FTQRh&M=f<5;HO?9#hR-LdqyV&r+NO*eWH|2D6kJ}@~zwt4Y+ z_;0y1k#7@pyxZ$B1Oj^}=7--0tk{+7(Xbx@)~8^Xg7yLAZA%%7<2gaTtFQ;=YL_8R zuAh0yP6qE!^kw?S;QN>3*|OB{UyesEZmc2w3+8@)|FYT0-&p_hW~J+n4fQVrlX392 zXqnWQFC@x-&l#Zp*CgowE~Wpewe=s6jNRyK4?*LSfsDz| z)U*E2%~kL;4<-s6?%R1^2xN6;pLQ+e)bm*OE0|}Lc}_*85UeS1jylZFQB7NG*CHxw z3%&CSy*}A&^ zLIT&+LDpK>{(7-@43gW!U^47aCe1h;mN9+(2b^8lPk#{i?CU%0&h_JKF)S<8jlM2F zo4}?Y0$bZ>iU&wj{KvSY{rO{+~LXJ?$Zrq`DTKW>?9%v*mDHu;=u;gn|(J~6%Cm~?u=m=s4@45&`r551y&zynIxlWY4#!!iy+|CV}d=q(9r z=y>IOK>GhQLI0mA{SU3J|A1uVb4+ZvxehfLd(>+q%qmZ0ony=Z?eS28J$|L^v40(V z3`9m5BXQg^+l^7V{_J@h7UjCv^l>Ga>#>BTy$y4@VvG+NnfW(i!wBohFC`w=;W=J? zM9DhBlhya|I(&_BYiL4l=Bl9`Oj*~fhlU!Da?ooJ93TD`vdJF8W4ISz5Z&44;dFu! zbME=l29E=OnCyo|FsM%&x<8?G-x=kEv1 zTO3x$XB(Aq5c*H8w+}WoVIS<60qXx$g8ok{{ioH|e?T%yo#i}?{i?*5y10x@;m8AO zho4b8%yf16uS$oJe6qfQXQZ@DpM(s9D6=W`{9#Ih&mJ*AeVe*SG&vx zB%_oO9(44;9EAQY_58mj!T&Mz z8&G?=V}kypl>P_Q*1usHxi-kT+OYnV_u_7CC5~HcyczMuxs9vs9Bo*?mwIuxGqJG$ z4EBJ7GlF)8Orgow%$Y!HD_P1_Q-etI9BmiS%N$MGDUMkOQ7%*KmHE^JzdUw;<+6K1 zxr|ojGQD=WG%VvF^q*1h`MViY?6_3#VJsY={(C0qKUV2~T5bIsmT?gJPp&s#oSZOU z#G?=cs+apD=)bShf1ld=H!R~I^q*dD4RN|#LmbGO;V&>~h>oofQ2H*Yt#89J4MN`* zGaCz!3PZEC7WE8>j7vEN8i@Ym63Y8vrT_Ta`VUA(nG>Rq_vgd4=7fhrj%ss4u3K?V zI9|y*%&c3*r-TU`&t|HK*23&-d>w;*&RgXfcb=8VH(L0F8v6^*PkDwd=Hm_+Jo_{< z@~ju1U)tH*;6EkBXW)i;BhyDHIh(6IPc&4|z)8PTgxv?>hg0gcJ5v(cox=v`heyLc z(Rw&h+3c9we%P>#gV29+y?)p1;=xY_QtzI{W^z>D-RbJPwhh`((-xd_plu7Vwq?$YKOQoW=I+B0 zZgTHdp><$tO(vLhZj%7I}?zJ*S_9}(U>cHuK+H?6J0nP zVT=yxLPr_*K)xa)<))0S2&3ODq>dB%Ex)-n@JKIsCp$c&Ge)#pmuQ;UL%yRlAGFlv z6om3_nr}bw;=5_Q4tMYI{s9AIen)9Hw7VyP=Jc*yxq>gD&05$~>cNx3CYYNmw)gR= z*^blta@~~zA9TWZjrlF%3}`MI01;{CfJVOSgY)hTpLq(#?+NiN?F9;UqFK94d9*d2 zx2lx0q{DZi5I;R%nO`n-Ez50y;0{hZIJiicW&c7N%DgOJ%;QC|r6oLQn+Fl(N-YFD zn_Zu8pO-JrZJUcfw- z=WFV^u?#d)fKuFTi(5SMrZh;)+L%I_7I=$0xfmvMkqe*>#lryL_&Mt37V)+n+9keUczwg@*3d8 z{8}N=_Y1&@`t~{n6W=Z=nD{nrsePMzB>6V=tmfO4G0C@k0FV0i+0M7mLz-MweOu`n z@^Bw6{w<-mWe)gzv1e)xf$L0Li)%`FTw!gOXZry^?lWPX=!JZv`dL40n_poZ@OvV4 zh4J-BV_oTUI)TRE$-6h_15RHPUK6P#2^QZ2&I)?zJv_T@p{E>pDa^ zq`#s*%=`5SqjiY7OWk-w4Ls5d-X#vt*aCj9b%~~loum$J0xflUBSNV|zFkxu8l6yw zE(A?t9rBBHHpdp;MZin0M+(u5Pw@T`aHI9bg6<#eWG1;eWFfD^@%!Ht51|Q zsXko>c(gv9>*~|xNRz8}eNy_yE0v!pl|e#|#pwSd*$(#yzPuUv5`IUdUNHU^q_JMS z*~!LwLAcb5D*)H^;!4ED_ci@hjy|3i__x%Hw*r^GbhQiLmc$e3x?WHYsTb6TdA}23 zv|dnm@%MMtz$3ljy~p7hTR?NIOEgXFB=zE2&{CK8B9waJ+eOuju?h9!?VyR)i_=TR z_4(8BL7qZyrO=KUg!A`z05?`QV#szJbq#Q%b>rO%CUxU|3MO@fw$*imdL`8j>RqjF zP}Zcn@qWOo)s5?rCRf$E5z{wRIU=c2D8slHC`9bFNhm`E@Jn}+!PhTY~-y*f#;xNU_%I2j%66aOwtHhZl03A1; z#bU?id*S(8&RaQ7e*^AWr$lzdZd}x-sw-p^YTB&ZNFmQlPi?%-RfK~ zj)=$mz4)wyIU?SEFPLW(XL00&e{g*CGs5N&<8iacne#x#O>_g5Xw6-gUxPY}b5uH( z^iWUp>H3*7%lXy#I>^gF6c1m(wZixxDIY(6?i^GhZI{eEpec*Uk@-OL?Fty44o1B( z-#!;RWL8EkAT`eq4M|3GlCSccNvnNhM1)n)H+lD71%@>NKZW#!i z+%Jp_>W(f7#&tmqWtBtyVkvB8mZaHxy_x2Sl0+#00k8kW+oI@9OzUz+I%}g*37~z{)+KNJp zaAi3P$Bb!oPZxfED{cC>V13nf!ftMH-!wb780-4v&!K%>pDXss_amuy3g;Ev5N|gl z@`*wb2?Z=t`f-u-rPZ7Bs2{@yc21OTe!#!CYY;!BeK3c*4WZ1TZiFpl?(!4BnRXLk zJO}T~&Q7xK@F3DSkGMaAceBHjdB;}}=e*+qz6A?^cAo zWX=|(1#>US?;F4+{WlTHw;U;BUlKi@9>3l37F^=-yeX}lkpsAQI$W`V@Dv+Zyp;EC zhbJ<93vtSH7ed-Ve3SQg1Gc$8EbDgxi|LB|?*W{b&jb4fy#GGnw5jModG4*k;|Gq1 z$o4(NDccVbie99T=b!TKbF@sO?ty;<<*+)%xkmKt8q*E><1(o#TUDd{5vv>KZWS{% z=G<1Tksdv6E1qr~I0tiz?Q3IGe%VEsH<(e|HZXZ~ptKEG)*I)D_}i+(2@N&2X%Q!k z7PcvW%u7FP!PWlZ3$1z(BF#Y^GzLvPRH1$a3A@r;F0U-z(*f@ zJ;rZiT*fKeq+zjp*mr<$N8WM9Sx?OCJ3(IlH==(8n9+%caY28s5C7QEV*Xy@x9^&~ z`w{2&38^F3$*A)Kfcf*>ZB)3z`zM+=PXETppX2=hHvjkT!g};rZ*=-W=p&a~x7x-< zK6F)?Wg_!-_Ls6Q#D0?NLO&a7-TpuBC&ljfD!a4qq}_k9-R%CqzO$kxX>QUsbQNwp z^qt~YVXFH#Iq?XN{ z&c5fkxbly-kUa85PV`H%FLDT8Eam=-?29}a&##OVHA`LDoH?~2vM*9S%`M5WZdBRN z+PbxtZMwi@nfcYmHB^4w)eX+Kub7Ita=+)v+S22&mmVkEwxBuvMBI-5)%sHRE1|nx zzezV=?cduqrFYOSSW~(Xp{yzW2{w>*owotbw5I^$n$nZbKC$6Q~E1HUb4;+qy=jklHcEeOZw*!${Gu0 z>`S7@I?dl5Z^0#=tSO0ZMh@Wq)8UE@gl8Bp<^9{?iA?`OoHG3fq4r7MzX;go{;;fG zCP7!^p8}kh&%>=LHD$tUN|a|9U@?1v$8f-TiEQbNm2Ct<(TntP+LSjEIJ}rf-2?v! z%3P?b=wM z@2oEdk|}+haf4%mhWTyXm|=iLP=91GK!yVwe+-Jbca2*!dd##%b{&KFdd=wfi0i(P zYaJhmtQq|QIKc{#wDs=W$JYPr2ZQyX zA*xe@UIeP$kh%Hn!!_o!3*Cd6lP0&=M~bS?jwf!g&#z6yYin{p&h&NTCPdp znRf+g!Q4vbZ2M*GoNa%E!k1;v`@k3M{Q4l^kmrF2eV&-lk3*an*8m8YHGo4hfsCYO z+Mx)e&%}$Lk@sO$@R&yZlXx(VaQ=)9QYr5w_!h6Yym1>GnXxuF3Zd9V!(=W?Uybui zc@sg$OUq&OgdCC#+!lAGTMJAJedmo5+i4 zTti68=VCY3-vj)mt`iSqeO7m~_xlLi1;jCM^|onS@ErKc&N17Dzay^eJojP`fLz(r z%_GwIJWw|tOpsP+mNcuTpH+_tOG4}+O-FzUpw)x^m0i)@zBb>!F5h8WBktoKO!%_A zgWG-L@gZCbI~*{1uYvC{koE`#<9pK7VS<7keYAxgtzgF-WBDDUU`L;5VJvsa<7k(M z#ybXh%wvkeJI3KnRj^mR#`2q{U?;jfH04Uu^cadHJ5&aJW%yb1>?+%vhDI*{%G2hs zfs8ZvnjDPjzv$NUPskWm%wM&6%JSTrHF!ebe4kSW1+nd+L?pfXG-sto@z=6L3rbaR zU}m24B6@rq@50L5O5BP;o!tXU7+9&d%z5I}juHhh*_DVb53`(9?;D70y|-7~kI ztezd2rhMj~O?JL|^2^_6{Fe*tWJteWuua~$kT*S4F@~Jj&YS*QU+}1=6{_Y-_gY7t z+Jma{@_v(}j{LUSM_0bRUfyU-9@`*rt#gR>(pTcG$5I)dHQ2W_R$2~zD{7V$gOwiF zopL@ovIX-j%k%7~y%0 z6J@@<1bWMyerKdJZ7E>fGjDS?0gX9lYZs(*9ycn2x6I+meDO5IIoCTKA!TA7Rwm15 zg@ZFM$(#6$uR9k3)>I{@e9^Kg6S zof&IW(SbbH0G7mKE#SPQeDWD9TLGbzE$QR5DQ_KccrlH-2mTS1!<=ouXRd3{AU6&) z3pKW@yGvfLZ3#_i>b*`@kC{LA+I8FSk81tFb!;7)KyS4dn1XZt_Yio*mP_55*eMy-KD++Sd%getO2lo?YcG*AKVA)f(Y^0nkcYqbeJ)@|7xk`0 z(a;8a-(84D_rALUYkcp!j?1}nD`}pC+4ruK&5(IE2Qe*p>Yj?OGXP zyZ*1=;>+<{-3huL%l2MF;3fXLA1yKuM47 z09}@{Wxzi3k7&QEJr8eNpDczDG7gMB33+O%uZ+WqV!K$*$kos>u{SMyHpn4#$ihm; zH#&b0bq0tC|4cOk?arP#bGM4Fu_1`C7R^OdE4Yu|kl0oVo>iJ^z5rz@bL-dPUe9|k zM4apufe^- zOBfH_LyDnVu~eCER6{ooX!b%kA)kweI3td!`=Dtf?-djGjgU$2IbVjj9d`@Vj`uGI zJUVuNlaCvukSEJU&jq-@xf!@-#?Vd7_LcMI4D2_XwDqAgu-W#E#yhodL7H66 zp6$tpw&>Azs4{P;5^rVOb6~1&JL^9*upKNAZhs|b8e+TJ#kGv^sR{M%6M3{^yIU!o z|4V4Aw(7Pj=hx@Uz4_n)l#rFAoZSZ4kk&EjE8`FFVgEV%(WSxzL|ZP@O__ykH%gG*X7w?zZbCg;}_@O|#ha-5&d8fROI=ncKU>rBoeS_qkz@y>FLP+PfKXUXtHeGB&?k5Xv~8woKCRYk>0-+FLW0_6CG;{J=lrX(9g$)w$ci zOX?|grtG%^wiE7U-avlT(NDviL#Ksx4$?&KJ3-6x{uaU{nAm}NFfZX}p6%`F6s+ zw$p2Y~%w&qFirufEvFp$#2%dO6LnsSABYhPa|1 zeJngcvwE>ziVl^9hV7Z9iD6)^WC!mPNXN_?Q|_TyCb7?qUynTSY&0Hj=Z0Cfo3e48 z=5v6{v)?=qpU;=yK-|_|uEb``>+Q4OHv-nv*Si*P3$?FvcwYuA-_=vh;WZlrc09id zc%i#DU&fjQ^Y}XAy&G~p%#-}Tf%rv3r?AO`Z8Z*d%a_-i^$YI~#M^T{x%L8Fz<#wl=CjcxkN%4@5X(0ac-TRidj9r2Uyt>82s-u?$%UD!#=RxrTcM}&c3PL zF<`ol6Ctom?^>MHzAjrSWjhO8zoA?|H2Ihl-;8c|ATH;>kq_f~pOdg30fw?M>v4?V zhxnR&CF|Ec$NNFR@wmLn=cl+AU*NO+%=;n0I`G*avDvQ??<|+PMYcx}m$GL*EL(gb z&i4nxegjy}xRd4iIO6!^08R!B^lryz*LcSL?#Pq);(sg~!k!>(PM;||#(&TFJolor z@vF4=2f|J%mo~tB*4NVBlY}kAu0jX>AnnmF@ZN=W3`a+qv&#z|T)QOBR~!u-7!}3B zo+4~TXQ5c+I}T~@X~xee<|W<6@yeXT|1;BKMJl}@vjuoR|c5%LIwfUyOOtVMgrT>}{&4c$c=9EfB ze!76CA+E@(m|J!ljjo!XBxXZNymLD?I=<&a<><_WhC^PI|~+8%fGJpY+9AppLe zki{X@<&CkoChDN8J)D)APbNy|@093$o(4&!Q|BRRGws^MlCDWH<@kP*m0(9qnn}2WD zOirU+ur4wap{##+t$=N^4^UhJ4Z4N5+~kwDc0kBW#+*S~Fdmisb_6czMB z!6lwN=P9}wIe@#X!xb9{&oCaI6n1zb({6}Urri_j@?OuY|Bblr3yJft8R32B{{Sc0MYept ze!R>@!+X&$09WRyasoGbvaM)jUe39~aI`V{+0dOB->PRr!_}R0iCw@m`h4iUN z7rCm9qX*wSctfN{@QfDwK6$=T&PFj#5r)ezOG zq3s97hti{i`g)d|%O6q8hs?(d{W@o2Y9>A}^f2W-x0rzWv*fqxpdi0%Tz*H@%Fm5t zm#j9+O67#Zw^fpo1OpOD@aMykF-0uhjVU)nt}4$$R+;lcFbTe`Q zx7Fc_4TNVHFXhd3cp}pr#3|D}gi>Cc`@{0hM_Q76r#N0LE0(R4)k45&N0FN{oLYs) zD;*D!X941rXAwfth4k_K@h+{SWg7Jjd?K*@gQm_l_C2fWHNkJ!>OQ2cS{k(f!m;WT zS)pdJAp+MHUE#j-e6+EFooDb~&sU;t1KW#Zfg`gJ#*afhI$xOtn4OmhrsY4`hX)ko zLEASvUpXE;^n7JD5|`N&elqw|r| z0Q2V~jT8#T=@(%?VNX1ly9~5)RU4<*P%kuQXe4Xt52PPu9guN0eV^|UE#E4cUVgsc znb;4H&-P}sb8{68JysX<%QyDqTg&C##_`$w`S|GaoQ;)yZ+7x@Z$)ExSl#FM7502= zw&!76!)x}uEwe-WDczyGdf@}yYgq+b5A$-&c}ZskgL0>FT-zC{JjQs9$ukhSIbMs8 zQ}AtA*aX{m?d3ub_Ps-fnKG3b)I_lR9kfXg>_MC0w`IDs3Hv3qEGy?Pr}gb~@qDHM z=Y93$@H{(h^D5{)((BH3A)PX!oln17*{7Ig%6+((-)HV zE;H>oyYARRM```1y%%5P*dx=K&sC0{G${ptwvc1-xw`fW9%{fvXjAG+-iEGYJMydh z){H-$z%+hMsjGmC3ZSlI%Vt;KKsd%}!ZUdKA{{TGB2L=VR7?q|u9>vM2AdnHrt%LL zal%x?0clDJSKwM@5`4)y^TRRqt92 z$C12V=ctGirrM-8;yVaoD;;4udreb3s_{Kxo zb%zCc?d>upPMB)<8dMoaMVv4dibv&j%ke*be~{N&M@5`4)gB?LKOgz!ZwFLYIx6CX zsm6q;HZK`@VL)}0qase23SEtoFkDl9<*0}grWzZf3fGi>J1XLYsqn~!$}8+q`>?^l zMVv6z-hc$<6}H9+j*2*8s(nIKA6T`|QexQa3`a$rFx9>xs@XTRd@!J@I4a_VsrCy| zJ^%X!pA4wp;i!lcrrJM5g$OQ@@CHXkoG=xps>&MS^7@{mB2Jjgc z8Dri{410agQ4uFhH9kc3ikr@SDxiACQ4uFhg~mnMaK^cJpk0!@_GQO~i#TDb!vP6= zzWaeqC?lad*-;TEOm#$v>Y-2Wh|Wr=);TKTgsF}UQQdsn9%yKV>S{+toG{fMf3nIAN;eLR6!Uxei^o z==D`cMVv6zq!3lu8c#SX;)JOtho}(2C3)?^K@BeAgsEBp32Yc{ZDu(t;)JQNg`=p# ztxbocB2Ji!W56J*xZSwXQ4uFhH9bTX*6R^RMVv6zj1W~=ui+fx z;UZ3$3NBt%ucI9mal%w5gs8%;=xL6MIAN-pA*!%7HaIHcgsEN;q6)W%A8=H}2~*7q zQH9&X?>Q>sgsDypQH5LVzdI`8gsCtIQZ_^cmw4~N946x;PMGQ>Kmv~nm-2i^MVv5I zCPWo3<#mpVIG|dM4}rU@6=74#DIh=>Ugf9^j+brE7EA59BD)L=Iktjj9)~*zVN;4O zn8NS+-@N%YtErx&%{4fG!oO=Wy*d8fwJxtY-nfWf^9&Uw6w7&@Yc9N7K}C6pBi0yS zM#MWAzowKOH!{vk=pS-<5eHPk1ksxhNK@)C{8Nh?pFa5w0o8vT6>%)5ah$TaE1df& zfHtL?@lQV2dDnkmXt0~$sE8A$T41PX8&cUzWM1Z|h!dt-2uM@Pj<`JUl=VMHMG>m= z92Ida>^;8B;~eCh3Q|Zt_hma z{J6{OR8Ml>i4!<;5u)>21ZX{vT5ND&TtA0J{@vb=^CFX%=G(ISkDt9H zuWK9?al%w90113`!B-#sZIIW;9TjoHR4YSN=j`$CuLV@!bX3Fvm9oYvL&dogt#Q}c z7k(P$n$210BQ+zsCuU|htpse3z!=ljob z3Q|bz3V{PYq}ASg7UE4Q@ycR*)Abfxd+)0Z&L_b~@USLHM!4p?yv{PYYtFAmYQXvJ z`~KzUan7$XIQ@$At9{Np?N0ul_v#quvjGh_-*xZV&&N4u4UVpHXZxH_cAU?SaXzO3 z&N+j#x03lBpY!F8^Eoljt3#acx%f#Km8GKX+-`7oR-ADb7GS*Yb(~knICmhmDJAvh zEuA-@+l+F~8=QA2&K*AIT}G2X_TyrlI{^*syxWbJJr?J@#^5}wIAf25>~Q^njR&sI z80WQs24j*HpWkOooO8k8{2l+oZ>@hfcQ1f(t&MR$7tlcFWZzh4aJW1yoX_>|HagDd z#yA%Z6-P?EP8@yP6L8`l!CF}eGl)APTQ&EEpk-E2~%=6>-8^Q~+s8p#aQv(Bofy zKCVTd!TG(?qT*}uI>)(UwNUn1Z>T1Mir2}X-2cHi=M6|{N@>pPea;_ooY%)VpKqw{ zCtF;%HVvN`=e!Xq@E=vm=lh)Ra-7ePalXJ%ZE`ZN9KQbeIOo?IoDV9_7xppiQYifr?|6C#LOtaa`ut8=NE2 zw22>Hij&Ms2zYb|2X^MylygP<1+`pvC6jG4 zpS|!uf7Fs~n^O;eQt-8;dgu!y+!um*c3G}_9fZlYmJ5}&UHM9(J&Ok}3YA_+V;@gx zSx_6#Jr7zBZEj=SPHqfseq(5-G={dIF*JARX+2F(ZH(J18$-)B$S&I;zr~GZ+hE}@ zQQX=~#Uj2zN^e?JYF~}l)ic_#?G-%1QZ2Eo)Sa*7${VYtclUMW%Z2u8$(2G^b=LXb z-rSmeZ#7yxz*a4(8&XwE>s?pq*;hFsS&k``OZoM49kTzYa791Ysiyz8(`Uy zH-1pZn5FhcvR#`$zkwWk+Y5M`z0heLuujIEh4b?r4KPL4oyAhF5h+*Wz5ZMgM^fZtoPK4-A ztTPdA`07Y|84pk;Hb8OQa^4(e(|`c03*D}9ucHqRgGpj{dOp9dqfmC9(B4LO*^C)=$E@1&C^FUz~vINgUo< zA*_aYP05_udImTf#*>$~Em|70_~g_2ave;_1ck6tlVxZ47-FocF$j(B1Fe;pP4NNF zhLLz+w5kbOV#|aXX{h9-VJ^EE=oCMnu)UMOJeFvE4#!QGy0aLv=eSm#(Hy}d+qR&U z-(u>@_3+gsG~XE6+Y?nX^YHqT`ZROKjo?F%ug~+prwj0UbDYW6^YPym*h*HEttA63 zUfv%&e7PFVj@kVJ-sXO?AmmAI4)9-9VAV7TEH^c?&CS*pGMk%#{a2Z-ng-fz3npPW zhrWc3STCLe;89U{$pG&aU;@w^Z^l|%+ge-Enk{W@o4mlMMDthRy9&KoFu*}*IHWF4 z3Yt|@7fCwb3E%)iGPf@mLLCWJ9r+NAIRWDTX5SaoDDz6;HusZi4d8!IpIc3X zz;bB9w{`WZ)&TzZn5~)y+HBHCxRd`AIITNX`uk>^^*+rL#)TZ?N-W_@`vXTdF* z1#RwHfX_>rw{quk2;0K1d70?kT(P~6i-{c=|6=8(Qo#CM&~#%p5QiaVOPyJ)(Af@v z17h1FLGZW4c=4xZUZ3Y)J^+eW1(Pll)XJkQOw zXRGi9;{`1`|FuzuM)5YV)2Mz2+FL62RSKo<5Y-v0rk-9Z;_D#G@)dlvOD31JAq1N| zxh>>-Q)>GjUYaxW-xZjB%4`@ubw-fmX`CjvIbS=gSS_KiO2VRC*XoX3mBb~h&s~YK d_MHKFnViZ-v(vFi*4Guf6spnzJG^D8xFUjuKzk?~V5OjZ5)mBwiY(uMC)L7bQM_ zTWobvqozE3k`N=ag?Q{#g+Wr33;Vp1wn#+t5ayUKjC5R-?k$P>*F{aVSCP&v7UFfB zJaTb5?e(jy<>o@(72vyW zisBj#kgnXq3?WXQDuk;{@%2~kY>;~l9>q!h`j)!_<=z9n5i=B5f91|Zx!(lOuVx;; zT-y1N!ILbvyxeM+`5+FTr8yKVw}a1eKPE%JTJWu9g>W2Bzsxy8%sE5x^=B8}k4}R} zai+J+R+PINd{gEsE;~TF`>_jlc@jLad5W*Ua+^W^uEC=?S#IC@&Oo`Jf^VuzarIZ< zGL-uWc;2l(e7O`;L}Qzdbmd+KdI$JEG5jT!ILbv?|th5F$TT^25*1mmZ99bdLcF~wUleI-;E&u06a|%imyNW?S;I%z|+-q zWO+A%XD%HP$Km9C3p^`Y6kozFD()JkAZ|N^=rwp0C;S<4*XeYA*;Q3t(OlD1vvA(* z2}>H6RW>wDNJZAwxN0kwR5ea;W+Cr8I8TM0w+mZ7MODsjZI1ZEk=E+E#>T3uR##|k zS1{!9X+&{dcQnu$IL{Legu05Op-`|bw63_*6N&o6MxMj6M7#m_YERU^*0a9V+uhyT z;1Bve5q~T3flzy_%Ucp^TO($R)AMakL@B|xAL_9s;F5qh9Eyb6qt25XCOZvn0$r<} zm7&h=K+qo+?%`+T3-4Orzq&5M8)T97;n3=^r_)&tWg@Lfb(aMqF;CFh7>)S?A?K9R zlG4^?m91@ou2yfbq-uGU@OJt{vCHjV(pc$sJBwW{3u~uMbryS(Y;0;+SlNVx8~4-Q zSXJ5FQ01%WRnyN^0FR55uRlTsLYMIR66$*w{hn&R=sZ&GU{Dz8+Q(7A< z7uHnF+c>3UYHKji2K6dxYU(Om16|%=%;%3BfxCSwlsT-t4o{>b>S+u5kH8n`iU#{< z=?wW|G@dsU_76Ze&F<+AxZy`ZPun0ec|F14;B$py(e7B(9f^khp3Xs(wx(w=+`$mE zGuql93h}M)@^l8g?qHzn+(BgP^sj?Y3?c&p!C-FB+CY~tv^L^q(1@6dneTHJpLLqE zxDL*~#05{Tbydx4p6@KK4*k2L5z6-c`^rXBR_)Z?R99CsuWq>v2i0{Au9_Oz(3=~p zl1<;`ZfvTkTOI|y2KZ7bw93@#H31wMzcWP z*DrbY?9*di=%)O>;^_Kre{s<3_F`DLIuu@irf?!F?|P5d?TJRifwoxGADKNH=C2JY z(~^Vsv2Z98H$fnrA}9Y*a40WhU8zbT#5BkkW6fUGJ z<95?FGs=t{F$jnR&eQT}tj1_qxvDZw)U#UIhZ?YXuo1J45vdbzN@rUnipoOdNbpbz z4%_5C`YtYvdjyNhdnDdRmJXnm+qk{NeMq2ywZ>mxVv|wf|=A=J}Bm9Aig3D8zFTztwZj%vpiWk<$ZLH^xr8 zDK5lOD8O#}S|Iye}<4IiSJq2aP$3v?l-5u|HFObB1VCI#+!QHXOSK3=q{;<&BPUUKZEna6(Z{8f(#alOP(Jn7cbjJvMB?dX@g zuIgQT_bNfI}S0)Zo7I+=S3&)+R^ll8&*D3SXcHa z?y$r^k+J-<@tNVK&>w7vZoe@43n6w&{HPyXI%lu@r2A&?`T2KRqenx3PK@lfRmCsg zdrn~eJ1^#a?X%~9bMY^QXqWihr_av&?Z+#2{PKp4=ZtE+Yq$`%N_@ehtf?!$xc$`@ z*O<$iFX_z_;?EL4y5)DjT;q8ACtrP~;)3}*ii(8z66SSw+bKV~+EzR%`-5*zM`=oVU^y)o-oq5`11Vya3 z*=^TOUb^@!-;2{S-tm9(-Rp0@LWo5YfBt{%{PDd9uX*FTEfr5b_>1Yd=a))+$6x;R z!2RJB=j}Rg)ukmnuDDBxmnHt!qd$Bw`-H~v_qID;d-b(_KNn&W>SniH@^sHfmp=RV z$1kk?MPbFFg%=93M&c*lFl*uOo?r7l$K!kc-d4ZwD(ETkfwNZq_0(T~^VMVDdB)%I z%qR1NcunDNU9~IEzW@54jo8-pR%QGZAxbdswA*IS96#%#i)wsNd^YBUllB)rgz2=z z|8efU-DUGX*m&>L-j?UqeI3)?A4q)DTL;%2z2Wt5y}Rqg_b+D`(y@Z1!r`GYkJ#H$S@Yl1)N9Bk_AK zfA~l9H!Xesq4gg{zJ9AXSBQdj)gDUZ4W+jX!H2BoBwuY=T+Af-v0D%_?yIc?|JQvCy)BN{mT7+UHhAjJ8l-@ zJ^0FXN8`skyS3Yx&9=+gteRaFPcNB{3FKj>U9Ief+Az-dd%8+G1}GRwm6Zg#f}iV-P$_q(C)zO-6@pkiibjSap+5}Yakj&md1XGX5&>fNEi*!m1^fvZ*eExRBhB3KV*B**Q{Qg!vCYL8GA&1>g78;UA{qd&K5)HsnL+tP<`Z(#dL>)>xV34&^NX}r|rP-Cyf4X$QljO>-*D3 zdF6n$vD|A8=%%L2JkS`|jt5Z#w?&%Li@ifB-W!gt4W|wE1FgW2MxZiiOdDbak^_g- zf&GAMkUm@uG`lzC!;HWaTptNUS|g!Y*o(`q5Eera3Db@W(+0x+{IeTtz<3S`8x=K` zI!nTyM!zTQ?QovqEb<4sokXsb7ZG()=KK;a2gU3xnp!FaO_@5=SuDj3H9tg7QzH4e z@1G?SrIZ<^%=pKZGW8#?xK*UdJpV++)0C35SXt@NEH>jGl^-e@=9y9U4^k~>Hq294X{-ok%L$vteL?$g>HbjdLvXrF7rw`HMLv~1Q-lWBc z?0tt3nY8#&T`f`ZG>WGw1t{&~Lkwp_cF4Zw8M5~sMr6_!Lv^)8#gi6KD4wR2q{XLy zUW=>#IdP{4+v8iZClvbJ4z2`hV-HpxHGoOP<{@TJSp0LF$D&VPfoTlp!J0q*@Bqzk zq;kbNq_Bh!+y*0+D=tNfOW7mE6-FvoY<(q#F(Scu@DqEb7Up!9(4o?XLo}?hPAHS635HBZiEaL;5n{ny`&r#%&W59>- zkl_nRlh=XsQJfoaYWnM-kC0R$3W0yXLO*#FAABlq%DLY{KOc0woys5iV!~s9bA+8$ zN*vUQdH)ONm8_ULR{NvX#w!ce;ZSFze02;;jI~oieJIiLs=|g>(r4#?dg#!haZoB> zjLc`X_(&IvZ?&;bSZHKEbzO~8@IGA>W*nKn8T{l4$OqHRwG|jXSI6vz&((?A3zQou zESW8dtQHx#4dPv7>c*)L)}tPG8P9oy&p_gS#`&Hy>KEs0x8nhu0G)tdz!L%efJK0p z0ZszE9`F=EJnIps0)8Lxi-5EbuUTcv94_w$QzOO01};~0Km&yf8mU~oL=nO(n0#F0 zY!8KfSfv!=+gMl5|Das(UahTf(k`%Yf5 zWoq=6z0vx92(i;lgyuw+JY>mfL~N*UIB>jsceC)4sd>hv%NZjrCRk-_*f{%djY5c0TO$(^D zoq;>5aCB_8?Oiza!S5t^ot?nHjq@tBFXKSlcge?UhiUmqZZYtdUjbvt zmY=4bkJG^bJb0{G;lp<~cr{5k{}>81H-Fjw*#z{#y0HDz)|(AvDcY+O=`uj1#c6pQC=45hUuZL1Ly35+{qO13}_sQ;>Lr($MN1vgp(} zF=q3n{S#xcUKFYnKxl9_^yb&Ap~I&A2pF;2mt959=Qk9M9rHt1(b!RRZwx~Uo(~ok z{C-1G0lNNz-bW40*cUQA z8|uuw<$%{neq3NQ;Ey&h?21}K4Tb9?$vcQp6NM=fp=Lwskm6{BnkY~eC_(ndD%!zv zBlA0eXI@JPx)12{pol31aR9;wrw`VT0f_2uGm!9I`z!`wefDAm#00V%_0oMVp z0K5PY!7086a24RM0l^zT7BW`@^24AGKqsIN@FYM#;K_jJ0L}qi2}t`wwhTlkLxu`O zOsPP`RIa!QTnfhzofHlP90w}~G+^lpb#?jiwMwAJk0A}-PV{4FlQMR>=*_JVx05nu zblQvrqtgz+X2d2MZ&^#qlw!G#PQ7x{P%p}&Pb!J{WU~07K8*C_BA8ftGG4OFsO0coa zUl?rS{REqJ>4Qyw(;YS#eXxGkXcI)MXPvtNX8>YI6L$kf0owt40Aqk_0nY%I#ZvdoyzYdrOd>Kv^ZJ1KghA96L-MZ*?jk5h+D28u?Dj;j6@0>da0OzB8Bz68B5jD#p^^R=V)b{ z_7}(n6zGx9OlyQ5DCHbj)4RFo0kC8I!ivs9Fp7P776wPL$yBddN|x3^C@R!TEHzp{ z0meqBF0DUcH}dyhDWxrK;EZfl%8bmRBNzQ7C34*age7uS0A(I0)!=$8PKOBLS4FNk zQYs={jFc0nLtLN0-HMcoT#qJjPa}0EPKWpqze>s^o0c*YDMj@nrJ~sdNcA7h_yIK! z-O@QxW2@28%n$laCi;gc(j3iNE%eh+MIFt?Bi~sT`X!+2i5kmUYM~#biA>RK8t4lw z(TqAXZwT<)T5&mcst&C4`x^1my&A(T@!&lHm_p_-K2L*vN9MDo zM{#=brJ6)gi%Uhf5XMYLHrpGn>PBBLJf7G(y)mky3ncBH_g8 z5bQb>?g6A!0DLNe`x8=U;&h0Q@T&q~KAb@XJ5JRKB$WZ|1Dx8~k(3ibLbMfmFxZtL zMc#=xhaopBqUiy&79H$3CH)kqnZ6rz9qguo_MV0QDd>9W#&X`V(Ayk9n1bEAxSDGT zcAUI2?-u~C(~8MpcbFJQCH0ZaGng0$lcdHtAkxP;#wrf!EU}7H$~05Q2Y|j1Dw$)I z3|4WiFCgp8V8x}GsDZx|!GU)8F(88x0#O_RjH~=|wHm$>-)GR@0DJ`32Lbm29s+z6 z&<2^{iSs`H2(SR~Awb%8KVTmCs&T5|!;}g>Oy!FEz@=~;1}NM>hHcJ1!6!A=YhvpY$xXCgNg{T*ntxw;FHeX+lp9L84)Gvkf z9B|efBP}g_rWRg^Adn?u_fFf(ydxk(HNWvlu{(B%O8ly(7EDli6Y3e5W^5cEm&HldahEI4H8oF`ngLP#S840NEj#*1Q6W3UbjZX!{nn`>P;BNu3NGqNM ztOI-zuo3WSK+I;u?*K7t;Sz29V!#&wX+!d{Nz~#TE@#wCjg)I$Oyvqb)={`_BgKa_ z|9E%KDpDPoX@L~IU+nk}Xd%oinK|Yr;OfmQQmsn5ywPpu9ofm3L#k>59;C1w1vl-) zFY(!&FdDth4x|*{w~=bbnOvaMHw8!zc;um7tG~ve>HReZO}93NJ0RWqG=pWbG3>;7 z6FpHKXbkuY6<;@5M#Y0_0s7hHCdf@JD-PV3r8BS78Ua#QIy0RuXy9Lg^U<0A2uNrC zGa#M$e*x*tuL07T5e%d=Bj(4M_WPUmkDe{>mzI$`>J7vpIl7-^wp$fLoztyWACt@1PFZZ%ShFAJ#;aJq2nBdQYyq@(j7FC&f6WOjWkx{TnRMi^KN<^nl}1CRhw&7n4<%GymD{kKpUotr=qe_RgR<#(v=VPQkN4pq zgqUB)zX=l z{{5u~R3198nf-;{=Oht_rd$2xE1=D`_=}bq1MOz3zo;>D)4-fY_x%-+1b18J3HIkl zEYs>o+3*9P#R$O3fOsSuXL}n3$id@iz{P<0mOjolX9o-ejs>Ld#M6&xLFGqGDL-N= zS3Z_kxaSN$_P#R>7iwJAqPz%;V9PNCZ0Z%gtwl8rxNJ(!2Q&A{31PW)gq?sRWpId!?`%a z0TzGa&474FCzskWzmk3PM8Iy~oq*Q>P5`7Gh^Km8IMtg(OsO}Cn93EaY>GNk_>9zl zfUC2W|EIY6Pf(YN!?^mbR#(S^Cq5-r3!?uLUr%{1Wf`p|UZPutdgvpatK&Jdbagy& zlCFLVAYC1UM(OH!mq5BY)~%(hmjcq&rvlQ|iPtSrxjNgVa&@MZt1BE`UE$ckbA`>$ z#$yxjzLP65?2KBuan7b~V>5`yH9ZPD^VkU)%D|OEr!>;ZD?^=yPQ00(jcb<6#;wcE zAui690oz#ON8p-rb=kb;?nu}LSmtFPt@HBD2(!+kaIN!coks(w>qI*9QzxdWv)w`` z-b^2BqE{dXPtpmQ-(jMc1H+SaLeh^09d$-GY|U#E1*W`|N0&0oKF&%9kC|R*p;uV) zkGIhE{nENSLD#yK8?p&$;R&X^#A)4_X1(z8F?3PBLY$V(H0dW<=;elPntrl{Zq0uR z=vp`Go2<7@oNCHTS}Hw5lvwCmcU^Dp*`swQPM59eQ!R9>UCS(VYyKIaXTvrSE%l~f z^Oyv`tBT@+)j%2 zqFz{r7N-MOownS5w$N%$kB0^_R-9>+KkqOyjg7wW~7}@gsdM1fEhK=O&?CZf0?O%tOx7EgTAiY7-Mc~Ju^fd=&*qu z&omP8d?|79q-`3cj2t`f5xE-E8he5*fkU$aC2uk=@jVsIGVS0BpG5#5m}U-U;TVY!G+ z8GhjPQJC1tFST5b5g13QyS4@G!*co20qy0Laxz5+VE=XEo^?_-5~@y=y#{$G`{)$k zhpx5sK&7h83=sk@r7o-wPIFzpV&Y*wHP$i9 z$rKUrnC~?vp1Aj_Z?SdoNw``X2YMDkM-1jftJU5@Z`$_ z$@&Zv7g*%FAZI*u<$_isFVgArXXB-$)Vj_w^q^1n@eSZM8RhGGZN_zq%~2Nn-Q<1A z6kh|6j*rwy(g4|Vw@P^?+v>cMo*^z#dFA*_xASep#Vs~MKI+7CyOgQ@cbK?T%E+*{ z9UpLKAArLB=*Q`)+t0F8K-wc9`hC9dbxuUxx>(B74%6zz6g3lT|F4z5Fnc|HvAs#5|`~qjwy5-xZ8wxqE;IJeFHxu zZ6D-zV}De+N2~k?C(WtXC{^}pdkh&rx2f@)x|d;pyH|ESvOi*fnI*W}Dz@V2_N-=1 zXP-no#%;t0gWQ|c+b#R5+aNQKc(u=u#N7^D5pe;Zu#XdhHtOHPYJ77icos)uT9SUBLB|GGNwO*b z0|p)2cJ-m(1sxw&bTv*xd3%MIU$sq1GOMyq1Z}@T)B4?m{Ev%nnL*?31?~ypf}Ngj zGw!#*#Z0*S!1pxDR(BZ{$5@kdg`t!BHb`8CSSts!Vfc*3WfAA|*OO0=XCF5CZMM*n z9+OaGhh&yJ)u?+`+}PmTxQAI7;OPCmS?8>{-rM_Kw2R@imaOw5ed}!6Cc338d6B-( zKQZdeK1|Q&8&bx;YA(zB$+~h5gt{8YWZcQYvm|qzWj~)M)+Uhb%d$jH#!pQ)!FS_w zGw$SUSxwXb8GRY+SB|pTCzW$6(UO2K)N_Y8bcnO2@^(LV)+)uaCjNnx#F+mj7_phQ zFXK1$F#lVw43IKy{D)v1!6py$zXGF&XWIA(qwfK8$wTsBZmhQLCRSn0|C&l-ZLfls zi}O#%F2Eq1I-2$2dQ7J6IiQ*1k(Ee|RtR96@MRuT4U9-&FmE&t&9guw5Q81p~b zlB0N=mT_fm#foa=9^_HDyXCd|Q5def>qB9l(wDMyvo(f;l4;|op{&>F4^F?X zuQh1%OdJ1wnYPC8MCz}GsrN-hpJUdyHJE{TZ|bWdmryfpyC6ebK0lH28j|y+WH5@WQp+;^Q!lPEW!lhO<#EBd1$ZK? znRgor@}%0(0ZgWiuaDA(FNH3h(pN*=RPgX0vuO<-iPRg0WQVG|NgqDh&9u4j%VXH@ z8=g$+!!Cvgc~bQ`2AE9SW%y-TA1zu`(pMkMeZcb)bk_PDlSnlil8;GPY>R8UhI4$-m1Ul2kQ4d@73r}{}_SN|dl84`WYMl!csfmW4hgdhp9yd~fROtNPZ$2@1TQmOlL|Jbc zk|!q0D$qAfVvIglc7>Cq9R72<)ME;AxD)>cW-i~{?X&GldHITp1qMItMpC#OQ z{R{7shw#tbz`e{9mOH1o<(|7(i%sHoLXL56=V}p{p)8%(NbEoSqO6E?VTU6=7SzRvNmj6NHcDo~f%*X=K^_U%p z&JFlQxf#{r_nvDI%F6_+r(XC-zKf|VSIesLT}}L3FHcx;Vf{XW3i7|#VRv_48E-Q| zSD~x2xV+9)SGTybX5QecLS<6FJlCp7D`QgY36_^lX)iS&y40!#<+Y0zRo7H3Sva^- z-FWm7#m3}5X^fO_QO(8c$}K6M?{ZZvuB#qo55pNj>{VId5gsZ09wFv)LaNhg@ z8EnejX=r7Eh!P^3_FT)0pHhM4Xf2*dB(S=xPX4<+G!yxsAP`L8xKV#@wrc%6=|M^js}rg0Y2SoNi{y-5>@!7C-|v*WyLU@A1@-s)dq1DunS18UnVBCllX23ESu>t<(^nv_ld6yk(K zgc$Opf^6r z_ehd>k0*(@E=jznlf-)_NxbKi#Cs`8yjPRNdoxMAcay~XFiE_vN#gxGNxUzU#M_=E z-uFr3{gfo$Z%N{%{A4t}3Ug9p>*w}K;_Z?oUe_e?dL)UrTatKtC5g9hl6bw7#5*ua zyhD=28;~U4;3V;eC5bmONxUPI#LG<*FF#4Vf+X=KB#AdENxaEP;!RHy@Az1F<$*x> zXzdh!qvMOjptS>o?)ky6w7n5`f!@iQW*gk6rxwq$+llEg0M7-^T|cYL9TC9(i?S2D z0RBC2Qhrf*G*3f%Bg3ztLZl(GKX8U;N5H-yJ>R|98l5_nsH^Nk%ZMmyU53f|(!D^WWR1x{8Z zUQ|2UgGL^33ha2c{$+oZ0>`QG;`Q$rzzY!XH$-q*{cEFlAkzK;oM$y2`!|-nd;|D4 z;JooWBDh#zDK9p9Jpgy?AV%nlMUVB{2Y4MN=i<|2IU|9St?|g`SoFFeVLWikQiu_s z9@j%>0B429i$|{)5-tJGy=@e|c>L=MdOvC$mdh(v{aF3>ZBs=1c8Xp+{!#7^2hKQ+ zN9 zi5FAuzXQ%sjo|e{Ic+7Wwpa5f9$6rz{%2h@%Tsi%LC4!jyC?;=C(m~SXKf^2RJojwo(0Y;8qX>>#(eZC zaN2ga)z2m`l;=Hwv!BKzc0B&|1oir-5aMjMdKu*M{z$6 zc(eCtoZjUcClS5XAagbFM(>rF9`#O8<0PVY5y;d7uk${M>5;ETYMey$z5|)jz#G1A zVtUknb2LsOdR)?afmgX-VtTCKB^oCYy+I&zCGeixKQTS(``>`mD_!Bm)A#QHZxC?0 z^j3KB^!*&*9SWQaG+sPK8-*9RZvb8ZT1+84d`+dA}?}(K66@dU6Kv zYBjEP8>&DA)F$}1KHS=gF=JG z(d1(4aq6K5#5+dYYn(*%$iFjyclCh8^tyn^i@%CK88%eWi^mtPXKv6qrhc*b!tr*W4KG$ZD1Q$D@0wwW+d+AL zN#mGuW6|S0vjupYhc`~|ca4*X9_2aZ@D%YIe!SxK8|!!22!$gN@fWLpTnA(Vug}QF z>6K}mMDzs6Oa;ycLEQtA67_rpqX-yE#yBS#mI+6G+B<3B(`e;7Q=T ztnn;8Zo{MeeFB_s8^Pmxu)~qy3x2%f(Ieh);FQ?$Z1V^GW>vsh6owb8z3h*RfU`6^ zG55a}&IGS8cd7+A&1-uoxjnjKs<0PWj3uL|l zUY9YA(<{+9iRiI@wZOY7FEKrin~yY3B6{TCr@-qzR?&+$-e|w%YMjRCO$FX*;}X;3 zy89lDlZYPYqlbX^0tX7Nc=h83eo6tx5q<_Qmb{REX8`BkqZOVt-fZ$rc}YJ;;YfnK zkKqSq|7HX4*g}PyNdB(XIEm=NR1;4C@1qHg)9YKLa1zn$1eCGBE1K9iy^AzXB6^gU zdx7^>abkMI$gfEXClS3MP$mQKnUcoobuVq4-cq3C0dG@TVtRR~RJX~{YxwbsH&1Uy zauskgrz*U7^0yc?DuJ_A<8gk9B`-r!P}^y+vyWBuXvfF$1D}B8M}U(tBZL==-nA&` zM&OK{rSSF$rx%(E!ccfl`;A1|wZw)tZP(%it=uJPpg7usO~i74~(kM_oZaz)Dm zwizVs_8RT0!8W{D?O=C#fw#6o(Tq2aNUuX>WVx~EQLb`<_kcSwy@NsT7vS`%Qh5B2 zMXweK{eg4UY=sw34sJsJe*&j&P6#g+y<*70O~CnKuEL9_hiI?4Aq*3|3Xkj3SoGF{ z-YVc6?^Af)ffq}zwgdhj;C##m;bQ;BqE`lb=_jU$U?6e*4n+QsfYXr-$Ho6x^vI4L zz*$hI@Z#}rB=X+|oR2kLJbKq6;Va;rQ=gdLnGmG4z!`U%!mEi>zZX%V3zwvbiscG# z0Pte1Qw{+9zy^hbsJx^-Zu2uZkTO0AJnr|DB!S2NtVj~ip9CJq@8TrzXiqLn0*`*% z^OL}%zPlm`Jkq-<2|SL6yQA=oKO2eqVtXHs!h>G3?GqEvel6nuYO;7XIbi+PM3syB zsdI;ArmQ*rI*RpnJe)gBPftH=Y;Hke!Pp4}r4w??#*EME>^fAr*W&cggD`GrRkGcSK^?&QL{(g@%mhq1~6b^ zZO~KgIms3D_-Y0OeLiowZ~lO4S0L#2>pTfj0u>(TY*)}-?^-aUqPBKMiQDUT1>7?T z_tg4og9Cl#b48XoqDM+PH$=Hq^36-J!U>)Vzc1jc3a0lhIV4?I##1vpeT=WV*5h^i z#mtUJ_7D~Im49?oM1_|{7W;j({jTctv8YU7MyR?|Jb^lwH@!4iSLyMk4<0md(2OZ# zW|VtsW>k0w=1znOMA5g$Ll}sF0lDly5jM6a$g}I{_ z4jz~}!|N$W^>PafCytrnsj2YRRk{O>U{__LG70I;aRufCUFBYPBY2*gpf^5BwXd>{ z%&YME-AUBVpu1{4PKc4$Ro;Y56)vy0>A8G$!P>f@GZ6HhjjP&I;q-cHPG~~5YWIA|L=!SV4>YBF>OD1;zWRWZIwKHP%(%+*0mmMmK42n* zeL@~2xkxIy^Z{dif0i;r*_D4@*%-=doI1-UPAnWfaTw*TfWJb7 zCPhq@qPDX9kDk-4>3Lqo;6Z~1vIe+lGZZeP8?$4NpW#zX5l1`oOG+k|h@KkK4v?w2 zB}D~A8=#rk&?16m+MDk@+v42y8_S-n|SHMSx`C= zQ{9BzX)-^t(t%Z&TUzGigg0(t$#j{2zz8f~7o~_D-HUv(cm+rWV1jEwxm#9J!9>cA z?$g}?(F3JyKb#dR^5vo~I9u3NgWy7NyDCLDecMJ%^?QPDNtZd=%47v&<@4c4OA%@o z5W9&kJ%XevuZqD=slIU*FaoThY-vp&Qk+=koLqB44a_Xr9^L#YqYKJPB|k!SFU@tb z`s8t_)c~U5yIC+c95B`PG=No0C7Nz5yN%Ek0jO-R;Yb@oRP#ttHCZDm@IInzkG@=H z%ggDhu5~(V=jGOV#sud}R^Lb;v+%pUuKDQU-9e>Dvbxe;nv z@LIoHChU!bNiu`qS65Ss$)eunuXLW|_WQ(MIxR(*G-r+5g^WQsL^}2O9@(7ElCrXb z(J&~-cwK=&uHWxkAofOLHpIj^#ucoXL+hk$L9JV*4M5s^$e7^_#LAoD#DP-3YxIJk zJK!8VTx0@wsLHES+xp+XS5c74==NAV7YZMC1aI&C0cc8-WsYOBrwagI` zZ`a1~h7Q9B=+vVChOiVUx2LAcN6VwGA_zh4)MFL8gQicu-!G2D{W7e&1HsCyEN8Bl zIZ&{(92_~KfaY~pR%ta9XmQYQ?vM7>`D?DTALII`bnvcoV^xea21j4ounqZt{q zvixqCz?Df9F&9OonIfE1z;3i_p3B=<*8Y+gO=t}Ga2U#(2q&A&T36%pFK|}X)l_iF zb3~=D4iePAt|s7_UE{7yhbfyajzWf`v1=kTfZ4FVlvXIOt2&|{Lg#k|RYg?X@A3o# zCV`x17eCok6Y#ogW(Vgu-F`oWX)mOFVp9BdHMF{PQWlcdrRz+!E|1lvWv>TxEPf=Yx6u&lErXmBP@m3Hd!VqcvK z)hH8>khq>2n#2a?47z6bC&m6wCs;ImsJuZn2unXGTl58`IT%VZZ%tjb+b>PlYBDC0 zxg6Y=n;L~Wa-PpqnJxB1;PPGY4XwxN}XfnAbOVmgRE)M`YXrIM=DY~l=%4rCf$ z<{HJN)ShB+A-LhJ@mZQC&t2=T!Q>MxaR=(WK|QRq<8nJLKKKPyTjZ;BD`DhxCyT6t z+a&1J^IIUe!0Q(KqMn@H!qU}LrjnN+d7pu%8O0dTVJ)z<3Pev1)o6Vp2e4gQBrrW& ztAYMTc%&!?$d#-tCD&72-a52lBr0*S(S6QRCF<0(5o#hrg3rk2C5z=UjR5iL?iN{@kXd=Ub#F&=WOp30?K1lK2 zY3eO|Z&0@AjaE&9sVKXhE)vxmso$LyQgWybU8dn7=9=EJbV0Tl1I*LSJeUa6KDUPH z3u!NHgxw%(6e1#JMI3?>7DbmJ6D^_&bs$hj8)30clv4g}v(8Dte;yW(EZ5>wGW~0$ zk3Fd4Rv$&)$LobMlsz5RsVqBUG#T15g$;AU<_n*o?PE%3pv==`dUB5lsy?lENh!`C zMMjzoBM)tQMoXXOgFwG#5s1*8X&^HO!a3VrBd1_UWsOg2s-umj3TKJx_o|dmJ#NHq zk?O}XzuT=u+F4fZsx{n;W^@9M*jX&gNzXQ;RjH_GeWkL&Sr||ii0Id*7l#66twTdX z-b&l5HJX#G7Dhb=QMyvmIlE##r6kH%RV93Y{BAcJjM1e#A=-v1t&B6XK;VuyH#zes?5If~`P1=Ap** zaa2`w*S0_<*i;_%b($HbS~Xx*5MooKMWOPXLF&wKv>D4%&t{ALf%33Xt=d0ry;JP(Vtk$95wnPIxT@}L3eQtb+=iwd1_!ic`BVQ|7@&s;QY7%sjm*P zjU8H8f8O{I9@J^TAX6u4EVD+M+i{Iw`|xZGp97Hw=H77zqO}w;i$)6|m)TsjjyGAQ zA*F>s8wsn;AX9UI$4tY?jIR>p-_K~(dD6FF+HO;daawG{VmnuYW|~o)VdE`Y*(4Aq zdvSVNw9O-S&y0OAu{u3bol%FF9-dei^aQ1EAuEEP*4SX}vxaJP&5=J*J}03%H=5cT zwWbD448McvawA3h9*a8@g9Cytm#g4xmaU={UNJAImXn-y+u~G6O`X?U8-z6|MgX!R zj(jEPJ+OTla&CwmSTU!`ojK%CjUK4RDNw%7(b#=+(%mE5f3nfX3Jyg_ui_9O`yy>x zjHX13PLx0|>%~T8Vv4Gz!%XJM7K4yB)X14_nPB=Ta-?sCf!Q6$c4X&7FBHl>l^(tl z3ho$}*P2SD&nYCNGS*UqP#li-G~NW3)}C(0SdwdWk; zs|mV1ScW)j{l57N;|~~Q1|tEiXM%uBV%iX7}igJdJAoT*}@GP3(OF( zsr@)!a=Sv-GoGClA*VWq#+eZ2Qp>NC8_PY#C6she$+rHzj8fVrYBd&n`ir+X#Iz@u zQI>y>zVs`xk)kz2C3bfz+|m<FCF8hy9MQbe+wpxEZP zD^74@DMZ)0rGE5+N8(uK+}~Zoga_*i4AI%v5dAaNt9=%T zvcpv${BLzvHQGEnS|T-WEo3AW$E>Bsjhtca%xR^4HSV!g8@s@=L$%$XEuKd5xke9I zdc^WTCon7&)(hn` zRg{MV;KWcO9i47@s;mrLPHi%(+-PhX2qEwU?G4li5Y%29CF}S;*_F znVl`B0`*}$9w(V(s0_8_Y&lnA$yQ1Nch*G!v1T2=N3;Fh#7!$D*jx*G5oUrTE{pjRn%G=Mcl@# z#yKds#>h-8o3J(HCi#&m+O+A^K|L5NHf>@w||)@;**`{lJE9NZ%21bk3aua zWngFR0wtKPB0jKOMRJ4I)K9zmck-s~4XD8FkrilU?_pb&uv6A&XP>&}E?${+ut|H2Y&{k21q&UAwF`lsWJ3tbFZ2)w zcfUy6w~^lXgLZ-%b<3&-{@?dH$B|GzKT=}(-;BYga(C>LKOq4~MndEPh|40L zL@`I^v+;Z$+_gs81^t7$BkA$VQ?|>DQ%Hi#U6syyx9bFHkW)pjib%%edR5qU#8W`Z z9ds}-a*W9yuHYKfV}f+coNOE?o{c#jL%u`Et?~ESW{Oxm=RlK;Ch2ROW+d0P*p#Kn^GU1BAxb>< zfs-M63$zc!sXk6#wRXrB92pDZ;Dq@M)dBwLu})*^^@+4TLPJ2)$09ltC3uWbhY%7- zn{u~*6L(z2+>@{mu9!&D85A(hl`dmta&a?RF6{e9m`avn}}yi!j9BQO~6wn`x=_?RLwSz63;}!S4J_#@fWvXH6_oV zqFjtOK9U;noaB}^(MmG}El;GVMom0Mq-|$K^=Q?PS2yoLNZY>LnJ6yToYLM|ny66` z$7sJA73un?=*c8%hx+l@{(twdG^RWzghRoN3I(!qCvK0B8TI#3$DQYj5+{P!TdcFD zf4lv5zS~dkrYtr})rpsY@C_Z}B6P(0#$6CH52XtGqujBLj%;O-{NMKsSSNsK`fM`u zT>PyX!6inznT4c@WKFTwBQmrh=Ng;awuDi3HMi-`GKXO7wy$0>peo>19h*>HHd zhOf#gCv921B6A2-Kf9ui6VWc@rjgns{51CI%4C#wKI+~!_Ujsw$ZnnS zJP~E@OoPN1^6+tRy(cS9#Ql4g4R3r;$#_0YN2(X5nC(15^+G$I(}MLp)-b~+mb&M% zJ1HkJ2{Kg}E{leM>>laF3AHTSR?OpFVmZJkEjD)nmf z0RQcbZH?0@jm{|65nydHo*6mztw(9Y4nI=NB2J$mD~E1*g#L|i+VBazTB-lIoT&8$ zndTdf=EVl<`Kaa4aAy!+>lD^oO+IY` zk~~uTpwYC^&ua?4Mr5S%PTN(ho+m@?Q14FaYNP|IKH_y-mim%wVP)Zji&$hj9WA?} z_$$Hygg8YH{;VNOev1(&^yo{x*4|hh^ zLq5NCSG1Me`0|20T5q&+s3DDJv@Bz_mi_4cH*8<4$VmO zAQ|(4PoiJli1m{AnX7D3&iN@rR|fmc>VQ!TCCTiLH>#-rKQIHJXSp`#3*hRp2*J?A z>z38|GCW2j&z8vzxAHhEUA?h#Ir=HzQWA1a8Pg8`d$sw8uQo43ccxm4q$vFz-`Qt| zNoa);{wQY%YH2+^mqew+^T_bkJG+~mF6V?ge4S3PwnNQ!PiXSpsS34GJs{1I{c(_a zZS++8=hw_;cl<$n8;vsU{{!V2dCK_!=)fob`U3JNZsuaLSpX&-XeM;I;54rX*-59! z{+3hyfSg=U9T{oZX{S|EyVczIm~7lT$^vUb_K1y-aV;Pd@rnx`&}wUlafM8uoH1#o zW{%~Si$DlpC!1{msqedj_6oVnB&{MoIe3tLR{RpD0OlbB^sl3TmgwenR#JB+(f(ZXX1m2w}r z*ub4-cu)U4cZFCCMR2NVxNV~Uqa0E3`0~Gd>WbGY_*5b%EN%}zXzVYZu$J8*9o=1x zaexf$y_+n!ALBF~m&U+Kk8 zj(5)*C*AB)yrBw=oZnc%h`gbvv(ECPs zanEd@e}SyS!?D*zO?P^iqM#GaiX?KC)MR4TnrS+SR@=7R!?>nGql;gQ6+Oljmgm zVW8W`mOi;OzXV@!1y0d8e5JX}SumlvFn>aRQCWVTd=FS*D1+U)Qrfb#7OT)~iTiAP z+%S1kpR9Xvs8x46UHkr1wtP?5LYz$0jkRYeL+i4oPCE$S-ZV%-9=Fo(HkOA_`3*~* zXfJ}_K9n!|+7TjvZ&r^j$Kr|}%sDncx3mCvQp2_js}sK$T8bBs z;RJxEf?vMGbAO>uWEEv4hD5@st}EU1OZmyId^k(wvxa9x;pkqJRQRaXA$E*Hyo%a| z?|&|kEujr|T?oZE|78U(iH2uo75RdmDwTIHjZovxTH)B2EzDIHSAp; zCVScdR$sFCDx4-hMqiX$=*%6B&$G%$o`cwO(UlLM*ySX(2@X)57ACAxDV!HGDdJmX zvc6lBl7FkdT2zQP#UIAfIXL71j@i@Av>O772Jhtf;QK+^s%(iS1ZJE=)3|M!qma z!mf41QJ{1nd;q#8_VlbQ`K4m#n2AMG@=Gv^#$gndFesbo%rBZeL8`3d;};P5np$ax z9%iqpR0@IkjFSVJQ%6Po?w0irVUV zk6YGMfbA62@=!0@X{izw0e?u^^?U#&EvNBW@!Ks+9OLp<)Olf)R!*vO;d7=zj~kWZ z2s$jp^~ez^97qj9JPKe+^K}mV>a?zYzAnBHhPGGgz++-C6-8A_u5*QOf2fIeE=%!x zB19eUTTsl=UsDxS!%IVLFPw;ZzHmA$32PGL+gIO<-ytDxWedJaOEnAgl~jw5hDhg* z8IxaJ##z!?Jh7mt%vqA3J7zqT4Q-i=Lvk?2h1bzns?S&k%y%rMSbQ2%&6A75j1VU* zlib2_&I$Qt<0t0fd)kFChGY+%6sk9L6jhU+MdT6P9-(P2dLqv)qCI7Cfm7b4p~m1# z_L%0UI`bxum8SrEgp!Oo!RgBvf8Yj077*N_3PwpbCJ$BT+(NJ_Z#oz@t^iYH2^vSq z{sqUwwa~%QMV(aAWy~4VR+yI!g3nt7e{5r??S3V+kUh6^{Xt+Ta`*aFx~N z>Jc^4{uqv`#I4Dcb=bGDIt&>p>t2Ua{d~Sx*ZsG~=w}`->91}KZ|LFH*YL39t(nc| z0pt-LC=KD9j3Zq`GJ_K3d9>U)hOD25{TKH9b0Drh?=3$IKHh`x7W*saEC_v?Th`(8 z#_EtcRF3~MEpnr=@RlUQDDiojhb5)PKPf&!_EatOjni2@Sbq}yjYg|6Tvqq0#_$FY zm0dCuu2`?P(lZZT!g-d0A-^K6z8`)zTazbu_~hJoZIX2#D!IQwGTY~crCuTB>}it2 zfPsrse`#G-;!r4Mex;n>iDxDF)$-B`Pd+|cPA%9T;#D}tS)jC=WU!rkAr>o%T-#Xl zhYXU3_+^DaEV53N{Vk1A7(7zW@9Wq`P$-+@_th70H1qirj#7APD?L?JU@Q-lk?Nz4BDUC^?-ROv8twf@ITW zjTMO~$|Bk{il@FGl0&(bPIx&7@%utq0I@{KpKaG-q;bc#VqSy_Rllcj)(&Pb-vjD^QXs+tO=ZHEt)ckeT2@r1EO67el{ zmnZA=vQ%yJg4AsC?5G^xN;279H_JLkvN1wvGKX1;!Z|@TSIxz@Ag7*-F;Jv^@EtgM zcUK`&5T>T=d33wX=?AaeIyJBRxs%Us=pwMJA^blx|M7$OzpEd==I5cCD(bd=Cd5(+ zfA^M`i!M2L;EJ118U0GXE2q~Bu|dMWzkTt_NjZ<5z39H1&noZjfoHQb3P?>k=&G%E ztbI0jh3AMv&VKZ<;b>T)gm;_z>a%mxzW$%n-^)F9+<6%=wl0+Lr=EH8gOh(=a_6D1 zi06LJJMl~*-jMJQ`}P{=9?}2s2YzT+(DlFPd@019ZAkyMuewivIPLW|#j9_cePzDy zaUqVE@M-IB*|e%~_@i@OgD*d3T7QgzRT4gW=FbOCSomR4-OO1Z9kTepsOLu#{`9=Z zCv>>_s?uQ}=YM+s#*fbz;()fKzt62t&7A#@-ZRc|eDuyG=Ujfe5cf%V+jCy%z0V=t zicUUY>$kJ6?S8HhKPq_1?MFU-VvlK0+?@6Py7EWv7ve~aZJn zd~)^c1=vhFUBU-`c*8emtQ|V`!zCrJ|GZ<;Xz)|QJHI^ngv!(Ix%tyO?%nX?oj*?H2GrwA$dF7j@2=TIn?|N(7-PW)6Rvz}LvtsWVpMw9pb|C%K4I^$ky5Nfw zr}TT`#%qROjKMNl!gE${Dfe9E?SEUJ&4VAwJqJ(iT_WMxD`sAoJM-*cdIZ`{=)bD& z3G|nQ&l>RVy~leNY=67U8Na{z!t!T@*smk$e>W-pp85|zyLMZd+dcD}{5|nGXbHc2 z>9m6WL%(1CpYr?e>Q#NgmKLlS@CoE_WGB)&d&|5Z&w2f~ zO{Wz-(<}Grg42XpDB(l%o_+d*f9<>Vn?oz6-TL@J7Xo(|;%~~n@zeQTCU1PX>-62a z1=^y&rc3xlhv&AXdn{bB_m1;2^U`~O|6fY@{fFK8$ljIvJ@wTO_q=`oMR#NgvDiU6 z=bTu*K4tmztgFs??9i{yedrS*)=Bu}ZU-Fqw6tKe0ST) zSNT3~gU8}`!I(@<8Mcdm&bPnUdk+12+7%aV9X(x$YbD(K=k&71>R&M^i`~C;5@Aa4veK6)zQ}+7u(cT3=eUaNG=ZTLl*|Gb#LR3ij z2dif--QMS@`xl+}`dj{GKYt~}Y6)L>NJ@M0Oz&PBudI2x+ikbKB*egOq~jVAxMtjE z|8TwZ?A$7`?6E6^I6=Z+_{Z}V#czB4FRe*^_L`sfh5Y;|;TIisdg=qIGt#rRKK|@o zZ++rLKXxY_|JscW87bSwyn5BMdz~}-`~o3PmGF&6jeR@yh*Rf%d+M8y99yw*9dMyL zQd0t}K5u{JC!hRKU%2^y&ff23jJZh?KI-!QZ$0|3E30aIe6!}7(>HDx;sXg^x%-@z z*Sd1LeRf}m%@5AKI3Pst9;8!y-={~uwCkCv7p?!Y{)L6-U5~dRN%)knj=H($Blq2Z z)t+5ve_NHYS%}*u{MM=Ey>C8hVYi}{FLZ48`uAT5@wJ2>ckUZw25iav{eyRweR1pX z_fYqNJ!QKNylk&;*JZw3w)*FPZ(lI%dm+|K_#;p3Sh`>R(w{D>zT~oAw{E!w;{wV* zHRZ!iZ>;^``KMkf>5z5k&Eu}wCd5n$zqtEoYnJ;NBax$riA~p>7%hZ|33Yp%9kImeQNkAgP|wWNdMp~UOeldkJov; z(^4M1;k><$5aLz|-#YAP$JMt4JAZxuFp*aHkB^1;R>C_ky>FjAZvOJ3%B;tNLw!%} zA;gm1NavuFZ@+YD`oWiN^p=(#eBOtU&u-WRgkHLQ_(R){`+mgZ|Mj-n<@zU{6XFU9 z|L~}LYln{ee&M}aDyF_M|IDdEd??|+^=@~{x{>b>yJ*#$=P&=Z&y|o*l#!Y;*>%=K zJ?~raukr=&x$ax`+5cdDD&apJ`pHY_C;n^3^9OdnWB%|(wL*L+;WxZ=)epz-d)AkW zA744{+6!|R2{9BpB{ik~w!K#M`_~nR+N{ z*TkWatH&jLTEjbURP8qsGfm+&*^^}OrYgZF-B)_`qieA#XI)tDdg zoH^uY_>C3++R`xgaQ_9h=hQs@h7hMn_@Gw@UVFlt4aa!<{<_Bt7yai=As&(NFFqc5 z)AMh+?(g)-W9zTlT5^*Rze)JR<7!^_XKc*hy8AczYp=g>g%DZbX==)nm%Hw_>n%rr z{rP3-w|VYd{wqvV3E$ji+VA_d^_TfRNZE1gX~AbeU&22Zr?1>LyWjNHV)L5nTe?A> zf06L#PMGoQvx`=AyR)WY-^2QQ@`cF3|7cRl6tto}RJ zJe=y?YwL9b77H<2!k@fnWk%bZ4!n5jnod7;n*6{-%y$xg!MUEbea0P9eb-O_T5c%6-`_m1`m@g_{J8SH5gSj#*jg#!?;iVschcqCKXCW%H`;stnx8Pf;7dwP>2u4g zA5LHK%Z&NKOYi$~#NmesQ7z#`Yeqi$&@He2bk2AGJ#Y4!c`v~>lJHRv^f>t3uu(}~}A!C23hla4sA+qkq*9S0wY@pyxTKR(p|Yh~37^-ISE_D}1%%OgU3rr?`D zpIi1r`{7;6et&w=nv<3Zk=dJc=FKd*{y|Ue7sI}L=&9WT6RyGPK*C3*|5Wwr{ugGv z@yXY#pV|Hkds~|Ssf~-u7B+nGp=V3! z-9nrz;hRspYHG#Rs{-G)&nRZ__gC&q_VqT$)Q$OkT>-$H*j+JoFv9rGH|IdrJ?zR0j_ng;$87;(v68?>E z)vBxCdF!Yv?#X@Os8m1X=LZQtVb1tsQP%#}6+?FW;lBHRgglHqi1eR1wC~9`}hOqp#-)u|>j<_$BS@mEzPZZ_B;%mLrcFlqy6T zo?lK)@!U9Tb(hrjtDfFvMa@@Z7QH9LaT2~$`>-Z5PJxlSN^`)hC zhhMu$h+`#uQO2y?z0Z36?7hxuyVn^f&w2v$f`l)9Vwdslejl~hkSo5tXqU6z$K3Lk zgwM*`KI(?wmdwaat2p?(1KV5(IqXOJPqtfo zek(t$`Ko@+nd5i8O^BNn{$(pSy*u~Lw+6P)uP%FT^K^_a3IE`+$-kcCyy3hzXDr@P zIO&~FgcyvuGd1PC?AzLB&CYwR;HQb>f(2)zAAJ&j%DEM7?p%HH)A{Zpmu%_z`DsGj zCE-7Q>i9gX-KVd$De7PS+o;R}A^s!bZ(ZjGM2+I+r&+5Ui{8_|gXt8aQaiyb42O zhNrq3&Jmp4ZwZn4_!_(y8{N&XMty5kBW^8XvXb6Jm0*|=m_b;Due#dTB6ifYMq_aL ztg61U`5X5o12f}7iXhIc`za>=&)YoEG3RVsD)Oe%o(WDNcUhvhpynhKD zVu@+XbVv|;4bt%&CG0U-6KOZVb6#Vsde?#(6}7cA^qrnsD5-(CBOiBa>5W@CvM#RB3B1_jG1=~g9V<`$ zMhi&H-mxhvu!for!zMa^(lv-zfn*7UwctUgNNC7o97uI8g_%~lfbIV~#P)dDZUd`z3}zrrw0~wwBmr%NX9LiOVGY$Kbr}tpk{Qf6bg}zjbyjX6oCiS;^;JYP*D1eu;w#da@ z&+~Q0jqoS46_bdzXJc_T*-1dzPtDhAP%VR%n>(6DlX_Pvg=iwlHUthg`O=_f>*x6` zRq*&?TXgkf@*r|$QY~MD5KFF;$PD+g6BSqQk!dCk>BGrvN#-H3GAG+}^IR>pWYiJg zmeheGNx%3%x(}0WNXT4{+NU!Yo^+Ey?& zxM(fcOpa8MF-K>-6}TE&v4k%snaJ5zPIhd|JUmd(=YpC^M_HpVeQLe#`G1KH@>>sx zwt}(UV*M9>6y#4H-f~uK1)iWuv4kbr89_d((`@rJ;115MhRe1klPh1D!N--FU5WWs zbu|@g2ebu5;K%1{f}$zJ9KO=H(?>BvQ*<~q7E@x9il%z?)QoJUtVov&z=^1WM zZ90K7^Vo0+Y+~fj6EN>kKTTN&+7Af^( z$c5?~HsS_H>OQDFjHqBp$)(ERNMNhp0yEDG57K#~fmmLx?@v67MJ-Ly!U_`PT-a`2k7r*G~W1 zBjm4x{^7wN(Fs40w(=5}Fgy$<((%K?MDk(*q-#&l0c;U|aS04US`L1Tgjh==cw!r` z^^#XOO_mpaZ|aZ(_#*t$@#AH1rmW1%=v3UWeFvWI5@I8pBpNo%e6k(hvL?i4{5r@s zJSStU_4oMY;b$&9!YVJO@%kRmMzK`hvlKi^EH9JZXCR(`l&L~&N6Mx69VJqGC@l3) znxuiphs7OilDe?7!1pEVPd0=_@w&2}Av7SH!qDLHDR{+DhaNW}y(eC<;|bskznyy! z;Yfg-6WoD-YqlHw9NB|K@>+z1HtgPSano0V)F110HyXtr#N%!9nw}yS;c;wnEW$1b zH{sV&%-6Bb;uIZoi1#hnzbx2~7VK9GhDgNq0`5Aq@hPL51^B?61B<3νwOcI0Cl~CKvjngQi<$nUOR9x%;BHDRAu(W zU1VjL91H&=z&qe&O+w&FyRgDpdF#A=+{&Apu=3j?@=N}Az?VG%6*~^(KU=CKn>=N2 ztAH~n6Dmx_>duHMRMQ85bxq&!9LV6hiJ&lXt%OBW=9ZU~)9}wk$*)voWqI8-v*E(9D_oOJDcl}f!|n;<&aoapUXW$! z(?KCry!r~y0^`Rn$~ zgyhQ;q7eHs z!K%(ZSkpTEoMU`-c=xGfY4jw;x{;|=ZoTm1^^IogcFoK-;EG}lX-K9PYBNcJ8)oqeQkn zLbkt?#a+e}cNufY=~Thq)p!o^osM;ux=`U^w0AnYQ$txsyR#fIM|xLe;?+q7QaLgT zDUw=wB|`g1H+fja6;PJ?iZ{|-fdIZw(+I;;wfOepNH26(@lAM2c=sWs#4~$NgrJ6x ze%6Pq3?Kd7G%LGnR;KE(o5fPb6iXR%h!;UY!M5lal;ygOh{K-EAwPuV;O@YVExOb) z;TIJF2an<9>4;CXDFWsp4qhfC?lPmydZVoUMZsBFc1R;^rNw$P$ZCsK$s#Asbo|W4 zI;`DAS=qEedEGCR2=0p3ssYZJ;um8Mu^w0own@im>4&bpfTj3!u#AOLLNQ8EFPX|Z z>>q(gGtJ)G9Qmf*oE%9Z(%3{^d68tF2twk($Xg)9G8a`nXiBJhDEsayc24{*=aMb_ zvg`gONG!H>xyeHfa8D9lzR=EvX7o9`yl+@VSqFAGTW6~95W1XodPH~q0I*GUJ!7it z8B<-aVC;GYgSFN!#j@a{%r?q~Vq;Il;u~xGBbApNZwSfIPWqmei?s?2H`dMp&T%$| zlO}1fp^ur?CKzKawA!M^8%6RU$;|mWri?Vgpks2|#njA(1IQvTyJ#%}bb_s=CJ!~? zeMz*`k}PEiBsRvVOYQ~HFkM2i8ib#@SU$xnTobmtITUFGCU8sj%CslnP#^?RGw$i?n zb|GjKw2*HlSoh#~$REzTk2UW;)x3jMFL{@1@s2UYJH{N8N}*ujyNt=%KSxT{Mu0H; zbHP~v?B>n>bCDZw8@FsjlH{ysX8(bB7n#1~ESHtVkI1P1BqZ-(WDgse%A8L(6cMtl zK@c=F01Fv)Woy2S1yHGa#uQ%|bBNo4s9<;NSmZ3P3AH%jn_?AT;r~L6`g(?pQRb^; zj4e*a}9$R}+T<$5~Oc-iNe;UGEA#sZUvU3gR+7R+`BojAOT zw@dNSkD#j(pS?*m)^n6!D2yXr^ehuZDK&6*sx{Lnlt;SiJeae(5+6=d%l;#D3XZC| zXS@9-iNblLPQrn3x8GC2BvR*CBlT)Yow7sftZ^iDjz3aoij8_Yl1QCNVbnvb5spN2 zk#Foy&UqZayeiP03@Z_mpKjf~)C;P68B^WMm_y9Rzk;2jV-A7t?Uk^5*#utp?o9;= z`&1a-z4>UHz9LjNyO$n7c>bJtj|ASlkC#pbn%2R)>kb}`GVmn0p=WjV7{GCo$~oUk zVW&}FD3M6R9eXzyavj2b6sKx1FlHZK3Wq zs&3V7jHzy8%pr>LuV7_5CcCXu!fxYS!OPxl*8z5Pf>Aj>LARMBc®R?{}G%L^4tmNFMSjm`TC1c6~r(oMqu!3O(G>?`4 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 diff --git a/sci_gateway/cpp/Release/sci_ipoptfminbnd.obj b/sci_gateway/cpp/Release/sci_ipoptfminbnd.obj deleted file mode 100644 index 7c1cb3c863945ec0a9d770e4b543cc42ff05f331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596247 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²XQ29F9jjg&izn8>SNpEmwZm#YVS5p<2X|l6>)5;PC-TC zbe{gzJViwuo2pAtQD#ydv%?$T_NjUm6>)5;xfa!-tDZrH)486ksE7k9!#;<3RMhLW zCHF4&sjgO3#If_5C#bYFu5@mE%%{3XQ4z+%hkDXbFF;sE8wBFDr=SG$=^@ zHkzuz$;STRVQMJP4IYlj-SF^kq}IpihvfhJmzJT@@XGY?1p?>K_|+cX?Roet#kt#) zXIa_2dIX=n`HTN6r#0LW&g*c2^D2I65gt9>)hflg$II({FRunjZPwg{psbH^49Mf4 zTb_!jxr>leAERD6uZ7;#)r#{%k(bFCt^g`sUf;O>`%oxou_Xd$+nCRJvB&u##d)#d z><(lGQiE%O&m*YCQo!nCj0<4p+_lY1e+lQcOyGPJ2)cBZdU?I7@>(i51JT)yMXe6o zV#@)ok9|O;&3vK#zHnYg2pkHdEw)T#Xco)eurPp z8S{;}5qC0^$v#eao4X9bQ~cltffF^uwf^oKYf z3#iZe^pooz4s%{9aK^-ZJ0I(Do~}3_8{(W3RJv9c?tOi~Fy{e*^B8`$4RYSqkm8(^ zoQ+zU7gRm?Wxqrox>lYJD%MKk*xp+Jq+G4MLghsqP#LvyP*ClPU#Raqbo7Z|m0IA& z`Ie$0j-A(WfcUl2?zj9eouU-|{y_MI6a# zo9zT!{4^-Y-UcKaI|6FzJT)esF&j9@-DuxSK&n~rhB<#);OuB{KHlT(D$d7;IG<1h=Mx3aE(YflJkDQMoKFaGKFQ+z$SHq9 zQ%Mgn?fe;mWA-;r@;LuqaXu-;d7Z`ikmK%uAU=@Pu7)lzpXzEwMI4*z0zvgr0Y?wyo)>@XQ+-QO5l80#xPtht%*zHO z8@ml^YDqz)j<*dQnL3*pilaf{9~XjL7lJ$-f@}yucK%q9b4LhroCPsky$eBHAKM+j zl(T!kn=Y4EX3V@u;5^M={PVcb^WNVn&KC;rW!jr%^ST(RvV|qy_{U~n70&BR0*7&f zJ!T#kdwGqgm;yo@np#`}s2`CoTE^#4)W_7~Qh{T(R+o63XDQB?$U11W-Ioa}H8^x$ z{K3h$hdIM!$lYwMF7r5_rZ`^~;(Udmg8PVL-1!3#I4JX#0>|Whg~$0R#rcX5XP6c8 z=(0+m{O3c$oUax*ui#flxU0OYtr;e9TovMc4WM#F&-6#mS@%|$^OptA8~D|nuko(- zQJk*{alTeiRkrhW0>`w*wI1g##rfJ0=j#R4w)mxWhv#2&Vp!%I1kTKu{I(W1&h;MW zixubV1?LI#x+gQ8l9Kb54j?Tygm*70DqidO!)wR+3jX0O;@WYh@BJV;Xq1e{mJQ-0 zaBL4>j|8mdf?o*foO0gfKMHGs4n1(T2ZFZzdhcp_0}^qp7h0Hg2c1z+9V}9zQ}YoI zg*kss;2dLczR}~{+aO7A3~|0mP*t}4*9DGg`I|h>w<^vz3C^bF$=SBNgaGWkrKosq zTmBn>$gvF5u68d+M@CzI&pilp9OBrPzZnoewnX=KZV@Be}panErG*$sLS-5-qoPu{LK*OTWjEao4_&a>8&2;Zz|5WhBzbq!5WoizC+-= zieD}B?cUYviu3Iu&Ue0LGMi9{TChB)61XnpK({F3UA&z%0Du$}J_ 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 diff --git a/sci_gateway/cpp/Release/sci_ipoptfmincon.obj b/sci_gateway/cpp/Release/sci_ipoptfmincon.obj deleted file mode 100644 index eca2fb8fc4894539a5c0ba0c70542539affca341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599135 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 diff --git a/sci_gateway/cpp/Release/sci_ipoptfminunc.obj b/sci_gateway/cpp/Release/sci_ipoptfminunc.obj deleted file mode 100644 index e8a4da86b8b907e2e3c03d9cef80fcbf1e6f537f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596475 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

      wT#u~@CbYbo)W8<*LF866#oBj;wU?1I; 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 M02e&=@z{I!03>iMmjD0& diff --git a/sci_gateway/cpp/Release/sci_minconNLP.obj b/sci_gateway/cpp/Release/sci_minconNLP.obj deleted file mode 100644 index 53ebb8fa8716cf99b884bcc5fe41fec9cbde2f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281852 zcmd2^2Ygh;*1wxX2%%)7frlD3U{tz+AVMf6q(C$TNJ7)dvdM19;wBq5n-CN+3aGdS zc|Ppr*?TX~?xR?+D>hK0*ijL|ik0vGpR#?Eg{bel`Q4nkXU?2CbLPyMGjq!pn=UuT zeKdAXfjPl=+GL1hn9Xgk@-*4ym0?_fL`GkIrC^fT7-q9qHqOr|(>e1zhH*dW4rrB_ zE&w@(dEzj)&FZmgD#KtkQx%QI=9tYnk?5wyK$id})5GX8!}yVIMvQcGVx&7cMmlSZ zboLnO95K?>#z?m?M!Lor=@!RGcY2I;XU0gkB1XEEG19fhNcYbe=`MjFIlv80qeek?!6Y=^l)c?vWVjo`{idU5s>3$4K{FjC3!>NcUQdbZ^E;w2}3P_d|?yKgUS-dyI6ZReGkBFvlEue%mibx^6Mj^^B1& zB}Tg5G146vBi$h}()Ejx?uZ!a2F6G?G)B7NG146qBi)!7>BdK*t88cpw6?^+3zcp$ zGS?3C*qagZ`Hrqg<$~X2#glPfx_R2X&^U2B@TH)cz`zp6emD{Tg~f@iw;nXjiY`vj zX}iyG<5C={_wkSHvhjFx4#+`nCX5c>t&3D0cDxUPyQSRSC z6So=(9Ex8UT^jOwfM$TA^R**He}{o?9B57opo^rxZJ=|3X4XHEz!8sA=r4pH`=b#w zOB7wS{&*2|XM?8nLL_kb`XhwjbmT1u&6|pj@qHxu`l6zge;LNWHRKk+FJv7s4S6Sl z=5|HLe#|lFgz1m?hKmg29GpCS`U~k_E>W%k&Hak5z5aayG%p3yh1J^={N4u5CyGw$ zIo$r(zi}5E#-TWQ_~aAq_1g>SMu4UylrE$l2ZF8=G^Z)L_S&%mG#3Tag|(v_`28C+ zw}sXxigPd%g~Ik6zg^zwL^qJ$^mFZx`r(zp8zHw6~+L)|@1a)E{fW zZv^O``FH#L*dMzUjpiDO-}m76JLq;@+de<8rw_kQbCNI;zum|>3Ur5EFKODdm+6W| zbB)9=6Y|Xj-Pt#^&#xNU4}<2=8zmizMf6uYkud-?eQ%a@950dl=`WyjgT{HQq+|a? zlJ8Osu=7CE{|-s#Yj24E-T&e$EiONbMMccKigo z!|#@|_}US|?;z-9254OONV+6|NcV z=8q8hPK10fgKofsvMl*WlJ6SGcN=Jqe^}D_+8ZKYcVsV7G?Fs1e4KyJi9{D7-$2y6 z3Um)WD!E0IFB1kg<}vu)Cna4p`Dia!C>lwrENB_56jRk(80! z`wiN=6LcSJl2l+HvEBh_Z`ar1d*70DzIsF2!SYr`BPk>E+l)**=*GX@F+Z20X^-D~ z$ZP=JR5HfVo_uF28c7*hKJr@uI_nlm)gHfpDVmP>T>`p>cRJ>GqoV1E->slq@ovZb z9#S;z@!N{b$3S-l8;+yB_P(TOBxPj%ZAIp5pu4wCQbprOJN;PENXqE^z69O#@3+s- zj_lt+WBowVk$-JTHal(Lz5rR5>Wsm1vvxl;bIBFfIT0IU|-B6Fq<*aly53RK}c$qi%kBo~yRr;k3Jr%C6&6jH*Spzq>g`m6KIYbGzod zt+nZe5T>ERFYZi7L!;H1Ugl}EIb7+(GlykX%*?B(bktQ;IfoU@E-~1zl<>E6AHsT3{)e3agk_T9B7pUcfBNl-v^v3X5PP zc@~tfb2(k}UFk!MC{yXwNu{|#{Xcc~vgAJqFn{xwYP5fhjqym3vXB%Ib9P zeJNL?r@ql+Y4Eu1*4n+OZ9&uCP&-|aP7SxcsKmCo&RXlJvN#=er|d>{Ie#$tA+sr4KE1{jVGn>bCvw>c&u( zfj*Z1p&6tE)7}{`E6Thh^plR9ikReduhX!ChqpPmGu{je1+<-#xGSrs<}t;hCAkC;<+} z4rNChn3ubzWN~lNaNC{MX1h&b;tt_P?(vp_($cA=#{QroCIOgPxuqpVC6kO~;JN`9 z2i%n0q7tL8LZkyxoLg3I;k-6!YUv!Kx6vcT!y3ds);R* z+IownzA3lfk>_a^mHzS%iY7g`K)iN1Bx^Aldy-3BLR5(`12M(AxY8~fByommPx2gl zgOLJRZ$UBaLb`IRs_fY5@2OBGqttG-8NJkHoH5Jo@Yn@kmWUVG5=Rw0(i_pHVVOCx zsJzTL00@6YWw{pCMdkTL1QJsA_TeZca8l4zpru%XOi9KbBGzO8D}>YH#}OlCAx9~n zB9iDnK=%<1wb|=j?plkrvcX>GG5(?OCPU%t-FA_25Hb!F1>CO2Ivbq*BCFeGIo0lV z83(F7lcDo0b#^NXdW?gO#FRTw%wj1mFE5&ipfJyAZD`1KyRD0jgOK?tGxMyTsv1TY z<%{d>GH)pI)*vs#(h#X^h6OiQ+}4SUJ@y96@KHtv$jiw}Q8Q?C+CBEEl?(8&PBG?N zkIQWw396lfDJ#miH&nSD^~ea~Hu4ylY+}kY2vCJR+8uS(E=B~6RUUMIV#))sLWU#- zZnrTW*LP%KG3T*mXIpZeECGg=O0;xbQN63)lbu~w3&%Fia)!gdN;QSgm@D43n?wj(sP#ZbipRB@cH!ZH(TM7x@-&W?%>5xUrm#y}73 zm|xK`qG+YV=HMe%Sc_Pl77Q}CP^rf{-#8j{?_)_L=o;&+?!}hs#yUYd&gN=_1r2Ge zYjDi3v)j@UicT<&LxDdI){LzUh@PZ}sBEkrw+Ke(ws@q#GVQiHJPkU7Jw#Jj3O6Wf zblU6Ydul9pw;RTEAabtLIqt?fMolW~AIOS_I}(MeJg~KKWIw@3L&gPKeoK*V8m(pc z2xBsGN2IG_y4~Xh6Gt7xQjN1f7emN#h{b|tjv6U0(g#U!1)KVt6it#VhM<*+Kuo??) zk41Ua2G3%r-8ckQ)29aHO9v{m#~>S1hs?H=dE8hHivbv9xBfm;Xlg14MJMQv*{h=P zViTJ^i;aHZ(50`coU1=+hr;wNRW6%-g7EF%!50eg{bEQ2pGobQnlq z( zDfqaH4$Yikl%wvabe~9jhB>2Sw9km{OhWyls!&e@O}MWqG%2~d)F=_7T;Q3qV9w(h z7K%eZ)4g5MZ|@8GtiJ#ZTK9=Tkfo=B&2Bh~`Sv>DYG5XHE@9vMYx@opAK_PG3RH?{xUHfi0c{=l^1GpUZd z96iKwG+yf<#1jkSo?sjXlAkn*+JFf3^v2;J7^Mk9c&G_LPE^D(O+V5F0}HOk=id2l^T`4D1m<}CTPE-GA% zQpf~kbn%;km^AcwP@^XLFoVwbNBOICgDq1VJr0kUt)C03%%{2OAWzi&tQ8-1+SLN+ zHmU0X4}$rZQN#2;%4F#+tC~D=PN31pn+&6_(dn%BU_cwAf!U#}S5u^JZTmfwf|57G z5n3i<=f%P>LsWc|&o>G@I-HSf7KjfI_Aw5Z^d#ZR)cz$Cg*Irdg$zBdfZ$GLO#jni zs^zfNdWL5K(T`1Yv*fwzJXQz%g{9u@YF;d+lV`P^VToaP!yFbV8=eTZSLiMc?xP4J zW(dQVkbe^lJ9ylnb<-r`*}o!|Wn5T;#e;H9Hmp>t?ATv-)fs(|#Wl5M8a6c${8<{T z)pks_jH5E54Dd?y?F3^GD27C#@O6L;lthp@ErOb1TlP$>@DfuBwVJV$jEGFevs00A zg6=sTGx${9jwOapY}$CZxOwj&pCSTdzjnB(S#9?|6bzcxzSt)QL9-g;vsbjy`D|GY z_z4E*heP$iRZ(q_U)8Q6Z2HzL&{l@nOSIPgagwGGE1tpHXv6b;p_H!x$N4|>Y^l4E z%QnBx{cLnsWus7r_P8+?(vcz~y^$T6rqfk7e}XXzr1xvf3~?tuD<)~kOib(NxDkr1 z4;nk!*}>Ps(I2YCv6M8{a)l&)FNdE)Pmz`)S3~7EF%fb2*~0N?V42;13KpYc7Pm&E zm|AbI!+i?77{hZTlAt0FZjK2iCq<+vto2kot@9hiOg|?gNq%E(?P7}^R%ncbxL-xl zB9)gOaV0zirS1!vl0w&D!bF5hxGelyul#h-UuSa&H#P&A!?ew6YY}m@KQ{7P8&g4X zYczksIOQ%q+#pij2wugwN&L zGlWX2@#$QFFv#Nusu*Do7pH`(>}-_~Q}c;hMv5PlF7nPeGnl<(_6H^9g@8xk1 z$B-&z_G)mU|6lSPi?qd<|URTgMqJ};u?Lb6KN zgdyF}axzq#qbtM05h0115c{L-aZ$?3AvVFFAh}U!0>+|TERWTM!YxTl;G`^!^f9ep z(Z9ZSNXL01s!7mO4Vqz@Z}$W*KlX9{LDy477YD{GR&LH>2X~Q0?stjqYS!Wf#BG!v z+g1#AKhfDjdaWHUeqPo)1fjd5QvHkTMF~_-rigkI9!`_6zA88v4~p`fve&M z$EkKPicZu$H_lMf9uSe~+Hd)M8CWOTzDq zS%P!Z6~X(+dLJ_u1#p|?p?xmyi)*=?dP^tR1Vy*B{I~Sr&|?aL41IQ*R;BP%!bkDW z2luGd#B40Yb$6{b-<%N3E}Yh?+^yF8Z^Ww2xM-Vi+z08eB@5|f-;~2}bU+j$-{65 z8{!3zK=IQ;!)WaSgk-{BOaj>vAuCWcDp*gk=#j&Y8_tW+RBSWj#r=@T4k4a z!Fy|?k>rSkISi%p>iLd!X9Vm-5;##_p9cM*G5!aFb1eaWasvn_d-l^UBM+VG-opjZRQIGw=^cRMkS;AuRuLzxQH zy;>UVKuSV-r{_bl&`}}o@$ylD!;rrrLO#~kl7MmKjBtXYI=CIW-@@>`YOBN9=(da1 zOFuBz)YI#w~96T#nFb&TRmKWre7vziK(&ncqQWfACttoh@ zu(VvP_jd#m;Cb|t++s`a#Hq;T;{z}Hb7iaXgnRiM3!XSe`=?mSrWVgcMcg--?57l( z^?4uRHFL2AQqovki3hkj{r`XvT4n|$m?C~CRCFrJ9UW6^V97QTMuCXELYif$4sl1KgYxp{d7)5_WVmT6OqO3E#z z1-W^X(Q4kYPVx6qxUJ-t(D;0{@RqnGD}{foZ*`1|h7iw$i`CySk&gju|2JzP2N}tT95SM%3!&vKZA; z3vYE)Zp5*^JI$DK>*h1`7GV_jyA8_>glkzNJc8sbG|!SpRdJ?eq<1=)%g4{eV{4Ng zcoxZBRkPTya3RBW9m+6L*y0o)yNPi8f@J_FdZ5b%r;Zo;yg=HzSt8NiVM|>Uv<)g&J=RCGaj-s zg$oh_fmyIjw59Vp;xK%S2+Nw-MsO&vak~~3aa3^$$I*f{-nYq+3$ zwi(GDQ@*V4hA8Uh1k6oE)Lq{^SM!-90w>JukyRR5u z;~VK1M~xI$7qRKnrWBS4!qxIBUwEN>uzK=lrU~H4V|CERo$)Eo5xRr;IqpH})-4 zWb@>7I3Fd|bcnGore5QFsBm=;KCzAG>rGF*_|<~)pY|Koqx_GjTOL1k1!jARAL;(h zR{hGN<&zo?OWnWQBYcmK^ygYn9zDjf99tuolr+s^PjXBhJY{_v~E6ur4+!JVla@Bh7W+J=kq2@`>@`SPQO|Kpx> z>J6vPTQzL;g?AaoF9Pp4ao*QMUcTtl19!b;uX*d&iH0#Gp8UTu&T8E@fAE|ej29oT zy|veMcxXo84?psz%(%NQxus8A-NoKTch3WVf&a4KGasDQbnG8pzIUIT`O3tz4dW|; zANOnOH?79$SKOX^#jWE{%0v$j#*j9f95>Cop@;dYtDf$5e%+3|miG}?2>cA|xex7s z|Kg7;7r$@4f5n&oHH-%Zezy0$&D94@-r;%gsp-r59Wcf)eiZm~n)bi@#G?*+Zr;#s zXMf#m)YXP@EZ%W7o9aj1RQ2&2-oj(u7uK(;dtx(OzrcUEar4@(FKu|ev`hA&TPFQ` z8$P=u@c;e%+rfh_?s9F(p|^gWd;Rb>d|p7{$FA6O){<$T*KIgt!9b+UC94{ z+v0mab%WD(^yikUgDO7Hz$@bdzdm8@O}8w5c4qhFUO(M?{AbwHTPyJ9XGY(Ae9`uW zGY3C;)4xYubQIpvz&o*K)B6){-!FT9{#!*qPo3l`I&T?Xe--$5u63U^)>ih+5%161 zV1H@;PQz#s_?LVA^hlS($_~A+I`#8UKi}|-VQdumq&H6L@#-&gRzH9B(vy3Z-344C z-a$2+`W~M!V$M;mpU%opzF@|AUf6%3z^4v+bjkK%3#S%6`}hU9xz*So-6-(AX1)3R zg4A#Rd)E88r%zg)fp#T#BcBucU47nBBf3uC^dHBC|GhaGug6ap_z69iJdr(Q&*Kl9 zod^KV%)@%6!1%vprbXb60o>G{pKe%mv1(+|eYCp>ibczjYu z;1B%z(SAigZ_n+K^W;Yt@9FccVZ0^qEgAE24?6el^A21Uf8g1t&3n=?`rw-gW>dpe zU+s6rXP^DFsQAVIo_FXb*yb#OFW<4VxzCbqmwh{T#|KKFdbxPj+A`q(Jg^P$kG*<{UX`1hnQZ?wMl{DNv@ z#bcM_^Fadt;efPB_R&L*eefsm;+{XQ`Wmlx3;den&N4q}u1L@R^oi&1e&;i%VZ0~s z%b)BvIpL472WDOV^_p(yegF@dhHoyIP3!M%&4|DGh>Mm#p7?X(j0dOUvl{|$`=(FX z_-h~P_2T*)M@=g^?;3mk@5?H3Q>%{p{)o7L8OBzDUplk?U!U%t|4rNp zD=xe9x-$5He!a+l!ufNr&7FJRuPF@)Q-)mC2)$Ja{En9&dad&EjSDsm&K>ZFkP<{gv_S5srJ_HH?J!@3=d9zSRD0k`9`Ug!hp=hD`VZ42&tXV`uPwdF6o zIL9!!QD-*2a7x8*&$pc4>#jQQAx95!6u`~}e#r$@ad+Kt+S3L0tc%~+|En`FUN8pC zrrn<>eU+W?`CD-%Lu!8?JE91Iu)zO!;G3TwTy^Q4!!CPo;Ad;se1y+>3H*omJ^9A4 zesw3!y=?8kSG&zV4xerk_}@Q&W5IvAY=5Kal9NwPKJ-J_e=pd&*|ec=-gni zB*gS;Hf@}6)91}SW<0y8=bYZX8saZN04nfpCvJ64ziii5d%wXGo&S9NXT$hI;4ip6 z)xF`_mhz?E?H@YcD7y!KCY5}i8#LgwoAWPU-LLWZMc+J@3jgzpz@NHpNUx>8&mOVp zT=T*Y*WG>~KAQzwG@Ax2E_A$c>bTXtCZ&$;I(+6VH16`r>|uaS*mJ z&8FG*Wj1{`_r{-`Ki=@fzkeCIv8wS?;HL`wr^oz~boH&C?%zCcjFDP= z<0qJ}1^$OS&TO5Y^VoSU_uq1EWk1Ie7{3C);kor&Py1!rU4vdXUic+{;W-#z(4E=z z;c@rXkDT>f3SCZn$~=6$P#*4C79LpE&oIBc?3< zu%vPBypIN+`6Kv$EAa8FUg>x6z+NS%9scRJ^R7uozaNWjN3$vO&0*J^^7u0+I0yXp zk5|@ww*~W^z+eB`l|P+)$hlvi`9$laYyOpsxa9$Xk1xGr{1XdPW8RH(xjY({7(#{dUn%!#GRe zhkbbc&a>B!Ec|d;>D#~TnLZJpdJ_1t=|5M$dDy=)Hh=cb4bScRbshXI=0daS`*+@b z{*!}O>^Ua?-4o9E`DFO)iv)hB>#D1+e(#;*F26VTmE+9rpW)91e)dzhZoH~^)T0Zm z!!J8wHlM=mgPj?($-VYjZ-!}G-kVoGf8eT#|HL>wQQ*hla@*+Es|KDrWcGpg-21{! ztKkm?{^_PCrgXXb%CciVDfs-K&wlbx_(Orux#5jU$Cb_@xA%W>_#?Ti2BNgO=>Kk0(ac|+eA@yFKpR&2j* z)cf#l^9BCbjUN@}d~w!8woMP$Zy2=%o3G7MlklwriUlhz3t9;w&2q~I}6rc_pkE}W1_$>+tl;W18zP3o3AcS zzuj@y%HQy*4uSu9&}XluFZ{UTr6ZE>Y#!B85C7Jmd{!;2eaf_QPWF}OJ~n8_1rNc$ zl?eQdUWcEwexU1@YifVlG5y`6s`2S=fgg9t@n80;zwn@UM>{?`CME4r!{~`VHk%gR ze&AJuKfZk6J=gADIy~#VuMlqt{QduY{Lx9vrf+#{@$QCmZZb|WjDHFIk*D2p$@280 zE`8QnR({m#4`IuPB6cyG{(IS|hqj&c!{{e|bjEeN?#UPM86|-~VesRZ{#N_gYwK#e zEE%!kZKq+3!Wctbea4lus;<7O;RpLShdleufVqaTUf>5kdWmW15nbLorPVa|yk1vN zgWouk^kW}PIr*jaRj*tTw`AC5{o;Nyj7tT+|E+I+IOqIdE1Er*-2e6HV_{dH3;cl( z-g3eCDcSj!FBdOPzwwRN@F_=h<>8t5SCw6Xhq1+HE~>?6F63tyh8{EQ7<^eme~%&P z^9>bP(p8sQD7-u$mb8MEI^lg}{khoiVcs7KhJE?_*K<*iw~vb+kDW4}5$< zeWRpFe)OXu;G-W+zBkOF65b_@#37kC}9it);8#AkDnx&E0t#y_Ld~=|oV}li+RDm9y{J08XBmrX8hTQp! z#37gM|AmKQw5=(BAhpR7GPD(Hf&!lO*oU zpparj;t)}g2xD?+)jpOcFH5b}QxkJ}^}-XZH}D%p{Mc4Krk#k+KIT@SH)EC~SPQk* zsv6v-mZclT*T!&fqrq;kz{i2q*Ty7bD87mi^=o4>kf1R^UmN4Ky!BD%tRKdYse~DH z#P&xsCjHAqtpF}r@Z#Pb`-A0 zH~+$hbga@hBi`bZH~Y?@dXd{2!KcJ30Ee=}weR&yKhK+=oovGJeP15H1BA|< z;m{02;Nx=p-iX@TEL)vxQKy8!r!jD6ReptG-zAZLp;Lm$RYbT5d*xa<5%VKEoslHy zQv>^Mp=gh|N4n1({*;cvvuONq#Xbu`XTxT6MxoIrjadDSXhLTM5YO*+hQZ=!6K6!@ z3=Sj30#`(ce#87rqsb0FJy_wW_brr$)pRLF=g(kL z-yV~QS_z)#YsGs@ozVpz+2c1o!#q>0YOr^*1$aQ!f<0LI0#;`l(%haPv9>0d$N${d zsy91qkzH-9jS|n??sErY;VoX)+jj=y-N1dfF!X}OiqDaD$~g4*O|6}{(;?c?87a7j zf%W^otD<3%*qg5I+#Q?6_>NJ;`-rg`6vMJ8w<2R@QQMilpoY$^weiVgdnYzP82nhV z++W<_XsBpF@Lz??Iu|}pgk6A$dX4DFqfKudt(`G45o$^Xf2sdMqr&bVI9wcOk-b$! zB?QlAV%0h#QsZMSob@*}yyK;=)j3~9?2#hmScgcJc)x$&orNg=H|QhO5d1fhA}$bO zZ9YcnaCr}D-&FudwaESdV@d7dT{WeUzjR!7Y@WOm;ak1^k7WrOC;wwv#3LQLk78JI zMZbd_@W|2sxJ}rb#w&=`j)Bx{}yDSd=JODlg zS8Z){a^lP=&rBcYwwB>d@2Z;g@#z_MM}0bxbHzo2ycn527?*oRoSrcvOE4OlK2$K< z+tQhTVric+qyH3P!q@>ZQiwYoKReWk){e;hbBaTr5kek_^{2=a&d{fW5uMYiugS4g z0UD`i{+3xM^xQd-b!nf(o$U4K{Cr9tKI%_tZ@9$aH2@=Z?CY6*8@Z!(vpQMaC*hb* z_PLfPoT0DDV*=DXJlHS7C1OMkPv?Ldot`7SV7*U{^p1waKKG(}Wk7lq03&_8uh;%`hNwc$;l3{V8>;Xr+GhlYaX;SC zT#r`;x*HFvRFd&LQX2&BWtB=Ywjwp(M7mE@3NPB=TKJQLKpA0W>z>coqr z;zz!_0g?gBkrr(6?zMOc1wVu#k7)Th$ZjD?Gy=Z;kb|=YZ_APfZxR~B;Rr0k`U0=D z3^~BJ;7rHKL(@FVgt37lv##25VX?Vgw0*;rFmilTFsemkB zk~QG{70|IMZ;BNDiDTGtxido>og?&gr&;?ViGBR@{$O5<6D+>=6#hdjxHowhRu~a0_-cvEeN>noX+ba;aw6N2(D8eyyQ|TR|4el^mZ(&c@u!R#yp@Gt)`&i4 zGVyAhI@Flq*S9cE#7DR~9verYeCXIn*Bk*kHeT&69f8(xo*ENhh8p@M-LwZZJe=>OML$m=Eazu?&NR(-z3>Ymfc=6Rp2OJ344{!`1bkT-=pe*hzlxM5qMP@bLQalAZwjJdAMzlVKX3+kcA|Nh zMAbCz1d-wp@q7I^lHiEs^`%%;pkFMo5Jx2Xu7W@5lSE398f*q#PdhV|7K82R8B|y> zk&?3wQt}aN*QXo23=KCJTk%L2|K*IrBx!fy90lH!LdK&mLm7_qkH;X_iEs1b=jq(| zPCsvqd#pCA#~L;^QC=N-b_npKJ&f)tl){6v4&UnPp2Ch8i~7h{-p;k)*VGS04z(~& z<=}}E`+WSIj>@8mk5^gP^ba!^M$`9d+9h z)orJ%Zdkzy92N)AkMD+EEOaICSYa)nam*-Dk?C{=O}lB#4%s*l;@MyP8lymoiBh3#jo1(Bo|1t} zQq?vJiXrOKhL23TYwIxiK?snA02h;u(WgP@_qi$%J=mVvFs=figz@SDO2>4NK z*)uY4FG8dJm6{I#q*10SHFI$+)y$MsGgER?UE&gOEpcUDd|3+LFZAx3usvrjdw>_vp6f!CmUgv*- z{B9ywZcdhlH9o{*C=+Fzsc&47(19V3qf-#UX=l$BStKF=%i>Q1#RuvS^-3oK_(jjgfZ zM<7K&$Tl5=k`DfQ047WRT6`~KOp4y@Jqih4LuKONHI0nH_dJOb|3x3bn{>lfxx%AN z3-u3mwQy~OEiJLFH3V=hu7?2@0v-*>t-IlX^8iNxQg2y+R0KDcx*89wRCnWXl}a*d zki*>WhEt{F5?124gk>tpSglgs#TJpo!PF9$Z8w+A@H#UxX3p|1$;ilhciEnVdbx6R$?b(ACBHhVYFZTW)|QE_Tp+5no66dXhYz-`Fb4;uOpezTQvvf*7gyDj1U*8Dc3EiKNw z5LLgQ*VcFJ2ky_7Ey>6$B{c#FhCO8Smm;v37Bn_XPEObNYU;6-7>aQxNBx zv-Z4a?Ynskk-3dot)4fH!EJ4+hfWmbC#{6gWT1<;<(fhMz9jd&O=+@zY}-6$VNO#& z@2{=-DE+&4&XBf*?+V*eM^9|)yKHUZ*o8UnuO#J|g_%tUwkp^oh!P&()9{*1esg=GIy#{wWZosLJUy#d#R?LGQ zCK-^lw2$q`r*Y`~w_);KMXnqX+d}gDU?|8xER@94Xz~)1#s-lHLlsbV%Er}4e}Zv7i?LQ(Zl3@ZDndkV{;is zP>-zV=mq;O`!!+7@o%bxE0_0%hG)&rFI2Wn3&OdGt5F!_Qmq@un@=q7}9H!z9 zi}?0AdFk>miF~TpFw${O!Wo!<^k5*w@Roxu1q#j!8Ell9GMVP=-Kmyhaji$)sg@an0oP)3 zjB>XqJ&=LZT3cze3dYnNt5K+cpmR2I^g*34a-*EZ3c1jbAweTxPvFp(EkgjC0b%sw zn*Gb`6@aG!Qm0D***M-Ok^_J#IRKbSGTy*{iQ~YMxMkbRuSFpv>nTiF(`e~6Vxq5U zMHD)1feE+F^E1*(v5o%_c&=ERyyAHzy)zTH?3mS7k&#}CqC98fJQ3$y!SNBsI}1$J zD~mJAy@?BYO>ZsF$SD1v;4Wnp9im>Cgf-> z&gjeX<)yexlQ&&~8$EqNvJxw8#oESW+wwCqwrqRn3(lzdrwu@Xw9*B={DOOuYrtN& zB;l(rD3I26Faqle%iNQ)UcASoXv^1|4Vs+;Vs$ZS+%-t0(wT|pXu9ARH}QKr0>@Cu zE>i1}vWe6uzSK^n<^k75jNy|-E;s!bh!pGK*j|oP9|s|a2ThX)$2P|-X*pTZvBSCg z@~?+@GU%s-_zr$Z{zu3+sZgDKz7NUIqH)2pdGL-Cr+NHJPl`aOf0Rkc0C-u%v5OCm zIxW>=yiz!QNVeiC*8~&HPWcTXVQ&b;XIdfz>>kki1NLdCs~IhoTO}N*{3YaOU$Cxk zUC7N7&ajVzeJ<#*rGi#;Pq_ovF90>?}YRLvX53mvN zLcm7>*8si%croBhfR_Tk1Bht20{wZvfDJywO1d@PFK0}bYG6miaEr2i@n5<%-eC)NYZ)l155|TzTxhp; zG2G5Ua69ZPx}7JGKQ6@Wu*^ZoW2|<$&+V83b_j&q!6%Y!%J;AaeFXZRxb}QcFC)db zH`_-<>M7zjC%sP}_@DiePqFELkS{#Y0l=l=nsa;~LrFk~bBh|;d*yJrohn=cxRF;> zkE7jLdme|b>Kb|+Fmu}*=8Mf*?W&qH@koH$z@=NFZv+lMoz);5(+x2=Cb~4b$6S<^ zE-k=ST?3>(*nbRfIG4cnh~o~pkVBBV2XHjteSi}H9|SxR5N=9@Gfx7(j_VD8p8!4$ z_!;1{fc!-EbAUep!i}|HpU!~2w(wTutAPCg-vk^2_%`53z|Da9fN*odh4FzIxrfJ; z+{0rEqX*+&;u2I!xG<;^uLd<3)sxUc!wv1foYz7K>Az~c1%1ne|H^vTy9?|0RCpQl zn3GeJmwyP(ZH4BQSV(Nyv1M)Bm)t}^kdo{jha9+t^tR2@7bGEnK%lF;4Vj3uL>1n| zS*7%JG7b_{65kX3Y@nuQ?cr*0;iQMFhnJZb;Mp?3j-D-zo(*xCEjZGmBSVP{`ch}G zU&{~jYso7Z;KR3N`g~im_Yd$y!2v9oNj@kO=->9IZ_$oC;S2f~Xe4XXmK~d4liJwt z)DiS{*sU2b_~*8S09r8zDXPM#y_}&2k^*J*qQn)0mk#O%qwLwa1pM zwQVV53iF#Xyi0Sua|a~fy*vJwoVJ8t!87%};%9fiXKFieY+=58E0=V66TzN5#?H)f zKTSrNO=Gb83PzhHqmfPN-ldt|x!8h@$Y`W{D|w8andyGHZ8K!>gu3I@0C!CDmhKpf zRppLbkdp40vHVh~wTt2Pr9MYWI$@f;bizl0Mmpgvq@)w(&c1ZQbm(%s<}h?}bay-u zxlZt;594vz&|r7`D)@v(fhUP9-14{>F8H|us`XZ`vHgr7~od8M`{yR)`CrD<4aug`O2>W zivf26Rsn)niv#c{z~z957F%uvL}cIc6+i+YBS-{mEpezb5il7r36M`u@s8C9K&*vY zjst{45$+jzE%R{w55OuwgcmIyK;oCH>vI7Q#r4I2aP=+!2J8>`Uv<3!@Nite2FP}N z05}M68{lBTM6{duZh)8~T2cU+e*hq464L{pqLkAEQ*wG>D#_pyRpL@rD#@_gY<12m z|D@o#mZ}gzZN0ak2jW_8pP!zNr-!Gc!7=xR^G(GBk-p;H#(Ca?RII6&w}4yLk4UX* zLdtt`Vr%MEy!{8?W;`%L#H z`evUB8SaWUR(pFVLP)QigqCNt;6l$sZnU%s{A;SwhI-6987jga0Op*BxLDvkMhfQXeEL)mGotRmD(@1Yge%9I*&v_2)an}w&t;gIqp}MEzJz#Fj8~K^v=W#7Rq5{2!~AfE9mhh zp)*)|zzp_Z$W{Ygr5bM`H6N)i;<0%-gY5wBY=L87CR4xqQWoUMx$G3A}jN?dH8(mU%r0D)_$IjH0CNB*0v->@{0czakQaNl1%RjG8lI}bpz#?qzncE)# zk85#q%3Ypu4-(#jbnlEzOuUKQmCo@NjO5%qgqur<_=_>=aNB1b^2)JuTB46zMuzudEkmiY+YT3Y(1m;*K=z!u7t#LQf(_p6%E0@y4jn!>?!ktWVx#aAza)7fhi5#8cSZ$3Wk`qn*(O;Q-Q)vU%|4?(|yI-Sw&7p3HIG4bmnOE*D<2k4okip z;Q;!oB7R-&#I}TI(TnA66|e3F>DY}+KEyOP8p&K(!Dw8+ko8>F9;7FaDM?ITwVv%P z&d9+zPHY&CUh!P=xfcN2I^DGFmxLv=$qg*V;ocvroff|-ep74yZgc!E6v8{RzAa~G zTUv@p>|TbufE6i;;$rKvb?JMGGo}Htvn^*EaTO`M8(#vi$>2G9?7A}s$HQ0$L#+6< z{L95M6;CDnO42klOfIpgaXWCuEMlt2$jNO@XoF;i31-R`z#@~+FN8-|O&SgBoGqG# zfZ0&QF#5?^n^x>eK9~0jS|^!+s93f;A^H59aZN*OEq>nIn)*9AqfO&lQ!TCIEb)8z z2Zqz2*~x%8Lc_1)@s9XSxXefPChvy$J?pma7rzN{DJ!q{F0F6N-3gh;QO35ku>!Fh zh#Vkth?ra7W&*2eZE1%wotqfHyDjY?C@cO|s4Jf}Ha?6Nvqxt`yn1S2?AvFI^=?SM zdwu+~)Rgyw!SBSc&BNHvM=o^s0(3??=&dzX=qNXSJ=ryW07Z>n1|1~w8H?FtmqKM< z|FLI}_xy~<(csYdClj|S^oHtGu5~k|7D!C4JjEXeUFrklYT}@#z_^NJaOfJXEg)0>Z2OD9FUm` zF?<*wAM(dU>oJ5vSNbf&)n7T_RncRj8nMzRbA9}!@z6iiNCh&K+w^&NnW-_`*#e%lRL1b8c82_Rx55xjUi9|QIU{1ot5g`WiY z6|NaUeF-=Z@N2*(z;6IwR@Wb@>mSth?|>|K5Ojw+ThajGby|*A*V%wS;<_A=dizyf zGwk4XHX!Mz0R90;mw@QS0BLSr)E>WeD4CiE6>~Le*_QbLo;$Z~rn`Axb zeO5eY_|r$ptJnRsrTaz|7GcL3ukj-QD6GMgiAzpz%{9yC5np?3Cv0Z$me#4it@|P_ z7xP#u!kBb3#KA0qNud=fuNB2$8T;+8!VEz*ETrOJGZ9Iz{5Z3 zm^9MUnN@+O5_1wk5xTm6SKHDCi6rF3W0Er~guEG$ z7dIA=1q8&!?nL~nLf%1A-T`AjpuAhWg%xdSoAbtg(5}3hO5S-P@}{>Z?|>kA2YBn| z`Q=4Y$vZDZUbIZ;cV4i(cz9FEJ5S4tMrA_BPe-whag=$_%0k<+-xHS9`*l1ZK;|jJ zK3Xkis5hf^oK$ZY?;hwk!&_(b%ZudhWg8IBQN=bqG+J@MRuBykqT2kTK0~1xuZ;bj z;{NO{w6&$}o;3FNCEp_89fzDWOWWM$m8)7{fOAhi2@ln*&ouhs0_!8p;#+(vZqP~G zc#KM!!mtw0jNAaIk8hC6gL4xPJ~P6og|s|BMSdcn&VLLsfPTDtKj1$O$^QlUiRzgV zE-L6F0?VHOr`i=U1dpybxmFI$zYF>D{cySOax~g8G34ehWu}Z@0AB5jF^qtlyS`Vd z8eC3%ZPHaI!VT7=4-RH^kgSed6$?su>}r+WF63ELo_GU2R5e!SAp zex>@Z<+ERU_oWtXm#?pqdcN4IPgk@ms^EJw89?RY^uOQ3d6_Xq=zBBln2`5oIG>G% z-t-~*7(S9rhbVkpoY6x4#{+Uc!wt)pQGi_l>lL1D<@Md_nyWw3arH<1(}36sZ()p_ z1h@mR2VgqtAU*?-*WAD3brm4#82u982$&4W{RQlew_FW~IjIG6n!sZ&6W5>-*W6_% z9q%HM?g+r%fVqHu080Tem$kGg{Bm{usJdpnO1fth{tdu`alIK3H#S>nPlo`qXV;)^ z`79h$@>w{hl8l}BFLB?iRFdJ%t=XryhiXvMF(KAX!{dPtGp>zj-FUfSwlHWx7yd8Y zp!Gc*8jC(eJ*b5B&@y=RL+c6q0}_9@(#GXzsoZ5@O3uPeCGoi)L*njGDQd&HPue&I z96~?#5|cK#rL*@65qGsZ(#VlYBS$HX3{V>3{=gpn>H*2KvFVn~|N+Y9`MzFFFUKOh$ zr4gp2MwpTskvM8Z;=H-GebPuRIArgOjTFnLutVP$13P_0cCEqA9XS$j%z}RYs+o^OSE!bw7F(#<${^kzi#v#r?irzw1U}OXysv_ zR+y4nVM=O6;;0pg^Pbs)bVS84%n3Xg;_~3s!drXwI78ns)MXgLULR30^5>fH7%-#5 zy|$Q8a}o80Ovd?2F$I8>qfja437=w^l8RwUDn{a{7>WDSzB`5w;U$`)dfLVN*vl1C-Z z8zOdYC%=>z@N_yOFUFI-AguhV7*q1AVoYHlgSmzY0j*qJFzW7QB&wUmz?%7qI@A7? zn0fm2)5IHbpwT>XLBo^zgnTM7A%KU@52lGXx`1Ywkk>Eq0aD3`RHEis9-$@q2`@kziBY7zMTO<>d=*9RHh%xnkCbi>&_4lm*X z^5}v#5{A>DEsAD;BYyw5-sE5@!CO8K59-P`y7mVDIO@d=Iw|dpI%eaG1Ng9p&6qXP z5`<9VLr#;Bjmx+2dQHAhYaV2D5p+F4$J&z>JRnjzrUQZZ=?ipPUs`tVG78yYNP%<*D}I}xvt;Nj71yd0cctLEH?Ef|gub>EyQ)rs zPJP!i@RRSrr1b7)^!1guh^_MwoQ=QY6@nAoLU4*B>o6Gyfu{>UrD;Xs@u;^aaPeX& zTc&uL4a#9kW4#vqOjy3%na@hT`*s)Yw5M@o+#$%*M}q44NOl_5x6q^hZ0aCmzX&#O zaoQYB7LPGQC1C8Rw?A~*6S@IIei*fJ{Q_i5G$QlUW0w4Q za?FZ-MvU3RQ9hb%e&J*a()naNKq$m78?O^XWIHlIHZx?4#81n{@;oWq5u#k2F#wR` zy&iZy-UkuaLOSWo2IHEx$#R7BLqmWI%-6n-w9FqCl21I#>-*h5_?MPL2A+B`UQL3z#=~!Ira$4rmzy;>BJY^y+WzG)CCq6KL9Ihus_p6n7 z1Ht#xw8qS!OXa4dKb-(R^s}R)^9tbOOZs?pp=U8>2;ZDbUM*6WIY?`LEO#r!@Bi2;&mZT`tJfj9;6dC06L~815aLBcSX2nzl8IMGmiK1kp7so;dCaWSkZ;& zp&pgjAHJIQF$vd%Cnz{Y!4g2-Cdx-%(}44}3EI$Y3abbFbUoxjeQCYWM#-ZLXZIjF z*(TS~^&lkx6`;9X<`06!@w6^6&;AupYG>w#rFIBCm^0C|Mx`E4^i z&#ynmytMOX@S#o?D|jkkSUKbe+B@Z-jHEjqX`fuM_o#9O@DTi=&%kop-dBa$d%STP z>hLR+{;aF91UO;qQp>{5mjV}R=Vt&Hi?3<{9gk?X%)X{ApQ-510t~R_sC^x-%fLR6 z>m|S4`sd1CMtpD1xBVegGIlbKj~*8Y)wtc(#TLGT=(N|(_tYq}3&AQ2q}`tb-qP+( zBCYLjCGdgvcOI^F8(8LCoU}hLAdm1ozpZFrdOm1rW37N;^uPz&7VFTqwHj$(ov^K_ zbq4Sd{9#*x<+N?xq-=|Jr+w)vq$4U&%$r?J7a(8SS%@x$&y6?z6ZxSwcOh`G*xbKB z$0M4}vCq50=GG{>ivR;{E>t4nMy(;(fIertlUktf0Nd&f+iE9%wG=d0+3R_a)xt-G zW(Hpe@V<<^g&#GUnb!7n1=4}`bS18}4Uq0~oV2H_0C{M?N8c2Q?%#?oJkM`O!nc9f z)u5%_U8CT&fMMm3A83D+N!#BINc&_&ivsHo&C~J=n+MMuRh>5ha=cLwI+mnNLzo2HwIL;C{h%pbhR!u^uvtu$9kF#JK2g+{V1TMz+z;)153IvS&aW?t!s#7xMIxXvp0npKR^eaJXFr_qXmdVXv?S z-QWJ0Kk05-TMoh=z<#KEA#9B6=wpF@ z5@$WGSufXt{B@xJ0#_KZUYLyCYV%j6E02ul{s-${r|O^B4$s=kDmEvWVGz>ao(+oM zAdCs_^Q^};-hOon4zOe5o&qkxPz->h9^+XUk|&>b034;F{3vauRlTLNm`y#V?^JA4t>?5lpF1t#MqTr>7!n<*1U z7#+UQ0s9kUunON@64%Vfny}K^V8^(P7wi5WhNYSxM%35XcdB;agNXV%73FKJZc66k z*%v$-tMT1grEBs{Gc2Ck`fBwlmHqeCB6wucA(rS_HF%L#60oUsY{ zTt9NpOV3en5Z5B`VjuWT!6VVkJ|fjy5z1^HE>-LScY`EjF#zR;HZPZy|PbVv(Jz*kGQWAf=OUwLo6q)PM5UsCYK|`5!U(u%6SDZU^pGtd3 zFn%X3+Qu@vZS|nlZ40zrQ;Nh#_Q7Foqwd36lpoLs$h&)JK4=2-dxqrahLleZ$!Gfl%cme; z%a)_^2-$N71e7IC%f>X@)jKpF*uZxGBP2gZ$(F<7D1Tr`zLrhrAB=o0Td3X+2`J0F z;QTn_u#kK$JLy<=ztDVO1NCxvNPehZj|j=vvTOcFA-|n9GTsjrzcAx;)Y3gjvz&Qc zMle1{Tc#Xq90LQvS0CCoOQNsEgZcU0P&MKM;^Hgn!-|4U5QjDWJRiDp2Mys(Puzl&MZ+L|IV%MYc!r_W6 z46KJ$WJRbac0Kyq6}3X``L*9aCPIC&w+o-mjAR~@gZqo)>evYN>_fYvR9K`cl=i{7 zXiS9qVsDqzRX0CU!;TNChxcE{MyO{W+7+$B69Vm{Kk6GFp}yFChlRhgF=}L_rdfj9 z##r{a2zAYjc})9kvAs%z+IKkW%#BcI?EO~lbXg->!Uu1ogBGlJTT!q_rbsqev5q?yHORr2U@j@`F3dV9p z;2pT%#Ovd62JSa$Iu+-Mc&QjP)Cc!F{AEnW6ySMqt<2{~PQbNgsvEx$QpXz|yf0{! z5LdRyS}!o)?qXZGR-UTLvb@QVdom%CM{P@c`Y6KhrSRDjpE`mON*nV2`gF(;s1IJ3 z;_MEIxCg_7aX;IvW9V|0X_0u+Yy3>&mrFg(K$>~8a0cr3NTsJT;4Qf}S3TCw)X{8S zPqKUP;U;l!R_kaE@cPg?3T_Tm6pZk-uRR_4^<3|EH7^d*v%mz{%t??zw~PJH>k6FR z(TO_tX=nWvVvWN`1XV_p9X`S*Gj%-|ytPg(thWY0s8tQ6L3)6CqNjxaexC`IaZLJ9 z|K}kt!2faYs}VS0r!1CcA?{N)kuGHan&YY)_OBNSdX}O6h1!;CMyTTt8dq^<)=9gG zq)**lsK7LLIvQT5zrFBi&M*w81k0d4%WrZAIJQ zS)ip2E(4@|k|B7lm0xDp>6V8Ws}QMHrR*5iNObPUN{?hp*DFAa7)7qNcxrJ6)>-m){^IR z>v@Gdy~G8~HN>5-aP@WeWMymsis=CkHVeWv@}*Jmxl2E{s4+vbI+Q`)b|oQ}#hevQJnbH7vE$7f72 zuF2)FiJ;Mk%9$N7zg$dSYFyA}bsd)m)J+z)VUP9vxdcpJyuJ){un+vsmd1X&OP3KJs1UzuX^3Zx z{ta4R%at;yH@pK7cMbCNp<V-Ku z7T=nM@x~31TldF}NVET{qsJSKbyoLc3%>I%KK>q7%Mf3+VxfzT=HLRTTrYJo#)ql? zIUH@ay60m%3in0%o2(dv>;tZY<(GsdmU6}6eb`&VbsbzyC*`7ED3jL9ZKyBMPH)FG z`-bvSe>dS|%zOtRk3zJI&!^oiu4P-u&vJriF?}1`#%ffAlHT5oixj<68GS^|Tfz z`~4X}9@;0Y6W7uQkY7hW;aSiJ+6McOK4GKcOWuLD(S9Gs34gEcf_{zZcAnW3KEl5% zC9J}?7e$@C2p-xdULwD}vI)VtLyMTA4I*I9$U(dJ#wK13*H?&5?7b{(KjqNv--J2> zZQ^xYYnz~+UdBnAcmt4!wux87wX}&G;5)L3H$fk06YM|Q#9N9lc?a4=^!|%8Q|4G~ zAYcR*i}?<MF!Qais}1_WNHXQ7s8-!6!#d`h z{aVL(;>*=>GhjZWk%#_>_1(le0Xz{u&UsBh$P2Rk8e{^vjBm2=`T4I3PFw&?SyRgR zf!Dbu>d3u3s^fa#XIWD(;)6{lEyVMF2JDXK5MU4M!HW*9p0ME5L)-=a9D>Q=90Krp zJ2J)Gs7B__#Uu@Pw068|s117+PTDI6w~nX2HWA%6#O&`;M;$w_dh|gj9Ep0g`px+N zQNIB<5i>p)Va1Tw_)4jI@G49io#=yc6pG(x#Qlw_O`)cB?*03fFbBbPUB2_f`6${~ z^`LH~72c_}7dzg3N(&{tP>vYj)0$du=+pIy-B4NupgS)Q|h1b%vJk z`be*A-gX1v2Wk>s^0r~hn^C+>q-E!LiJK1IoF$5knRW0R0UzoptdSD-7{v2yU4YPL zj$X}-8XWe1AH5oro8g@fte_$u_I@AK4Tbcb4wh-X_fa?YwEP(n^phK7E_xHM1NGqE z@$uN(`26IJqx)s9i1?)gj{C+p8nn8om~oB+QQmiru46DGO~N>>v5s4rG*Z0x- z`VQ1q)CLA?)l}15&8FD#mvrd6WAUw~&s5>#%#V!2pIFyCJ zOuyX$m#3GwS7$Q(c!|8lv?^{7;nRGOkGhr1ZE~*>ek~*AFUn5bYlWBjVBKlG>;pXO zMc+HvSJJGXZnJxx$WlFRoMPHd?)6#PKL6$Uskr@xuP7roHuN%>W|6PrT1Cd$a_-10 z0CUW_t%N&DxU+<_CEQKIITG$E;a(E%E#X`V_ml7d2@jO;AcWesSgtxorae;Md7!6l z2emLCFt0M2+Cv#l^I1mIwyS5a93r|MD&b)g9*(dWKWoorG;M2TG;J$oG_}7XEwhh< zrOu8J{f?CIC<#^nqXj-jLYp5gZv$+zxo{Np|-sl?$ffaB<>91 z)jCm~^L!QeM&VPPnZDH_-)69{Mfg<*@~ThG^CqsNM7H&ldHyEXDg5dWDVx4Vbt>9# zvs+f8591Vh6L+TY9xt|V3SipkX%e0;VO7F53EL&CNw`$PE(w<-WP16s&DydpE9Rw4 zw_eELr8e9nvQ>vZz*;V>OZzLzYj$Ueyf}`v$9(x?2VI>w)LHE;jx#KA)P7X2a+_#! zE9<0D-!7Wn>N;tZ*E7yQiPBK}X_Sw*L}_T8dii*3oirNd;~a^j?}Td_jct5_ds`jd z>gE4@;XhUEd;l=*d`Q9-60VZ)Yzf~i;Tj1?Bs^Eb^CY|gVLX<(h&Y+Eq7Bd&y&d5+ z%suJcQn8I>H1+!zBMx=F1YsGDGPZ0We+!}cv9w8BWnC`vuQ2j0PRG%9{J?r*x>wqC zF@CrTFfYbo`(PaMT`hcG2g9d2ybE;Z@fw6>ILaVB_2Q%Wv6;wFM8d8uq^*t)}+m;ql5Y&&IxJTB7a`z zCU+Ck;HAFN@@rk^<21WlB#!!W)^|B?;%*b(V%piWfaX_mh&|r=oN}{Xb6kvy$GuQM#Y| zAE)~TN$jenY~CBzzbleL;6|Ypnm)V z;AQ;pBeZ$*V*%i8U&3{WOjfoI@#usmzZbIN(=}_EN3ZtpfpI>bG|ZIqB@e$}n`Mt# zavUy$V=6#rUjA=eL)Z*D>Wr!G_vKhAKi3%a=Qt*wdDS=^|AaUN4(vzY&>al=OI_IK z*{Ta5N7svaCiR9mVdhxi+6MVvd)WJa0^mWs#wcqO?nJ;i1MVg5_t1Pc!Op@NC1E9q z^~!oqS5^ah?FLw9S_FJAKBdjLJhN*tVAXxs{i*9DcM{|F_t$zm2;&=hfV+AJYXf-S zka79}V_5J;3!34=%%dpzV6TIrG`y*B?;6{1W#*;5rBR;$@Kge!xD8 z=*M>MxAcfUggbEXnCkyQz;e8z&o5!W)Ftr=_q465Dvr9}2ppEaxFD9sX>aRqYwrsC z<5>TxSzysE~teEoUB_W;H>(R?}6#ysH}lRIZdsIe#1Y>OAbo@=Y+Fs-8R(A^UVxKyI+)fp_dUW3vAQbs#|g_>$E=qh5XM`1)RppnNcd#buJ8wV zpiSV)k4TT+apE4N8{OW?k3rK*)*xT1x4?Ro6*11W8sy==`s+~K`nI26PqRtrStZ4V zOFc^|-pQu;hMU={Cq=v2^xTu&ZW16%_OtyI<*MrnKf^tr#h-c!``JX{b;;qlH@1yC z-)3*y&GqZ<<*G3*<62ob7;BvM1RK+RZcn0a#In9z)VF=R<0hAZbnK))Om^3r2(a(i;lKl$eQ*ul zF)WH_>q)WMnR2ZAXOIuA`#<2`*8LxuN92_}IOSCy>R~o zUv6&(cPEZoJLB6CH(K54p14WTo;a)LzyB}L^X$fZ`Bw3fx zm)3cy>!kZS?>*BJdntJtefycFGXA{DIN_Q4brVk-h36YJ)O^|gZ*!SXYn}7T{+Q#w zi$}7tzy!QRt9UzpAm1d=IDVMO7j1FrJZl1&KOIA4yosA4yp)-Z11c@_H#$C84?JNU z5cb(k1I*w0_!VU~xeb7~=_`Mc7f%AhtLsJ_6Vvb3lRYDnt^8%OHxk}>yt4`LQ%AD$ z*%WYjdWqXCli~M>k++x@zH=vhnh)|(w{p2nZY$x}I#T|k?8I#&yvzsdPU~eB@T?bI z@7q?=te}c;cSH3wpgw@{-!-r-`zk@ z+YV~sRe*Vw(bOKwXqwM5nzmhC>)c&*d$ojfB-{gGF@Dyb%V^rx%4phF%4lkTMOtPb zy3g)4qTgN;zE(oje{X^Jk-t0RA0qtfbEt>fb_MroSz~SUFyYlY zQJwRA6}Le6RA;7db;!3FoEa(nssnk|r{;MRcXWwt>nHR4P3~CXSAR&^^fjte(SDoV zaV7dNPLVfpCkXHHVhaZYrj5>*@K6a4m+%M)kCN~h2^UIuyo4trWP16s&DydpE9Rw4 zx04`)*A}ANVv(&noD5jYg>`9vMS0EcRFN0QvG$lR|7Q1wI&rA8+F2au42h%mqk5Iw z1kP!!lSX~JXm(5Lq)}eaO|BzKL+z(gK02c`G)}#IEUS}7qkNnxapHY;jct5_>#n0) zz5MqI|EXe2rvav&pDtll!Zr!pC9FxfRKhL^mrK|qVIRVHEOQodnA@i<(gx^@1`x*k z>?%U@V_mZsLH+(9=+t!xVHu9{n?**M{H9UluN3*KjC_mJakL#j&=#2Pn{2umKfD<* zFUDc}U>x$T5k8+s!>9Rq3+T+_TM?GwD1-FWpGRYrydGI!SWG*kX*zF{w9hkXTO4K3 zhSU0k9y;$x8q1;{Ew6Lp?3g4^%gRpmdb{X#F~YL^Ygv=VJt1W}s1M>?lD6NX&RDZX z8obmuT7IqTd_J4qJ0yvw-TV{-Rt~le;=fSA9j9>}!Qr$DUUK zX1Tvh!fPaaH^Q>`W6`@TUYzcAlFoahbl>+sPWJ`q-Eu$ zzJ|WR?z3YWp>M%=QxReu(^i(}JxpPfzP3nmTv%8Zuv4eG})lrs6E zl!@ls_ti+;_9fhBm&wZ3GM<)wc3kJs_x;I-y&ma4JJRevJ6Y>kr+s$+r`8@g_R$Gc z?gR4s#(>LDH->$79LK~Hq8f+epAe_Ofjv7Lx?MrH8v|a-WGU0+{-Zr1Q`f6?&)vSj z**$mr0k(VY_6MBbbC+A180YFhD6h3G#l3f|`*bPS?7cex>D#?`2LjeS=-#_l;OySJ zMS$(zyHfz$y?4x$-Fw#$*zUa>25k4*9W;)#NpM@6Psdv%Pg3``W#C9yWXL zR+4V^-UT?@dq>^M_TG&EuY2##!M&D&?!7w~xOnd!WyO2%&Iiu!y}JOg-FwHjZ};92 zwtMd`0&Mr*5!QWn+`mOQ-g|cmaCYw^obA1Pfb?kZ z9rs9a@7lgL%`r$45n%UE#ZJdfzj;&M`Y^+Ynb6896) zQ{~&d{R}i6!!fOJRooMD?`at4SUq&l#%%1_n6i;`-vBTD-$Mwwv9sFF;^m&$neLk+ zXH9BjVXx~Wz^fnMAN$A|-{Q6v+;_mYq}JJo?Yo}mF~I)Atg_$taliv@E31k#-)la) z>YX?DIpF)L;KTkQ-~#J(;C=vHrWWgDq=#r+hx>M=Mw%YWpDdQ5RYC+6sc=9WeOK#+MOg6ub-xD-K6U9}n_UyeEPQYS-7J+i64Yz_q27C+G z!)ntCPmkzqo0fl81aBL`9N#NHzn{XrDcb{w9(C`%s>9GI3NWHpO-A zOMMylcNuPvy@l_Y4420BD4#}Gn#S)_zTs5fA2M7j?~fVI%VRlC!6%Xb1U$<=E=T&+ zr$M7%EtL5ld+zHC9U)3RSLSd#9%gy4j1<;7P+03gVXXs&sjiJbD}uF7lwa$Fu-3`5 zAqhS|7jSUO=cc;z%P8Ywtybht}T*GBmKq+__8II;tyc zZOg;w-YwJ$x@;!#eJ#!@k z(E&{aFZv>&lF?MEI! zd*>PbtzOsgUd&{~v!%v%Jss~FO$C1CGCU0gxH1hep3zKU`*$%a>jR(n<4vBo-hMU8 zsaE|r)T=8xhuZMDzG^$a>(<`gH#m&m$EP>5vH|#bmHGF?Em}*v;5U>u6uuUO>xJE^ zY7^|A&f=(@y|xkS;u?L zZqXvv@g~HLWHv^gjq$T~Li;6N?RRtBTl?Jtu;wd`kMYlz!1F57GCNcI-3q)3c()c= zb8w%^!o9Uirmwb*a`Jq$fU`O?O_fnbW4}xJftDYG5wCW?1MV|DqCAO=P+r+Q(UmfO z+7xl8Z@jtN3?Z-T{2Jb0>XUb^0-oJJ@ZGf`9MZU~OU^N@u>Ls)STtB0#CPrkjK1e2 zxE^_D4|DdA8&x^SDn32*-`E=)8Hl&_Cie=)ThQB%U8&XHv%~m{IttE@`4nCWrqD*3 zyj&D|yvk_mGbx+zM62xABaW55AKj1N)=Sp}$Sv=6KAEK^Ii}DY`eX2XO$?1;zw>0e^&yM;>&bzX&)cIq+ zV|yUvn({@vn^b89ZjD8Tc3n9b_QevRKjnT)xP`NDSyLh09R3Z->i zC|BfL%av__bwRr?G#FJevXA4+Rs7>k3(392fDQ%>Y?^?BJNYYkc*sNupdiP z`&lFQL)+5z2;N)!IUcYrIvrn~0Q{O9A&jpU0Uz7YV&HgHpM!nUpiCxmLn9KDx^}cPK#xh*;W}%>!^WG3d;oQ zlPqNHs1LfT9r0f6=q%h@I~oA2dXTRlKibhCLSAJw)v=5g+tCo@(2j;BT!F9<4|Hos z)I;rPHSSZrkc*sNup>)TI~t2mS_!$f=+uT*0ly|k2=;R}_2>@=U~`R+^Kowij#oYV z(SGgC!uJ-0+OO4mmkup!P>01bD%y?ByVgkqyXhO|IR{m&J1oU>nuUzroC6)zZg{VD z^ETXDyEzZA>PWtG@uS_GkC0axO?51z#ddQ6ig?OM_yP+OxH<#c()eE`E z=>@y7wDH)@+acE$o!ZUCz^};>g56w7{>W}F1CG~dc5}J#U4c;SCYM549Tv-|Xg4VR zeZa5D6X0K(Djxtoww(_G$E%+0upZfGT`zn$AQaolr?5B&ruA4Xr=tDX{A;~5u%A90 zb&t>1tyBZb!^ZdA1YOmBc(3+z3+}D`+zMFrB;U>W(SB}2$g7N|dX~{*`}qju(0*>0 z@D7B9c%WPRp&n{KcjG?Q3%SVY1^cnI*nU{HI*#VO9Y@~@IA3_2+n7|j3-~n=f%bC` z`6J)+QQ&xuWf17JfHJk?de|JTYLH(VAY#^pT&>%^m&B5%4o4Y*?6%%eF1W4PxndqMT7;Jpj&&Q zJhi6>aG%OYE^>Ooo-9r6>0B90H?pVuAvY>N|7`yy;Mc?idA|QLXt7Ow1vp;yY)Z$` zUlqOw5sFR4sVt5VX?+&UE3>OIn$}N)@sJ+~sZ%mQnkH@NA?T_$#Cx@&Z{ptC(6<1q z9^`u%Kibf@5%Madsg7l|*oGc~9NN%#B>XPILOjr|4N(uZp~rBa>V;h7^nwjpn%a=g z4K=c%M#ogr%gRU+z5W~OQfq! zJ&Aj3Q@;SLc_81<@S{yVg^*W~mes$mY5Wqrw3}ZcEbs$w?S<)6SMm*k#x#F}pIy@^ zZ%=XAU_v%6l>t*8m6qQ@p62%%+)Fw5cV~YO*yV8oz$lPg!{ByAT?Jm zuxU$En|>aCaSG!796#90EH7Yv%;UJ0G6cEJm{Zq}V}&I&&tLg7;^*5*Q-!*WWexE!;Nw-+p18k?wml7N z4{L?*S%i~aTz^^+SuF}Ct;+=E7;M2M&xtIii?=4Dc2aH&d)9y6z*f2*d>*MCYl(7a z#)!`&E%nE|S6liA?rq!oCt$TD^8Fn@ww-?=;yz6i8fu!fU+SrCjO%|s514(nZOo@7G_N;gsQq4pa;M$C06AJb;Tg2a{TH}3 zDKglogY3wbuwH|>So7lHfV4%~|HH!8^8zcBRc}4JiSeWTimcDcuq)1_>xHiq40X(% zn`#u-XR%BxPV0bWMZM@B%J^)VvJAQGM-U&tg^XjNPrz z_~)UH%lH4y>+9~O$u7d)S$_xjkMrXuAl3+%l+9J0$9-YKEVtl>PS#gK6Oo50Jw zdYwjSui@;98AxpiDRHlbmKk}%)#PT%z3%HHe>rdBaF~w2*cND;8v$mx2}1N+-d{6* zF`bIrOya7J+Ag*LzDytXgT!lF-U|1Oqv>o7*ru}qV7BFL5c1Oel;u6}CT^DSmdVk6 zU)NDy0bbh9wi0fKun>>wioYOD^XAjTYN)2iGGKnR&9l6j*B$YT+x&*Wr8KPPSoxe! zs7IS#hqhy>{dME@h!t*;57d?_ExSU7mj7QC`*lw%aXSmH9j;5|?V>n(D3Lc?aVv)W z-izG@4i**qn^z0YComYsKbmGo+iIT&t49xxD_$1yb+&b<=Q(TKp@Cu9C)MQUNE+CJ zTk9LZgaGtoKeh+(p_G@SUMp@-z}UYspUEn`9%fWRk|7Rx@cqtXyF0r3+I^v9_^r7A zb!CR2OF-$%?FK_>PcQJGf*q;P~j`1WqFu5 z1AA@VA>d_r7()8$!x6GSjB#3qEL+Mw5`1YH!mDZ-`ZVElEG<8-YjOu8uJ}LS#^wR` z?V6s^`;sQNAma(HM10H<2Jc-7@Z5KP6!6w&*%nxil9F%XwC$rAzhqpu9>#UYfTov@ z>tL&;{@RwUwCcsgOz5wpK* z1J2qUef|>Q)>uYwpG~d?ynQFF6R>?(j`Zpw{=j(HGrl=TcwW_?!%q9AT=cgcJWHLn z&F@_R6W+i=8XgA>-)9)^4$s(287H!Jjx#odUtR{9UX#Tyo9yv~$lN%??wQ5#ZtdQs zC%gVb`vz9F4Rp-o>G|G{NE-reJ=b4U1og@?MYSfw z;L!_v?nf2o0Kg=0y|W}We#7uzt)mvE@_N(>>RvK-G59jFJ&vFRlS%4I%G( z*j+SKZ66*Os1B~~S<=_-eM*qu;)ut$?D1iWn6{C_NEVxj%hKP>)5>+&%F~K^%)%SS zgIz;iD{A=M20q-PdECME)|R$KcofXeUhmFEm78PuD3MKtAMW;XLrg&CQvPd{N9A>^=ih6 z@H}r|4)&NwMd{;^wijvnqD*P~k``B=_#?*MkMy_-4ZW50Vl}4n=PSKV`iGOAueLPq zQKaRoZY`hBw?JFG#I%QnuI%|7d$~O(_tWw_Tc3q& z&h22j1an;i%e;=laC^0(wgLZMkm7oWdun*6BaOpdU>sK{y{9%fh_R3#^C=Ezjimg& zkV*cqC&?xEn(~wHcZ?}dVLwR2_Tgu~dirJBq^CdMQbY&m8p`NISBKe09~9!#XMJAk zNZZPNgn?&0>N6MH1mXMfWBd9dLSE!!9kU(ieEkD}_k$l~eW|Tvahu$iC9ckY)aOmy zSB2Ngra!AE`)iTx`n-wzMu}|dUQhPJ!e7jj^$Wq@P)?B#`xENQz>Q2`x=^)jC#N;5$L&dmO*` ztVfo2O3S5HY54;9)i3-I_w)h=D^uG*NH1H{V?5QU2 z{sX{vp5n)VIk&FqP|i=R965Kw;=)-J)7(!f3+LY8BaG;urn#R1UfSKaq|MJ)Omj~F z&gMvPMg(BID~U-#&hZJ1v_l-p2>c#tPm=e9GFrv`g0zF%Iy7ILD`DLN%flep*H)e) zPc&D;G0rxaEBU484K+Xn5IwruypJS{l&alZ!qY5Zsp!w}1Q3s>TPEBBN| zytXsi8{ud0v-4aj-$;=62hi*Bv7NDft8f1kU~iLFHvIXYf#+35)4pBDNPht@2X$)^ zsxIn7{t8^COD0#-r>-^)pD5bP-+<@kX=pE2hPIatm%4&=7U+ketd9VR&Rv=gP*lYl|fp#vN3}8-E4oX|6wo``J3E} z5|?8=%F(`}vPrOEZA+As09TZO-8;bZQhST}yxy?)2@xOtx0R=SlY~!gedJ@O#6Vq5POqYH~>qy&R3*u8=&>_pK zmxs1xY1+0Pl)i}Vj{CHy<2#@);6ALqVgxEa_rJhN{}T@I5j+moP4QTog}u?oPI1i! z&jvs_eCC;w;eDH$Mpz;;-ui@(Zd+c11#8+HD2{8F(m$j)d`Fg8#!Ydn0w3G(hKP$f zIp0FL>qOf%<`6y3?^A3X&YS5IkbvDixcaqC-bAI+z&_Go+t}^-{}~f za)f7t(7#mYAx-W!^5s%-(~)l8S2R^vu4T_-^a+6m8JO*>f2PKa$_&WmRnI5z*cGpBc%@FO!))n|PUCdU%hZsB@Fk zXPzQ0dwwd?vga`B#k4iA9N*i#+V7(8!9y8vF^=-_ejng%oGdR{KR~{VB^~vLoS!-i z@`e!Zjk3w+!wud*!ZNGOz}%gmv*I(yaH)(5?)4%w%pZn&Dc|es z=cRZGTl)$<^Tk3k6+s;ipkC+?=VBfroFUP-ob6rCk7yeh>ca3gzzI$grmfQT8@I;j4#p~ z_G4+>DTLj0&TSZXJ+LX$lz7h|L`mrwy_pGM;$AC3lYkgG?(+m z7LqnrutRutwZjJIHi@M4&wuj!qEdrgmiGft0m{;K%t-2WSKUzT1Q@VwLyQ{TpMnq9lZp^nsFb*uqT zT~t;lV9h)Iaxwj8w=|WNw6NSmzQWvD7hu)_%SU|+eFWj<_|a#biIA6$!M8@c*0l1x ziR%$wwJR$}?MnB^c7vDkdnN2c$as{^c;U*P*$Xnkp#G~!%g+nZUs7hUfqcBYePlE( z7nT?0uR#1XKd2Ec7oRq4#M0C!&c)g?=bh*;^_@)GT=kIdS`Ydy`bgS*_2AW*S|UL`>GA}h6A`Y9?sUx;h2{}M8zpw+;r)E@B{A%Gn8(~Xs zBvVqt*kx4ii-QlHIuhDG{fFMuFX=t~o8Hs!@V=~_X}i`jL^)sP8?;@K&yL%7ka7F@ zCSBHn>TsdKbNs6D*?zXekL%0Fqc5zpZmQ;+uJjEq>l+x_t+eYpEbY0_{^)}*L3-+g zFJ;>2;n$$=y29xC4&2X1Udg{L%9r=rcU=w|>HNJDKhpWT689`?wr8e&8Gh`$u0qI* zI&F(kb-EgOEvIX6uj$2o7t z%K89c&HFIYD5l@+KA6f%T3GHOU!m{10Wiyyo&k?pHbkIfVJ$&_XYguzaK!ztBj^~rt>9V1}}Z|R}dEXfmi>lWzO`;_cidR zX+pzXn(&pDroQq~)D_3|U%+TX$Ms)?oU*x&>EQ6Q+bCDg$A1-knIUj&ImtZ;+!}-A ze8Sg(i`y*u>b2QG8?DXGtb7A9c*Sj2*SKiQQ_)@@626BK>U=_4udZmz#WK&@RfG5M ze6F+i?>v~kf5$Pzw~@Zu%_F!EW3T*N!FP!t$@axO3Yfp?s6Xn(d&>C^e$!wj-$Tet zpJ`b~Y|rGKgD~Sw+~dOQ?F_WX0MpLCk5Jd!7+=#YOYetKdh}7`FY+et$HI%e`+ah% z7sE`iiun75efeRKl+&8Bjm;OSbiDJ z`u_aB`ae_NNLK%U0XzqBbsU?Q)8y8sX@qln{|J~of0FQ7giN3DnSQwP<4LALTCm~F zpD~`&G^YBxLY}}-pJvCQ6K8Pwfi?v*fjtGg;+!bQ#7g5lsM1;tjkdsX4{5Xqj(4a_ zz4}y{tWS=C81Fy0pM{Y1%6zN8{x9wc`}%`t$kiW|wKVnDyUW;?zFhq^`Scwmoll9! zx_mkeQz^lB{{V4tx;cDyllu|w2ix0vt3c%7-adJ+DREDLXQ(gq$@Kj{_i*TQ3I7W4 z%C3$Y=Q;@g4sdT9mN8ahZ#B}eb1;7e%{oiYxjYA4Hhyh#e*^5l4&dibrn%=CC+rET zDxPw;Qa}<;F7!d-jr|xoasL258|NmTPv4cI&i@1*<5SJ1&&R(M7qaSc z{|>m2UFi#72sp`dSQBPlaNdP|jjRJyUIbs<7gFDPePN)D))&IPZc2Ngoc#N>oO_w# z=Ux`BW#6?k`ooIwCI~k(Bceuq7xSWhS2N<#XV9J}nESVaC-iAa%Ot@U+im7Ubo`>S zn1<~KQqAw~71bj)38*&1@RUbdmk z^C&;R9xzMN(msA$!2Ic$g7=j33j8>x*bX5t%?HN>XW_^4XWx+VCT<7e)qZ+=!0ZoR ziBQvHd`*)w;`DZk(&M@Zd5XM=+eLVFOrd%)%=D_bU4>8enhltG?S`-%mmgD52d2;Q zMJBh&y;|gw7N;4HBj!k&dmz+tgq8#Q4;@G3%cI%7M$*voXFB9(nhZ0268Bo+)jaJb zY3_}Xc1D|^O>24WD|pJV;|RiY@#8q+bqIMeJ(gKU%i3F!mW`2huIcrV!}$A2xIaS1 z8y1-eaOKAax%5Dd`}kBBSp7C=Z@je6rR|~Ge4k7Evwb}4U;A;|KJz|0smB z?3f{~8P0IA$HH>C^iKsJfi|mi9YtE^TeO|9f3$u1zS5T;2OR>fGJ|`HY2VtcI5bS7&mY z+;WjiTAXIwS9eRAJqXoqv>f`Oi}uy|@@RH_l7^N)(;+|8WSHrbxU+;;^VBbC4j`n> z(x)-qRs|Nws>#NTOt=!46ubt-J1iJ0B-was# z?AR-UKXGp%zv;Wz0JeQM^HbJ$6W@ZeiTm!ihWMIY-*=BF&h*{1hq&)PC-CL^Zq|R? zcfT$0jl1tYAMxV8o8?ol?+&!l`|b-MgV$(%H~TI2-4_b~MF?|!cU(hh7oPQ71>aH9 zhiA5*`5bLO?90l}5Vk8ZtNF@RH2r`h7l=(~(8G5XE<+x)-{igar&r+K`p$O%R^7>W zIezq)??lK;{WaesrH?D}ChjWXEu-y5WAyQY|GW~s^q=pN@M?sGc%Z9~Wcg4p^)K(n zeX1vNrFwc9@Gq98{$+)%-EjVobAjC7bPeSA_A13Eg^IQ}(OnB#Xq$N=*J$1YTHaP? zRIUS#S8Qi?PKk9p31?!xS9srt(9S94Q&Iyf)@`w@5|@>6=-aX~$m*uSJK}y5bv1o4 za&aC`=TMTC>!EY7si}A$58IS5?q&VlNc;%d4fxU4Zbrzf zNXzViV}S~IZUHat=T?LTe&DU$Fnt{laLmIrZ^zH>pH9aRl0Ns{r+j#~^-l2fYB08y z^6KmDz}YK(y-o{I5$V{L`rZwBW%3)Wm#KVw!#ow;q31xb%s&d5TIL_aJam(@A# zhdOEd{ygppd)t6UIom+{wlrpq zTb~WS3SRO&h_Jv98?P%1ajdUkyHQ_3-I(S>_*q{;`P8`{jcq8U!C9$%#-m>;qs_(I zyDLBUrFw8*UpG&z8*U%Macc&WGM<5QrLITd_XyHv-^R4QWAy;m>Omin>S1W=2k9>; zBhOcH-}Ca}2hrB*wXv^($2cpruO|0(;P{3*j-&GMHvqTeSbLtoO8UcqeOndyo1~j} z^vUxr;5zEGEz-XYde$DB+;;(MyPAa!F|+&-$`;_m~awOz~;E!dp|OO;Hy6 zTF%AL7J0FL>BE_}`tTnKAKM=LJjUU@w{y9ty*6r-r2h;*w#g?D@}h09y=An_zO+sL z9K7Ut5@CTKZL+Q`#8F$NuIz_wn`D~5!mq4N)}yiArL?F`vYn(fleXG_8BN=X?GH1) zihBk!dF|Mso%{kkTG84^(2k!1-nNxr0=8}C*MMzXd7AX7t^5W!+ZKKcc&u&VcZOHn z!tV`E+k(YuTd=tCv;~fTTfT_YP`KR zR2{^FHMX4NbJza;#g3E*p9dbsan=*J@r=~AqOGgjAIC`AS$G?6pw`y0n&XLH zd^<+Ioju9vr(vtzICBAu@qPHpcz6$v@wUzA^8LT?5nD}j1Gl6NpO+0f!*?;x6p!od z>aO7=y}|Z@u718$9%#!vO)V?nX1OH;eamY&qp!=K_e~jRVkfTG6C>ej+meub$>-7> zO|pfe=pX1?%A!-d1 zgPvn>sH+#pA5tNyqX7=Z_!)8^w*@>tR^LDsdh`tsK*EyYL7olEG zXR44k+0|Cn+K2sCi)v@zKu?>D|0M2o=gYIU3YEll7slB#;Cz*#7E?Re(c}3rpH(OM zcXplJ%gGGntxC$Z*DdRV2@LnbP%tOPlRSMoeK^?$gUznat{OAegU`LC>F5K?dV&H@da_iDGoIW;~;KDinB!&bX|$}hEdm@_@<5=Tp93FiEm%l)!jk!Y^Qa4 z`KyWd))n}6@-Pmyj@s=i;-$G5l9zF|p=ti!L>y8Y!b`6#X8$B9WxN$>ehY8apBGA7 z)p&3Av?0`dPinhrXA?bbxP6(n3fQ-{c$Uk|h^{h|6z^>pv9ju5JicoU-v+r_G@&du z0v`U$a0mQ|;0IAm+FswHIInsr+ch4S_jBucT&=fncyn<1 z4F%h@+VT0M)ZY6I&AJ@M!%4{gi-+340Q7VXW%hh-M9)$U`McE6SN09VWR_rZGWehK z9ZVCp)d3%_<-5M~DPUCWtFyNYYEq92TxtNJMM(W$nBhy?|2BBD8qU107u}ApvBA|i zg(vJM-+^yk2aiS-s8==U*w>C@O?|r4GM?eywEL+J!QHhj#i#65@9pFb?yB@C{&Q{8 z=HKeVTZmK;O_yJmO#866gXRsChXL{h56RahZV0b429>?L75v4HjK~mJSuUGmmY%O= z_lE2Z(hFe|9u9)d^0`?VkLdP_jK-Fm_A>(+esFa!&h71L_e~ownXjmI5Bjvv)0qVJ zuijaQI={%R96)!QHCexT?OA-kXVS*UU?9Qq$lozm@Q)s-&Gxx-`PZGa7lYP0z_+$S zzZvol0M9mL8L@2kh71foR`*m4w!G zWTlT9twBBL!sm*ALkE4X_z%ZFc#a>a|J({2g5_wJ6{oseI+>0qvjg0s19!;t7nNBc z+MsO1vnQWl)6tKVJD*88KMiZ=6pY7G$HcWHFM?k$IYTm^=F6xf%ZvJHc~!6|H+zI* z#;~_L0nFzM>dJC`0Y9GU(!|9(Tzevq+_&;yuXA`8nDVMe4*7F7`JB)UULDi#yi0fo zvdL|fOb{8ABl&y@^^WsmATNxgD=o9|jLAHmit&1#`HEs%GEgruwA>J0>z8FW1!-#8 zO=bG9wKeNzYm&y;4KAmYS{>Se+8v)C#$tEWmv*;)u|68v-OHvg%aOWjIc^9&tPQpR zRvTn_PvZ~V(-HDg8(h!B!3HVM+TaY(tPRpGXoE9F2IbVXLCNXZ?E>c^K`w2v!9LK? z8|cS9EhGlU=eA8K2R6kr;=Pv9X1KRyv^ij%yCC1D_;Iab3xvFM9|-+C=V7?MP~^wH z>pJ{gPb=f!M)-A}lx@FUcH(B0@RrL>+;+k{8}sx{=v=l0%sHB^C47a1+e)}SLY5cH zMdx7nEX=ZaC4TW73}vO|gnK)WLp;lt`P~`!8DCbOzAT#aG@akSS$yJED6_DBH^J=y zIkt+~Z_+pJ2s}Ht09V{jfc;r#{PG8QI3LF{+wwdwqrNSNb?e=e`NDSyLa}A7xG~jfu}l)DWyvyOUaVbb`OfMm ztYMF0Uw+TbV*ZUS%db@*!F1sNRUg7f;x`Q&B(;tTG?cQ^sH>MT!nzD&x?>RE#$m0{ zVvhx$7vr#>&^kX3c*@XAWqTQ@^He9u&^o^ybx!|w6yo_TioZJ=@EX}C#Pb;!0`~ic z!dJfF+bqt1;me$Dk5cld+tb%gamQzI@jVj`;KSb96Nr!AmtkE@a#NENLDNh6`^+vz zsf)c3mvzx#?Yp|5Z*WO=cs-%?U}Xij!jNOeEK|nKHL|5k>=P8h749M?6VEv_4jC$ld zcyC~u%e(qlVlGkPVKhNZKl<+&B!#^m!vul-~|5X_L zo!xz5y;E^Zu$~=GH^_8=Rd;lu?I=%M$C<-}LzuDd?nu*P-UB9!=Y>@24t0Fl%zT`E46L-7lQ&`uuTR!_iTmfeSd#?k5zrR*N`8^sUFkUj`<&dCYbUAH&E;E=GT-`*-J1rk10^E3vFH7 zgXXyg+>+W-pAPRi$47a*ui=|y%)?UL=S&-V&Y!yEYXPJHSpb>{?9Zw@;>K>RFMM^WWf%)(PME5M*97$JA1I= z;yLG{ePcz&&zto?7w_}CWVDL;H_wC#IEL}yfcmpPVjr!~cD;c6@MGW2H9&fMj`sS2 zBmY?pM|fZHadnJ32t4KJ_+SVy`*zA=8jJDc^Y$=8UX;Z+>9_=A0P?N$eA(E8GUkB4 zjHYP~gRWx{o7UNBT4Bt>JeBdiS@?9^Og^SrBln9&B?^r+oY$obHJnJp!w6Zwam{453fdg={|-FB+UyE+VUuuow&D)Y>j`h z#HXCHys9p$GxyAqkD;x*%S5iF#kQeoUM^`~fv^lm89YBYt&eC=gwlL@Mc?+&vSj)3 z(s3*8m+$Y><|+Sbq;2&-5b5zEAI}O_zH1xsY1`6re-C)I+*$XT{KQ=c8ZV};?IU0+ zZj#^go7n~1Ao=n#D(?M8MxK_>C)1TS@Aso#AIZ~nZ>T2^&!*b$3woGm5MOtwn-4(_ z-`)B!!Xx}V=qS%W^v^g?z<;4rZ)0Z%UmL#lIhw3PxtHIIlDk+E$9BFP=qn5PfseaY z%7Jx%Gw!wSKZ5(L4)fpoC0{7xq~#X5_p-$=YFkd9jhe%p`AOiNjJ|BjMmWn9_w4Iv zGw310s2llK9J&QRLRJ{h#l1Z;Z=^V`QghTvm~Aqw(DZe7A`RlYkw(CwBNH6ULHj83 z3@D5h$?onYZS7e1CVm+5uznMi5WR?_9{8RhhSVVq;;07~RoTZgE}xC{(Vj4$7wt3Q z3c!#v(1slg`W>281~+R(UsuPh+5QZR)ds&U(&XOw5#a2;Bl^{Wj-V>(Zv%|A^;CC0 zmr@SLTGUZtjJ47<{1D2}FwVj|rA_WU#H+1pulWUUjElKf_9Eayg@rRRE(z&%s_aVv zV-*P>%?bSP0L%|kc5y+~=OJW%!`ToO9_d&qC*65f;bh{CFe!l@R{Wm>n6F4seBWF%(hBCSdJZUsv&WV?&?-0>W z*se175NwIh_7Pks(U2yy$AmQOj*RSec^rHg{VgV{RqOdT=gXEVDa!BNPlOP0#f($<{v7|TBD zyTHdQo*U6IG3QW^a4V9#h3_7O`{qZb_(G$k--_DBif}p>9PxctZcpdO5nufxeSqzU z{)M?sj!`+c?a*(33Ut1oJG&*Em5QSA&*7{i9jAUali|l4ivL`SPg?k0Elrc<%X{sU zDU0=@zC9hk0#94JA3yFL{USnMr(%3hyZ;hkYlr-{E9C%t3^oLK8>ejSnO)#(&)Z0o ze+LqFe^j5hBkV&#e*k-1+z*(2;{?n{Js@dOnw&YPC5$;ARJL|#dK>p>NQ?QIWb#d0 zW4`sdfVy!!;_=}1ebjkb|3~<1_)SZi+=B>t@q5h7`_}>6_Qt$Z&S-gOddU02PCRF_ z?`}q3zag?2d%e6}A+Oq~7wKJ`)AV~GslFJ!tG+A))}PkBuji3a*UX#Zsh8ffTxNqu z?c+P3@s~Y2CGNZAhirb6LgTTm+jx(Ghd&$dafvt6#G{R=j346O%J>mr{;Z52lOJi5 zSL6NE+_M}M{{-%>yq^Q+&&qp}{E$apjrWwf=U7_tzXIOM`!!(xth}cg7xKuf@qR1! zI<{h-eY?V_P}>#b=y+NA=pXjRkI$K}L&!^Mn*iQaXj=%4GWNl}rn{NkuYeD$v)+$s z8ElxrIEwpL{QGme!H3PA8(zyDXu}7k!&`N;{6cSzy>&h|ei%l5dr`b#XoG(d9ePL8 z0WEy2>4SCDw9g(by^v*0+l@8VG{UH9V?5pREb^_s_&MCuZgiaeHE++Aup}(j0Sr{f53|}{z@4mybojee*rGWskncq^1?fK{{YNql7AxPv(kUc;sLK| z6=WiJXQwj5vskJlBA1~H^lQMMfM3gsWk@}mfy>g$%8GnyZ(1G`B|U~V z&LqIR;<}mwyw-`vnF^d;E7v?t2A*X%4I%Yn+1oU-GS6uBWUVi zN4iXtVakU(nU46pEUjLeGbGKK2-V+HUMxGrPu#|JWmlY@F`;#J@knNqn;{d!iuBl*wsCT<%m2Yry$MV~|0$T&W2{y&?8SDk{1@An%Bjwq({{{b=u||L{e5R|Q{PdZUa1-G88FB)7!i=szZ)iQh zLtQn0zaj1iI=E62p0Qd0>+>7sZ3Gy5U;R5*9A|9;SPmla&u^Oo*0UT)-vTf<#OpKV zR)Di-u_m`QVSI2hOEYn=0IrLlPxa%`ile>k>uYalfSU0cgzbJmhtm@A)&ZZ*h+`eL zV$=uq+QaiGz8eU>=o!7javjTa$1KF^|vf66+B zJ}YVA_rlqioLj%|l#v2Ts@jE*m~eJt^!~FX(y02}Twez+5cdxcnRH7MFjO-{@z?`q z;UAYlL{RH|+?R-GtYiADSMhz0_VqiVp4d;RPum%A+Ao>s3;K}RpiP@tal0VorF_uQ-5=Z^s^p?Ee%Xky_Y9n9A3mR_^(5%0-@%EH>+sQteT>;al?k?dR315Ry zb!XnG?`wfeWuae+^Qe6LM0}brojcuI(%9Fh5ym)-Qz#RpF&B7VMOqlg@SX1~yDGg{dg{FFKUq}AoqL=cqk1f;V zh=^~yI($b(d|X>8lXpym^3X9!S-fmLCbWrd>&QPo(u2iOChx?EPklmM4~vD5&%9iR z;ZqLRU1$R*gEn=9_d%yq0GFk8YMNGf2BI&}IBx)rvKdnL=?E$N42FiU3b;)68-2VW zgSt}&{Q_kyVQ6Hu11^)%;p6e!4q=UQ9$@;t`4S!?;h_>9CgB1JkCgCe36GUAVy?yujz53A8`zV%!myM|dChOu*%~ow(&9qbNV~ z11g6yI9@IC;?1*67r(B=F>H|!V=Cd(=czuxEa$TjlArNXe-o{7a^5hdp^n*B=-(5J z-z#|cf@Ag_y!>$XBzf%^UdHqoEQht6cntqa#H}vC5J$%JI}$zy!w$e3V&-lyz&SVH zxWn+{-`62dG+uPC2QC}4PICJJmT~!*dLs58d`?)`X9vdJA8FbiOl2NG-9n$@$KMA6 z?(6SdMLNgdt%L{jaP?RsSVnkj*7M6Kalf!;vkW+vBI9@Ce&qnhk>DrX1GuvrAFB58 z6E^^u>t>uACVdd_P_4T=z%wgDfO*AZXwG--j(sb(c zza9KqRxCs2?GoU!w6d}ypW2_6^<|PCLmTIEz`WwRdI#`YCmQFSz?IFvT>(7H?n;Ez zi)C-q$jUsU)syuuk#)7m;{01Gt7QJ|ETqdc8K!)wlXoLNFH5VJ=6fW~>kw+cN_pDH zGotK%LKc8OW zZnARFf7^1?vF^ns^Kay{eK&2)&cCq@+WEJwv3@FFqVRnq%QT*UTZ{2RJpaZq^t#T! zod+F)gBz=3WuG?5osW2C9&RiiIqa`MJUbV6G2nPE?o#rYxwxwU>s;J5xX7?rRLHR#n}4Ni|dakWJr>m zhZ~~?B~i!Fr+%!yE;=8VOTQ$Qv2^(PiMi@Yb!O&98Hbp;Ir<762i%E!I}W%DaN1{? zxjDwU2S3iu-Hni!@>#$7G0@Z}+BhGVI7M21E>6b|>N`J$c-D7jG86Y{k*RZW9|cVR z`Uwd?DdA@js;=5!-wRwS3#Ad~N%=k>@o7GEF79)Z#ut1V;TfNC3i(7DUj&|4kru`@ zd{(>8+te85;&PT{r*nmX`P^~M$c%3uG-28 zp3b$E(R6;TjCNv!^3-{>vUsOTJk}k@KGtXb05Ipr7}B%-5Fz<~#BhZ7pyY>mcV%!myN0=Y`HDH||%iBoe zo)#HJ`B__3Id*<5mh-zzm)!hVo)6#16F!|Edj>Ge`40%G1Lw!mHeWJ7meNqiIzP67 z%#YEo?EDyc?HF6e+!&~Y`7!zsJI219u$dpbgRq$&`z+w`PkMxP=KByg8q2x+fy>5| zliZg8NAqN3=p{m4)^(iExv~e4ZrNPfm#LqbEBgvyJ6HBq!e*|Fu$?RWh3C)DmHiSp zoh$nd?(JOJZvor6vOfa0b7g-5Z0E}U4479u#^sz9=gR&fbn=wWm5rrz)A6m&n2px4 zJ-fES7&mV|>5)TtYjR+yICYk%%L;E!MC)PE1e%=upPN5>7Ue*HFzP%OAM^5Qj!P## z0gR?k7=w&(n#f#c4?sF8_EI!Sg^a2Xedlv1AN8Hj<9_x?=6nCnvO_;Y9-YIXzasok z{5Y@n4}`qvzw)%qhf>DhC}Sj({U5-^I2HFoDlg2d{R=P)?B56}|G#DNfRE?ZQXP@I zcwQ}|73aw+TZD8Hga!SeNxTnE`J2J7WyLaN+=;+tX=PCULW@9L%d_wCwDOn@i@^$Y=X}+8E$;UmM$??ekBG=G9oH z@x0nUTVCFIwHKj7Hm^2*hs!xO6uyoX*3E027gB&~OHUV%v=QfEvX3lK`z&htP z9rt$5Z3bXF=e7x8JLk3;U_0lwIbb{IwiRGI=e7;tY>d?8UO_mTbK4d;JLg8bis#(u zAL2PT)^%$%=f=E7<1`!w1)ISs#&}b%x}q~2smoJ$tL@!=gFG|HuN}^;YzIDG@pwe% z+}Qte&TV_)+W}!=&TahWkd9Es(*IuL=KxCk-?Hhgb<(Cp(5U_JgZ1^&xwtZ2N|GA? zxFJ75cUYbIxrQSfGv2~JdDx$hCw4|1+wsIMfYZLu%+E2-uAp&#ZZ<+*%4hxat3Xq~ zYvb%Laf-D3{G5(K)Ccc@c-9AJG84C_$kh3{-2l_4zgogM621nZ>Z<+zYk^B;p)}$= zDc?R3pXNj7=k}H~_VsCmc>u;K9otY+XZR zqCXk)JYrstF^t#e&K+guZdBb^zOR!zElG;SmxZDdABP9xdT95*{nzLJ5zP@FWROL#X-Y z_@Yeb)4{_FeEyk0`-&>#j<7t!yxkiC>%3jQUJ}$uwPjf`hNB zj=C4G!Tg>ny*HC{N!lP#?V-@$5J}lbN`)MW&9!hX7O8l@hL!@J$F+SLT&Eyal*a7D^+|lk&Ya z;?sQSIDCzyG2+t*WxzOvd?Jl=f#+4Eg?@p>FzP!iQt^%LWlSsNBB`<2(C3c&&dL~d zsx!VGvmPur+Jdb&JuhlBTF!#R^KKJ|<0PA(>*~aLuZgo=6zBbQ;(Q>D z6WY$zb;|eplrQn$VzBz$SV#7U(l|l(adl+hl=3Bh+-YUsQb+c!CeHLIuOF!s=XMi^ zc5KtRvre45Bu<&l*=G>G<6z}|6!G{B!jRtnV+iR3KhAK3_n}Na0k}-|Cw;sigKdH` z=)WlA(+rJ_&j2oy@mU`)dj`1#Fx%l}623#it0cTe!uLq{J_$c4;SCagSi+knyiLM8 zB)nU~dnEjng!dxUK89tbeaz>9?}uK+JS6T5pz+f3B5#oo`zlht#J`hc>*7mw;yfU6 z^qiW0JP)v~mFv>vz9RgpxAGVDN!)|NOB&x7$$Vz!`}UM~p6&xL>*an4zbxTbCH$I% zUq`6VIhLmS*ypLdA5GlDh|7!mkT26G(^bp3JpUE`#Ag}wk$wzDoc^blP>Smq;FC^arz6cfGOS%Yfmw7Mh?S$pIkncf#4zT9;fCG5m z-9+~d;8=<*kB7oNzH3$U??ru+@t5}E;NbAi6x$jedeU?Gz9sNrUr&1W0o!3e-jxdL zD^2bZ!ox%UutL5&^&P;&y`kO+KMHthd*3h)=k@PaeGf3tw_|+j^h3gsw^Z`@Bfxz2 zB&=t>;Vi3p%TgILD?bJgulRYC&w%^mdGsejC(p^w>|+?ySdnk+=PYfML25XEi1r`) zrKE-RNFP9dz`9m{z_v&D=lF4tLOdoIa9Lo z8_JEo3&7`%32yh~w_XP2q~8tCRlxtr=MDH&Uw>N0&pN` zywrcQT;>2S@+R(2!b`slx9k20n6~j}gtQr^sW!v!4l|v#_}M;$e8f{Xrtw$Yr~1HO zt3HMFk&fDyr@( zM&Gf^#YUbpan(lt2HYA+05(^79&l_kd>)+adXv9{rk8vJcw9E~ay$>R&a$%0>Xmh) z{$K;t=!R}lxE2Oq@o(rpb%b?Y@pBGpYcBwAZSBA0gDgKU0e_-(Nf;l7^>+87ltUR! z=QfHoYXcK!a350z@)#x(HX+os)y5_Om!=IH)3kLQLV6)B@J#}qSCN+Kq2o}FnTF*@ zevVPnG%HPRs>rhZ?2Gv;<6kf35AWDd1I&6`AECBYrol9e@e{Y9#J9ZVX(euYlvazR zH3OlRCF@;f*)jA+;7Rj|n%G!mQ77(YN@@AMOga16jOmD-Xq?S~n--1jSjMS5+*^OZ zysZl@FEi6$Z9~V^dHEIh3dtwi0(rD8Y|FfiWM#D-V5Y(Hh|}6$WRS)(rT#wO;J0~W zy=QsL&XHDIVqE=ER-V7f?NpMEZ--Gjs$Z;wt#_tVOe1l-N*e4N*dBKV%y2h^v?0c0 zxom@H=!wAZ4m^K6Bh%g&Wlwak1|Kh#JqIvlPeG{lq_!Q`)1DHSavRa&_NwiV@$$5+ zy%crD^A>ELm!~0bw%)Xl`u2pT89cxHKk$KEUm=e^gYc}fX6PI`g)p+mOnl>^gzuXY zHxco)UkiN`zSIMpJ~uEe+G?0AU+uqVPF#G}+VqWQ`m$v{@8MzKP=emu13p#-;%mwv1t%&hg(Cz+qIMo_W0`V0=~Ae*svZ z1-24d9Nsg|)_@0>4EOZQIockEkZ`6lzB5NUV4lOB^7rCYU*Vrcx;$KH9NOyO5We1S zW%>t>kfz2_{vAX{NF&q-%!wxhw}-Jvz;Pc+bx|+!w;Z}B?v;pF^G`L@Ex=3r!*>A{ z?uT)OGbIAOKcd%sgb;s6$Xm*?5F2B=#-6#Qq3k3*FCg&m0($i@oM`OxnK*&FP_$kj zfpL^MQ6bLk5XaO>;+Sr~q)WSaRY+IP5f`}&dsDey#=`JrXMIN7gL3_$@l0oidkx_A zP+t6SGrp~}GUQ=~+Y9&>;88B^%jG*bJ zBHjxRINHiA;8q2L@p`ascknnE3C=oZTCW9eXW-QEiQ5~v-2_L&CysVM$K$-=`?$2< zy@-?NQ}XQt+`ho+{z;ByCnJ*>%O1VjTZ^3A2cyDs>S3K-1B0Bi@Mrk}hcl-aS{!{e z&NyEnjGm7;oN>ND7}K~o#Dr}o$*^{|1_;|%*`*^I( zvvn8ZdH!|6KNsPC_IZA+-ZXupPa}-_Os{=)f(ds1*bmWO=;Oncxcx*g_RAIE*)Q|{ z5jp!@`&5nJkBC|Pifc9T`JBc0qn_=ea~R`#PezxyUebFqA|$t-Jw`1`qQ3NZ!O?T% zU-d3YCC^}2w?%U-yXP0U{kz~Ll19_F6%W6ytsF^|52X?3N%+^7#k;9NyjvU4blta1rd{8S%hRs!@*Q2aSFO8#)DhQr8Pe08g^=xkfT7_V1YDNx zkdGH+FkQ-E+og;Z42_JHfXig8^6|3u-8R6qxg`>|OV}Y{O~OtImrA%y!Y&EVlyJF( z-4gal*ehY5gu@c9MyURkWu^Z0O~9W8y^48A+?zq;rR7TAB45R=N%`>Y2JqXu7^xHI z9EqcI8)sn*$9aizUGSYI;a9ztzo<{*&KF+NwuQ{h2W0JhPg&o63wT*CZN zXn(rC%lG$qt|i;N-TzBoom=5t2kBh((fz+1R{&1Wrk_uKv%VXjm30W|W_|Z~!1)RM zu?#K4y2MF{o1d>~a;E^N^EG@o?^M9iI`3E#c*%QyPeZ!7Wi#~iEWbBUKeN_*I{D06 z?-_vYT5pxGS?fI;u;y9UdM^SFgJQqd`}T03uJvBR_-3t_?ar?CUMjF%>t&m?YrU5f zHfz0C0Jdwr?*weudanem&(fTGxR$V4>wP!i(bjt310G)Svm&39xYm1}(8*J});pG3 zPM;5DfHm4!AJ6yn1#Aru=4Ht1-}`XhjS zc|vj4_xtf=kA0@fcoTQ0@X}|)CA&KS(?;$>$a-g*YCBx}W!!u4v;7PC zh^KDU=VQ1}(||8meG0l#M?M7MQoFG6)Gl=Gmo}qozjx!_`m2uu*7_dr+V96rT(y-? z0B6^JKM6Rt9X=m%?e|ll=~cS+JBBu2_l>)8*h{f|v-)KnW&WYk!v0U~>R#wSbtKd` z?^%x=Pk-L$E3AFQb77QsUmCCCpW{{D{USrh3tu81`2Dj!e3I%(_{*TtW**pRhjl70BTl(pM#X5TT~6_W5<-(zHt->i_-d@ zr1dyLElb*q%CckgAAl##Cu-t{B8xh44LGGm>&C>Z{rrUKh@EJhp8{95Zk) zxLrf`{ALaL51`vMWP#JQUV(FK$bbC**n1N=yNW7*yx!~1LJ~rg1Pprv5j7CZ#uh{D zPP&tHOgf>HP5^ZtFWs+`hTeGnIuO*@YIGD86nESZ6&W{Nao=#?b;fbr#pUNZE{V9K z{J-C-bMCEM_r9eAIOBZ&_tUTI)~Rz&ojP^u)OzoAG>JWA=Iiev|JLOj?IBw}-X5~$ z5$qw~L%!Y~@*fb-+C%;$;2ffcd&snv1%QWp$gDeb!>K)F!oxje+Da>M{XJyX?IH_{ z_mKYtSh$D$XTZWeWZFH)`KSYIin;w~+V4ujyglT<0Cpi@_4bhIqr*L9!oodd`s;8H znXqsVnY7^^GGXB!GHF{;JN_OrVgD0*$X`IdjqD-+6?nYDIYKyY=JUDSL%vt=|Aw&2 z9&#gIHCic%carOEq#Qn^{r7KS*!;2IqTSHvyDM+*6ZzOz{|0dO)x19y^9FbC_P&&! zeMn57GfgyhT%_T=jWl)Nd8l*k`|*6XPM7LEpIze}N5UepuY5!jWiYzG?>IuwlKEnS zjI1*8{2k|HnNl0ie8*7++u9|NU1zs;F&#Fb492sV||WO8J~k6 z_nl`WCw(X0$EL10CBynl5kV3s2p5J{ob#+9Khx z5-vcfva+n?bv$5^e9%T%CdFGA;AuJRT6zxOyp}vpuz9$)N1Bwp$m1lyd8O0bJc7-< z?mLd8>Zfi+Q`&{D-AplNYY0c?(8YI(U?R8gN>dHp_(q{bn4fms~r6p_~Jam4i z?SuA6{-Ir*>D6tR=I=*`Y5sn6nC9Eiw9MTpbp9xCBk57aakBKgQ)E$@xgL|o!`_zQsor)WPF-JykocsFWXQ!bFpc}sQ5xGH zI!*SQcU5^G6>)XVhHEPI-bXcq_}+eW_>S3`O!xMqk3&4UAD!&b8tCxsKJ1C$lUxsK zGA9G3>p|R`J_Ye$Z+hyP-Ou$N>hM&^k=Riao~Kb>Z?C$Qc-~(1>4^J#)n_p7?Nwil zxavUnsviRw2G>?co85i1SKUo|Z?Bqd(%-AzDsg|Wn(fu!tGH4kiTki&LXs_J2?gKn)-`e%<$$jg+z*XDSy~siG4fd@$e&@dR zl}OVobKiQ(b@;%J->G-jsp@?Q_rBhT5x2TUA&7SceyraSguJvrpsqO9PUGgynBdaS z!;PC!#Az>ABcvTMPqicNVO#$JnBON6k8sMyJSK1-$ph(Co>czGNA1m~q2KW7)JAj< zoA#r7*k#=NeyoDH*8NoXu=jbiYB$#a=I>!&i+E^9oL_Mddq2|j%G|>~0y~njh2Ldw z%r(H*r*$3IHR~((8@U$tpK4=ILRn@_y1M5*>y+d1C)+Ys-_L$ZM3=MURORO>C9jtvR9(_ul$SrYzZp1DIZ+cY7haT!d(%-` zu%Au1+Rv+)kJyRQyc)2q{p^Sz%I*6VmaSSE$L!V8SZ{G!EWg@@j`x#1aDGb4N&n3> zEz28NmdRLGwz(wcw!CHA^+0Sxn-Xs`PwYcb{$96@gNg1#zmDmM z>t44__x8GPV|uXHO&$At-Im7N>sA`gAk&fwts)G+v0nB-FG0}-|LomwAU^1#9sH?98F@coB8^C-S2ey zMtj|skGI!tc?5gi?;&4ruls$7XYF;rA8@X5gnQkzl?8x@d)=%%bkV83Zo=`GcwU;e z(h8Wr*Uh?JWMT1M_XhwA_qsm_Sh&|syXSns-|MFRt|ZLc>;4d67Xnsqubcim-0LPR z-0P+<5BItW3-`K78}4-z7VdSEwl&!6ChUJ=ulq*i+sIz`hk?f{oJ)jz-8>)5z3z_) z{znm3+3TLVhmBSm;+^l>8#eL2_n%uZR1l#A> zv!B_*`>b?`hV&R8)pg#riP)^FGa<&PduUR=~wzSuXD<77h zV|kXF7t6!4Q@(FVdB+fA8QTJRKx*aF^dZFkaZ$`GXTA$ww(gE~y4U&0YB;b7Fk+rD zev`S|;=BEryHQA{{SmYVN3@CawM#ztF3b*;U;$CTD`dka| zbu9gJ@LCLB%oAW-P9DZxUB_|9I*z-#)VTW=gqD%?ZI)l&{04b2?&>Hzu64w-IIN=! zGV17emQT}h=Oc}>q5p{H=e`b36dlkWc_xIolTv?5i@w^{r>1`c@$=y;fSCuncXf@8 zj#XBz+B7;*9w`o)opRG=;cacQe)t#G$wB-uSK+snziKOgLtMwS#QQ6LoU8vG zA+K~AbSJtvG1oLNkFl$nyl+#Xt9yIzwrxF~+qZYE-P~y`+-xdzZ|&~nyD=EgA>P^3 zv$Y2@GM-0#`;MNi-5Ykb_jGr4ZxDDB;k{e7wD(+Q`7|T07^Itqc-M~39v^2qU>%)1 z+PgM)c4&Sx0Nb*)r!$1l1bk=bx*ZV2%5jw7`LJ1pweRTZy42y!791Zo2e9_do2`sT z<9>7d_8o=IojW@>n?q~NjN^{Ml!a|82j?NR)+x2MxwNk|WOl7g#G@*NzI6UY`^|$s zT@QKF1URn~WsUDX)LD)Iz&Rgm&Y}Z6sz3O8w(F?gL9A)}u&1MS*s*qlEhFo1`;PV< zUE6nbt=sPO!aCg2-qo!-XWeymckSqE-`sUMP`7qFJl5gb_MV=u&YnW=wvP54oes{r z+`e`5&d$QNj>7iKw(scNV)J5suJ37ISJ<(&uy$*2cZb*p>vVHhcV~MKRKKBfZBM)7 z!#X9rupLS3Hd-F6*NrsD_U=MEY;)_SU8p{avLgMozzEa}z zC4Qd77fAeki61BN3nYHL#4nWiLnMBY#1~3@*;1#&6Ewce#ZT1uau+{I<11YJWR0(M z@l!N@o{OKV@$+5$G>u>2;;o3=HUl+vZrF;}e)!N@w42kV-OPmj2JL2Du~OPITHfz9 z9R)?LCu%!Kfj+bC!1K&P8ZY&O*?2iKC&J6O(0A&Z)l$&1-ONS$Y>%Jzt(rIc_Eg(N z>ueFe+Rym-{(I-5wuv#pJfTVRi~TkG82TLTV=ONEu$YhAw`JLHga79HL%#zbc{lFat2KG~Gpg=kRpJ?e@6}M}6Y{>FB(U8X?g%8*S*d9 ziG2cSp5C*PRv3k}N0*LA~r(ni^SwT+$u`4V+x?Rthe6YvAc z1lV~gw!7~r-YMQvlcdAP!&b}`-Z&1w^m0B+bOsMFWsOIQWS z#5S=Q@!Ji~4Wm&K#`Zut8)*+`1CLj&_CULyi}rAi;4VR!pS*oi`i-PEb|#{cWz#mO zU)n~^c4C=!UP~V}I67i>CgTZyOCbl_iGIVDc`PRkd8q9WXBmF8F~X1SG}l77wyX1S z@3*V-5l_?S%msk+(*A_Li9hxQ4AV5t<|3id@#9Lw*_JMpa23K79nw|SRkeJIcoS@F zMpG2rdpgRsTnzqN&NaAaId$CoXvEnkQ*YFP_Pdmi`f10H{camVUX+t#Z!OY#N@JttN^CcTuLFEb zX?(o6hwu5%nGVFmw#0gCHpAn43dXi2##{MS=u*LTI`AEAW31!VhDUP>_~!3!Hna%8 z%~bI6Q`Zks&PLi@C-8WM?M`i3+uVA=+ko(KPBW`k1v;qKM$&Z>+av3InY^D*@mTg# zu^_-Tg*LY^5ZlJ2vy+waJN@iBirQ8;DwFQ+wo)n z)q{|i$`z-@_NHepb^w?5+KVuS54g4?ZL_p@jstZ)h_YB2;YWP>%YZ}6xYUMB%gvhx zh|<#@tWCgnL%P|RJwLVvo#q|V8PGjm=(6PX$E?%|WtXyv%vw&3i~nBZ4pA0|_!7|u(DhY~j(J-n3ItBXz99nlK#e?B~4nh9p_k% zbpHYz&Uf4#r3-J)9f{^NS0IgZot-Yx=Cd0xR;9oq0`lrdnw#&8_D}Sc+!)S|qvo3u z($e#u`DPICR`6@@@7FQCmFp_N7diNPbRvngA*6Bcv!PT;z^RvW0PiRbl`17n-z3$| z-Ew9a>0!S$0@zG*rCXqsIS~0Y()Wx4k5}0Da1J!b&4GG3?wF4;-%`>Jbk&vB5hOYBEn+jmT#GuHvmOZ^D@NB$~+rSY5069r$#de9p9l+B7tjNItLqy-L1O!ts^PUk>0ttvZgSa^}fM^X&<3GdBs?feZr9C79NT zT|EVOyh6LuF%9c}CT!}dg7-9p(U>M9?^<=A)>W*3+68qH+8?$E?E9)%|4ds`%NBQR z-C9`RxeE)G>&;Ft5?P;{t3Qjpys-o0*W(x3AK_|$&%wQKf6ql+%M;V*%ng9^N~gtT zRa<*DaA|8dO8C4io{*p_PtfXENo_5X#j~}WGHmVn$jj4^9c$kNSZHG}0PKK|XnlE8 zj_^k8>xIDMRn5LwpR}(R3EqnlM)u|BTctizdWJ@|P5XX~dr-77)+6nxrcc|^)qNS3 zusgSL>jWDj*gDynhDBCIzAq`VRE8wBrmgt2{1t)5f*_iT+e!1|*Tf4e<6nZ+_ z*KMSQRZB_O*_)Y%XJ?GR1;5bF2v>U!m zGm9rAsLB(xp`Astcy{*I4Bz!Gk2Z+8NApemtTgCkBOcK06O@v3Hb zv;q3H_X^(o5Jq-aRfhUDkg6Nc27P~rW0cn4vF>S;HRpM5XKMkDFEc9@9pZ|i7oOD9&FfxP4%7~SWXT>k>$DZ+?UDMvpvSY zf?sHRgsbiSJMMkk`wzrb{+K>zz6Ln2bXwZ>z6xC0-hWE?^(>x{pej$$hPD^U;@MtS z-}_(4E2SqpAI_O?AT6}HZvu88O@O&ZQ;unk*xI*%$E%vHY2W*8!TS!v$kx(%*R1E1 z{sY@$ebTmS?^AT+bWC^q=0f}0t`X%sqRkJ15EB)4g3*N5~dbX6v7l!1=qk2v0JFp?vA8lxN zt?^qorkFjQorRt4JzX5dZ7;0t-GN!Bu6@)_k7S{Z9b$f-jWK>0ztF}AR~x$r_r8t& z9&s&KOrJA<0GwAkEp21J11@dsj}rbVizg(g$`iDqjYYC}Hg;#mSnkirtG3Eqzxfy7 zg*NwBzz)&UUQc6wwNsrvG4)F0oSCgVHW z18sI-YBt;6-H}+aOG}r;h~%T)Hl3QZTgIF53+X*w5~1KiMdj|MEmc9U9{a{G84Ag<+#>2u~pz>unkKdJ6K&)Rl}8PepoYqo)COAe+dJ6PezKUA6*`S2eq2z0)pF z7rZkNMs}HIEU-Iy%l6KA z4xXV~PU8}`9%nc46;^xZ`Qf0IofGn1wTe4r#qwZf{|CTmYXs@3_tG8pM#KBIxV&*-J4$mT-xZl2vhigtNpn-+%s`P$G;LK(-FSYq902Z z>rkx6by#)145#E(kLxi^@4+c$2i@f9aXI8m=7#OWYqwYS50yG`*aM2>c3})iX6gI_ z_k^7OaQ*@Oc&}#$RwC~I&J%rbk3G^Y_WsWYoY&3GSX0C0RF;r{W7?C5@qMA??N^*(wL4e0*!N)#Mi zX*O+(7Oh+Re^haD2t+HG{m*Urf2?o9Iq$H=0`z~wF;p$vgVQQECd_wZRJs2=&7)cg zqN2DP+UYy~!FJj|I4o{@<|HIwgE?Y_>aLv)xfe|MS>vwGu={iEWnifeU5q z$oq@D`&Dv(7S5saY#hg%j{?`PS>UDTQ7O}Uz|wSivq9(IK4^Q(s%5({z+H3ulQW+1$jqkLlIkAb9h$rTAj{!fY8+S%^bEf<`vqkd7 z88oX;ori4&oI23+zm$I)U@Q}Ln=V7MxkPwn(NG6jG~0zn=O}(Yyw9eaW_pFrw?mbW zboNKRdOw4)<(i-mKe(2UE9n2Jj}ceaF^qh4vkV=s<~mCbc<&hnwz>-!ymPE?Nw= zo8ThDbYq`b?diOvw-cv<@Ek6(khB@H(;FS*SZ^Q3we$a(rlV_TXU_&c2+JbiDbDS> zHgJ@|qu_YL+CBhV;NnJakIr{z8T%ACWO0X&)@|K_vbslQsiWD^4qtcgmbFk#bUMk+ zm*>PMx;i&tk79da>w3Fc(Xn-l=6`g=W9v5m`QEu^E4DF!zoiq8hP&s>kBN7G+~eu8 zzR_ZOyW8>j@P=;pO!+Fz%W=fgu5UaR^(yo7?W03D0o+rn;DLP1$Ngy3{0{NVs;TxY zzh%@>tQ6&uBHl)%oWti@9*_LA9sUdM*$!)-b+A0w6^HsJhTtChFPSKgR0b=9IHl|! z$;e7d zwSFv*uUGopSg%K$5h)AHN!&OsUdQtLE&9K--_4t=JwD003)a>^ALkLDwZF0{`8+Y- zGsb>1vD63M@?Bn!1l%r|K_5JSzZCHU7T~_Uy9{xEDUI!#{J4IVT=C+**-7RCz#$gj z=T#UP8Y>Kr42&ubZOt9k-%_d+*|@e8$Luns>iyM=^u9@lD-pZEs{3gR~*8! zSz)YL#&gB!%g0&1`DP<<7Q}fB7BQk9F96jos@mrWh{IujLQom!s=>QIOA`j7x z4irX4N1TdTuTJNJUk3h0!5_lI28AlvJkvf7+~l4^Q;zoD$euz4c)Y?r1-@5mzB~`n z+uOU1>-(qSy;2i`zYpO|^-OMMn*Sp=#IZ7;`)5DGd$u=!?}+jJ_=S5%gsUHZ0`A3c z&&xr^CnB!CHm1*+CjrhYotEA^x(>MXJqILwau!cWP?aZWb?x5f2d5Cp0y=#zDC-=^ zB=QP<4(snJfG6v3M((MAMdymdZ*dQv@J8zOX~5$Z)@$;4gmd!;1@GwyqrD>LhbJxN zxR|S5KbG7Ch~7yQ>mk;=zt@gF$?j9KUTGKEdq%@}U*G5mBrrRp+qO3PIoi?nq&>(z z&fGk{_K5uve;jXzKTWF^M);)1Pwj_!JR85+`T6EK2zhZ#LAcuH4Y>Dh^G3we^f~i9 zq36C3?e4jVGkiWmEf4vS_62}Nc_SyKP4NZ2Z-ex6Fo`XWutFPTPLsg}m? zQ^aX;TmOlSOE_lXnJ;~28t?9y7~WYd;}Nw8Hixiv+$h0Q)UavdQl1v$`T`^+;0p!b zHB!3TPuqsPT1|U|%lIO*I}v}lX)j$Zc{BYSvpb5joJ&o6dGs1cCvp(B(zN%D^2H(^ z>_W3Ug}2)5PT{pNKZhBWw}UW;8NoJEjsR~nVICgk-Dc1$ZkWLKg?s-AVLJ%xT^q?q z*rkMRj$v%qk8{2GOo+y1*~kR)!S`dxcukmUI#d@u^vaFvbJ>6M8TvE8c>(yW!hH5<)QQV$kOXMgF5YYgw~X&uhuKF3_TOaQ zf&6BgvGEF^)GhOcFVDXdaJ^18+4<_)9DOeH(jWag%ldZ9W14w4!s_K&SGm@e2RHE; z;ys|D4v&|zuzYC2;}!eDDJN$Ra=y>z!8FeOC}*0V%E@{mABOx8ovLm4>z^vaU6w}eqS<^r;DPl=yvr=+i8*E> zJ_~Vu{#WaPeN`-XllcsI(nfPIGU`-qobl=S@qHRI5%SuUX?OMzLIF>HyB7cyuzOyz zr#jXc>~sVPZ5^^@z`EmneGGgtMVu%V_#P5IV?7N$YD@l$kV`MjkShK7#L86jV7bVD z@uVx`94RB=ymxT7)_n}qFhWdeGZ$&p9c{?R z`?}!i`0+mxr%n79LdwBBd^x@;aPrW+iO=}Ak;ZdO-$KYs>nct|-L|+i&F?$FCH;31 zs{K;Ni7a~9>Gy@V;u3EKc=~0tasc-Sf~z`Eo~i?fmoq;SJeBE(h*PE?Bh)&&eljWF zPmq=>AM*UE@M2xDZnds{4mkCwa#Mz1RN?VU;i2;U3~|cy-w3rVq)+FcGrtyErm?(n zUB|k=+_sbOOqjLd=x~T@A*)uEOS=b0`s4QE;%FxROE0w1zz28B`zpR*<#6j$yvMf! z*zoMP1E?3jP1$ya@{Dl_2k*XP{L7#zm+;c9(nufIGYR_&V3@jLu|hE&{HqZ>rXW7c zKhE_Q+jJc+{e1r*-{wWeE`{rP-vEzde}9={0LH(^xcUq!KF11o1KwYf6!-(;{=XQv z#D0jdUjb%iEl>1SWIXU2ON){D=zcrS_$}hY#cK9XbS zfLggY(my&}DB>-Sm=n15!qIY}QrvS6&-R@I^Rzduwq{!w`;oKU`2_p@KfY+j_A^Ue zALC`z)>}Oj*Y$L4+_tu(eQif?z^W}eDzvkDnW{54bu+el%j$#ly#$v)_nd#yPG>;R zk%Id4t)?z5t9@s+JMwXG%oL*5=y=Qoe{JQ&I|}i*bss*&dYyrOcoyJ#X+P|#`=6>_ zX}7Wdb1hxaxAq@Lqnxy7?LX!qK9?}ioDlTIjJF_dc0O;8LC8zndz=P(^qai2pE(w| z>}TeAd|g{h$YsY9Sgf@?7a)vyLfYdI=f(byaFu@{c^-5$q-EL(2*dBS>9~jTo>T>o zX)J#h52jhT>HzP2e>Cie7t@mRrgd;C_)-U_AymEiF!f=y+cdwNIRkXOd^v16A%~`g zx_KyQe4lm};-qIDaT#;wVZvMGdN|^gb&=pF^%dtwUQ4U+Vj6j5<#Qe0q0RT}PPh5G zc1b*b-B9~!`eVe=shJ1VFK|5Tw||a*{r1m3c0S}PxQ#KlUlh4)+hIG0>^>5NoutaR z>&C-#WO8a-{2J}5&^yw%x72r4so#wc*zZ4t@Sc*uxh~OUPE6oB*vWwDn#yA7_fPR) zOV+qCL#qcn`)mh0-GePz;`p8E!Op(e!C2p#$JvsHkGBMP)XyV4yd{FS*n>Ux@s8iw z9_(Vt!-t)o0b4Ene7rRou+gHU~*4-0*9k{{N+LC4FN!^#giG%fVS9iZ`b+le^o>5F4M z<;;5Ft#WNZoU*PH{G`6({C*+xBl=MtOOdbdQ^m(d^Q8yN$FkmhANwN65&GB_D37)g z9q%29cjXw4`DOXm^O;BBTQ4Fk^25$gJqj@Od+J+PdocB_kM>~dTiZOC`qs4`Onocs zPxDaU>f@x{+)|T$YIFfB-0)=d{a|D()XD*R)Gml>gU*fTyF#a3-xK@QlKznsp zpVx$IYuC7LJ#z`Kuq#-@yBgg6^#@j}3a9qWF#Z7+4!@zjE&r91_2^;_1N z&|>`Myr=v=`+@YnP9Fs^NTb)*A3jvqu?xTZG}<40?H`v42q^scqE@tWR##KSec>j3j~ZQp&v zHN7VQu2*VJFA_1atQS=c?b){7NoU(n0UL3Enol<7Xpfca!$#5g?9gdTq_xh~GbCJe${+@@Q9V?-X&&NG^GB4%% z0>Y3lbHM3`EfKGL3-#j4<@&B$5m)=9j-G=b`U1Q4^ubbK(kP)};V8_gmsdOz?TRa%+ zh^ISrPm*g9FMzj@Ezby=9Rd|hdB2R4!HPh5FaXy?5W_~#9XA`hB6J} zdqw;{#2b)SrP0Ap&NjCry|4k_3dVe$-(UGR#1B*Kgl15ZV_aLUeezko{-?0Jsdn*rA`yZc^rQ;xC~3jG5^I7-ab z_`adh@rg3ORiSCz4<0J)8>sLoauNys9^}Zq1w43#=QQ{(@0s@OD&HB=eB48DZuPB# zdk4aqZk?ivX5i1O_^;!koLQ6BSJ<)QeTdV(Sl|A*`W=#&?wzxJa|}*9CqCmbev^5Z z;Om%${CKvJcFgaDtM6jlVf;P7=NiSGLI=NKix@9w-WSQ^&LF-Qaq@aULZxM% zDO$9t55{>|S=9G@n6#cxWquz4%wMC>an*+aXMP_=$UG=#7Jj`n(nNGvBhYfuFA}b@ zeG>Wje(h74`R2^00q3Q1egbjI`5A<&d-Wlo1B`iC-6JQ>n=&s2O(a*Hv@p*vNSVq3#q)kUKkVS36`2cB~liBS??SnM7tpJa9%Ca~+b#3;S;zLdc{1EQlg?CMg zZ0bWeUjK>bLl}?oo6NTaKl{DzcD#mzr(+W%eQv;J$7u?QPSv}_-o-wn_^vP9sL$?wNLU^|8*GmabB?wZ5d%pewvPf_>ETXFMSAd z=vpZ253?yg(PK|-=orYY_wWc7*4n*s3w^=e$Qx6I!D000cFrlji15nZ(TQyH=4 zOJf560pNSeqZ4Duh3%a@ehAn=acI26FH;E~VU_ZP0|D=tKZBRTM^D5(;M!&xcUQX2GVQOR4gDV5 zf1KveM{+HMYa6`}v}~6;_A;%p--_tr=W>AaQa==@rRQC7TI{3vEd%FK2 zOIDTc`BmuV)S-J}6}q`~=w4EVuB8s$%~j~;)uDT36}km==w5_6$ zx#dmY&3p2vpXNRDpikyK^PwN+J@ca9<^6ozL)G@4d2(J$IP=Ayy=UHwI&5BKo}bSx)w&S{@E~G)w@#`uBb42;t4K$Lwu#}D++ zcI1w81?;QuC626PB*zld&EJs5e!GANM!bDaJRw^y;TfKZfrieQwDQGo$SZID&b*|* zKN|64ArJc0b^EZ^!8Mm@DCYx{UA%_mkCj+{+6Z?D-H3|gnAzr3f7}@Yqz0qKO24f*{v4UoP)5%&BGoTmAfGU71!2*`wSzgwjtYw8B?3Q z+t1ukecw|zcHKF~!4Z4_IWoZbT&m2g-EmYom3o%l8&&$Y-ZZU~p`);ATYE=)yB-)u zn^|8&o|FWpDrf7TI9_BMe}-{u3Xen`s8D!@9WN~yEpxo7<9vUgmN3p|!}HoPJbiAI ze$3x@T8jMQU8KW@sO#z2`&|aOUb6S1V*NvPO&>liK3vCZD3Y=pt*&pp2qFDB`Rf?+QG^|Id{~D}TMbw^ zCM7(Q3u|V2)>7qH|NdyuMtI<-b5WIL4bmxZ8^TbQwSbY2mTw*6>=%|AUoL!u7;s*; z&p?=!--xWcpW8}IXLrQYbuP8T(1&t8wPH^Z#`99@J?qS#9_L2Bl$WMFXxIk^Ys};61Nqfq-@Se8CX9ymHdt!YFbr{lYL7KC{ zd<*ZDp0?xQ$#s%T1V_h4+Ysk(!Wh$oFn-1jZ@xlY+l$ZF-RD})0FBE2DBvg zt=O9O7i{BkT5=9cxR$d7T9#AW`~c$Gt|NN*!99TUN~fjgus&V5ceuCJ`JX`vuSBSI z_fW{iG4UAk;TaX`mh!1Cm`>iqfX&V|n<0d}vgq3Zr>r5(Xe%kEMsszmCCSW(^_Z2< zcnuobK^DzK4I0`}7R@y^XgJTwqS;@AhPItW^8}$;EAzb(#A#z=5|$;bNVreJYbCr+ z!Y3l!E%Q3^Xf|#RMm{s;p1kJBJ^8^D>^zM;7sx&N!c;7ryib;U^2Z|gOIN1CSD zJXdJ^JcwIOrW*yHZJzZ*pG3aT2R!m8C~?9MNnI9!!!vw3U)^+s^VQwpQ*FN5hcr81 z#mvAPG>pdMl4w}Vfkc&OBI5aKKl7?FU%d+HoIKtC?BX$hIM$+_Q0jQTI@3G}`65ru zS7(|7xW{~zQ9ECqq|ECFhTU_PIrCH-XEMi0IdhQlt~mV}HXf&6&-gZ=W1L3(=SaLy z=x>m?U0^Tqoe_9<4q-jmQm`~lxtkEzv6!x5vu>)*b6r~fdF~6qgICr(_b7V?VcQ|j zb02|u?h9Kjs(BGYZ=Q>S-cQSrc`g{)d2WVrH8jsXxB9%YfDgkDR!px8-OSWHwK{%e z)OI9^lOvEVIWgWhI@o_s@?S6`&Y*G`Uy4gau+RIO)O#GnSq4TadT6ov7~^#a$%p*4U$_mhC_jU7c?hoBZ zSAD0>WB<*A={)w$fDIG}hv0(k9F%%M>DD`to4c|OF;9)=uAG0)#r*Rvfa@jm+G zKbS#O+xNk?X(P7&CS!YwB0VY>hU^d$qy$37ockwZT~>#NUsfZ-Y$ZdV7?HM(wwOyD|9BN~4a* z-*3+!Mx6ZE9!c|F{Md#+f{<4_Ek28pl@^}6@OkQdP|sa_wAG!v_!vUwf0u+GM@Zfr zFOuF}>G^NO8wh^+6J-g`Sx~2{>(8{hI;UR9Oa05|a3Avybb)cFpQhu^0~zB^)&s_f ziE|dr-ye%5_ePq`2atF2kb+x>B0PCG!NETWcyuVijg!oW0E-VKI6T6lg9yOmIg3vK zruG>h*C+mL^GT%Xc$nug} zZ$Wr?-s1CsslU~+Ds@(KR_G$GPc(^ExBGrxVG2-0zjb{N~fjQt9&~3PkQF!TdmG7eOtosAk=w#2jt=}JZC`}RUb?z|L+6F za~9u2$g3KU8%}gGhjc$^B~^7gJ!cWp{ixNFRn1S&S%h@|uMVA_vk2*aT8B>0S%h>y zuS2KjEJC_p)}hmL79riQ>d@&qi;(U&b?Ee*MM!t34xOH}2Zp7JEekkFO zCH#qmKa=nm68^V@zn1W~5+0WD9)x<%g1qUo(c~?E`e)uV5Bg%>Gave2-ZL-yTi!E2 z3|Z|x^E_GZnJ@k0;GTUj%g^?$?St!Ke?&TeTu<}QS!lcBIg39b zomUoJc+SG7`%9}Ovtuy&eEJz(Presv{*S(dGQ{-F=5N5^McD~=vLDrQUu)8zCHxV} zMBM)Xj=yeoM#lKzJ-`XiS=mj-IFaP>bzPX@6zh`@j3A2mDR`Vxr=w8 zkLS6Iyx=w=^wy&uK-J5_6gXmhfJlbzAOR1$dNvb{B-|2@EcD#m=vq_y9K|_moq7yI z;&?xp-Zgp{qp*voF$%ld@e{!?hGZM2eX$Me8qy&2%FZ=)X{+ivihqQ@)``#4wV|URr}}Xn1F^qi8=Z|b&MRk0 zS%`NX)=g$jlE$5>I2vg>X7g$03XQJe%t4%dk3q=!GjVl{cr0ND9Us;a)8+vdjyVaB z@(9jU5U#!)FUX1Uz)$CyD$4?-Q(=!tr@!u$mLjQclBZv#WvtzP;&QKiixBLOt*t#3kU*D~tcrT5S^2+?fZT zzklYzw@HKbk{!Y`^h-Mdr(er80AaL)?_XfK0dydD+~W}!S~yb;>)DADWNem`%{W1cnUj;oQ*xg$5!AE0cj&K+qt$+_c9(~bO*w><-~75A7s zGHTB(Y@_Vn8HgSmXEN8!b7ni^-WiBq8;{d3V|-hD2I8?2*E0~0m$-ihqCl8;2BL_# zj+=B{nRQid&gs(X&pCI42d}I-r=Ee}oReoD`UJNhp*QD5K_93plQ}0ix;bZt%{4gZ zWc#{C+L!j_1CX0=*1z_l^x2H>MH=TRd!&rS3+E|UB8_b|q`69HbZ#(+IB|v$YJS?z zM*xfR1CEaK$v2sn-oqXfzN40J&Xz;REoH)FjKn^Rd5i<*kAsfS*uy5?138zV&ZX9( zxdhKn4?~uW+DsZwmBBOT4J@3JlD`qkfxWshZ64?9qcQJ8Pq zcU}NKc<}&C!9B0>Lc|XUfVT2t#I>GVvDne-jzz5<9Ua1_P5FU|RjcT4y!C{we3pa# z{!2YtwUL(r7TU-&U?cdRT>fUH=_URpQM2`IM8w|d!l~Oux}M_pOa1fw(X2_==06S{ zYWu%S?v@!h5yN*Mg64o3BHh`P_;y=9M$AN1T_H z0rl^vY5i;azXiB{3)1%g8o;yK{|9XulI{OC;Hq6{-M)c*gZ6*3wEx?YrdMYBZ=lzh zk{776^v*JK{=|AzUB3}B`nrA-;##M~dlllW(>F_5veLA^)epP{xby>W&Ef^PZv)KV z_XEuH?SO@TfN;vm{NIW6NH&xtAsg(#Pg6TkKR_E%KX3>5_vXwgCpaJ_x)i3m`^-F)ivD~al=MUE4jDq@ui{)PF z8UFyvWXA)z=aotW%(n&7h%L78UTyRv;N#oqM-eBl4I#s=Y3iA4T|1{!Shs1k7;;i4#NV&4oR$0Aq zea4LuJ_}s>hRUfH}wvwuA z=u_*Oe&Vp_Cw|ZSgU)As9c7s{iTzTP&19eRcjKSIh6c$7ld2?souM#g`vzsO^5pEj z+WWTv_wD`Lh-*1X^G*C_PtTd}AmpXIuAk(++qe8)6`JoyG!AbWbdtsU2ZE>P&c2H{ z+soY&{t%(&t2X~*z#{oj521XD_mcomWwL7&IlTJ}>CEe=2(>(%T@c3o3B0~Ag7MuVKZ1-& zW2`-Tr_belxGUZHPc`&)qZyI)B< zajw8lFutofrCg@k{;Jsv^FPqAPiSB;l;Iib4S(3KehYo5Z{WT9hQqk`eZ%h%*Rl}r z5PtLx_aNk@ynNsAhblCGjA)#1xYP3uKJPyZp8AI0BhL2vCkg+8Q1jI`e=lGW50oa9 zPx1a9;HgaN8~!GF+-LJ}a*`&c1LTq8MjWnmTG}`GvZ-%)hWG}aK~Ueoai{u*{kZpi z19|wqfporaAg%8kNbmaw?#+b0A?vIJvN>Yk@K+EA4XY6&w*G-H4+#B39x&fOG$9`P zhek4>k7$;r+ zd*#er(UtBmo{s+S9;8no-Qpu2<2M=mvI$A!d$-t+Erxyi=Rs{*kw!ayTa`49x6T$l z=v+tX*jJ8MNn=~-61{|UVZY5HD$lUp`f1alt2wGe(G7LTKH2Fo-@-Pi_xH%XzGH*m zJm$|o4{{3hN*?~VRTp?`*{w{UBu)ICbYy+#e60U+J@*V-FNL*u!HQkq3ec#w$C@8GDP*RRJPxu6SibF#J9R`#161qN7= z^XTm3yb*=I)>39*_S_-mRJ~9}y}#hJ_@3XdQn=pRdO-;oUkcpWc-HBW2zjY3@}1@W zd&@c2;TXtWP3CN?Bk;x=5p}D5-x5!zbG`d95bC&oX#`KclVG{PSuecDAN1+IAF(o` z!8d17->&}LnV{W}oj>0OE+9T^!2b@%-#lHc5`N5!K3(%t8(2+%iEV&qE`1yLSzrU# zi49x~x(pjgIK8M+b@!^CCD`+`5mj(V*6D}xYCTg{cklXMzB`(APQSvw%3b*GnJpvr zlxv}Gv<}yKygIyl>PhQxeFRUQ{n{vS>XrBSi|TMwM3ZlsM185e)^-n44!pm|!#P*{ zE#b63&3l`NW6LVEJs$j!N6Rx9nit=3%X_u+G4N&ntB!Z}!#GDuyT}XqUIe((Ugq&9 z9_3L##CVcN-aHQYv`OlnPb@BNVLbLZ7?0U@%;$hz9%muhFPQPSq=ueA-b&%J)q*%9yky8kfp zroDa0%7T3#gtRvfiE#8KHlJ zNB=pG{(Axa7li)vLjOgffBkWBnZNAO|2Uxks?dK$=>J{l*?-Nla^_puPwBls|M1^K z&-WcF&f3=a{ypCPLh%7wf8(&z3VxjHT_f#=`kuhO@>0G^!?^u!23nQAUx755kK!@@ zUi@Zzc*0;*fy3>2s zgU^R!SpMh>DL3uW_qV?UJ}*6c%Y2CI(-0QZG@D-ujh0n$wXbA6#&0seiSVb-<9zYTlp8y(y4eB*5MYoy~F;bZ#? z{GQNk^IOCR21n$*)DC}mbYJw1#zROij&s|RXK7}e-yvSQI=&yW=VfP`X6T|aT8N8l zeerDbP2>-FRAlntLG{wrN!UH$J2F}+ltu@vT!&F7yyv@e zXw-HUSJ#>tkMWz#-vnRn^bbf^T=uy!Zrqy|#-u4e#Ly+686s+XdsXp}75>2fAJS3HtEc#a|Hj+r_aqJ#H8G zBJQ_~za#Fq3*!6jq6y{q+r>1*wO#OD+r_7=w2NcFFKibd&uACZ!OL$Ke?gtFU35#k zn1OV?GTKFQ=Q!0ogzs$a=_osG z?d1s7)<~=Lw6&N%Z{`X;ZH?_UPRp4#tQqi9A3TP8-_{rpZH+u4hXg;>=pJA-AAAnV z;oDjde4cM>?+$$MER@H$wK<6Uwnlv4){aKHZ)?XOuC~T|wY7HWBFhKAGs6d84BXHM z^JT@ptuG^;%iD-<6Xpzgtn`}6`}#{Gqh;pQU&6~UhX+Ua;W?Xzw=mhH;%*+Bu&|uM#>yoN zgq^H4Gsr1V`#BD}u)C=PL!-qC-hE^lj92y#mCUY{X`l#X&*vQvTF%d|k7dKFk4E|f z(GEG;TvBE9nqs-Xa9yc9D)K43Fj7M2kEx)=&l`nX{J{|z)*x1^$*U=uHd5My93`D) zny|Buf(tdz9c$s-)Eul zNGR|m4~1VnF<7b;x{KY=oe$^eq&UQ-`()bScwsm7%JMim6ooB$Pof@e{UDS8Jnu2LsQCEU&RM>QMs;hV7TaSX=or=@j? zNB&A>JS8zSI1H1vTW$JvOAoG_XRxa*ygSg2dVLfsNpL$`JP^8K;n7TEEbb@ja)kB?;8aiKfv`!jUi;^}%R%BZ@w z_o8dw`?_Y_*EQpzt_cfuO<1UF!a`jWRzuehh=1r2JAP-HM}~e| zJ^e06xm3UQUi8a*U%!m|`ei)SFJYm62@Ca0Sg2pZ{!#jUSY7=_Q^aZ-?yP0MC`#lj zRwAPMwfCZ5-uwDx+}AJTp?(Pq^-EZ&U&2ED682#0SNpd|)YY#&>!0Nq*4NUjT{DsX z?R=C+^=j`$ue|s5%DAsr#zVal7V4F-P_KlAdL`_^)~ou3v+L?LvfHW(*42%y@dM{@ z+Q(gpa;bjpz37+szJ3|^^~-puU&2ED5*F&0uu#8*J=pqHyIoROzZmUiS*`zl^$dSI z;puf1%Av%^%~i26$N*RTgV>w zVyio{+tnzS>et?jetGZfmvLXejEDLqEYvSyp?(Pq^-I`;tzWgek+iZh7zPmT_OVjEA}7EabxYWTt=pY4hq$1wZX?^RrR2zd zx!zrCt=g^bdaGG6Ao4N0rEm1twEq9K(0DEN{;Y-SdL8QtW|m)-u7A7U7*~tzD#U=O zo_0z-U1WKP3?yvPi7ZE(Mmh8ca&;EKI)=gHY>n6Dvwc1unme<>&{Yh3GwR?569=g#w zviDL)y!Y#faleij59^4qu#N}|>xi(hjtKi_tfMt`>!^QpV)sxftCDnat6m*#gl@Es z?7h?x@BKPr+^-|X!#W}?tRuq0IwCBrBf|cf>WJerwxhPXb;My=YxRoSDy<3oKio&> zvq<4HMSS<9riIV=aGkOzvtKNX7YaQ)c66=9w(Ghf>{EA?#{0^HV|ZE8a`@dEscmgM zvy68-qioy{U6sv$2cGDSd4gpU04^vK&&aI@AD%xuBb(2*Egc}nf9896HjYSZ%dv5= zR4$hL_U=z)UI#kr>|^2SPqj=s?mY(?*o8&@|yQtm&y=Wlk6miw*zZB~N9dhVdB?DXpx&30IaBRUb- zW*B(E8Mwi*wCVV&k(s^~Wx;oPGV|S8yN+>cZU`pN)K}R&imxhQZ!I#|by>-3 zYq^$7kS}d^pOozkE4TG5l?ktYn)wv@IKD_Abwj+FrmugigWCF{J)WgIo~_Hwzne-VZP*t}l5AI4W$hSuH~9<-Qf_iQ6O zQ4Y3Uo^RfTd+G`Azdf{A^n0l-XOX#X9f+ieTPF9puV4nr79Su$E3gs&StIPFN6$C%UC{6uJJ;_hq9=CGIMRpXJu~*~C)@qwP;R_W zq&SRp%Gd;5Jl@mAY0yPY5gL^7$Zce0V`^R*>q2b-MU8CX3R|YeY@z6te_BJfFf|#E z#1_u0r|0wH@{gg`*%t8l&XjDSALR~hq2%e}^g6cCsElm8AA@ab+oi1h;TS&ZD{CHI zDel?4uF!?PSnp6;YxjeYkF<+Gd%)5@GmofuRrZ!k#eVx#MhT-mzCy;nt#9?j2+h8K zNd;qtB}0ADS731-t$JEpHam#p+Tm3q&lQk|TOhbd!%>jOm4GcGY_Q+HYlY>it`(Q>5O6kH{$Rdm6t7ZrV++c7 zyM+%8UL}5rus56G-G#o1ash{sw6Ck6(Y_71qa*uxm};mH6-{^{{auod5l@^feI@DN zE9t|dBdPS~V&w5bmu|~R{EwPG+Q70H+2zIa(4UYrm2U)P{EQj11PXf*<_BK@Y-rfM zn}zx#>??pxc(5_hehqoMT1LTfPK;;O=VPpXHPZC@2EOE&WwWsUOgL?WeZUCX)EQvX z2HVR%JIOA2U9o~)TXYC?>#l!KfWQs9r0rH9lRsXe{h&W7^O>m1U_5r@SftsFMXXNU zn6t8XaJ*x1d~B%LR~qIiGHaWx_XU_uU02##_Qx|LsF#KIse|=@ub@~MG#rQ5tu>znyvG0Ic=AY>41Y=np!*MQk#B-1%=$BS3t&BrG{lZlJYOBSN>(`^5barl*<3KjPf7!%KxxB<)4a->O(k= zJ_3C#yQq#nmR*$A2c~#a(#JD1^zkfDA1Bq;N5e86LHU=TU#I-b&rg>hk3&zX{LjfK z|8u?apHaK~4a>M(e3~0$4EMvCyFL?s3;sS4pK12lIM-2{;Gb^vqh-{x?Gtq_fUYr`3*2O7Yius?0g1dV1*;^z<@MPe(PRr>V(!1a0v=ySPwe@_OF#xcp#MiEjBFU5tM(qot4%o|8j56tmWq%Y%1lyC8PYW@yg#? zyZjBycqHYoSO3d1>K~7pOsV{@%P9Zrz4D)0r~Hk|xC*}5J=@bg+TPcPCqmq_J2}&X z*{wduv#X5n)yQ)@guD29Jg37kBmMXrAltsaLOd8YJ<49Wq&H1Wa%k7}& zoWNgm1KY@FywR4uwr}NFoNI1x^7NF8#;{4ZUTZ8)8Mv3pc1yo?BsNlS{JK12{JLO@ zHgX5b8TyE~d1XJjj*U!3M(sc7$JR*y%{2(TDQhD=^8mm?P1By|Lo*jIrV=Q`G&P8M=RuSDuH~(fw3pRNZfb zjQ)HFs-BWhdA}#~Dyf4HcrwrA$(;uFw~nArR@5u+ii|pW*c8k6VXu6Yu?aTz5wCoY ztX(Hll2Pjfk4e`WPbC%<>|8rBp472QJv29-@YhZ_zWX@JrfZ#_z`gn_ZJ+eZc#1Z` zoO=^&lb-~Bvk`w9U~qhxhweV*>23~mhp}e@^Zu6S2<+&*dOqvC48OX3igxr_lsojR zpYwFFs{0+;zeU%&tHK|iNVCGRY2+-%dw=02r*_*zCi{HIqBXV$5QsmQ4QjAM`^(8tPp>k}(8)+f%L zqCUQvp^tBQ`Z&L~J{p$s2+F^#Uit0H0qlD!b0EGaHuOW^^~$@jc6l3?=}5|3&$gCj z*gv)|rd0mBGwS;XUinX`Q~s&QsQo88%xHXDtN;8F$w&8{yw+ssQW~GFBQhu0*v>wW(NCr+>@GPu8DTOxUbo4X6AqD z$=On6k7(7Z8oP8yxUYExcDJHlovz5RyN6EE?tTG%gzfH^o{pB(w!4O9Jc9DCthX1w zGGo7f$rQ`~>x}aM#w-7MwaeeIjCKqw_MOLAfb9nDFMrs}OWxTqID&7o7WmOzo{TDB zu4sDGFgaG3eb&l-Z(^{2u#6*C*as{Q1^jkbO%uMGtbCJb+WzII?Fh&OAb zpu&sgb^J{J59#ubPE^tb&HxHGo}+Z{t$1WBWpm#+c^U3GzF|J}M}JD^lO>_)&4Nl! z7|+=EWBlIoI(&$_=9h@a)YnG|uiuNqovUse>skYihK_1v87 zgCMop|Q zK5N0WtAT}=(NC1*eSd_pf9xL|7{D3Okv>U?;dnb>1a3 zhYYNX891|$16(hCXUqS!y3luxHKD9?p?B6z9^*a#J-CcdL;CD|-ZYC&?3rjNCr$%B zd?+t{5AJl}HX%L(q4H&&YyCT0aPLH&1sw7`3Sq<(USl@mytw8-IQLlG{2mA z2gGhyI6XVwCm~LH<`L^DXHFL0D%UB9Q`Qp%KdG-cKk`~yg%{Jv zBP*Y$=AF;}`^Ws4w^f`1)=BPl)?%p5LUJiE`_QE3D6q zoVb4AApMy+eWQ#^iN0;11o$F?D+k+Gp?9QjZ>jI9QonOv{O;}?!h1>rci-kcCV}f< z#{#DBYUX!%NjuMjEkQmk!*L#r-vTG>cn`K@iQ~7>gPnb`gR$NA7FeLetd`i zQiQy;&s&1H_7^_h3c<7e5(f3l5ht&eS@?ka{rvzo&}3ZE!h4nXLeM&R-ol;i`4+Ox`IPu#MU-4sbh_r|rwV;=yl>L~YR>d#UcL=E zwnGzeO9%YD!u@d$@zx`a08)`Dc^2^>$~UKUvB|yD}HJIO=cV5 zymakH@zc0@(<8V#W+QGIFK2cHc-eX9%uc~e^N7cBtML5=j`ubIm*Hb1yhOt7681{C zOTtSLvTmrSS(C}~T@F|(Pn-~YEa1GfPFX+1dpzJ#oj}uCCs}D)-@1n4SXXJ;a%MN+yeJ#(z_-KxDl{dbQCa#Brz`^q)jryBU$xGGy;pdseGp$|Y{Pw| zmt5XlDY%;7AmYsLDuik?)MZxrh6CCWp)F?O$M%uM%d@{kn=6Btwo{gwvX2AiuM?6V z%NV6$&Y^P(rX|Z9r)ildK+7`kLzo3qJunZSpOpjac>4k8#k6&}uO`P@Nwa>&lTq`0 z0@5kR6A@;?v_7c^+7t65epH`m4^IXyFQuOpo>wCzKGz>2`Ec*+X$f$mG*3RYUu|0l z1<#fPZ7Z(3cs|Cwp5gQJ@Km;^Bc1a9E5a-o^VNAD`CXsj7t5~l(Pt3vIfCcpi}5s% zXG^}%MVOW|#%EfxtZ|z1x>0yN4`CLJJiY5=I+K4$xe==$FEwveM9>Ihqs(){4ulel&A#~}}_2je9yd@{Z;LfN>EeFfmU-hDCF3%I6UByPL?xL2XP&#iaw z0c>nyd@uGi`>qna0l-RlSqdKhbztE+1o+^{I36H&w4;c}->h#kV~8Jk@Ct0pKwr%- zw3PA5GM1@=cwcd>*vF5ah@95|w!5?kpGk1KxE66Pkr4kn+!wYKuX0l{SB@tER(1qd zcLx}kH5JmZ5A2ilDDI`RZ|V~UOm}f2IK5LZ<9qR~@v92>T+hHD*Kb%yPqF#1b+|nR zmc_lO-t+V?X+7r9#rFC^E|eu#DLUUPo_wMf%T*3llkR)TdO$Na&ct+OtUH~zaU3R_CU zyX_vyDmk=-bM`8m;KVF4$T@T)-%KnS(_Usucc8B$RJC<9p zGVK`*`mbJRSeN3vrH(?nFpAn1?UN zdj(D&nm6$oe?NX)`*)6!$#4*-|+A4I5QO3FBqMUT13hlRJ|5|7WY`en0n z0QaMUt2$7gsso3YGj|D|>fmFDQ>Kq2)H=F;GAZ9Dk(MeS^8A$WVqN*`HlG2UdQ`b7 z!)L4T_?+-ic|MIe<@r29Eeq+>`RB|Rg_db7FLm#1BG&!aZJQ0>A!JutV}DS0A2IS3 zbuqo2TzFj_+g05qO}Ltd2p~GoDBmFOtbL=^fg7*#-XD*LzJdPYEx^&8DaPN5c)a`M z_}l@Q8^bE5gTF0;#}wp2-8V9x=Xl^f;8E=F$8c@jF#aLNIc1<5Y``UPjPViB^p}JR z<0SI=M9e4pZtWKUv*qA0*!I;;=1Z2=4JF9y%ZU5qDVFCefJOW9jZ_MFbHDmH?2mmF zw0fobo%+^;+#+pEsXx%ZkZnNwLfSt2!vDBmGX3wfeLg3b?uQ$BPR>1=k@-MC;`zY% zeG~e80^Dvx&nJ8xx~}$ofwcMF^` z#q;goLb=29{onR#B7J&h|@zyo7E=s#n2_7rvT{R~~) z?df7gZCx}hBXyzgx5^qrxACL3=MMId?t7ED?>_duZ3CrZ<=mx9v7jlCbK$Q0Dwtg3 zBD5)YBX1Mex&5Wx6MGhICoqp+Q|<~3*QY0O%64{XVeI3ZuomoJq~q1>0y_@Kn{z!X zro>b)UOM9%mm3LI3KemZRCwnYsFbTi)4ckGia1Fs${tgd_I&WYabC|CD&i!m@a;&C z>e-(;>Wwkg`-F-(Nh-c|InFCdb+=FvCrNcw4XPQUTH++BW+kY8eaE{ods1zjD^$cu zQgQzvmM}@xD^$cuQsJ#r9@Vaw?1tfJUQZM%;v}h#u0i!$p(0L_YHosR`ES2>L7dm; zgo-#xs$*(U9TFguTT*uNrhv^9@TFi{;p5PR5uD0agtOE5>(f3o%y7g>Q12|PLc|)*2^o|Qobux z#7R=&%`6^O(&q0KD&i!mF!lGSk`{FWoeD1EB&qNg9FHogjf;eeI7uqJZ`GrE^{x}P z5yM@V3KemZRCxQBN44gT<+sFC6`>+dl8T=&k8R_RKihbFO!Y#cB2JPDZ$a>=5W%Gq z-XT=PNm5}M-=j*_*XM4KLN!(E>jD&i!m7A2@2b?0Tj zim46@6>*YOa4wz>FSzn9_@)1^y=#w=tE$5@4h988rJ}W!Sd*6UC}n3K-Gb=e*~jc` zyPbW}cB!Sev-8-!-Mcfx&P=;i3k$`z!crEfwe$}l${!UqAdz6eAPI!X%NT-03`((p z52#`=ff$H>zjJ@*-gD;e?cSvQr|L=e?wxbK?>p!G&bj9`bI*}+EuxMKjxajweE4`Z zs`%oKC?m=0VisX^7WV#7Sg#!ZI65oI8fO+^bk+qL>t_QC(9lZOZOkH!&bm-zmA`*J zs;Xo?%q+s_tcx_(k>uJ{9_w{x5k_ZWe5T}U_Kk6vS;lo1b>nb^(OJvkTMm^y zRx7gzqqFedr^1?E-13^o$})>EI%|c-ir;wac8@i~EW+rlOEuORm)wP}TjuK#W)Vhb zHE1l|8gDX-Fgh!)vG4&-#8(wUS%lG9GzRqI z(p#Hbm_-G}F74e{Uzqq9)O1M_t;vk0TJ zF4I_gD>}d|!sx8aHI{CT?aU&K&ib;((%ZwknMD|#b%n;#+rwv>MHrp+6^*60*zYro zFgok28VeubWbOSD4U^#rqqExJ6^!EVzSnMk+{vjrN9z!nw{hhrGt%zf z9pbp!BTMS?)hSq%LTNc~j`wr0C_RLc)>t};50NhX#iGu*kv@}?{8ug-*b|K)pTYNMrWl2i)=$I z$H_DgGK(-es|P-@s59ci@A=-BrMyO9{!CZF$MQaO9)L)eGPGYSdbRfpOg! zdfmH)tlTT&QkBz!HGnI1JI7vn_jSkOYA*T&W+4iK%7a|my<5S`X*U-gdM=dJgMKh$ zQMyuHbR2hfkpZx%_EM-`rj)jz+MDCJ2m_WG3T=y`GFgj};e7w4vdgPBsy|^A^7GZSOdX2SZ z!3U3etmm0U7_by;Y!ED(E0Hyx+Pw1z9_ug6B8(o_uwY4R>^yy0yT`%{Ey58-XI&*& z)IdlZcy|k!MHnaaeD;aB^`}kov7%=q!JZCi+HiB{1*fD)q+PyLF#)l*fF^TLnup=B^v# z0z=Eg61Ua8yP1`@`jl_hjuHE4Jli{4BD zaF74^g$MoCs3Ig5U9MQ8;#%VXD_0zAD0Z$1)*{%Mh7xD~>FlTd%G(6yr;2jTReqY4 zYeE^o$T2q;OX{q#UFc9BM=oj7`hb)3NaQ_c5k|M+6ns1zPCxg%?|H2As5^oqjHA@T zK3-q2&gYZy`D}N6q|P4KX9+9+(Djj+$6O!6sI_+o(i4krgjFfG*RD>YiNXi1t^2yb z+@n}^hilcBS$T)Bs#<%$Az0kqMxHsGM5T~6{Kz5%!V$*tTgE<)HB_B%0^^JZi7|6p z1FD$R8DJJ+^nC3UtP268e0})vUr~bf`MOqM8t~Z4r*fxzS7ha#zIjmbQN_wW<^!$XCr+w+UL9lpu9htd2w%SY2 ztIQ&do}OKTRX8mYq0Z`s-&}HmKRq`J%zj{`eRjEb|7PV~zVv)cu+Xsym)m9WW#yviOPiIa0VsU@lNBw%bkN)vUZ*q!7T!uLI-S zD|9Fxa%1=QyzaNgw-FMH{uWnhjlJ&OA6R*>V+|!2Hwl(hwlmA7{mRr@#>D(fD&u!` z@FVv=E8pZ(oNEh}c1`;~9=DbKpfYgu{Lr+mAnoO|nolwbJ{fjNS!wC?Th z-54w1?o-~cDR;kl%m z4@R5VMgTuDqs_lYC$aUO_&rpnST)S_(uRcLZIIGvrrYPkH-v}x)T#GC+#Jjl$B`H_ zfnyEECh}DaN2g6@tZD_Raemm^m^wa=e~mjItRtLSS2$QQ9IQJWEENvc6ArdI9BfTE zm>E*e45`P*x6fBxAq$_6uNG?Ak~s2^YEy41OTW1`RKtq%{DJ~;j$po;ncNW+&WF4s)AIZ-XxnbC@YoeS~k z)QVPhq*frE`H*Ft`j;iU&5x~&m9`5Lhl7e=jfRvhm%?Pr&KIg71ShT0u`oEX6(aUR z3L%-xXG5S$*)Y+L<)=buRk9XNSF{RNn1~D3R6Z9%6j2xGi0u&25xj|!vGFoX2rM@H z%2}llz)Wsytx_#mc{@yMsjh{^ifn}ikCsZg5o=B>;Bl#9>rH-+@})v3Tp?rGp@1Wq za1ooS%w&#K=Q66EMyog%rmvhYPT<5B&ItCd4S}MJ&+%;6X=Tdg5GcHKSe&!!)~T84 zQWmG8hKd>3$-H>^Fhl~dvl=(<^-W-13h?^gTyjJC{5W!N%hU#}h^yhLv3jR-Awor49Q;w=K0X+B?DQK}gFuRLdDO zK1-K&wEveH&Y6n11$@%$NlG&)&k9bd0t?E4XSrtMq?;|RnT@Apr}K{Csk$qX7YY{uqq#uABiB7xSdKaq~7Tqc@7i;i5cm=M6r?AU0)PX%W~ zbFU1i6W(Y@AtQHQOv_*@asnba;v-$TKk+N1M7*o2?#dJ@zCo;rPQP!80#=%hbhK@H%kW453i zsAiK*xLC!R$mcA~Ax$*pHtkK~Z~t%xu02{3E6!_aUfgJ;((G`K$9nNjZYK?48;yQ6 zm9%+wN5;<9Y{=#YYFI0`suouCyrvuLgV@l*EEPctY?>2d{OcrU z1n0!&Ds#(HU)KO-!Nd&RHk#uFMC3Ur3jb_V>&m9)mey4*xm6hiOMegP+`+$KS8J7g zjyqoJu|&^Hr;-@;`AV5-NWy~(BG_CD0%!ahl zpX^-Q*WKA`q)TlrrID>|E#k|Nwxx-LArsnEsLL3YRA;G%u01(fni$Gjc4oxD6fi|b z;dq>BjENuNisg&78BA-Y`U(yW%EH*?ZHcngQJoSQPGUubjz02h_9v*AP1CI8vCx2F z1ZGvGaVsA&R4+P2fdhHe`puK+0NR;6^(*s1_L1o0%BNWdeh-#Ji1M5xwIZ#P!a74( Rd9Br_Ni>{o=G?0j{{cZ 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%0D+|yv>5w9cl$y%SZtGI1B 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 diff --git a/sci_gateway/cpp/Release/sci_solver_status_query_functions.obj b/sci_gateway/cpp/Release/sci_solver_status_query_functions.obj deleted file mode 100644 index c1d5e70a85035b2460f5e0e50c0adcd4206bc875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20073 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 F{{sTnUfTcw diff --git a/sci_gateway/cpp/Release/sci_sym_addrowcol.obj b/sci_gateway/cpp/Release/sci_sym_addrowcol.obj deleted file mode 100644 index edbfa1b8cc1354b091969644d6c09e28805a6cf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22899 zcmc&+3w%@6{Xc0+scoSt6owPowMGcFJ5|cHDk+|cojGUE=Q=-B}Lgq2sEnYm;^I4tib7N z4!3HpGG*@%80!b0<6IGw4xnS2c?HeEpv*&%@QGK16%G`HT-_lB;bF+y4q5K=MPxC6 zps_S1=KFpsW0y~1tiC|x%K^}7kZ-_g57|W=Js09WA@Rsqokpiih}+*-^1V=po+ysNs`rXF6wvl490epayB*sAX)uR0{(9jkH|@UgY}yY zV(P^*hX|ALk*K-J_{4T!Crc2`e;Op{we0Had$glB-+#T*K z>>;<$n;-J|Jk7rD{0@6CzLO>BaNAn#Ay=2Zr_tf}H`cm5E_=|`Ncdn+ht2ME z27Fx(pQpgr+|EkboE(+F*hr>fz8yc$2)29jf4g{@rwN>SH2-r}qHmk9`zSd|n*Vqh3 zORce7UuPtety;g(IKRqdT+GvZeI8${Pspz#ooZ_;YW1s%8m;A3CjGosMFrCuJ?>_x zr#G2u${XEYhbQcG1y91=G7ZXnr@S_Muq|Y7_P9>M=k|s?L$h@FoMAGa!xwN3LpPb- z?nhH{xIOmfQ%K~ndpxI}$`=m#!y#KR6mZ!)P9eAU&Qsy`_@JHC%%Mw>W=1Q-uarFy#DUZ<}sXrr+ssK}DDW3M)#C7TV#dG!@S z{(RqmYfwVo&i`KC=*nV0wbj+snC8_i;lsiFnp%UPu)fnsg2Aj1`U%t>bzusJ4 zS5;%S5_gx_x&EUg`hOtHP@6m8^xFfWo<^xP$?XVZh1)CS8!It}87pa+$~)z;*dFq9 zv^ZpmdH*jN(nxx;#8$(?U}J;WAsRbp78L3g+16Qv{3R?HaInEIN4z?j-`V`1ez!$m z*PV`{!omX502j?6F2~er9LvgyO{X12Ha>8%+<3HvJ&TRXX{EP1zijRfzs=_F)cf7# zp>9URrYN!1<7>8KbjI|+_oQN$Hqhv8X&6eJeR_w(1s7qIgi^6um)*%mOVJe85O9ZFTrQrRS6*EjPBy?QQYV z`zY)Pp*-n10Z{0LXbc2+oa)CF2zY(A5L8Uh`3>m)P#fM~&W>gWrG{0~bI60BaUEPF z#Vtvpx*;-2wL07+Gz-!D5jBH#Lfo(F5tzSVya4-&IWnM zkmS=R8+ z9Aviy4$<^=5QxT-p7Rhm#HLAwrb3GFr&qD%y=SpsML;4u()P2*?D6vZR?Duc@CQ zBGnY^$7>1+zQBD8R8awHR5xdLtiE8&#=4tsU;f6#n&PLCoa0|iS@P{9b)e4ow(7*) zSB3U4wwB|Y@((<;%-wTjf7UhM?tA6B7Z`h)<1=2nEb9+nFWvaU?W>lJvfe+EvC+st zqnfZFb=uPN*MHDp$lg$YeSa3Jo#RJ0y#7La?q^S3{g(bm6&tl$#%|*HsgK>P%0Dmd zjTP%v%da1OyM?j+9Dm~m_ds67l#U0!dT-sbqYr<;*x4y0Kku&B-&wluo5t?Y&D%ej zH4`qjhvRRZvS{I@&i&ItCq@wr&IbZ$x`;4u`_@q&_ef;ht4+oZBvE_=U8wxhwct2ym=lGXLAA2kUf)}s4=&W@U|71LHZ=mR6)Qb*v zuTkwx9oV|9=lR8%*`tsBdcof&Vi|(tAF1%Z8PGm&{9ycHT~(I-!=nbfuB zt4$q0y=CIvuieGi+Z^xT{^8s|j=fg1Y1b!RudLd5CzdNRNd5;UUuWEYS19wd9VIN+ z^vn0rBRT$eFCJ{KJ2qlQR^7MHMxMB$kFiHYd~x8P&X!lY)>H(4kUQp#N3k5l@oVkN zX3ci53C?lfYz@!c9Dxs>N%EiV{9Se0?YCJ=-Zy^uR@>$FF*Q>bBJf?rRu#kbQHW`@#K;Wsf2`5p9$H z`)l94{>&THXI^t<)02$VaQwNGw-%<{fAhBS2fRP+?|Pt#v2`3j=bPNm*0UeodXN6r zyXIb2h!N{^^hr1D%^anTe#s?n;V!Z0qUDzql)wx94&SYjUSBlK7PJi(0{=!@2Iv(1 z>Y&1}?u<_28awSyS4;48Bm}$s0lW-a3fx}LU_Fu+CeCkd#K7)YkqLhM3H>JbZ(c$wBTTF5nm)2`AjqnAM$r)~?1Vc`Hpf#Cw3-b(_MD2EeMAzIQ-@}L~TJs-j9Y|>&ZG1SKng0|DH*EYM?=^1`~Ce#BO8qLL%4ymWqQJlUo)(KB){*%2R z{60_5X$v{!b~V%((gxE6I_ybbS*K*3Q|xp@=_BSjZ2KhCHNCi|B}+WqfxZP_5QcAy zB)R9K!4DqBhMT=35b6pfed7&R0^C%5TS%ru(%MW?g6YW;4>x-h;IyYN$w$j!Yv6O@ z9botL1l_^Lpf4P7AnNtOSH(bl`h$QUt9JN+l*~p+4Lnpkm)=#wmXoBSXjJR82i)}a zV%Tzq(&x0=4HYJt2E(nhE=QYv_$G}vg*Yl>s_6H)x=%|9S`m@w%>UN8&`B1B8!<2P zxB0xoe@nz$gkm-f>20TD4G%t@hLU!d;a2KU8YJx|@g?96NKrENhm+Xhj=qbub%jDf zz;1Qf1CBOfuAp_f{Q@DE^GHyP6bnB@l${E*pq*C81r-&|5c0XW(@hVN(?yXG{cjVA zT#BV!ietGH#ajsm0#A`Z95adq9XD1p8B4^8*5jruQks&eWXfnsX3diFh-Et)AI(I2 z!PQ=ZH4^-=gxDyBGMEn`ENuW6ltLMNjYY?C*8xYN40b0%MvmJmg)&(0A-{Fn{$ARp zg8dlZYa{RxJ$iSgK7#c;c3JN(|1)soSxFIYFAle z^w8TPVZBK^aZ#;=Pwzc`B0RB;6107Y1v(iW%d8*E4ahBLal?9pHp|kkss;3jav#MK z6ze~{ex`+1P1*<)6U!LWv8{KPHm0M2bd=2# zrz1)+QI*~I6ztt^(h3)wwA$>xUn4esV75VzYJatf45S;vL#Ta3wW8NilKVm3+e^gPp0$^Jl=aeziUtS z!&F*!LW{*P#-1~1H6}?X*}|#4v(%w7Q9LbU6OZxWp9xeP{F7Y6wTS1|ZdXZJAyH~b z(h195Q~|}c?P`gdj!NtM4bW@$hi0J;=2+TOm8746bO31F#e4tw*SG(%OBGJrH}KZG z2Q_>DzHiR~2s@az?^7bfAew!9P^b(04cZC4hcpKowdn^YY8QcUL9J*iOSHvmsl|@u zWjXjm4y0_w?2qlWoi(uh*k0ZfM6MAW#5HealZ2v!uT)hkt`vHts`)eS!Q$xYNKZXE z4WBm{Gw=}gK|StVc0Qgu+-Yn&o@KamSp}Xt+-b~;=OwsvSreY36fDXz8Uk`zH=c8F zr?IQ?q|Hsa>?e5YaHp|*@SKG^mw!u`$wPm`Q-?c^eTFA?R)MNUixP2J2$gW$>?p1V zp<<2;AS6opO_aI^Au*4SqqxrzqO#<&69`R1D2E^Dy@=tI!t(6_-7m$7{uLi?Mef@We;FlJ(r1q*E^2X%{T%m; z3G{WGj-_T?^tJe1)X+?($>9j;K{`D`J;LMyI#0L~UFn0tku0XA?3zeLivk7=AmBZ)d-z2{W z+`WVYuY{}eVzUvKyBh@h1`FfRH`rY8ZXvly?b?qyIth=DQW0d$@&G9f+HZtfF4}g4`U_fn1T?l8klH(XXM}R1xDgO7 zKe8MUy*m;BEClQVECRd^5Fm{*y2*abihWyJiujuTEHg2$$-s(<$zAWO28`smjPZ0*bKN5uobWskiMGY z{Sxs4wgUzMF@8tFfSrIh0>Va-n*lMJM{Wa*;CCP3YQXJ)YXE->*ax^9@ESns_iF+F z3JBXq-UGZI@B_epzz+e}0e%8_1K?+X8v(xrgzY0*)c+>HDS$r#ECBo|U?JcwfO7$F z16&A5cC7(KTZz;GE&yB%NcGePNcH3gBt9AfXowlf9+5(s>++7>=kaFFZinTJPx*Xd{ACl8MCPSZc?zix3R+-7qa-57@B(mJ8Q=1^yvK z@Hrge07s!D{3;golDTagdO8w}MX9(hgwt^^n_^OGeyiJ_*I3PyLR z%@q*xOnDayc}99v-~prN)#fFbYEWr}N;{Mn@I?~KJRL%_%jFelo3qPVmccNj`U0hb zRa!6*u<1zN$Rc3P3zg;$xoJlx%pzF${$(K$_6q0Irx%~!<-K6a`9h03fKQegtiJzH z@B0I*4^hLET&Tqj;R)!SQNKoXqHN3iKUfy^qSD&ayISk0{W)izec0cA(W`0-coDM?()L?@i=AwUPJKNKT4{yeAV-jZyEZQTCn& zAUWQLc|yC5=SB`xOxHD%u2C;WsjEp_3D-%N-KRnR@TpAjsYZyZbi+|nsNXk|&<3sF z67OCdM*oJoZHwYvi+w;#RzNxC)V7ZxkB{t|sPiEEX7^R%?FqkPj$FIRJg^nWAZkr0 zU>W3r!4I^Eb)5Z^oxGCQ!odAG?Pg>LpZ=p)^N|SxTcTgxeMRUZwP}(K6{W%t~ zn7zBGxxNXqVfvoOQo(ub-RzA|AKRC?TWlNs$EOcq-2l4kR-M`Z%0}c>*E{EG78-G# zs`u$sa$j{TKSuf`@WR?)ltyqgS%9cqBxcxqXaamO&4D#qyjmD{%hqV|_F(YNY8xzK zHVyrUrMfKc{Wj{FO>G04yqqArW@in+J>#8^Qx7Kd%y<*xJT#yiai_5fcp7+!Cir^X zx%@+#g_&=x#r;m&1$z;h-K zeTb(HcN#m4C#Ex?rlN6(xKRj|a9n8=XF;f#<5nUhN_haGb2#p~Xo#jMBJLA}M0u$x zvIZ9+B;v@0!n6hX8W387P#UX^QkxLMBnQ;Xqqq$SiRE}Sira~h=&;eWqK->B5TzbO z2va&p$->Y@Hq2#aghbm15wdXHl?c`F&{~8hB9z89AY|sDO$g~Z^)`gY^U!?=jpNiE z2#w*PClL}IENZe};@0ApFFH5$2qHwI>nIulHc#^S5yZE^TEz+O45gu5o&}7#Gb)8U zgV{ItWk|AorON@BIt9ArC6k_<`DttOR@% za5dm#fS5Wn?BR=Gip=18L=a{JfX@Q%1bhwfdB8UTDWAUpQaF~F^W#{usL#FRTi6M=sL zz65vz@Kr$USdF|1m;!hd5X(W4F96d3X%i==<&iO{pG-hnM4`9j+-UX-uyc!Ub`N*|^V*u9yjs?5{5L5fet$=3&ZUrR!-3$0C^!hd6p8&T5QhiY0 zC3+UrU5I-mAL}TDrF99H!QO`zMchYHD1)JI^Dl_WC)X#L+s@!l0RQBiFpoV+!V*d- zeFIHMiSB{beHC9gQL&>(GFXa+76vmS6D&yB3{y2lRziDl0HU3*CPepL?=k;a}{(QFmw~0AkoKzjxwX=C8kxe35v8N zkH#&f?C&Si!K0*4OrYx%(oagD%k?GeE`ToUrjuk7Bn#&$(h^SAjlxteZ6Y05Ww|FO z&~=h-I!cc87bMVS-DLVy&}H37-&na->_SCaqQ%owSV00^)?F?)?M0Q_1mWboW%{%P zdZJy66X=QQXMmoDI)`YkH??cJW&wW*8!--}33V~W6*~kWpVz1#gwpBQ=VG5Jg&gWL z-$x!JAmwt{mfAbD-HUP4>zwRGdSSOUn*-eZr1=hU1fxDV9vbkm;u0zUdEX&ZIzR%) zpH81h0^^Xe^5`UaQ<-|qC@hzkAq zb#)FE0R3(O;x|ZkAf0f|#E*4uZUd^%RAzJF3=NMHJ)PN_ab}v4jfkGbY%LypYc#Gw z99yiT@m!?GWQ$I&L}gBZjBpDUg)kuXhpA_Z3A)LbAfJCxl#j|m z<)Mq(y4=TT%#AN+3abGfHqeX(O&-q|5iSz5O)Zy^uAw?2E^CrB^->yTeNtbL(~5mS z%^IY%6qoZ`nvhnFeCT~c>8UIfr+3d~z{&Ed9Z-2>9*PssGQiTL?ZCRU+GaE_uBxpu zR~yZBtUdt|>j!jLipnqBO?>57lW1Q^W$x-= zYdQQL9Q>lbfV|Tg$_*@yzmzY=^OVaaJ*n&yqo?ZP^QCzem6z&NE~8vWL0+bGjgQMg z-vuOoiYwbdC*q`M%pNJM3pm-PTpsdJ(t9{P)NNJ$4K^MjBDu6OioKW$~Wmn z_ew59)-Rp?C_(02NhaBKQ2Bt1Na;lztJ!MAJU zMR~^ZP_qpQd0PS3joa@w$fLAcq+P|w9Qxj&ypqo? zzVlpX{m^GVb;-p+ougcz+a-OPpilDmvaq|m1N_Ni18`vl?pNS@4S9>TjDlm%Msx15Op~$=H2K;))UoI9m~+$nDuv!UEP7h~ z2*stN>O3r;QzyLgjQV^wavX}9LiKbv^cec!b3<|L6tpgmO>Cbkjd&`Z=H6oaJck#m z%Y@H-VQPs~$ArThioZYuJz{$xTq@z5E(`I=@6h`cc1eq!e~uedrb%T_jYtRl(H5wT zsgcpT<)8ti9YeXs(K~ zijIifM}SLb(Z(L_3t6lyilnhJm8GX_SJ*@|L|gfHjFt2b&>?Rc^K`V=yTI-Ab>72H zV2w`AbS*9%+9)hkp}ZnS`8REZRjX(rH2zZlRay#2Y8CxS8_hgom-6q~sD-Ol@pPG! zo0{nSw&9;_=#Ov+D`J#?@5Qky+Fw#k$z2csp6U?a{S|*1M}D(fMStFwLp-=r;VFyP zXbGk=0c{z3gG#0WL;EvGavD?qWm_6BY85T{(Y59Lr}t6&7q4?9NIY1TQ2Zer%~aGX z%%S-8!t!5q$5PS$6}pH=lyobP(?dv*!)I|Sfk?RS3qB16<=nT6NN(@=+-Z)XR*~mL z*TPFfD7c&oOS$|a9uYSQ zgB>PPD&paFQB;Bu?OhS;f_84vXD`~_62r^{h8Cs=*B33{s#PR|u1V$>>SB5Al=31T zQRjcg=`8LN!zY5MWNI5Ei+18sUTSJB#nf8p1C)qC1n&TP(j`E$vL%cHPOX9$$1m^k zULa)VsZxM=#2}SPyhsjRWC`(-F|;o+9=FUMFTAq(jwI>dv)S3E+T2&zNXZ&&c z*Rpjj~E)Zf5s#?zOlnH}5+saa5axS_7N}vMAUA0JI zi~e~K{U=+({?D>9Te;3wXf)}njq|F@EtQoz{#~T3gl2tZCD>P0R>HqUmX*jmtIA5s zwB?2(9g`9p%)0p|li6(48%`y0z!eGyyoDj3mH)q-PPbHFx#Ut=Xt`cjQ*JPt7g#Jh z@k=IcfGR6dZm@z%w8N^bxNJt5Ry-dk3}H(!;NNV~5T?9%aW z8~!DcXK&FDURf^xL8@MD`en@Z|4Vm9f|@`QlyhDHBVP% zthN|T^Qv^kWhK$AUu0VtTi%Z*nH@X1qD3;y*O|%}EUd1mvFN6sG$p=e>zEBXnVYL< z3#*(F$LT%v>c_S>D~@4$Tvq;VOxDn7)-7CMG+Rvb&BLwBX~@bQ6vgn}wv@4zA8@Z0 zx9Wn7Z+P@)k~jdznK@Nt<|o+sE-|hh7^SVSWJ!xJi0xrMFSEg>yc%Ui%WHHMCPR6} zyqe@yT!Kw$Fl$+fv@NZy1h%C5hH~`p2IS`jhpcqeIn}nK&E;58!~d5sW#1JZ(L&0FQK+8_YzoaNP|he#B4SjEEoo; z#ZQ9>NT^aY{{_05>dG3!yoHwGHm(_BJGNr3Y7fj4|2;u2m|>yLSTWyNRb5d%Tybaw TXpE8^-u~j+1jd1rwTb@&iTl!k diff --git a/sci_gateway/cpp/Release/sci_sym_get_dbl_arr.obj b/sci_gateway/cpp/Release/sci_sym_get_dbl_arr.obj deleted file mode 100644 index bec62f60e8894aa4276f81110d64ea7e8467afb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19494 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

      C>#Ul_ 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 M!r_>m&QwnNKMKUHu>b%7 diff --git a/sci_gateway/cpp/Release/sci_sym_isenvactive.obj b/sci_gateway/cpp/Release/sci_sym_isenvactive.obj deleted file mode 100644 index 47ce6ac93d35beee38635ff072d86ef254fa2b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13960 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 T?o&$sVmsHi~o&G9OyZl96UxsmLq0 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 diff --git a/sci_gateway/cpp/Release/sci_sym_openclose.obj b/sci_gateway/cpp/Release/sci_sym_openclose.obj deleted file mode 100644 index dc875b958594a86dc22f68411214bdbd186b285d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16349 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 diff --git a/sci_gateway/cpp/Release/sci_sym_primalbound.obj b/sci_gateway/cpp/Release/sci_sym_primalbound.obj deleted file mode 100644 index bd1ee94baeb37692de3551318ec683dfc74e039e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15153 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 diff --git a/sci_gateway/cpp/Release/sci_sym_rowmod.obj b/sci_gateway/cpp/Release/sci_sym_rowmod.obj deleted file mode 100644 index d25eec975a713f417f0f6100ff90bda4dbb6b66d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19805 zcmc&+34D~*wZF3vLK4UX0-{j-h$EXOhLC_pATwkp3uYsefXK)&nfa1Tn60y9QHw(Z zE-Z?>b)m>Z6!(I)TCK)P6@5OfJ{KqttF2U9+@M;l`sDr3{l0JZKzRIW?=SP6d(S!d z+;h*p_uS>XU+Pq&+5A6Uxb*f)#u}Iuiktz_5$YD@Bs&k057kOahFLmRu9mTD&t>eF#hi`h0i?4Fm1~UyFja<}o%mnGgL> z5QOtg<|<=rT}xfLnLoSc&GJDA7^A?7DK6jh1x6oq`hQxrJ=eR6Ehs)Ms z4~aeYKC8p;w>FDz(H<17gb((4Yyn@7$LB2awRN#_HaAZtz#>cs#eChWD6Drm0=}TH zJtRzPo-W85xx5`hrO)Gcxy1l;44;?B96in-x<1U|rXrgHzK($1BUC||pf#rMVplM1 zcMFzK*y-{KGmDFgt&1zIZ7#3X;Vv>?Y-SFRlNFk5wt7pY%_bC@mee-PDiI1Dh+0~j zYb#q2v7t?E7IS55v)R_rXfv6cn$4BQ7Bi7-^~Q_LRkd~I#XP^)=k|5@gu+_VskyPb z*|=(^)lykoXI!vqW>JaN?P`O1#=5%3N~_E3aEF~@@C4lLB~a$L@;dFo&XB#$EuMhS zgxDF zZ?%|XL*Hbxv=}QdvQ@PQ-0n<_YIUu+M#J?#!fV!{7QhU`gCl-XjsC}>?G4G3%ZoT6f5T(K=pLgB?M z7;vzpnGusF^E=yq=!q>lQFl9L78e(h27K-CV=RNmvYfowa@H}^#(fscPejYu32bCu z2TkZa*jygJ&F1em`dyWwUPi4cC%bIJnudbwGkCNmfPTCqoW8N z5cT%HHW5n%g^8(-2yRh$Z?+8Kq*)qTR_x$w@U^5^#k?E|+p> zI9bAtNswzX+DLRv0n!LaC^a_9NJ;@G>6I^+!5C+g6(Mb@Bo$$~E{e8l!bnAvL`fZ) zNkWfjnR%7S%Z)9%yzM@kio%W%>XVsw1t>HZngaozruGp70k6*%f{K}W4}tCvbzac{Lb9*ODw|vysham&!T95D;`-rpO~BT0#M`VJ zmTr1w^QucnS{@nB*eDdBQ;lD!Em=BsP>n*V>fa9j9=fTDm**mos}C^%h!$C+{D;^j=%AG*FZt_bkC#z{PTuOk34Y@TUBiF zbgF_KZ-20K!?)Jn&~3XuJ%7%0^lFa3bNZr-E^+Rkr9Lcvd*9t#Z)9vI$6x-R_xxt( z7q|cQuC>NDo_d+KP5n#_c*cXD-na3E*8Uk8$KGVD5B^D~>ipZEo_r#(^s;T2 zt+=je(~XZXwuj?i8+G)lj595hcDCn#bnv4WUIZ^}s#C3dtNZKg-u>S_S2nyn(YUbo zO2%3_{;bUx)V{s1>*4%8yZ*PW>4jUd-Q{@KB`ZEX_qAINo__cpvGbj87cllF$6w2` zj&A(qj!*YLJ@cHyuHQocMcA|JRIcqSw&mz{-~GE08@!)YM&3hPa(wyulP*}jy3YCP z_qk_I**)=T#`bdj2NgU0rPW`p+WD4a$==?pmoRo_2FYpp?2F!USA6`lBg;SAR&wXQ zD;RTf{FjS_U-W$Nw=EyHh~n}u%;On*nB(`%-~Lf=PU}l=j$Ar+R8Vt0?8fm=6uo-o zc@s8F{BQGthXOM%M7zvG+v`-n)edaGzwf2R*}0>R{$k-@CNj2$H}^Jjb_=I&0Z)r~AIy;`!#YMf<0=Gp5GgQm1-v{)5BHJ52A?{ZjSGNbL6Bk zI~IO^=yu^j*CW?{hyFi;aZSwsUt41|!e0{j~-LF1j%*64_uHRc(_*TjH@Bh!* zPac^4UM^$(9RJj_$JR{hS@X}EJ-6OI@qxE?Fm{0B{kuMz_r{p3bvN(+wCD9zo3=7` zb{5G$SoTfU<{hEz&mS*i`E~bxhyly-zj^ggSIg01vvXR$|6Syn%huuuLc*5@zH_#} z-m|7UcxL|S5l=Dp9mii|zx4bITx)`JUAI}nbGAeno0CoQf7kt+`i#wYS;{^%e{{o3 zAKt)NFUNN;Z{GTZ%l}E)m%n;pY_R_4j6K8gt@dkvHF{UypWFK0v+r8_x91o;#_^7< z-qlZSU!Aq##-e$jUFof3Y#qj`PW6X-0zbXbX?gMN_m;dM{#VBrjJ?9~tKOb*|LOw| zFByA?eS5a+vHgtYj3oYueueRjYu;UV`gNMqueyB2vl#Cjf7X=k#p*|HyMNpP@2%^5 z9$kTB7mlC%ZT{yQ*-!3#(0J#LdCQ97vHp%R`N=3e9OYKOyc=%kyJ2Z}R#;Y4h7IU( zwry6LzR1lMb*2iz)Xxf6Vob`R@`9r8MIm_B?VnYs#utxqP6>iK~c0~&nusz zNr*zzSe*5zvtdmTlcr`)cccCXVt^!7|@2lO&p zh^O_ZCpAi(zA(-QPiX!V%?^H_yYG~RoOHh$%z<>mGy#u2?R<4o);Y;RH<&(BnM1Zu zQd`rkRgy0AP`!LRUKsllvt znTJ|DDsakcm-OCp$Qt;Zm;>zYzMv~;4f?_X2a;YNHmY#Mr|ty&IIY85qjWY(Yv959 zxja`5Sx%aUBCpnM54h;9#gOF;rq3z$8>&n?4TjogJ&sQM&`p|X3dt*Do#=Oqy{DuE z9fv3j=6~rz=mdwsRxFDAoj&i-XNg3MP|60E-gzq4aN~VxDD7|=YNHOOLE2%GSOdQM zn3+!fp=5TrqH~eHrC2Bm*e#+x;OG?Q33}1x7YMnWCxTL&IkUnUWSl*)yaDup!Ri~@f+!fTOZS*!yw94!F1QjTS@pCG2^xYcqj zi`{|PbdK9B$Ff-eC%XQ5z%dpc*Gb@Gdi3wsK8eFLK-~-X5Mq61m%2;6NG9g29SCR4 z8X)TWv7D^#Qgx}CV&u>V8*}uFx>PbI6B!=if;P73wap4+X8+g6!V@}4Lgz;~EK|6n zWv@5swHIjhSNy1^DTOO1%C)ghpSh?@t>j)ikh^yNv17-OIUlDYIG@m!=Y`K$^JZxD zx+YcmB2{=)|A4yxdG(q%!ynEXI5cd+K>yxj2Tc0R{!cOwOw>cy(d%3EnOt94*F$;h zQHWI8Ma^~*51qjfPRg_%PGUFFEmBfaQ2y`9eZQIqVvuhCvcV7+3GB!rM(07+-$4xhKy z>lAxYqwKsdWh6HLQlU(Z+B0?pzf9<-1k#z(lYqc+ArGfB7NL5;P7xe~u_=JSv8jN> z*91r{dk)}SIc)$u7wM&dxF!~H0Tu(U1e^)D3a|vQA8;1nEr6wfcL0*S&44(kj@$=0 z8xTjkY!2W6AklXNUI_R$Aj*v3D2`PCj)3k)z^Q=fdy(mYm4NdAO@J^Zo%Khm0BZm( zfOUY>MkJT&N5^o(*~M}!n_1;p7JrLC)NJ;36vquO1jGDQS$o*+?h~-4@OFsKqAdP? zC)&<+z8+k)F?t1lbRzg1j&J~6xP?Q#z>d|OfVZ1suiyy>LqeM<*ahjV2JujjD0+or z0sB$mY?7QRrp6vb4jdk0QRYDw@Y78s(OHqj%yb4-E?DI0UBLT6<(-p&6)MVggQxczF^iG>TRcLnwaJoo-)@mu)uejRNI$;XM-AS%?S^sWp)Yode zH1WQ6_^bg=9?aRk4-c4=;B9l)j!-jp50wIst4s8_S-kYW{sGMgAE~>*q|dox(x4tT zq2$F&P?QeNwh8cJMMvFJIGJbbzu0(%zWDF=_T$NH%R{H5S;H^gEy^LFH+_U%saVjCrK>%xzDQl2cGW#x-j?ZY@l+V*hB)4 z>1kB37cp_vDdtkLYx~dFgyu_?KOi%i5A7q~>O*hdL;2QcE;KssR33;2!S`^F#N|Hp1sIAhpk3W>L?=vFPRJZSC)ICR18x!*ZtDfegrs#w-kxw}DzaM=Uj};@&x<(jJ3JTi*cg>U zrJ1dk<7P&26^PYvoD(t9EQ75?4E_x<-2am$uR;vI5BjY~4Bimb|A$}a*sd2NOM4?aMp)E?kx z;1^FXBd0E3KYkf8>Iw1mt2v$K2F7o3Tmh?Gm^9myPE-QHX& z(|~-O7*Sc7vDS-=eR#W{owo-By7YiG4yGKAdJ-t3B(%B4!WSct$ueV$k+H~oKVcyh z2Mb0gZkprb2`M#@kiUelTWHmylluUo+~%}uq5hjVpmc_;*Mm->#oi4|+*c8MJ95+LbWwAMk zRdC#eax9Bci;xG)<~s|DWwD9Sj_*>P?XL?sbG}Lz*;dN zMul)C0({jfU{K4;QLOc59WR3ySK8BM(xR*^rqYowQL!V3vzS^(yQi!OEv{9gVFgh6 zP@p?PIt&Q}HE|`-X%|Cu;w8E^iB9-!UuVy7l^klo1Cean$75TG4&p?|)EZ3X*HHGtmpU;Mkg-4_z z78hbS36)Eattlvjf&EG9Bj`-=H;`3sICQ@(`>PeoTaWq}FESbYq#yctY0dgNFQt3aAx1m(8_j~phP z5jZXG6-qY-j~pgD!ieexoR|1%ftX@6Hkch1e?zt-yCvF8!%V=9gMC5f_DyeFEvo|G zl(cq`FIl!qP_bPN_^IubzFmtnwbf**0LI-yq_30hKssSz^`m-FeJD_0SNtmZ+{AjSStIDMfo=?Fia%dOxJb-4&0I#N zj@pR0ENSwz%6a13lg5IQR~iEvwnWZLX{EfSNqIFWhvpl~Pj#U*%{|M2Q{+=Wp!z60 zlqQ}_0n5|&1IyBSo4H|eZF6Hoy}6-855~$gj{>Ag=go;-&h!fm7;7xOkgLJR0WZGGaCdS#w!o=wH z`NVQ*?MF7Jey7-3=|?}|bU`K(rCVh^TyhLCU1*ax(sP$u2kC7kDSz|iS0U!ZAg-Z z_Q0Gcl}ozD>ZoGZbDh*WWj>@fr1qm9j%Ro~q|Wux%kr&C%wUlE>rIeHdG*M(y^<3*LUhLFZhKx}vLVZz4_ z`D`tt&n|Ei#Bc8)KStw+@K`$#-tDH(794&)u5N_P9KuW2%sB35;PixZIhk%Owz)_T zZeeMTy%jt)T)zCdhg>e{ct6LxT`R@deEbmBIX1j}z^nRRvMHb2(f1w$FAQy?n|ros z)nfF=WjfAnV&u5|Ps()Mn@yqL4jrG7=+asNKGg%{TwtU>>cd8o8zok$&aeZ z8?xxfkN-%jiVYu&s;a4-?tvbIe|fW{H1-*eA%RWmpDNu}`oSOA;#~$dD`UBy#gma2b#HaZ7ZE<$Vh<$*Q;8RNEx@#ly z7iQ=SR7Wiww(^0QlvX}2I|9282ZvPW?WuK+`yOdYX)KYx&h$N#GRBoXOS4>m@}74$%TzxQXA|8ZedS-_D``$NpltGa2D)!l z4PQ~yN7#gwF!BGVf@4)}Q0p|%3p)xvrZ!{=|1*U4oEjDV_YR6t z&_-jUBm^)5`Z9$nGKO(X{QvC807aw1%87@Aum1=qfKndmkdDyABjIo$D+fjLb_J0l zc{nH<740o3Ji4~{IYkQobA^P&A*6y+p(auw$?+PJJvAyil%(+J+huws4_+zBxrj&7 zaM_@8Mu117Dk32WS#QkxM#+PNZ8;b5NOHC$$e|qc!bb{%%=1|aMx&UHDLkh|F^c4= zQ4I0K*E9>_H7e{Tcvx4p1n1rg^GrEHJW_O}LW*K;O2EYTsBG|PRP@?q24W*-J&KcK zQa-+i)4{MtMgR9C4>1ba(H?cTEE&hMD4kxZl!8u2%p^G@p%x>7iPggUbw3b_Vvoxa z;z_JK^;wOo08a`>u0A{v%XL`JMLbe;It>~ggd{n+z$TADIXk;V&P6U4Kq9BHu0}Q=NNVN}HSEC{s6ecyi(h@7{ zA-OE#k+l9xLQSQYS$KgGl?+TNwFRwGsVoh(&Md;*6~!RIzDbZnn0#_GJP2}G1u2-K z1dQBUpfBxHs222JV-iCxa@eBZYtw(gNOzH^A|Qss0dH~0XW{=?!(doythx9SR#9QA zG}ww4G#Hxds++1z^#*=*q@pbT%)X*bzC2PM2GB@+5yFSf8Bm*%;| zCS&SGzox-}a^m^jbm!y*{IXsq!@`T|YwApeBPe~VBR@Ok2@ zSJPzVMN6X0HHHP%jg_W)h%$OB%0#+-Qc)&fctOp|B*}E;rJ@XXUJT3zVVq4dQ)Q!} zy3SNty`XUr5xDMBQD(0wlP|nfl*yKYiu8#SSt~eb#hZ*ZWGV2r)_Oy!l_4t5u|&tp zM*d$*l(!}_lE3hb;gY_}r;fqD-%;vfZZI^|FI;G@s#|Elh8(t-RZ(V<@8ZBbvCB9W zWw?#QtCILJzripoU3(ju4X1G-Tp4z<)b7aN;mW-ZDqOVC+|X24)nMT7o+`>{>0MEV zw@=grc>M%x%I}6M$}04grV|Ft4b*XL z*aFzyhT^24C}3J(s5RF&nd%nQ8qj+b%ToskpbpBbFu68(B^6cORAs2EM8B?XY%;*; zC&-BxTIh=C6%B1kO$?mTP0Jd*akJnv2e)Y9pF7}`GAPBkwQaoJc^h*%i=*$dsgE`J Lg1Bbo^RoW~Ezb!q diff --git a/sci_gateway/cpp/Release/sci_sym_set_indices.obj b/sci_gateway/cpp/Release/sci_sym_set_indices.obj deleted file mode 100644 index 4b819c38f863c7e6f2af539b84ba8dcee51f9b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15804 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 diff --git a/sci_gateway/cpp/Release/sci_sym_set_variables.obj b/sci_gateway/cpp/Release/sci_sym_set_variables.obj deleted file mode 100644 index 7cc9733139f089d8bf2596488b4a4e1b68a27c74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29801 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 diff --git a/sci_gateway/cpp/Release/sci_sym_setcolsoln.obj b/sci_gateway/cpp/Release/sci_sym_setcolsoln.obj deleted file mode 100644 index b39f76bf07eeff85c0e5376b99385530fb0aaaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14593 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 VRR#QzLfMhm(B1C&nGEWo{|AM`SS|nn diff --git a/sci_gateway/cpp/Release/sci_sym_setobj.obj b/sci_gateway/cpp/Release/sci_sym_setobj.obj deleted file mode 100644 index 815dda68fa4a931d6b19edda9adbe15e8c072cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18206 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 RpoF;2R3$LSjV~1Fe*v9t;(-7F diff --git a/sci_gateway/cpp/Release/sci_sym_solution.obj b/sci_gateway/cpp/Release/sci_sym_solution.obj deleted file mode 100644 index 8f56e27a2ddc962f8f1f49db7dad220bc66966fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16509 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 F{vQ=>c=-ST diff --git a/sci_gateway/cpp/Release/sci_sym_solve.obj b/sci_gateway/cpp/Release/sci_sym_solve.obj deleted file mode 100644 index 38c6e571b334aa73978ba77b1e966d9c976c09a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14722 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 U7{B{TVi{N1C2UXO9F_z054kWywEzGB diff --git a/sci_gateway/cpp/Release/sci_sym_varbounds.obj b/sci_gateway/cpp/Release/sci_sym_varbounds.obj deleted file mode 100644 index 14fb728fc65e47a710459d86ede238efb6a75008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15371 zcmc&*3wTu3wO%s`A%+kpF>rlQJjD3GHZeSc8iC9tnLIErG6?~V4D&ci4$RD%&Ya0Z zErtes@KCB&thQWhE%njbR{B}(lUA(O(%M>|*Q=kla`o01P{VDZFWS`b28&SFtANwt4%m{OARO*+# zv7Ta=N$H(KbPRkxNk_5~*vVE^>WxNC9u65#eTJxPZ>c5^Xh{SwWbKiNW)|t-e;|-- zt!q>BJqo^K;Q4E@&Nl^t-G+Q4evjtSG5-GsL8dm zx~;uvG}zKu)9h$+x{9Psq&$ST0`+klS@Ky>bwyW4RE|WuYFk_`r?aa@?GFW1kKY7J zTEdzVRIc)9iW(}>R5jpL2TFpTs3u2@G{Of7(SNUx2f0ji@~lPf)6bGSRMtx+|4v%oC7YTFkGg()_a0vaXfYU0x;B zwab!uy=YjbRv-{q=qXmnIT5@xZv#O&`Dydcf zU4s(x_W%3xMpxGRsk^%r)Z<$)aPqZu?c|H~j|4q0eqMzcxI$ykz3Hy{hO$sRxD8Br^BMifmJaydnYAnVwvqvX0AZWf(TfHeXLrDnz%St($; zUWG;;M1svwgtg_IEQ|_WOl_@<=vlKwT^)l-hfkyI{A#2X#+H>(x61QT%%`C|+4

    1. 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 diff --git a/sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.c b/sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.c deleted file mode 100644 index 86dab727..00000000 --- a/sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.c +++ /dev/null @@ -1,168 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -static int direct_gateway(char *fname,void F(void)) { F();return 0;}; -extern Gatefunc sci_sym_open; -extern Gatefunc sci_sym_close; -extern Gatefunc sci_sym_isEnvActive; -extern Gatefunc sci_sym_set_defaults; -extern Gatefunc sci_sym_set_int_param; -extern Gatefunc sci_sym_get_int_param; -extern Gatefunc sci_sym_set_dbl_param; -extern Gatefunc sci_sym_get_dbl_param; -extern Gatefunc sci_sym_set_str_param; -extern Gatefunc sci_sym_get_str_param; -extern Gatefunc sci_sym_getInfinity; -extern Gatefunc sci_sym_loadProblemBasic; -extern Gatefunc sci_sym_loadProblem; -extern Gatefunc sci_sym_load_mps; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_get_num_int; -extern Gatefunc sci_sym_isContinuous; -extern Gatefunc sci_sym_isBinary; -extern Gatefunc sci_sym_isInteger; -extern Gatefunc sci_sym_set_continuous; -extern Gatefunc sci_sym_set_integer; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setVarBound; -extern Gatefunc sci_sym_setVarBound; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setObjCoeff; -extern Gatefunc sci_sym_getObjSense; -extern Gatefunc sci_sym_setObjSense; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_get_dbl_arr; -extern Gatefunc sci_sym_setConstrBound; -extern Gatefunc sci_sym_setConstrBound; -extern Gatefunc sci_sym_setConstrType; -extern Gatefunc sci_sym_get_matrix; -extern Gatefunc sci_sym_addConstr; -extern Gatefunc sci_sym_addVar; -extern Gatefunc sci_sym_delete_cols; -extern Gatefunc sci_sym_delete_rows; -extern Gatefunc sci_sym_getPrimalBound; -extern Gatefunc sci_sym_setPrimalBound; -extern Gatefunc sci_sym_setColSoln; -extern Gatefunc sci_sym_solve; -extern Gatefunc sci_sym_get_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_get_solver_status; -extern Gatefunc sci_sym_getVarSoln; -extern Gatefunc sci_sym_getObjVal; -extern Gatefunc sci_sym_get_iteration_count; -extern Gatefunc sci_sym_getRowActivity; -extern Gatefunc sci_linearprog; -extern Gatefunc sci_rmps; -extern Gatefunc sci_solveqp; -extern Gatefunc sci_solveminuncp; -extern Gatefunc sci_solveminbndp; -extern Gatefunc sci_solveminconp; -extern Gatefunc cpp_intfminunc; -extern Gatefunc cpp_intfminbnd; -extern Gatefunc cpp_intfmincon; -extern Gatefunc cpp_intqpipopt; -extern Gatefunc matrix_cppintlinprog; -extern Gatefunc mps_cppintlinprog; -extern Gatefunc sci_ecos; -static GenericTable Tab[]={ - {(Myinterfun)sci_gateway,sci_sym_open,"sym_open"}, - {(Myinterfun)sci_gateway,sci_sym_close,"sym_close"}, - {(Myinterfun)sci_gateway,sci_sym_isEnvActive,"sym_isEnvActive"}, - {(Myinterfun)sci_gateway,sci_sym_set_defaults,"sym_resetParams"}, - {(Myinterfun)sci_gateway,sci_sym_set_int_param,"sym_setIntParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_int_param,"sym_getIntParam"}, - {(Myinterfun)sci_gateway,sci_sym_set_dbl_param,"sym_setDblParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_param,"sym_getDblParam"}, - {(Myinterfun)sci_gateway,sci_sym_set_str_param,"sym_setStrParam"}, - {(Myinterfun)sci_gateway,sci_sym_get_str_param,"sym_getStrParam"}, - {(Myinterfun)sci_gateway,sci_sym_getInfinity,"sym_getInfinity"}, - {(Myinterfun)sci_gateway,sci_sym_loadProblemBasic,"sym_loadProblemBasic"}, - {(Myinterfun)sci_gateway,sci_sym_loadProblem,"sym_loadProblem"}, - {(Myinterfun)sci_gateway,sci_sym_load_mps,"sym_loadMPS"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumConstr"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumVar"}, - {(Myinterfun)sci_gateway,sci_sym_get_num_int,"sym_getNumElements"}, - {(Myinterfun)sci_gateway,sci_sym_isContinuous,"sym_isContinuous"}, - {(Myinterfun)sci_gateway,sci_sym_isBinary,"sym_isBinary"}, - {(Myinterfun)sci_gateway,sci_sym_isInteger,"sym_isInteger"}, - {(Myinterfun)sci_gateway,sci_sym_set_continuous,"sym_setContinuous"}, - {(Myinterfun)sci_gateway,sci_sym_set_integer,"sym_setInteger"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getVarLower"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getVarUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setVarBound,"sym_setVarLower"}, - {(Myinterfun)sci_gateway,sci_sym_setVarBound,"sym_setVarUpper"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getObjCoeff"}, - {(Myinterfun)sci_gateway,sci_sym_setObjCoeff,"sym_setObjCoeff"}, - {(Myinterfun)sci_gateway,sci_sym_getObjSense,"sym_getObjSense"}, - {(Myinterfun)sci_gateway,sci_sym_setObjSense,"sym_setObjSense"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getRhs"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrRange"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrLower"}, - {(Myinterfun)sci_gateway,sci_sym_get_dbl_arr,"sym_getConstrUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrBound,"sym_setConstrLower"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrBound,"sym_setConstrUpper"}, - {(Myinterfun)sci_gateway,sci_sym_setConstrType,"sym_setConstrType"}, - {(Myinterfun)sci_gateway,sci_sym_get_matrix,"sym_getMatrix"}, - {(Myinterfun)sci_gateway,sci_sym_addConstr,"sym_addConstr"}, - {(Myinterfun)sci_gateway,sci_sym_addVar,"sym_addVar"}, - {(Myinterfun)sci_gateway,sci_sym_delete_cols,"sym_deleteVars"}, - {(Myinterfun)sci_gateway,sci_sym_delete_rows,"sym_deleteConstrs"}, - {(Myinterfun)sci_gateway,sci_sym_getPrimalBound,"sym_getPrimalBound"}, - {(Myinterfun)sci_gateway,sci_sym_setPrimalBound,"sym_setPrimalBound"}, - {(Myinterfun)sci_gateway,sci_sym_setColSoln,"sym_setVarSoln"}, - {(Myinterfun)sci_gateway,sci_sym_solve,"sym_solve"}, - {(Myinterfun)sci_gateway,sci_sym_get_status,"sym_getStatus"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isOptimal"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isInfeasible"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isAbandoned"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isIterLimitReached"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isTimeLimitReached"}, - {(Myinterfun)sci_gateway,sci_sym_get_solver_status,"sym_isTargetGapAchieved"}, - {(Myinterfun)sci_gateway,sci_sym_getVarSoln,"sym_getVarSoln"}, - {(Myinterfun)sci_gateway,sci_sym_getObjVal,"sym_getObjVal"}, - {(Myinterfun)sci_gateway,sci_sym_get_iteration_count,"sym_getIterCount"}, - {(Myinterfun)sci_gateway,sci_sym_getRowActivity,"sym_getConstrActivity"}, - {(Myinterfun)sci_gateway,sci_linearprog,"linearprog"}, - {(Myinterfun)sci_gateway,sci_rmps,"rmps"}, - {(Myinterfun)sci_gateway,sci_solveqp,"solveqp"}, - {(Myinterfun)sci_gateway,sci_solveminuncp,"solveminuncp"}, - {(Myinterfun)sci_gateway,sci_solveminbndp,"solveminbndp"}, - {(Myinterfun)sci_gateway,sci_solveminconp,"solveminconp"}, - {(Myinterfun)sci_gateway,cpp_intfminunc,"inter_fminunc"}, - {(Myinterfun)sci_gateway,cpp_intfminbnd,"inter_fminbnd"}, - {(Myinterfun)sci_gateway,cpp_intfmincon,"inter_fmincon"}, - {(Myinterfun)sci_gateway,cpp_intqpipopt,"sci_intqpipopt"}, - {(Myinterfun)sci_gateway,matrix_cppintlinprog,"sci_matrix_intlinprog"}, - {(Myinterfun)sci_gateway,mps_cppintlinprog,"sci_mps_intlinprog"}, - {(Myinterfun)sci_gateway,sci_ecos,"solveecos"}, -}; - -int C2F(libFOSSEE_Optimization_Toolbox)() -{ - Rhs = Max(0, Rhs); - if (*(Tab[Fin-1].f) != NULL) - { - if(pvApiCtx == NULL) - { - pvApiCtx = (StrCtx*)MALLOC(sizeof(StrCtx)); - } - pvApiCtx->pstName = (char*)Tab[Fin-1].name; - (*(Tab[Fin-1].f))(Tab[Fin-1].name,Tab[Fin-1].F); - } - return 0; -} -#ifdef __cplusplus -} -#endif diff --git a/sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.so b/sci_gateway/cpp/libFOSSEE_Optimization_Toolbox.so deleted file mode 100644 index 72adf65395961da1c272769351c0df0a7b39aa5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291600 zcmeFac|cV4_y2!EQ8E`oEi}!MT+mEszy(cnP_e;v0yHvp7+{o9mXSr#7RNOZHFAq= zBiqQ*$g<2fG|ROl+tjSctcGkMv)<&p^moqdb?(fW%Urc@zt8vk&*#>4cs}mA=e3>J za+iUH@#97Z2L&nW)$e3N`181)GCl2QavNc$sGsV2x59at&&%Dy$S{%8)2o-7meNrD zq~eIOwSz;L%UdQ)Qqm8mPHgjBhpE3_|4i4VZMRMNF7n3ncxH1rVJm!^VHd7~Ajd&f zEi0P5xL#4hmbrrrBisfVn2Up#2QBRd zv7?MKM+G$t3Rl{PMrWA8A>;vaF}nHZ=3=EnaVtTKlsI?0SfzTMLD>v?QO%Pr%tk{? zC}2oPTAF1% z_{O4z2f2f+VTuyjA{^b-1cxeRX3!m)1;1>*B0RX*LJ5tCgbIC1u^Ym>R_~81Q;NgZ zM&BCUClb8&={l-OagpQJYN&wtT}CA+{Y52gOlU;$q8T(O1+Ur}LbYEYD*-AkdgLH&ceL2kk@7I1q(ekd=( z=gY8fhy4}UcfgL@PWhp{0iSQfz6VLuFe4eTGm{weIZ9fkck z>?csb_66);!G03S=6&#>3Seg^j6VE-NV2H4NR{uk_j!!CjvVj73A zCa{OVj$1SMq#;ZK`u9pYj}3%3+xH7kArU$Pak~>f?}Ggv*cZdT z6!vAXuYg_MO6lkO;ByV*>)_`HV1F3)M_}IsJ8n^?dLW2KMh@ z$L)Lgtb_eD?7tAJr_VF+*#P^Wu>S@7->{#DJ%~DDQ}}EKdvn;YfV~CmEn#mB`&F>x z)*e2ufjt8D4#YabXD8UZ!hSumZt&Ry_MWi!g8c^A`@r58cHE5gi9eg*=V;jb6B|UI zvG6$r_Mxy3CpHQ`N7K)@z~=+2Jz-b_eO1 z@acqoHfgl^=IJ?4hrb;(d~J*+c-AWk+fF?5Tg#{V>}fS%$>JvI?>F1Mwa3DO$6Nk1 z-u>(YpYF<7IUuU{CwH{^xx>uOgM)K2qMKakwb%H_*+a8ZKMQ`$`pc+aZ*r`vpO(98 z%&~~l5nCP`bj)u5?U|c?m~8rB=!RVbwoZRDBEBL1>#afY89i16t$cp4bIY#9aX}wG zvGj1%??+1hxbmtA-~8S4c=GfwOyiop+4{qGnl0>fWbyU)efq-t%Gm829{XwgiFMTv zeB8?35bP zwcWik`ntQ~$Lt+bwrqwi`ne}tEo>X|sM7M~e#>9@qU-xpH+*|__4{#k(-N#jGo5`u zx#N#jhdqB5zIpSm@wM-5JvME|16!A5huwMeL-#LRY5Tm>ON&--`m)axS6q`5_UlIn z|EQj89Cl>T9jia~*f!3-=9$-?edN6#?(P=5IJW+DySJ-}@SOXaBnLOzzWLo6R16cyruOKY#rFy2ln9%br~M-EBMO)L++R zvZ>7*Pkfg+FYTwzrnKj_Z8$Jt;B$__|0o_z8r17GGb)>CqK4M+Om9EllsnE2DUD`x2nsgPq!_}Hh=Q?tUKejc`U0| z-}>uYsn5=M;MD=~Fa5dr)w7>eO$=W?@V&UaewS4c>exY~% zk^SPz%?k@^Z{D!n)bFOM6Pu?cJ$u)n)lHXfd+qRo7RR1@ro{*0UGmQ#GE9EZ*=yQ+ zdnfPQe8KVGh4n3F4^Mde*Swd%oICiAA&)Ffc7HrI|L~sY*532*i_Sl99k?m}nVjs2 zr%r{gd3o0RgTt?S=&cSXFWf)AKJ~ZNrrU=;Q@zJ=s@=z*?mLm9{Qi5JwBmcVoKBfJ z`kwa&pMLTA<(1{zH%7d=B>Th*wFe$^%~;xhyCJOA;`TGXICbFNsl(oHsQ%=s=NHuV zJvHImb_agB`p^=4Lr!nc{5Mv&I5=|8hKQ@HZ0RL0FL-ir)0)H8v;VWLRr;a*8Oe`z zk6o;M(RRQ4ug~6DG-tupp)1CJ)UMg5=auwNzVuAE`@^nBZ|`z=>%xK)F$Ys#xoc?G z8E5V&_P7VF?sB!WP1wQ~$C}OgwNKvElRa*K)Ul>p@0C4HfAmZ1nRl;$O<6rAC*=!SbX|p@;%Rf@D z?EKeScR}&u_Xg+09{9U$V&s{1Pi&pIsiD`oM^?rx?^Ji--8a9R{^qKK-!Hz&@!yKp z>(|9z+i7D)V$tL=6Bf)GejsAmYll{U)nwt;wl80}Vtbl=3i}Rb7Z*8Cd$L{#8TY@&E&MR$IqD=2} zCVtKnzqNe$-O|0In^g}#wV^}*$@7kHZ+Bag{qd+Z6Ynki;y*t=)L~cUd$XTNxG^g{ ze&dd{hyNNeWRlDbvbKT{K~}5f6csMeB{Pv zk?xYo+iySh-l=UzGCGbt<#f+?U(uw;zGGdopBgi@!@en-s}CJrd%Co=_49p(e)al~ z_a1y`f@|@>pf!tM+PeDHGkrfOpSgKg{^w1TfA2Nt##f6TjhM7+?SI$K+Br10y2r-F zj}K__FBqoecirEla#N9um1btf$z5N7O|)2 zJuj^eHMDA3+4P#Q&);8s{o=$&&NSQi=o@L1I`qH3XI#=XgF3w)y(PIOV_t3kYd6ks z_xmk3v^$%1_QAjF?>(pt{lfVE{-h?0gB~#)eDSXtA*;p?#kucdTNC99rT(nHMO7=j zhG@KP?iZN193Pn9bzNZo;Y@u#@SS^gbT+&`8Q1p%vZJu%p-3N z%s+vf1cCey(#iiCoqD@o$In$01N(o*7?|IsQ~$6GR15*?$F9Sj$$|Y3=pMM9yEYAM ze?{}a_7S}U^P6(q&#b2{mkBn8e-yiR^@)`_dxa5a5ZfO_lFF>wB;0S^=pO?C29 zsFR;e9Y51_>^teSW3EpBDui+c>MzS%2G0NMI`O}}Z(u)<=)`%rPF&s5GjO`4(C&fq znFaA5h>y^T|7#}%_W#}3z&uu`KG*8_F~eP2wkF|hx+I`IbPN@Rd|`=ME2KY!|s zZ(r!7+Z-|(D4qxC)Z2YJ?f#%noE+21=l44G_JvM7+y?C%s2`Q+jFTbJf$fbt{VrQ4 zJ`;5Ozp7*Zt4_Twg18M-&%rwFm8jF-!*%-ahdT8$L8rYuI^*gzo%&g+(~d)Q>fukF zdV5Kye!kY3M?Tgm?=GEw`jn3Utvd6UVbo^YSQ~!79*ylwBj)!z>;J9__ z^p`JT-VD?)Dj?Vb#akDh`C^?;K0}~BVTfq7-46K=#Gkk#aDEo(jE5a`#*J5W;;@BI zJXiM(oS#p0c)d4I&u4^PQ10!spmAEelZN{Cs4VD z>%?KP&iHu;v`ZjA*Xh*5Y@KrL(TT$|I&pHZ4sT%$oS#il`H}F%byFN(VZ!qbnmJa* zV!O0d^33wadwb$TM@U|VH~(RagK-MCy^t>2_jpPASuPJNhrmDbCrpyt+DQAseI#Fu z4{u;wD6#S*9LM}r(8DYX@$>Kl`U##U9aj>+0mcoqe*+)7z!pV(XjjR1Zj>CR6|tRy z^#l5;uaE_N{;nz*Z&xg?chb`vp|4tBEIyajB)U ze6REqDL<4TasAa&*^dv{V7r;x>-BCjpK~`zexuB;QrA}cca4x-&Cfvy0Iauh_;3a` zFcVwb5t7%$NM23#*(Of%Xneo~+ad8UJiED8@>AbR{wDFrF0#Bwm-?62)>+!W`jxa# zm)TN^LS;V9_}~*ZgZLNTqky|)n9n}=5Dd1}P2_8ry$KBFieV*GB@`L5Ni~5C{{{y|H{}jqk9Qk<= z0vOXBm?Zras{RdRPjMbed_Vkv_7fhG_G-Dl870%5jt?MV^N{^s%Ks_KzuGQyMoasr z$4mPjWd97*8|J?gjZ13(ilBDysA>1pW@&%EyY$maW=pvR;u-T9M)_C$zj&qO_fZ_G z@z#gp_Tg~p2Z|%M8(K^Ib7bG2_;qk%SEaRLsPoVN+9A?@U>nKRcnGI5PhzrDT{^L|I==u@))k{bn|-=ckge3=0@n5M<{ z4a7O})i+8G)grbtFzz8wr2MP(vp7!H^J;um1~#>Q_ftD=zz5B+EfN31`vfrGVLQHt z5AtEd_X=>s;R5}?+)je-5-UAuT&g-K{albA$~0K#qy2fxr&^yqXdX#-N!vzaL*lfGtXXDBG!ihPIaew~3?h&I^qX zFWw{holWI|lAEOe)>lcc#$oUPS*|jCNdY#s-(7vPv|rj;+N=Hj4a!gJccuN4(!KHl z)mu-^c>a5w^pn?5`k7Ao=>&m|zp~FU$W-kNAxZ{N|nLd{QGFvI$Mp6U~-OKh8He70!j3qvT|X|EkuJ5#x|>!t2v zrG1rM`ln@(QU>E5mbV$rj~4R(3j`SQDfrS7Y-+!&hkRl?meBwJ%_O$|G@gI(ptO%8 zUJ4C?@pJV!nXc+5>?Y}7I}Y0^-da+;srHrB??zlF{iyN36C~zyF^!)v9Et4+WB}9c zLkl-rb||0FIFN@g&A@hdGx4E(4hf+j?YgclG!T}zh~gG5XT)}f;_7=EIIjzpe80}P zZE7L?Yu8uVqpK;(8`Ei;T;B>Ja5%XFH#Z}=yua!d}p?xHkOPwEkL5ITn zEN+k)hw2hr!Hu$9KWviuzeav2gWet zst0x4o=@wXhUwBChFP&CQokrlmwXrT$q)~i&waFhP~-f?C@R-xnIE-WClX|SKBeog zIpn7`ty^5QZn=TDYY_TxuQU|PdaELSFC>KdKdG5dACHzi_)D2C41;337Ag?y;W({_ z)&BB$FKNG$@~Nhqc&)Ubc0`us0@@mCAgo^>&Qrixhle6SjBB zesOc@f2ihqWFC|Q(@mps1DacG<8|hdc9ib#nbLm_*~ig1V9;DYb{i@EpQrI$jsKfz zJ#c`==U2(kL)1_E)B37_cpIJhVlR!8_h`nw)=&=^Z}rP%ycx((Q)-t^6*B*I#5;GQ zdVW*ZCxwgh8<=7Jlxwaxo6)*)Mv$~uS0F`ie@ zy80D)Sh*P{EX?Od8c$UFvosDo{+%qZhy0ADacnbob|^Q{@Rmr2V-&q`g`XUr|5ZXpsCA`QJ?SuU!YmKs}@X=jpnjknAJ+$$AUZjQ>tr zZ)oSQo-qDkJy+5FI<*}us9jQ@l=-=x>g~b^neNY;aV9)e^42sispTCa{I^yNO`3=t zs^ijOn!l>4KdR|EX)1 z|MiOG(0#;)<4U;FN?EBcK!|S@_0U=g3-xcuwG>x>XL3A5uGxhK5G}AIy|M&F8{s$v>v+Q?-5LAa2qAl;(bHJk&GhXSC-2 zTNSL+(0+G!nIE-ZOr!a3Ymnq>efEF_HrhAPx)Fv8vEjNeJiz;t_vzek*+BC}N6r0{ zPoS9Sf2n5v&7}4^p^4|Y6t~AUaeJQX=V{IL`y{IWT3TR#d;p0sh?{o-p*0Hss1ZrqCxvp zx5|7jCI7e4_|RK(UHLW5zm>GE+eh~IKtY5bdfo)Xh1gEeIwX_UA!_}%qWNnNT^Fcv z_&1F+J7}Cy*C9{C`XB4zGrAvMLj{PXdUpIQ^Zz1Us5FQ5B-$6hDS42rCS@tL;{m#W zrr}jNLh;a-?!SSV*z%$Nv0UK}=|JsARWuHq#V_o@HY7xRD7&ej?x23E_Ul<@nV$%{ zUfU(j6$_LD=f_Z5hfwyFGM)J%nEH!$9heChwpiYJ%Kselzq`BiU#Xb~hjx?plh?}n zQP(GJp`Nk4Srky}IKPPEE%=x$??-BV()ebdFa6v_1&^>segSGCGDd%*Xau>-U=>IKIMmU9~2Pl zzq;glQDgN~Z$Hz0gMFzopB~~bnWcR#UB5%O65G4f@21i^S&iogh<_~aUK$vlX(jEa z(fWTm^+yOZv9+VP8cpkYXjZX(LG4nf>A!_g|5ri1)juxtA4>M`nK7TOmCW-p|7zU6 zPU&jrofjeCF`s1#(tZ!s&k(BrpJ{xC?1^m;G$__v8LiLNdYeG?aE_kms^xlu=BY<% zo>KeuJZOJRH~w{*;7FOg@-_?<*zVeK^|pc1ev@XMKa=Ji?YuCL(w(ZAAFqb_9n+1b zag~M>WdY5Dv6}n6JDW@UopitPed_PiM@oK{{Hx>h%g_**f9?IW83QEOUJt_8_(guE zca{~Pj+1Xd1!6w6FCc8hRz>|nyH1-FDearl zx>s$->*#*V{AXl7J5ijR13#G0m#H4q{$4}r?$E3&W}Bq{Q=0jrn&yihG+)F~K95nq z=u6i%uMz)xgp9*V>c47#{0Xv$`N_IMX0R>H2e=)g`CYrNdkKzVdyUhq+lT9n8&>d- z_K_41>Nt5L#hXzRZ-3DEdG1+RZ<{E7#zIA*AMJec2=xoYi!%SsW?XOUrU`&8(^ToaW6tMU*8WC zH@2hEB-=|JCx55wmzOoyFL~5Y+iC8r^rvyjqq%%L`> zyo}mi9sk=>{Qp7gCAHpiAUUkhmYQ|4<9eBH&1#t+wcYO@F8Nk^E~(C&Ln*Fa_(0af zR;r&m7@x5n>*+p*I)D8D^@ihy_Wh+TFkm8o?J4PJolIVt7%lU;o7US99%Ac3>j%qp zX}^T{Ss4GtI7#!DYTt|2z0Dq%jz1^+EQ(w0csKzDeDw2*=K83aS@L_j%5*;>KY375 zSf5`}e}QHa+ijH3LzGYGR$}`b)+uPOy?@w()?FX(llfdh17F@yneK*mGTocxhjKgh z-)ldU;CrgKNpaHtd{4>C$bJB=bF}yQ_lthlT1ln(PR-{cy3ZE;h;*#>-|gf_yT1C2 z;!S(KlTC3xnHsh^<g6T$4d{$Ard>Jq6EqSc0uwBH{h#wg(`G1IKz{HK~z|^KP@KyhvpaL=7 zYRx+5$+pse6x|;KDYhEO58BV7>oqlQx3!n{L+JjbIuD+Oi3#ns?=_91dBOFG%;!R? z=eucsZ%Nlv9!mFbv-IDR;zaH52KYfdPyAi_QSY;5Qh%SmT=Gitqu6XSvvYH7`33g8 z0-H^-Idhx^ifsmbD7J*;@wN;{o@1snzrc}~Jbq+WZjK|_o|fg1#{wU*r5D-Jfj!H) z01U^>wIz~=ky-Zqd`G@wn=&D(z|=pdFx!#mOt)n@vz-O`3C{SKYB5q z^LTraGrKT*0wk3muW>fWcRb0Fo|}`AAFuH+Smw9^Qj^7vR^o(Ii@0z%{13!J$*BXbLL3S zH!CSOs}PfDble2TC#KDsY|komXb%p|&&`_a$dfqQG%?>fGRp;?fMI%hGwkUO(L~@N z$&r)qEq<0uG+%UoDE>rO0mR1wQNU5oJV(072G(WrT%#>#K+Hhfgv<1uZ7;}k7TMBW zE@w_bmNUndmpfB&&5d(8M-~(*>6wo7*$FwW!h*QGnGl*e1rkjxEa1#G#WWBrJ*QxF zUT$_$x--k3=Coq#$6#HJb{07@k|6R&AtPvn`K| zlEu<1waJu~YtOLe_#^}!1 zEBmKmZ_bR%$ru4$GDA9HU2=dkAF?{vkt2fJo~7+LrdZV=A!mlep6`TGX>FpTo%w37 z9ET%lqQed$oT0TtU)cRGYGZQd$EDeGGGKgfbdvQ(ow@n8G>G5+2{46HFKonRT4IW{7dVP=uAMT0MTQYdJ)tlgM%>0jF&%@xgU7O6 z`I?aoMkX9Cl3Yx+f^eNdjmo-y8)A8#F-o@9a*0OV&tf-BcmU>ca{m;uv2 z%u5+i`_S`E{k??GCVJ)r<1#Yf1n`VguhDyMUi`&V0n03idWZhGrf66Tq~&BJk58B| z&N?zW9-2JKXmi4jt_P0D%>jdf-ov=4NS^F}78?2!XtaQSOwl9kX-N=pE*zf*LDh)S zQLI#C*<+KkVf|z+$V(854D8l0evX56Q+&J_Gm@ft#!M!eLE&>$wCJ+Qlhthd9TinY zurflUG6xmct2~oRcPKi|k*CSY9gy zQlRAVFbttM@{f1q=i6sGEHLoE`iC`~e?eo6xF~gs^(56SjI3jFq5lJeDi#evL3^>5 zaFJ<}Js};lDb7nO7-WO~SY$GpqM`f3dNf~jpoDZ-qngq)?RmC>JUcE>)8oa7qJU%5 z6UQdSh&KJ_4%F5W?o^?z)y9G3Z#noDM?s=}9>$!e0phL6wnXf5zPf<$ix-j9C>8&% zBBIrLkzh5kwuo;O36LiBx%hawLbzmlYN03}G0@Z0mSHG8D?Sk`#IGaru7T&Nt{O#x zrhe2g@W-ZTIi(~O*b542@b$OAdNU!9F2w{6(=WLeKfC2YK)zPMKhM{iW>rl9Qy zrprq}(`ryz>e#0(gT~U-pDIfBVcX@Nr&j>2`^(FIqxumA&}r;ORn)i${7g1LHIAx( zG)CcdyWfKV3Tf5OJ&1;IQ0ukF@ z0@Fj_li8XEjPb;PebDQOuT-QZ3t9g(<1ZGkf#(}vGJf-o7wgV9UJLDf<2|66Z!T3# zbzZzwZCqmP@+Kdz*ZnS;5x?okH%e>jT4(4LR)sm~JcMY$PeJ27=nWb#kwGKOS(w0K z-7xWb@Y*^YwD+>8nKY=@rBU@;0dvM?EMEwr=CPrT4ggCE1EP1m6U7H0u zH`$hKgtG_A>omNlVjZ2Bl$&J3sa@nj_aZMqPRQFJadD-0)rdD32iTHLI@en~4B{`= zm3U=een;YG>2@P-6sQwHi$*&$im+j`?eOp+U4e$S!9xsuaubb@6JWK{=*G6VX`N(K z;zv$QvgPB=68aGrUh>CuxT})`d}dZ|nmx;wKR?^%$eF9aZTNKPs5ZE2vdy(;iPUDo z-LZN0`Qm4^%Z0nfUXh-a3%7|eQ+UXkAD=Tf4jv0YGAe`g;mOqudtp{Vz8{1_*F8{GTz z0?ZRU!@)9m8NUw&#gk z-kiau@yJ}qj2T`A=K>Q?e7p>j4#Y;nZM1^ME+tNemAcmfW++=cZSf*|Mus%x1ajz= z@QBb+;D91$`RbEc9^7U1+JSFto)bDlqq6B>`NYf@vEu53yTkj+aGSv&i6>(LjzE^- zLdNG!)*n1_^E=(CJ_dyHz;i%;3~m{V4x&aKJo|Fk^Pu0&6jpiOc)}daamiEhXSh8G z6Rtmi+phiqBF3d;Inzc@OiGH6x8aqV`oPYXoSU1KmRn>~AkP!hG*8!ZvvFX?Ss}Nu zK$(%}aDY^AV>G(?Oye0`xyglWv`8gH+{=$425%LdC1dxpKh9`A%{2A+Dm;I^^egrYk`#U~XEoGTv3B_s{9!M#NI zHy&XBEEr6MKvvM-Wq0N!j75_;I1baK$tF&SwIw*g!U^Y$6sL~@9&bw;tF_7is|>Bx zt!U*;O0XqOv?Wav6Rd0&Q3GO@u;r)2{n?zEa$tmx29K8$GZNuxX$IU+a?{lbW0hwe~@K5XS!B zkA$(83WaeZ6u4QySb+5u#=;m|(yg|nlt!^&!nq?a+mYdfNgZxiW@V+pGd1x#Moe7R z%v@;U%xrw%4^NG0gGz*ZMuWv;s8QHap#5#pvJOYuv(gK*z*Pn;!C|f{aKhUcnw}dY zB1yj5V9T9h%gN1=!Q_jsM!h`-UuA%p%P-J7Lq6u8FbJ3ae0Wd+WFo_k4-u#MY-n^) zP1I3F)g}>gIa&BL2JSc|(#;SE_Cy-VM1L~DL&Xe7QBuKtxHAOB66N*!z*h-u;(2Sn zbR#cD$QRF!4AL1gNE5|VQm+@22;iA{u)ZJz8M&%~Ja?u%7gFGUO|h5-(P>17$6IOf z&NORAn!Frx;-}vUMv>Yqd%8{ah`lA6dW(OWzD{M5ol0xQdKApG@=Alo*|JXI*{|t;YqbAghmx{F zt99FGjuvsruCND)>qGe{2--ouC6!c=;|O#G2h&VCJT}5dS9+77xC9dySJts`nT2iO zyWEG%Dg84qGK~(vD>nEaAIl_9_W48ax;fGH2N(13yrjP-Z>DHj6L?oQUtE6jjGO*_ z#+f_y!p~O{b?w6lEm8dM>HmXi+yBHta_n%@;D95Gh&yrlh@-xvDBU3*ienuoKuwFo z1(~qS#%lKWW{UO=MKirVVSJE-&RC7L30}v5=WVdMgb`GXzWxT$12XOTliY%qb{EKrL88i(TZ_k4l#3tY? zgqT$vHtGrweQ(byd(W7JJ(+qHn7Vtp^VxaJM zX^Mqrk_$Xd`)JZO;Y*LQ%56ok)U!G1oh5#AMePLsX{glClBQ@sM%`m9ho=7dx%i5c zw~Qjz{7quyn_m!PzG(FGf#bbz5h9-8h&b`jrzsk)`NS&NyU^ucqA#{k<}1wr3uZq* zV&wqMrxwY7$^8#J{hM_R&ynfUYZ*WD%UyTylL9P)_+gXYLWmm$S`6{yri-s{xT$od zyT;+B0oOU&$Z53R5i2$BhAme();=%b#{w)nk_sGi{{NfC|BohG=zwA#!CMD@Q_KXo zn);`&^$beS&4ycp4tx<#%u>Ak2$HlwJAmV$7L8XCqv56rz5(X<5}p(9fk3y0m*Vo^ z3LTHZyNxhWz_Uu<;((0Atu1H1e7}(doI4V-nB^!!qa?VHvgb(yNLLJslM=LVC4-^7 zQ#)}6nKmNw{VoMw@)YkqiNwGNUpt3)PVi;soS9h;c@PVTS1gSSXmVQ9tr_?j16TU# zaO=K+UViqb41-LTyo(Dz;bnrFZ3|ULl6;w3c%thD^2ag_MZ_DCG0}MT0Qshkv4GzF zgcsXH%6^ptGnsQ{j(m+<9aga*MtL&TF?q<)Ti>f_EvPtU#C)3rd41H>?gFKgk;iRtjL>tz=~=X|{a>6rh6 z;x&$#i>1}rS|_Q&@)cURALQ$=&~xBI(t7|ql27@%D{>0|M)7QlPR=c`XN|N@N`~)a z@ZrPPvwS|iUD@X`pqbi7d}juj*jZlLO2K!EcAelm!f$$LDBbqZ#;MOr_x%HAa*;m7 ztS&nQ**SWlz)UXE{;-1fYkxU;!N2&{G;R`zuiePNkY}iYLFeOZ0RH2+JlpU5M#DK~ zQ98I}6p$H@0*UmZKpxdZfrNMwb_?7rl%eU%1ah3vwOo6n%Xfx0YNUTbDQbMS+Sm&e zPxAbW#uJ%bBA&?VAH|cJxZjGvzb~q81CPvDR#-mz;)z9#2Tm4pr2dB`g z>PUm_OoY~bjL_`|ANe=e*UZbMudaQ@fi7`oW{+we35od#%k(F831OcgiKM zsC|Y3ucu`nGX0M{H%LzKB@W#7%Sd!^nR~N?}n4#m!IH$De+}P|65LeCThs} zdskPi8cLz(PsJC@{?Be(`Q_wa-MI4iBtjX6()@rAdu1caXJ>(Kg8BLSH=RpUPnYgs z{wDm|bqC^FQqp9nar5VCTE6n_0=4Z#;>fcMA(>1gpIk9{F|`wrF0p0G@0?`*1PYN08Q>YsN38=lRy#ZJ9>%e^BG>E>3xO) zoBe-&%#}^*9do^s#$3?yz4D8VxjrM^G1qINhMWjXAEmI-F=m$6TMM ze?R7Wef^uxV^h0 zx!kDqopOn$_ZbFk_W$`YS2n44%=Jndb3tEv%=H=Rj=5eFHRMFh`zRlCeUy*6UivS` zT(6&hJ?8p6{rfT3>+9ciF8?~cj1K01LZD9OZ*hr^=5HLJv-un7b~ugM<#sy%(=O5R z{EY*4zJD_2dfU%8=5hop7Wl3J+;yWj$E|QL`S$U)_z9B}5+_a=A3q@(&Wkq5uS(e9 zrEmDXGw^*1cuCuy70@p1>WMtikWG5*}%Kg0bcJPqrV1u`t8aoj0F{O+9b^ht$R}LDRi}Xgo zYxMBl8E=B(*)KuA6d})zU5FIn&DwPFi(pKHurjfbU<}_endiuBe2RF}%HLAF5T$1+ zii|$`eKsiS2+{$8>G zmiV$@bc|Y)zF-#Lz0k84v9E>~eD?%@$ylK3Lg&72Ex*+g$S1t<1^+`^;Y-!v3FZg-w)jpGKBbQK<`PebN5Rgy@Ctr_@4u~<`R3KtdhEwli}-V&iDylIZ_ zgXoxf(^kI?*w_xed5aC+7^ zXc+j0U4B7E`VBYq&Cl&S5M{derrliD; zNU)ju#z>r!0>=IOMw_@)e|0VYl)u%M6aF(E4OZw^T#KK58mT;6{@avJY{KjnMN-uR z{gQgJ)PCsYCD2(a3sIVZnMBm#p3IFDgq8MPe_LvX9n!LF(XR_>~LC~Lf(sBG- z2ko3r_>J_Jb1lmKeZiIU9aKK)XRA$ zbfdq06>)=x?<5|p;RlFYHT*d7Ob!2mxLd=|5ii&97Qf1TR%v)g;`=nbH}P5xA40rA z!^aR0d&s{YY{a89JeRmx!|x=XqTwrvyEJ?w@nQ|%LcBu5-y*(4!w(X#(ePu$JsN(R zxbm=ndCw7#(C`*#Wc?d8yd!aohW93(s^LS37isty;$<2>g?Ocg&mvx};R}c#)$nD+ z>ovTbc<3Yk_3#{VgNDCFJXXU$ByQF4Q^Yeh{14)84R89JtmkqK4<}xw;hl-^)9^mT zYc>34;td*pEAg;L{p%rvc$9|c6E|!4-NaKgyp*_0!yhDGtl^u9S7`W7;yX0_L*g|W z?ji2caOJG5XXP>f^0px!q2Zm08#TNyaf^nJBA%+@6NwjTcrx)a4WCN9Qp26Zt2KNs z@uM2Pgm}G%-%mWW!oMCKBW}>}EyQCr{0-t(4L?FWQ^UU{UPJR2&Y~M($2ARZM;SjY zk@(lcIQ^+1!Rr}!0#W^_fA10fbFTh9WGz?!p0k!8rN2L;d8rAwDgB3CY!F6Y%OUCzr`x}2x7bUEM0 z(ye9nP{h*Zd>>1f^KzCh=b0>B&TCk@bjhvY=4R<~Uc=Jmyn?06xr?RCc`ZwK18d(M zEM3k$EM3lbuyi>uX6bU?z|y@#lvMr`%F^XLN{7elaI+4#=y0nJPu1ZmjK9kAU&iMe!w+nIeT0y_GROiuoyL`Q$v4<&*PRmQT*h zng7$we+Bc;xr_Pd+|2xQUcvmgWaX-4{y8sV{yDcW|D0Dc|NWW&D(0VaH}lWAmHFqq ziuoVQ>SqV@&v`NP&v^>-&-o7K|0d8)dS~ctR6TwGXE1CuJAZ3^RunSBxClNm2&yqfVc#;q*g${8Qc>?;_rWA#?a_#wut7_VY} zY8fBM(rsY;7iO=pb{Wa+Lm3ZcJdE+aj2jql%KS$$K9$)U8SlmHV;OfaZf2bRw6LfR z3*&8=y_NBmjHfXE2CL6h#?36BnT+4SxSR14%zrWCuP|Q5_%AG7595C@dxfpL+Ou>+ z8UK#?31i&J>?0W8%j}~VPh|EM#(!t_DU9FC@|nu`4UA_puKulRbmwCHJ?6iN@hZmM zjMF1bakPr@ZYjNi|A4dWrKyhj<|#q4VtuVuWR@!gC!Fn*MAg^h3O-{!^wgff03 z%TE~NU$c6MV0;hrZ(#gGW*^0PD)Vn-{4?e!mhlG0t&H24pA^P3n0+eaYZ>3c_I=597yKy7i2oWW0g#@yx%%)(`Y5gE%Xc@vbag1LGqYk7E2L#*K_0W4xI0 zO2*4q`|jtfZ?<8EDi~Ma3`1VYI6ebVw<^Y+%>NF?Z)f#T&3HT234HEjyglPJj9<<8 zQO18_>DDrSj&Tp;Z!c}cr4>X88*K0ouymO_*7M@F13uiSh+lm zKhFHrGyXK=4U9j_cqMy&_W zbht~07whl}9lk?{*XVGM4p->C8f|$abhuH6TXcA;4lmN-Wjef4hga+HqdL4^hlkR8 zHQIVG=o4iBUEYP9tbrNhlSJVl4Qba=52uh8K; zba;&p_vmni-mB4;H$sOSb+|=`r|R$`9bTrxD|L9a4nL~H>vec2y;q~H2ZIie)!|kh zo~gs#I=ozmSLyJ5I=ohgH|X#%de28&4^cYYtiw}uxQERh4CG#Z}?1Qd_1!+V*Go?%NYNY`Ke?)j^(qO@o~)0QO0L8`+CL~F#Aw8KGQ43 zB6S1fQOr*)1WC89&PM-@v$m$M_D$KViIv@!J^pF#ap!3Y#ysv3y1_{xP#RGJZA7zlHIpjHfdG zU+%w5-fzM0*!{`;8yIJ9lqkl(V)jPHn=t>ej4xyMX2u_2+`{-bj9VGMg=Hv(@jID) zD&tr-b<1R2{cZ^!b1{B}Y7C!6jF&S1ZpK?PUd%XupRVm#CR0TrnSC+iUo!hL z#nuV%anv){+Kf!WtE-j(sAjK?rPwTz!- z_8!K6V!WR5ZY!2d{|$^AnIC1XFaDz$4`n=t@i4~wGakYCG?pI&;~%j6L@_>? z`7ts+gz;F$k1#)G#>X&jVf-fM$IAE^md_N%hcWw9#@jOgnT+4e>|KnfGW#ONhckOO z<0lv|X1sy%GRDs`|K*JLXS{;(IOeC4@ezzyG5#v^vxD)$j8`*0iuu{c_+!kzhVjwN z{wU+OFkZ{Jg>et#35?e>?qKcP!1x$uudMUM|HCYwp^S$!KVgiIWqu+UAIG?X@wUuQ z6yrZIdn4noFdoY|edSvmH8cJ#v$rrlfR)S2_;_ZY!uWM8pQ(%oGoHzKIrHygyq@_l zV*FOd-HhikKgEpm_c6*CU%~9l8Bb#VD;PI2`%1>IVdbh~Jem2~!T1Hns~Mlf_&&zN znEx8aCo}t_jGtq?mhl11kB9Nwn0-Ct&6#}z<2N&|toOzL?aWUo<5L(9V?2}9X9VLf zGj3pf8uJsyxWep>j8A9wv5a?N`8P9eV%);`6vnNL*Rym}7`L%>QyFi`>@yj+GkX`~ zX^a;!9>M&$8Bb^S#f(R?{FgEQHuF=?_?yg61>+fvS28}8`Ke+&nx(sg@#mO*HRCgw z|9yKXPBQIjAt?X zYR2zkd>`Wl%ufyDg^V9%d@kd)jL&1-!*~(n^^DJFyn*orj4KcL;{O86e<P|z#y2uQ#f&d!_GOIU%z#L_&&xTV!Vd&hZ#T0_#=$hGX5yz9>yPIyq@t8R;~udE111P?@{2hoz=`f zl<^;#eHi1L7>{6_f3L^D_!G=Nit#5IH!}VdH$L!sVKhJnE<69WFEcr3iQX2C9gOQ45S#?2(=i0W4 zVp*~$^c`t*VZfPZYhGgg$^e1a+CvyHPho?G}0`Y7D13m(bf#hoVjudNXQ#G+1X9dK2mvsLeue zM13V{qtI(mw?u6adIjoMsKbO_jJh>yMd$^n+n}yL51@M<>M+!`LeD~d73vzH(@=+_ zt`>RWo5%qsB)%bq1kZpze%1Oz2?L*P&K~J_n(Z*#&j|-&p=Ls12xV zh5i9`SJX8^pF|yrx?1StsBu!Ps}lMM>Takjgg$_}JL)o_ccbos+AZ`>)ICwVgx-ca z3U#W`n^E^dZ54VG>fWf$LT^NU18SqtYf$$=Z4i0|>Kjpq3B4F~U(|}w3sB=N^t$@L zMEj#QqOKKs7HSjf8llrrN29J5dJ5_o)Kx+!qVA8nLg+E52cRw!dIai$sNF&jK|Khy zOXz6Sv8Ypp?u~jdYOBzZsE4373*8Yl-m|b9VT=z>YGt3LZ2%K zJsfrYe?|MFHlwZ;`Uli;sB45iiFyR;YN3y#9*Me2=p(2{p{@}60P1+uWkT;pJsP!J z=$)uO|DlLQg@Rgt|)TMAXTsD})|{dJ^g~p+}&e zjM^>q5Y)G!b_pGgIt6vA(7jRLj@l}8Bx=0HR%aHvBkDU)8-)%>Jr%V<=oYA_p$-!| z81;12iqPjC0Bu8E|EFkw)TyXzh5iAx9d(V+CsC)Nt`_<@>U7jqLLWh$fx1HI1E?LS z%Y@#IdIoB@&^uAjMC}rK8)}?@>QaT?jM|CXD)c7QvrwCb-iUfOYNOC=P-mew2)zPz zHtH~;7o*NWtq8pUbuQ}q2GRbgU8rk?o`rf2>KdWbQ0Jkp7J3TmeAHD!C!#JuT_N-s z)P<XLr~8{?Gic~brI@Rp?jmAkJ>79Bx<}QuQLnX5%ry@jY5Z`z6-TM z=oYB&Mja+}FzS0yD?*>!0D2+n`u~XbN9{&kEA$Vj7on~Z`XuVbsH=rOj(Q2|Dxr^{ zUW&Rx=mV&ip)M18H|pi6-9qm~eJ^U4(A!WKqfQliGwKr5R-recUV+*y^hVUBsEtCe zLA?^SLFg5zSD_9QdNJzNs1>0XpuP`v{U4(JQJ0~v6?zux`%%{jorZc1>T02rht+JqGo9)MY}CK)nIATj(LEA3*IAIvRC3>Qte7qka&zRp?068&R8u?uhy! z)JCDhQ9q2@Aao1VkDv|{IvDk%s1>2ltq1)W>iXYB`=hQvT`Tkts2@jNBlJnsn^0E^ zeH`@@sH=oNg8E6+6+$0C{S@jlp?9Nx8ns*Kov5Ed?Gkz$>Ppn9LT^U>ENZLJn^12? zZ5DbX>gP}!gSD@a4I!x%rsJEh4gkFI91=RItMf;2K6D-2BBA=ejjz1(2G%jfLalH0qVo3>(7YxM_q%u zR_Ix%KSW(4bQd#QSgpNji z6m_c5y-^=SZ528a^>Nf@p*y1f9JNvCaMUMI8-#9w`U})yLI zXn)kTsB4A(0rl6YYlJ?D`XuUVp^u~f26dItM^K+aT_N-V)Zd~m6M8r5?@+si-ii8q z)Gnd7q4uCo6?!x3I@DI7H=+IkwOQzms86Fd3cUvPkEjhouR#41>M)@fqy8DSBJ={( zzo4$K7wwO_9(AqIvrzwvx<=?U)Mrpv3q1w(Z>Xz;PDFhcb%oGlQ2&m)Oz07)|3K{) zdI;+Opmqrzjk*DKs?fbr|B2cvbR_C?sLeumMEzgXMxnz||ApEhbPLpfqYe`~81;G7 ziqPlQfWCmb{uj~ysPPeNU9HeRpvG7C>uQ8Pi8>f{wa~{=MKxNh2Df3Z^6}>h2DtzO4LT7*PzBn zuXP5YSD?mQ!F6FmFGh{84%aC{FF=jInx(G(XVLzs!%)`>Jqz_!sB45yLmiH~TIeaL z@l~I?Dxnimw?kba^cd85E4{8v=n<&#)%rTO&_ht;t95lQp`%gbBj37Ip?jn5fZ8f_ zBT02nqsCXI>#Br4g1Q^(3ZW06#z&BKWkT;pjgR!|+(Pd}-4nG-=xwN@ zP^SvL8FeqzR-rec?v2_k^hVS-pf(D<26Z3Q2BBA=#zzEoVL~rP-50eY_3}t%M%jh# zn>3#-?v;EEeeM*WmQ}-g!3C6MRS14evh-@OlzeMh($IQtd$`T^DEPqJY*$RXP&=bd zmr;r`?H#MgrG!!1GYSw1{p z5CP8Sle3o6nLJ0l}I4e39=OctgNU0$e}ChoW4&z@FLki8*JOc=JZY3~U7 zHJrRRWTHQfOHQ&Z`qA1#Q8Fy0O}j^dy`?1HW2)Y}tO}N2c>dmHFMEGF=aq2UTlkNqWUpuNj~6a1t8TNddTDh*3tR{(bzQE2L!}}2l6fea<3DJ= z8SeUM%j@tz4Qv!r(8M*)?J+=AZ_^t%KWN1Dv+Z|?7DuP74c-|NT2 z{WL>AH#PRN2>qxj*Yh*rfa1BL@fj20z+RC(ks4Jl=H2V3f%}09P&~U}d7~*obDlC@ z{&>p_0i$^CYkbBhPzVSOymZ1Uhd5R|DUI8Ft27H0X1jJ`%gBbsAoUDt?DuYYLX|jS zuO|d<#k`$@wpYSWmXdd7wE1N}?A5qXhp_$1lP)YDvA{>^dTc>U=`s{#u-9`EM)SSP zs^JKpB3pd0&}~-Xj>MsY#$iOYQfGkSm?XsAsg7UO4s9IOZpMZu9H|S$iD)6tKwrp@HutY znKpfD$hFMyf9f!Ycv8^mEszBf9h7#-`bywx6<{uoL3z}ittzX8VFOf+Xl7AC&w9jh zN%neHh+>6Vmh3i;D{T>nSAxoG*l0WPpSQ46f!DYTA42Xi-ehk3RKv6rMaWVb=1rne zc8<@>eZ0_?!L$feMq% zRoF4r!*#e6Wl4{P0)kC@C|SrY%uU@%Y&f;y_j+QaFJae{+u@}>v-|v8pTFkZ4sSs* zySC8%A>D9H_j`DQMa|#oY-Y3-I)rL;fE!tu(Syv>7H)JsGg>M=VGM+nF(YQO2&OYx zQ@urPMfq3e5xDx`hmHP+*W%gKEV2HF8lZ~RLuUU&oi%CVU?b;Z=%%9KOFk6+2*z^k zPM%J(^I^kVN_NREh6m*Ae*SwARw4}ij*9uZRvs1Q@;fRf=H2qBD3;$*F}*%1kBaR3 z9mW3bSuT%?a{C<>6J(}5ie>Z9vzYeAz)`UZVofm@1}u!|$M%j{YPTv625S%2F+3N|1usD5cmGvV*s$d8zk=E6BYEtEgvX_G$+f|Wh4dQn-u z%2IN7LrLM;l1cTYlg?U7;~Q{NSv96z>7@FS??tZeE&PDl>x2LZM_9j6?rI`1pdJ3TNrtw{-7x@?+iFWoU#3~ z&%mC6X)Ix9K#njYrEdHU1HST0b|L`7Z>o?Tm0J{~)C})3D3*|NIE+7(P6EG)p_Y=* zF4XwSBkBq5q0q&6BLiwN)XUmb1hQtSPidOqQU(2E& z&ur*PnpO4tFy6s>OgN#OtZKicCI}M!0Ml)NP*AfNXaQ6S`GVu>pi+VZ1}p$BX90wR z6I3uXv3CI^#w)&lz?C7`h}AM?=h%1XUyf^y7eL~4ANF4Wz4Z-0Rl5M9Q^WjLFWS^U z_j93L0Fev-1(4RoKIrgNU*17rlo&6)byx@&G&vSgeDe6@WLYolaYg+JXc zX{A5Cz$V^IS*sy0eIVBwE`QTKFf;I_5+2qrl?+f7>QbqIxzR3_LZvUUR7&P{nx#_J z37^0I+)lGp@<3gwtDttw&Tpx-1g0_7=s)lK%6OVDm2%|bOf0&Nb0fY~x?Oq_OQkoN z5o?6Wr~Rgd6E6wB|ZSSrnzM@9Di zj*6wy9rCCsx8G5*R2n9ain93~6-%Wqa8$cg8e1z$StUxj*OLWflXj^Td)nl`47vu+ z(Jq5xa8Q%WAPdyA=Lzhfi}v8?eTR2Sx#&9Rs->`SIrKSZr~S8giFMHVC1M@aFHf$6 zzJh@FjDg;vu7kdV1A;qQbkd-mx>$TSevzjw4D2Ys$TJzNEo7$|&_Z^yS31r|FZXdO{UVQi7^34% zQHK|MS6th2Dp1Y@%C#sLvParp@_BNW$+t~G4ct?PKiDbhe&&VP!oLsGtob};h$G3| z&Bu|}ak%n%$^#_Iik^71gFVTVo)$+c015dnK;@Dr&fC$b3sD?OB*Bs+C8nvUO3>!$ z9Fprsj+Gv2xj2N2;SeL?%NatOR06mhPQ|70ikph#eytcT2VHR~j^b_-$93y_JOc>#msq~&$(+R;4JR+7fOHmz2FWGX zO?>~-9TSJ--kp@|Lb^JWTbaWRi&x!U{zMID>%eU$_ZLQ0e^tN9Ggw|wQpzYIpJg3E zx>w6(J(2QlS}Pf_Yo7NT05|Iu!h@}mndVL;!74zbTY7>&mN=(PF7w$|a+fp1F1HcBBY$Oel>a)JP;oNw~9+kyjg=*!AI+w z9%;2~&eT>B6|J|uAgxU?$!}DZNCV)`hC}xxA5Y1Vp#;(tr!t^}S+FH2(CDB;<+>10 zRZs_eN@JF_%=&89a7ym(Dv)6m%-^7Rf)2c$!U8PRh0`+jhK_e@On^T>Cz446sNBuv z$_`yh1>jVY7=3c-UT#1P?$>=Wx>bxPR;d^#OJkO`fpM9fdppRx;Gox2Ul1m`MYMwJ z(tcnZ=5lxCy`7gKv#U_vr2$mleF*@TccXkx<*@Sm5n20O4=C4_hU9b+p*mi)QVZp4B^yHf_fx_Ax2@P zim|JT!P=p%M{v;V?qS~Vl!(il=lyCVbw-pMy2;{7&y2-?9W4~{BE7mhNhF%>?*&TG z>gLNmBD3xN_oVM6@57OLMAgh*+#^4AyjxOD@aEA<%k(X)S>{*}VgU2`Bm11v@6-86Cwi@wBGO zR>Kq{YZTACfGkmq>=$l{Bdk&cN)bkoEyT_6NT!F<`8;1Kk6rftlt?~DxJt7+I%eRXE0S249iJBfHUPnvfwRHaD zh)(*LZ#MbY-JfRuwU@)X1-&pPgue=13>NKHqtn>rpjuR`D7xSt69BPB_q>AC8;mbt zi2J^RE|qwP!Q8$G=Jkr%WHA2>`|o2KPcgd<<{Kbr*|L3}sF0w&e_v<2< zyD4V7!JI|RdJoh3oO6m`zVm{Za)-g(o0$80n0C(XR|NBSifMKF0S2Lur>KmahT!oS z&%QTMEo1c@2S(;;!Mz1M%c#B7kJA(%jc7O!e@8Z)iN7TcNKro0$1|rK)E6d-VI9G6UO~a@6nvL3`0)g zfp@Y6sP9ei55Z~Q5&?h2U5g9J>btMAGzN^iJuI25zBS|z0xGLB%4mXi%@%hie4N`! zH;64RB3C5)CmmmGo7>o6Q~hTk)qhGO_N0AJ04+am#M$tG`RXH31%EhY2K`~dUH2pi zp9-1m7Iy+s?uQ(<;_IwPW4Ln3ud(73+2 zlrmq7j3KM#2ig5xEza+NA>1@DO%AElA}a_mXKF9XhzwCKq$*)l(3d2;ll$R`SR}hs zRR$0@VQR-i_VCVKIUmU6TY1V+K=t-+rz}P3LA?)R?>Kl`QLD@AL1 zMf2Ji7Y)PZ;`*n2E`o%^vRfN~{C5I@5seIzD6$6{;bqhgsBt;ocB}w%5DXf2OE0)5 z7R>Onq2T`ZF!mO7n=zi(&2Vt?$3VoGwN`d+@Ia$ zbALGPfJQJh_q3X#TG%x}=Oxb!0$K><_MV-+qfF#*Zf{Ar*5>v`F~gKw>i(lxZg0`? zTq+U|@i^i#{-N3Jxyo0WISu%|(R3Th3k-NDw|4{9EJT&T+}<_>FJu{gkWmyD`9($+ zrgn*6WYl14yZj;pAyeDq7km98cg6-_z!VGF4$szvmJyF$#rU06ULfwZ^PV;?7pUgUJ=|y23NA0f_r)#_e;fb zml#~hY6|Y&aokrhZbka#ydlpV)#ZZw9wNI4&%Y{;+i7q)NQ!%Z9Cs#gm(QXy9+$8b z_t~=?HfN~}m$O&~-pTi}E_uuuJ0>RKxQmnJC{4;eIt3>lQNj(dZu!Y_226Iw>;=Gd z?vDs4Mop?c`l!Pu9huJc)#SQ$R!nB@^Huj6y3XcRRT!HxVrxcpAJ%F*z{`k!Lf-t0 z=(6Q- z!pbF*?wIwM*N++4cZJ`!da0GhK<*@%b`v}hAHXDoFqZf^2SMXsd{d z)~hiCsEC;4j;cf&0CyZ$6Dzr-g#5%_oic1BZ&hhV7-@D=?Xxx@#zVX-5tK!+(9h0c zZg1tXZrDTXn=9lp7321mWqt$T?&0!nxiu-ob|7gA(W+t*tk)m04(0oJy#0eCc7`;@ z^S8a2{mkF;HzL1vr&P>!;fmsY%zz1o-8{0w)ciQjgHZ zQ@#RD`%{hC z;3Ov+@KElk4s#MKS}=F?ckG;zFsi_mC7&qvVpf`>>lX+7A~&f9fXkXG+T6}Y&xMuw zILzo6^eVqN-V|-#hbyfu)92VS-Ha{Qq8vIGMk%mmDRwUGPE}ek8T2=3)t=Vc={QbM zdq#|>tTO&_FF7N2TAaW=AfS@dF>K(77gef9p0NI!?9{dKQ04?-D00M$W1zT_43VQ} z$H#GZEQZUGQd~)f2<{GX+&7CI)8c?DE+`wG-+&*FL{oPb!=+g$t|UXG-#g;CX9IV6 z3e??)8QL-=ml1HOUsK}|l{8*mt>e2)s@)&=^6vgQ1>MN(Z#@r({TyDG^#{Rlj zuuITK3Q|wPp&Z7Fdj(e-;8Cu60GD=i5INQL3kkFAVUAV^iB;#Bn{_jAj5K-&GEP_6 zPU+8{>bldwepMTl!f;M??L{Z$pX$0B3l%N}A3SfNt=;Skmp|23D^WKL7r;$1$qT9y zX#m;+S&+?nHnXpz;f4d&k9t546_3KEtVCi(GeA* zAoJ7`pJQB>ssODq0Y0Y!NCV(rz|!swo!Qq7XwQlFBB#3k2y67k=+>d!+lX z@H6Gk^1h|=Zh1PQLquth@&3KL{RZ&9O^|n^e9qpm^2dd^9#F2YXjkR;aIG$q6{u1b z#FQ`S=(<~3v;rLVK!~xcbb55e1jyYbaMA!O$KHoaJ8z5tbRl5@jualP^+=$cuYUQL zD!><20M>@G0z(NP=;*pMEI=#m*gw_vj2ekf#Nctxu3rnBG=R#roJ3XtV?Fd^!K{GQ zQJ!IkHwjEuV0R-%tu)Gsi$F?mh^)X7s$NTYHO;`E=i`+3Iw~J5ol}mCN4{gHx{ffd zXTS<=R)C>^lbmSFieNsfm`w)rbHt3F>MAXQ=_qEa z!F=LQV8%~%Jr9CbAj|DxirH>3uOeprRM+)IFu$mn9R_n6G2^GYPAr1?imoA6r(Ypv z{8ZQF7|-ITx}HSOp}qZ(r@BVUI%7|D<*y5!ySjfNcFglIpx&vj)#BB&bsXJ%_2psk z%L#rs!R@K8TNQkkf=>&BPb2tF1h=QUzJLoo)is(WIn_0SrO2tSuLK6T&S>{r;yxsO z@Kea-zRl}@=~P#u7F+(UZl`49_R28)uYTuHZnu)>PozIAxVtU_;h#Y!n?ZOU?QSpR zuoX|RVm9VXF8Mf%C!?sl6M30H@?lhNB!f^9ID>`60TKwk8MC`RpXzjyPai<${Oq!klez;Q)8#&N` zhj#v_U@lpi4EQL5|J&PrP$!)X!@K|( zCwTxsOo)@LlJYc+njT%xtu()nW%80oK`5ZlqP+?K5n-zZ3g&);>1?U$&=W4aZZp23=7T+$8E_ej>bttG&yhb z+c?^hK=WDGsY8<}q6JPml9J;)r^ZQbHhfZ?v?R3!h1oVvif3eCSe(4r(l4ira+6p# zB4d9Iz?QeNv4@+D91gtXDKO5xh`OAmqHJfe44|WrcH(teG$}pyGR3)3(-3l)YO=G- z16Zunxi?X|LrQO;bUhbvo_;w@&c7U9Ta$Yc=U*o0-o?gia_&u@f7uV-6X#!2;98>y z$sN7MrA}{Ec)6obbaQTVN6T&ykb0d_S}S*Cvp4z;aL-5Gic7nNjO31vMGWI_8C$8f zeDzsB)1B{j(&*)m_EuO42fed02N~FRh2J)%Fr3`c0A@P`w87;$FlSr}K6rjsTW$1v zgtm&PXubNE0CuufU|06R^8Sj_`71D1XLhGET=JsP_$^TMgjqpQ@DGO5-pyPTPk?Yp2!Og8~Kj zHQJ;nTHxg$rSl(E(b{98Exk@iNCQN>60wjcT430qsZ;>p($lkb&lg@iPK#65HbcId+Lm51e9 zh(*_zPZCb~>XAmiQ>8J>+F_ZdpriZg>NUE>atm%R4av_}?Z7GIjbB9()9j4N_sIew zAr0u@Db8stU)VI2Uc@w)$)vYgIg`%%dR|9yp797D4d;-{e4YPRw4{n=`8r5vP@NHc zH|il5NoW05C=8X(T20IJO`}m~f=y?Af%KhZX%*IjVWhLJQSK}|m9z@Hk!RjYec%Kq z{R``#%}K=R$lrf;cM!MOoAoAycp*h#LOgjfmBFDPzqg=VoN>fIExHnQ6C1=G+EQK11j9u!D>{Rz_` zg7A`ZPJzM*5)VHQ*J2P#=idoXeVFl9;ns2#O?%Y`dNFCQ9}UgZcjM590D1_9Ci@K8 zwAVIRM{m3$l*jlKP|-&mUkcmaMb{KbhE?DWTi+M(#~hJ4=oelxY)?8_OesGZb}bmU zi3)4r<8(1?74;X~^8+AuO1x)G*35x#EI>Y_5z1EL9R~A&BA81Qv&mq72nqToc$nP= zb3_r$OBA!!U@j+SiHA90FuTBt707ZsSuxuUW|o)*Y^Ri4>(H(&g1Nb3b{Nd>6Ep8& z+8KLf5zKCN|5m4CiFt&FX*s(Po* zy!OR@`yML7_F)k=p$N;-)VGs}@QC|cTxgDQ5lfO|yoseqj`1OwnXRicMtjuH$%Et= z_XH2_W#U6-_R0~ZNhfUl!O`cDm2o>TzDO}X{tXOezIvr3YLZ*+t^@lBx^VY~nr%k$ zPNK|(_H4zkSTP#f$|Y}Nu>{3nit%Tt94f`AnKheyLttuH_G>C*H5pGVoDQ<@iOkik zWnwb;Z0L)$F(51^DUD=cAvG&dt`C&w*s@7AH8r8arY?(QN3Wz? z7*2L{7XbQnAf7(MOZz_^Q^q#gY9>QJYj*T|^cfTrw70P3p`Vf4Sax*6m4=*VM}Lx+ zK;Yjx6}8F!J5tX!59+?Q9{IfF+v7vE*uz)w(b`<&8YjKRyuuqIz5G+~gNJDgX@0XL z;iNy9kX|#l8oz+aZ_S;Jj&jLLQ#U$m>fB687o=E_$&F}Ee^Am7-|IazI&W>StOH9c zKM5yc2j#U~@9YBOMiO=`NG;i@ko4uje!r2K?fnU*xwl2~fx$U@8mQlvkSUl`>xG z2Cvlal@^*37#(E@qR8)bn$FApBERNoYAgL>m0uk17gK(*)h{mai|u}Kktr6kQ#`(E zz0#3hX_{9$&MVbb=rkUa7$=&GAYXd!;6?G~X+=c%`3srB<(W zwO8u!N(;QweWnCOcR=(HF^|XM9Y=aX66bkWkti0BrWqszjS2T_SO&dqg!XieBK0Z~wF0Cg4H5$C zg!@r&v!X~RDN>grQEfotsF6KRANTLMSWjP7q;5r`hJjRPkmR6QXB=q|8CfV|P?0zU zK$>NcBy0V{ID3yM(tsjy1c5{YB74YcCfr@)NLMOSk0No1fkX=<5|Xb8cZWE8#|Tn& zKOzK8Id2E=8_{sJ66S=40W46$^@cFo67B*-{t={v68;4VLvIOpmHKf#1*xO(XXew} z+Cj<5-XLW2oaA!g&c2gQ(#bBuz6kyHI4-?{#pS?jD*CQC?#Xdnx)F;j2NtE@`Z#W7 z9G8B_;&O1b-*3io*J2bR^3qXRTu?T+g9yzc@^-{=>DeqURjmC!9LH^lrRu+{tlVeUYK~f7+m=^Org?(VmCWV5%u&QIgL8MI4MrUI8}QfU#$H zb{y<-1B4pv97LN)_g03mClU##_u)BIwcU!3I^>;2*!zu4p#JN;spU+nga zJ$|vpFZTLH*DntE#X-NAfQvR#jIu>X7I|!;mH-a#tA#%B%oJi%S@D?>Vtt#qS10SD zS>M<2#C&>;>?~;&KZ?V!Uh6&DN})liOO%|gl^*B`O%L5#KTT+ev%{mt9*xtL#vExC zuZFuVUh5QXr2^4|c(Yu#PI?dvK`@o2N*%Q;UUtc)7zQt?S|?flH3U$+?2%Tn2VPRI zndYVZNi^($E?CMj&6Qw5Zmx7Siw;^);Uu5i+YoYbiF-$^#TQqEj*};KJ`*iJi^&Nn zb>e6J;yU?D<*Z-4ME*9(Ukbi{@ih5cFMnsr-;Dfq@wX)6@kWYRY?Tw!BzN3O8%;*4Uy=xY;o_TUoRT_X);ktBN)uB|bJgzGzb= zn^Hxas@Rk%+BBX`wMCm!Y?@ZIDZ{3^SQFkxJV&;rnNs~e$*dR%^wqQgo`(eLi?+6# z);VYev_Jtm-NXy69Gh<8MY%wXO}FxbS|->6UQn;RXy*kr$%{q27;i2*ctLHkWeG2+ zA6|6wf*RpP7cZuni*8;}YPR(7g7WbKU#7$7Yaq46zpTLuB9mI)?I*?-dNy?M$FW5% z!Ob1M!~`=GB(X<}BmwXvail+T8t2nZUOrrwW{G^;;?OtBq!;feT_nK1#ne+Eb#bIw z5u{N;B#C_Yj3a$Rk;(w;-KbtT52>y%vq85BgCvxn+9dnT2gx{ISM+}7*F|+{RS2ly zvDFUHjKn=82R&N#`3R!JOXCQa6QQ^c4+}tVDj{h9aiDGW=F^sK!%lJNy#Z|%=0od# zp~+|6&<5Xg2k{!i1N8ebNq5ENeDjxiSyM%B?%G0{M=inb#Lt~qV%~4}Fydq{Xn zG?dOi1Y&COr){X1n1q%~=ika&7B8JR@f}!L>HODN!{Vi76W2-&w`P5>uzIAAvxyX& zP}{eXO|MBOPmwZ^^Qsa}Dj zYhUteD_JXNc=Hq2dbL}!_G*P4d#>$m9b(PCOSHDkt9_HTGWYTm_wZ`FS$nv`?d zh_wf3?XDi|Le#=uP>ruQYU4g$$SWdXsJWX;a*EupyeR6 z%<)?83AF5mmS1=+%pdfB302Q|Rr7q{Ry6!}w&ipd8l3bxoqOiQu{$Q5R7JB}l9|z+!8>$HI{6VneoGJ$YCf6TmOX7U0$)%qolge=oK?Wl z)25AI)ZD-x7m*3x)L6tezBMsOl&7NN09RP0b z6un^ch&~ZGVZVXzKPrle55frOz-beLIedsJKq=V+9;xF%v)&1jh%?<1gzeohY-DqiFhEZVvw7IiBLM!;;o>>6y`;PSIsk6CrP8>r%&vPrh6(UNB zHTyP;V7X00VErhFB`<9V4BdjbUhGGM4i4g7FK_`KXT^Jy5A}R0fYlEm4<*@Bv@1bc zi#5aw*8hzlQfpD9G8j&Bc>pPh!o668xqw;Nt%hg39dU4sc6*TGqM{(&L~!@9S10Zb zB0J!HZWz$Wm;Oj*mRLjlNXtlVtn5$+6lLS)?nA|fvzQ- zyv+b$GbFq%3IIr|IZOHuEE*nQe{$la0fYA&X&D3y!hio4%!!f@&ht)`yod-t{B6Ue zyUSeE&09rRIqdHcKC>Ne3QuVOVt(Araqvd@>Sd^cZ@PDL^-a?oagX^A2&C;T<=cqz zrE~p?8(Fak!sL?Iv3MhjfuT<3QAtZ_l;5$*EPmtnoPPi{>kUk^I@|;>{tK_}^TV~e zI#kgza!b1qHAhy5g5-`!rjY$Jnzh6Pjg}Z_vjl;^O@XlxAX}PP#y`~m3XDG7Zg3&E z3@Lwrmm2WULhyCncm=_aCU{=h@D_rLprME}uTn7bNH98n_sBTdW&lG<4N$o(rEo;5 zT$XYmv(HT#GJ(ACCxRIB0?f2XmrKFA;-kTQLYw_t%G!%k&U5$XwDCgegGZSLsW{!4 z9$lqW5bih~aTkRI+3Utl&bG?9})P`C*zI zo-|0vk4!3rM&$z6Ml(W)MSUWLEXeZSOgt}uxCkHO2E&%5geG!ff+pMGf8DdqZ$>^} zhp ziDCUQh-G3OiLgKQ2 z4uJkcOf<9W8D2E=dF+2oZJA&D_Y24*Pt7Vr1@}A#Dte@@hmE0+J15f&?BOsQ%6hmGq|-xKffu_=;y>U5&b+d#}9UT(e7?@nqTn(EAE6~x#VgVe~DsX z@RJ2pGWxk!e#a)4<9Dd&M^4-Vn-&t~N{oV} z3Ba%SorRImbFsI}1HSxJ!#T=-p5-NFc^Hm~9`i{GzEBOv4!bF%BVU{tFkhgMGl#BR z4B)Um&f__W(t8Qm8>k#`63v|@rT4DPtz7Z;_9flV4CauON%sgycR>b7ve5Q9WIcR_ z?tAb>3_L(4ryjdZk{D;w_D`=n?*!zr0;kS;G9{$xVoWkl&AQBr*GA&Z8BB(Iu@PZd zq?0UcDh}I>++zQAUT3{UI_vTYjE@rtcUI=ZR>fhpGb6k?cgTZxls(r4#do))dm&f1 zS)~$%^dR*mN*FA?yccDURqCbm@+MRf1G0~zQTiwIpd;3b6aLG|T#}B#Nxg^`4a6}< zL$&4Ts`Orbv}6T9OS*EMl7+K`j#>F$>9iHv-Pi=B>4Q0PHf*4Ov~rv(_-%w0uVb7D zE8K*M4VLt64PqP7PFN$&4?z5|*n#1$aB9$H$TULQJMX+Ws?>~r6l6uMYE`3DhK#43 z$EckFs~s9%nW)x7gz}9!s?KPZGWyx(Gz6XK3u;dc`*wgCuo@Gv3%1}%yL$ihU}^KM zF==6&0b`NdDrUw+WTO#>WkU^F995KYncW#DQ|Y8v!yeY|I zvq2tM{WgUT9#{=(EZTuHnY)c;V^-0nofKAzRAn~*M_yCXFgBv~0kgFpFG#J~0A z8dqbEcjdY;wyW^A%1%g*FJ@FE8qX-Cc~1z_nzt%o%WEg3SC!@;k*Wc$8kmq?J@)`k zBlenQB@B|T2H?37(S~wq7~tVsx1>2eP}2W!b9!w_|1Cz#K?SXvdt6Ys)pHMq?(t!x z+|=+f-wO3>J!%r`U=pj0Nq{FN>aDpOGyjdK?}nlD@CVpTx)aKH81~QsSz4yT^(}!) zs*0;*b!omUqLQ_j##BNsi>d@8gofd%WcAz=gDM%kbV_lRRQW1_U*Iemq)OlyA}TqC zcjJv-?h?IR6Vglb+LSqfo#Q8*YOwmIyE#upNmyJ#PagS7Bzj9T`*;87bJTeMrkO$~ zrW%5~g8LUldvfmsHiDD*g|u%uy>rLISm=SL@o@T#XN?m!7x~f8t36@$Ey1wJDH^zT zSWV}!x}Fj0x-K}A{jTfq^{Qaka^ZIkpB?BLC&q`@wL3j1^{k*>`(4lCx)YFEF8r?H z4gy_c%A@PDjVt`DP}lWAgDLYAUhhm@7wlRt{H|fGfv({;Iyq1n02b<@vD{1_? z{Yu;JxYIa(GsNx(QWN=c$0Zm_SMP!Haq`wj`(c;LPeR_jyOXEc&O{0C6{ zSUeWj?s>wHac$KMut1%l$4vyx95yI3w4WwBK5Yv-3b3($9yxx7L?r z`3*YqLypa^i8=$V+|&UQf<2C{>BXO^I4d;vc*JgFXVNj9MW5D)Ge=|RcI0aA0*!Wb zw;&w74KBe*W2mD%hIz4(4~^YPjn1Xl1ZVP^xfOPqwksbzmDxv#H|;UAPw}^&kY0Dm zK`g`NRfc9DY#l*M*_c_!F&aK@h1_HaE~!eGn|_Ja?ukfaM~FECZ)C&VmkIYK4nwpc z+-tN@jC)M_p3qwG|Mp%C!P&6)Vnz0Cx;^rI=|=WqMK*I1%6g9`F+ehQP-NexorOnO z$MQcCr%wBSF;2C%JdC|)b1x==H&n70ZEivp6uyDIAZB0ky=niu7lr#7J0hgL|J{qi zHb!l5FIx2<*^B=FYA*(r{O?{2F6TeE7pn^I#V}E^RoBSG?CTI^E;}-~^T4LZU-A8& z2R1z$3jf3Vtzh`iAWK4UZwJ5wC`EPvk$4|7C>Xh$hn$@zV*BxSAes+-bNRwgc1XC5 zM@Te(gItGyz?b{8R9OCM2`xT?Yv+PuQK^*mHeHO zugl0aza7hi;mK!o&=Qg2a7ba^gK)IAykT0#%c#mb$|kZUhwvf!JE0 - - `Actions' do not necessarily invoke an immediate action; it's just that they - don't fit neatly into the parameters array. - - This coding scheme is in flux. -*/ - -enum CbcOrClpParameterType - -{ - CBC_PARAM_GENERALQUERY = -100, - CBC_PARAM_FULLGENERALQUERY, - - CLP_PARAM_DBL_PRIMALTOLERANCE = 1, - CLP_PARAM_DBL_DUALTOLERANCE, - CLP_PARAM_DBL_TIMELIMIT, - CLP_PARAM_DBL_DUALBOUND, - CLP_PARAM_DBL_PRIMALWEIGHT, - CLP_PARAM_DBL_OBJSCALE, - CLP_PARAM_DBL_RHSSCALE, - CLP_PARAM_DBL_ZEROTOLERANCE, - - CBC_PARAM_DBL_INFEASIBILITYWEIGHT = 51, - CBC_PARAM_DBL_CUTOFF, - CBC_PARAM_DBL_INTEGERTOLERANCE, - CBC_PARAM_DBL_INCREMENT, - CBC_PARAM_DBL_ALLOWABLEGAP, - CBC_PARAM_DBL_TIMELIMIT_BAB, - CBC_PARAM_DBL_GAPRATIO, - - CBC_PARAM_DBL_DJFIX = 81, - CBC_PARAM_DBL_TIGHTENFACTOR, - CLP_PARAM_DBL_PRESOLVETOLERANCE, - CLP_PARAM_DBL_OBJSCALE2, - CBC_PARAM_DBL_FAKEINCREMENT, - CBC_PARAM_DBL_FAKECUTOFF, - CBC_PARAM_DBL_ARTIFICIALCOST, - CBC_PARAM_DBL_DEXTRA3, - CBC_PARAM_DBL_SMALLBAB, - CBC_PARAM_DBL_DEXTRA4, - CBC_PARAM_DBL_DEXTRA5, - - CLP_PARAM_INT_SOLVERLOGLEVEL = 101, -#ifndef COIN_HAS_CBC - CLP_PARAM_INT_LOGLEVEL = 101, -#endif - CLP_PARAM_INT_MAXFACTOR, - CLP_PARAM_INT_PERTVALUE, - CLP_PARAM_INT_MAXITERATION, - CLP_PARAM_INT_PRESOLVEPASS, - CLP_PARAM_INT_IDIOT, - CLP_PARAM_INT_SPRINT, - CLP_PARAM_INT_OUTPUTFORMAT, - CLP_PARAM_INT_SLPVALUE, - CLP_PARAM_INT_PRESOLVEOPTIONS, - CLP_PARAM_INT_PRINTOPTIONS, - CLP_PARAM_INT_SPECIALOPTIONS, - CLP_PARAM_INT_SUBSTITUTION, - CLP_PARAM_INT_DUALIZE, - CLP_PARAM_INT_VERBOSE, - CLP_PARAM_INT_CPP, - CLP_PARAM_INT_PROCESSTUNE, - CLP_PARAM_INT_USESOLUTION, - CLP_PARAM_INT_RANDOMSEED, - CLP_PARAM_INT_MORESPECIALOPTIONS, - CLP_PARAM_INT_DECOMPOSE_BLOCKS, - - CBC_PARAM_INT_STRONGBRANCHING = 151, - CBC_PARAM_INT_CUTDEPTH, - CBC_PARAM_INT_MAXNODES, - CBC_PARAM_INT_NUMBERBEFORE, - CBC_PARAM_INT_NUMBERANALYZE, - CBC_PARAM_INT_MIPOPTIONS, - CBC_PARAM_INT_MOREMIPOPTIONS, - CBC_PARAM_INT_MAXHOTITS, - CBC_PARAM_INT_FPUMPITS, - CBC_PARAM_INT_MAXSOLS, - CBC_PARAM_INT_FPUMPTUNE, - CBC_PARAM_INT_TESTOSI, - CBC_PARAM_INT_EXTRA1, - CBC_PARAM_INT_EXTRA2, - CBC_PARAM_INT_EXTRA3, - CBC_PARAM_INT_EXTRA4, - CBC_PARAM_INT_DEPTHMINIBAB, - CBC_PARAM_INT_CUTPASSINTREE, - CBC_PARAM_INT_THREADS, - CBC_PARAM_INT_CUTPASS, - CBC_PARAM_INT_VUBTRY, - CBC_PARAM_INT_DENSE, - CBC_PARAM_INT_EXPERIMENT, - CBC_PARAM_INT_DIVEOPT, - CBC_PARAM_INT_DIVEOPTSOLVES, - CBC_PARAM_INT_STRATEGY, - CBC_PARAM_INT_SMALLFACT, - CBC_PARAM_INT_HOPTIONS, - CBC_PARAM_INT_CUTLENGTH, - CBC_PARAM_INT_FPUMPTUNE2, -#ifdef COIN_HAS_CBC - CLP_PARAM_INT_LOGLEVEL , -#endif - CBC_PARAM_INT_MAXSAVEDSOLS, - CBC_PARAM_INT_RANDOMSEED, - CBC_PARAM_INT_MULTIPLEROOTS, - CBC_PARAM_INT_STRONG_STRATEGY, - CBC_PARAM_INT_EXTRA_VARIABLES, - CBC_PARAM_INT_MAX_SLOW_CUTS, - CBC_PARAM_INT_MOREMOREMIPOPTIONS, - - CLP_PARAM_STR_DIRECTION = 201, - CLP_PARAM_STR_DUALPIVOT, - CLP_PARAM_STR_SCALING, - CLP_PARAM_STR_ERRORSALLOWED, - CLP_PARAM_STR_KEEPNAMES, - CLP_PARAM_STR_SPARSEFACTOR, - CLP_PARAM_STR_PRIMALPIVOT, - CLP_PARAM_STR_PRESOLVE, - CLP_PARAM_STR_CRASH, - CLP_PARAM_STR_BIASLU, - CLP_PARAM_STR_PERTURBATION, - CLP_PARAM_STR_MESSAGES, - CLP_PARAM_STR_AUTOSCALE, - CLP_PARAM_STR_CHOLESKY, - CLP_PARAM_STR_KKT, - CLP_PARAM_STR_BARRIERSCALE, - CLP_PARAM_STR_GAMMA, - CLP_PARAM_STR_CROSSOVER, - CLP_PARAM_STR_PFI, - CLP_PARAM_STR_INTPRINT, - CLP_PARAM_STR_VECTOR, - CLP_PARAM_STR_FACTORIZATION, - CLP_PARAM_STR_ALLCOMMANDS, - CLP_PARAM_STR_TIME_MODE, - CLP_PARAM_STR_ABCWANTED, - - CBC_PARAM_STR_NODESTRATEGY = 251, - CBC_PARAM_STR_BRANCHSTRATEGY, - CBC_PARAM_STR_CUTSSTRATEGY, - CBC_PARAM_STR_HEURISTICSTRATEGY, - CBC_PARAM_STR_GOMORYCUTS, - CBC_PARAM_STR_PROBINGCUTS, - CBC_PARAM_STR_KNAPSACKCUTS, - CBC_PARAM_STR_REDSPLITCUTS, - CBC_PARAM_STR_ROUNDING, - CBC_PARAM_STR_SOLVER, - CBC_PARAM_STR_CLIQUECUTS, - CBC_PARAM_STR_COSTSTRATEGY, - CBC_PARAM_STR_FLOWCUTS, - CBC_PARAM_STR_MIXEDCUTS, - CBC_PARAM_STR_TWOMIRCUTS, - CBC_PARAM_STR_PREPROCESS, - CBC_PARAM_STR_FPUMP, - CBC_PARAM_STR_GREEDY, - CBC_PARAM_STR_COMBINE, - CBC_PARAM_STR_PROXIMITY, - CBC_PARAM_STR_LOCALTREE, - CBC_PARAM_STR_SOS, - CBC_PARAM_STR_LANDPCUTS, - CBC_PARAM_STR_RINS, - CBC_PARAM_STR_RESIDCUTS, - CBC_PARAM_STR_RENS, - CBC_PARAM_STR_DIVINGS, - CBC_PARAM_STR_DIVINGC, - CBC_PARAM_STR_DIVINGF, - CBC_PARAM_STR_DIVINGG, - CBC_PARAM_STR_DIVINGL, - CBC_PARAM_STR_DIVINGP, - CBC_PARAM_STR_DIVINGV, - CBC_PARAM_STR_DINS, - CBC_PARAM_STR_PIVOTANDFIX, - CBC_PARAM_STR_RANDROUND, - CBC_PARAM_STR_NAIVE, - CBC_PARAM_STR_ZEROHALFCUTS, - CBC_PARAM_STR_CPX, - CBC_PARAM_STR_CROSSOVER2, - CBC_PARAM_STR_PIVOTANDCOMPLEMENT, - CBC_PARAM_STR_VND, - CBC_PARAM_STR_LAGOMORYCUTS, - CBC_PARAM_STR_LATWOMIRCUTS, - CBC_PARAM_STR_REDSPLIT2CUTS, - CBC_PARAM_STR_GMICUTS, - CBC_PARAM_STR_CUTOFF_CONSTRAINT, - CBC_PARAM_STR_DW, - CBC_PARAM_STR_ORBITAL, - - CLP_PARAM_ACTION_DIRECTORY = 301, - CLP_PARAM_ACTION_DIRSAMPLE, - CLP_PARAM_ACTION_DIRNETLIB, - CBC_PARAM_ACTION_DIRMIPLIB, - CLP_PARAM_ACTION_IMPORT, - CLP_PARAM_ACTION_EXPORT, - CLP_PARAM_ACTION_RESTORE, - CLP_PARAM_ACTION_SAVE, - CLP_PARAM_ACTION_DUALSIMPLEX, - CLP_PARAM_ACTION_PRIMALSIMPLEX, - CLP_PARAM_ACTION_EITHERSIMPLEX, - CLP_PARAM_ACTION_MAXIMIZE, - CLP_PARAM_ACTION_MINIMIZE, - CLP_PARAM_ACTION_EXIT, - CLP_PARAM_ACTION_STDIN, - CLP_PARAM_ACTION_UNITTEST, - CLP_PARAM_ACTION_NETLIB_EITHER, - CLP_PARAM_ACTION_NETLIB_DUAL, - CLP_PARAM_ACTION_NETLIB_PRIMAL, - CLP_PARAM_ACTION_SOLUTION, - CLP_PARAM_ACTION_SAVESOL, - CLP_PARAM_ACTION_TIGHTEN, - CLP_PARAM_ACTION_FAKEBOUND, - CLP_PARAM_ACTION_HELP, - CLP_PARAM_ACTION_PLUSMINUS, - CLP_PARAM_ACTION_NETWORK, - CLP_PARAM_ACTION_ALLSLACK, - CLP_PARAM_ACTION_REVERSE, - CLP_PARAM_ACTION_BARRIER, - CLP_PARAM_ACTION_NETLIB_BARRIER, - CLP_PARAM_ACTION_NETLIB_TUNE, - CLP_PARAM_ACTION_REALLY_SCALE, - CLP_PARAM_ACTION_BASISIN, - CLP_PARAM_ACTION_BASISOUT, - CLP_PARAM_ACTION_SOLVECONTINUOUS, - CLP_PARAM_ACTION_CLEARCUTS, - CLP_PARAM_ACTION_VERSION, - CLP_PARAM_ACTION_STATISTICS, - CLP_PARAM_ACTION_DEBUG, - CLP_PARAM_ACTION_DUMMY, - CLP_PARAM_ACTION_PRINTMASK, - CLP_PARAM_ACTION_OUTDUPROWS, - CLP_PARAM_ACTION_USERCLP, - CLP_PARAM_ACTION_MODELIN, - CLP_PARAM_ACTION_CSVSTATISTICS, - CLP_PARAM_ACTION_STOREDFILE, - CLP_PARAM_ACTION_ENVIRONMENT, - CLP_PARAM_ACTION_PARAMETRICS, - CLP_PARAM_ACTION_GMPL_SOLUTION, - CLP_PARAM_ACTION_RESTORESOL, - - CBC_PARAM_ACTION_BAB = 361, - CBC_PARAM_ACTION_MIPLIB, - CBC_PARAM_ACTION_STRENGTHEN, - CBC_PARAM_ACTION_PRIORITYIN, - CBC_PARAM_ACTION_MIPSTART, - CBC_PARAM_ACTION_USERCBC, - CBC_PARAM_ACTION_DOHEURISTIC, - CLP_PARAM_ACTION_NEXTBESTSOLUTION, - - CBC_PARAM_NOTUSED_OSLSTUFF = 401, - CBC_PARAM_NOTUSED_CBCSTUFF, - - CBC_PARAM_NOTUSED_INVALID = 1000 -} ; -#include -#include - -/// Very simple class for setting parameters - -class CbcOrClpParam { -public: - /**@name Constructor and destructor */ - //@{ - /// Constructors - CbcOrClpParam ( ); - CbcOrClpParam (std::string name, std::string help, - double lower, double upper, CbcOrClpParameterType type, int display = 2); - CbcOrClpParam (std::string name, std::string help, - int lower, int upper, CbcOrClpParameterType type, int display = 2); - // Other strings will be added by insert - CbcOrClpParam (std::string name, std::string help, std::string firstValue, - CbcOrClpParameterType type, int whereUsed = 7, int display = 2); - // Action - CbcOrClpParam (std::string name, std::string help, - CbcOrClpParameterType type, int whereUsed = 7, int display = 2); - /// Copy constructor. - CbcOrClpParam(const CbcOrClpParam &); - /// Assignment operator. This copies the data - CbcOrClpParam & operator=(const CbcOrClpParam & rhs); - /// Destructor - ~CbcOrClpParam ( ); - //@} - - /**@name stuff */ - //@{ - /// Insert string (only valid for keywords) - void append(std::string keyWord); - /// Adds one help line - void addHelp(std::string keyWord); - /// Returns name - inline std::string name( ) const { - return name_; - } - /// Returns short help - inline std::string shortHelp( ) const { - return shortHelp_; - } - /// Sets a double parameter (nonzero code if error) - int setDoubleParameter(CbcModel & model, double value) ; - /// Sets double parameter and returns printable string and error code - const char * setDoubleParameterWithMessage ( CbcModel & model, double value , int & returnCode); - /// Gets a double parameter - double doubleParameter(CbcModel & model) const; - /// Sets a int parameter (nonzero code if error) - int setIntParameter(CbcModel & model, int value) ; - /// Sets int parameter and returns printable string and error code - const char * setIntParameterWithMessage ( CbcModel & model, int value , int & returnCode); - /// Gets a int parameter - int intParameter(CbcModel & model) const; - /// Sets a double parameter (nonzero code if error) - int setDoubleParameter(ClpSimplex * model, double value) ; - /// Gets a double parameter - double doubleParameter(ClpSimplex * model) const; - /// Sets double parameter and returns printable string and error code - const char * setDoubleParameterWithMessage ( ClpSimplex * model, double value , int & returnCode); - /// Sets a int parameter (nonzero code if error) - int setIntParameter(ClpSimplex * model, int value) ; - /// Sets int parameter and returns printable string and error code - const char * setIntParameterWithMessage ( ClpSimplex * model, int value , int & returnCode); - /// Gets a int parameter - int intParameter(ClpSimplex * model) const; - /// Sets a double parameter (nonzero code if error) - int setDoubleParameter(OsiSolverInterface * model, double value) ; - /// Sets double parameter and returns printable string and error code - const char * setDoubleParameterWithMessage ( OsiSolverInterface * model, double value , int & returnCode); - /// Gets a double parameter - double doubleParameter(OsiSolverInterface * model) const; - /// Sets a int parameter (nonzero code if error) - int setIntParameter(OsiSolverInterface * model, int value) ; - /// Sets int parameter and returns printable string and error code - const char * setIntParameterWithMessage ( OsiSolverInterface * model, int value , int & returnCode); - /// Gets a int parameter - int intParameter(OsiSolverInterface * model) const; - /// Checks a double parameter (nonzero code if error) - int checkDoubleParameter(double value) const; - /// Returns name which could match - std::string matchName ( ) const; - /// Returns length of name for ptinting - int lengthMatchName ( ) const; - /// Returns parameter option which matches (-1 if none) - int parameterOption ( std::string check ) const; - /// Prints parameter options - void printOptions ( ) const; - /// Returns current parameter option - inline std::string currentOption ( ) const { - return definedKeyWords_[currentKeyWord_]; - } - /// Sets current parameter option - void setCurrentOption ( int value , bool printIt = false); - /// Sets current parameter option and returns printable string - const char * setCurrentOptionWithMessage ( int value ); - /// Sets current parameter option using string - void setCurrentOption (const std::string value ); - /// Sets current parameter option using string with message - const char * setCurrentOptionWithMessage (const std::string value ); - /// Returns current parameter option position - int currentOptionAsInteger ( ) const ; - /** Returns current parameter option position - but if fake keyword returns a fake value and sets - fakeInteger to true value. If not fake then fakeInteger is -COIN_INT_MAX - */ - int currentOptionAsInteger ( int & fakeInteger ) const; - /// Sets int value - void setIntValue ( int value ); - /// Sets int value with message - const char * setIntValueWithMessage ( int value ); - inline int intValue () const { - return intValue_; - } - /// Sets double value - void setDoubleValue ( double value ); - /// Sets double value with message - const char * setDoubleValueWithMessage ( double value ); - inline double doubleValue () const { - return doubleValue_; - } - /// Sets string value - void setStringValue ( std::string value ); - inline std::string stringValue () const { - return stringValue_; - } - /// Returns 1 if matches minimum, 2 if matches less, 0 if not matched - int matches (std::string input) const; - /// type - inline CbcOrClpParameterType type() const { - return type_; - } - /// whether to display - inline int displayThis() const { - return display_; - } - /// Set Long help - inline void setLonghelp(const std::string help) { - longHelp_ = help; - } - /// Print Long help - void printLongHelp() const; - /// Print action and string - void printString() const; - /** 7 if used everywhere, - 1 - used by clp - 2 - used by cbc - 4 - used by ampl - */ - inline int whereUsed() const { - return whereUsed_; - } - /// Gets value of fake keyword - inline int fakeKeyWord() const - { return fakeKeyWord_;} - /// Sets value of fake keyword - inline void setFakeKeyWord(int value, int fakeValue) - { fakeKeyWord_ = value; fakeValue_ = fakeValue;} - /// Sets value of fake keyword to current size of keywords - void setFakeKeyWord(int fakeValue); - -private: - /// gutsOfConstructor - void gutsOfConstructor(); - //@} -////////////////// data ////////////////// -private: - - /**@name data - We might as well throw all type data in - could derive? - */ - //@{ - // Type see CbcOrClpParameterType - CbcOrClpParameterType type_; - /// If double == okay - double lowerDoubleValue_; - double upperDoubleValue_; - /// If int == okay - int lowerIntValue_; - int upperIntValue_; - // Length of name - unsigned int lengthName_; - // Minimum match - unsigned int lengthMatch_; - /// set of valid strings - std::vector definedKeyWords_; - /// Name - std::string name_; - /// Short help - std::string shortHelp_; - /// Long help - std::string longHelp_; - /// Action - CbcOrClpParameterType action_; - /// Current keyWord (if a keyword parameter) - int currentKeyWord_; - /// Display on ? - int display_; - /// Integer parameter - current value - int intValue_; - /// Double parameter - current value - double doubleValue_; - /// String parameter - current value - std::string stringValue_; - /** 7 if used everywhere, - 1 - used by clp - 2 - used by cbc - 4 - used by ampl - */ - int whereUsed_; - /** If >=0 then integers allowed as a fake keyword - So minusnnnn would got to -nnnn in currentKeyword_ - and plusnnnn would go to fakeKeyword_+nnnn - */ - int fakeKeyWord_; - /// Return this as main value if an integer - int fakeValue_; - //@} -}; -/// Simple read stuff -std::string CoinReadNextField(); - -std::string CoinReadGetCommand(int argc, const char *argv[]); -std::string CoinReadGetString(int argc, const char *argv[]); -// valid 0 - okay, 1 bad, 2 not there -int CoinReadGetIntField(int argc, const char *argv[], int * valid); -double CoinReadGetDoubleField(int argc, const char *argv[], int * valid); -void CoinReadPrintit(const char * input); -void setCbcOrClpPrinting(bool yesNo); -#define CBCMAXPARAMETERS 250 -/* - Subroutine to establish the cbc parameter array. See the description of - class CbcOrClpParam for details. Pulled from C..Main() for clarity. -*/ -void establishParams (int &numberParameters, CbcOrClpParam *const parameters); -// Given a parameter type - returns its number in list -int whichParam (CbcOrClpParameterType name, - int numberParameters, CbcOrClpParam *const parameters); -// Dump/restore a solution to file -void saveSolution(const ClpSimplex * lpSolver, std::string fileName); -void restoreSolution(ClpSimplex * lpSolver, std::string fileName, int mode); -#endif /* CbcOrClpParam_H */ diff --git a/thirdparty/linux/include/coin1/Cgl012cut.hpp b/thirdparty/linux/include/coin1/Cgl012cut.hpp deleted file mode 100644 index 2814b0a8..00000000 --- a/thirdparty/linux/include/coin1/Cgl012cut.hpp +++ /dev/null @@ -1,464 +0,0 @@ -// $Id: Cgl012cut.hpp 1149 2013-10-21 18:23:53Z tkr $ -// Copyright (C) 2010, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/** @file 012cut.h Include file for C coded 0-1/2 separator */ -#ifndef CGL012CUT -#define CGL012CUT -#include -#include -#include - -#define CGL_NEW_SHORT -#ifndef CGL_NEW_SHORT -typedef /* arc */ - struct arc_st -{ - int len; /* length of the arc */ - struct node_st *head; /* head node */ -} - arc; - -typedef /* node */ - struct node_st -{ - arc *first; /* first outgoing arc */ - int dist; /* tentative shortest path length */ - struct node_st *parent; /* parent pointer */ - struct node_st *next; /* next node in queue */ - struct node_st *prev; /* previous node in queue */ - int status; /* status of node */ - int temp; /* for temporary labels */ - int index; /* index of the node in the graph */ -} node; -#endif -typedef struct -{ - int length; // Length of arc - int to; // To node -} cgl_arc; - -typedef struct -{ - cgl_arc * firstArc; // First outgoing arc - int parentNode; // Parent node in shortest path - int index; // Which node I am - int distanceBack; // Distance back to source -} cgl_node; - -typedef struct -{ - int nnodes; // Number of nodes in graph - int narcs; // Number of arcs in graph - cgl_node * nodes; - cgl_arc * arcs; -} cgl_graph; -/* #define PRINT */ -/* #define PRINT_CUTS */ -#define REDUCTION - -typedef struct { -int mr; /* number of rows in the ILP matrix */ -int mc; /* number of columns in the ILP matrix */ -int mnz; /* number of nonzero's in the ILP matrix */ -int *mtbeg; /* starting position of each row in arrays mtind and mtval */ -int *mtcnt; /* number of entries of each row in arrays mtind and mtval */ -int *mtind; /* column indices of the nonzero entries of the ILP matrix */ -int *mtval; /* values of the nonzero entries of the ILP matrix */ -int *vlb; /* lower bounds on the variables */ -int *vub; /* upper bounds on the variables */ -int *mrhs; /* right hand sides of the constraints */ -char *msense; /* senses of the constraints: 'L', 'G' or 'E' */ -const double *xstar; /* current optimal solution of the LP relaxation */ -} ilp; - -typedef struct { -int mr; /* number of rows in the parity ILP matrix */ -int mc; /* number of columns in the parity ILP matrix */ -int mnz; /* number of 1's in the parity ILP matrix */ -int *mtbeg; /* starting position of each row in arrays mtind and mtval */ -int *mtcnt; /* number of entries of each row in arrays mtind and mtval */ -int *mtind; /* column indices of the 1's of the parity ILP matrix */ -short int *mrhs; /* right hand side parity of the constraints */ -double *xstar; /* current optimal solution of the LP relaxation */ -double *slack; /* slack of the constraints w.r.t. xstar */ -short int *row_to_delete; /* flag for marking rows not to be considered */ -short int *col_to_delete; /* flag for marking columns not to be considered */ -int *gcd; /* greatest common divisor of each row in the input ILP matrix */ -short int *possible_weak; /* possible weakening types of each column */ -short int *type_even_weak; /* type of even weakening of each column - (lower or upper bound weakening) */ -short int *type_odd_weak; /* type of odd weakening of each column - (lower or upper bound weakening) */ -double *loss_even_weak; /* loss for the even weakening of each column */ -double *loss_odd_weak; /* loss for the odd weakening of each column */ -double *min_loss_by_weak; /* minimum loss for the weakening of each column */ -} parity_ilp; - -typedef struct { -int nweak; /* number of variables weakened */ -int *var; /* list of variables weakened */ -short int *type; /* type of weakening (lower or upper bound weakening) */ -} info_weak; - -typedef struct { -int endpoint1, endpoint2; /* endpoints of the edge */ -double weight; /* edge weight */ -short int parity; /* edge parity (even or odd) */ -int constr; /* constraint associated with the edge */ -info_weak *weak; /* weakening information */ -} edge; - -typedef struct { -int nnodes; /* number of nodes */ -int nedges; /* number of edges */ -int *nodes; /* indexes of the ILP columns corresponding to the nodes */ -int *ind; /* indexes of the nodes corresponding to the ILP columns */ -edge **even_adj_list; /* pointers to the even edges */ -edge **odd_adj_list; /* pointers to the odd edges */ -} separation_graph; - -#ifndef CGL_NEW_SHORT -typedef struct { -int nnodes; /* number of nodes */ -int narcs; /* number of arcs */ -node *nodes; /* array of the nodes - see "types_db.h" */ -arc *arcs; /* array of the arcs - see "types_db.h" */ -} auxiliary_graph; -#else -typedef struct { -int nnodes; /* number of nodes */ -int narcs; /* number of arcs */ -cgl_node *nodes; /* array of the nodes - see "types_db.h" */ -cgl_arc *arcs; /* array of the arcs - see "types_db.h" */ -} auxiliary_graph; -#endif - -typedef struct { -long dist; /* distance from/to root */ -int pred; /* index of the predecessor */ -} short_path_node; - -typedef struct { -double weight; /* overall weight of the cycle */ -int length; /* number of edges in the cycle */ -edge **edge_list; /* list of edges in the cycle */ -} cycle; - -typedef struct { -int cnum; /* overall number of cycles */ -cycle **list; /* pointers to the cycles in the list */ -} cycle_list; - -typedef struct { -int n_of_constr; /* number of constraints combined to get the cut */ -int *constr_list; /* list of the constraints combined */ -short int *in_constr_list; /* flag saying whether a given constraint is - in the list of constraints of the cut (IN) - or not (OUT) */ -int cnzcnt; /* overall number of nonzero's in the cut */ -int *cind; /* column indices of the nonzero entries of the cut */ -int *cval; /* values of the nonzero entries of the cut */ -int crhs; /* right hand side of the cut */ -char csense; /* sense of the cut: 'L', 'G' or 'E' */ -double violation; /* violation of the cut w.r.t. the current LP solution */ -} cut; - -typedef struct { -int cnum; /* overall number of cuts */ -cut **list; /* pointers to the cuts in the list */ -} cut_list; - -typedef struct { -int n_of_constr; /* number of constraints combined to get the cut */ -int *constr_list; /* list of the constraints combined */ -int code; /* identifier of the cut */ -int n_it_violated; /* number of consecutive iterations (starting from the - last and going backward) in which the cut was - violated by the LP solution */ -int it_found; /* iteration in which the cut was separated */ -double score; /* score of the cut, used to choose wich cut should be - added to the current LP (if any) */ -} pool_cut; - -typedef struct { -int cnum; /* overall number of cuts */ -pool_cut **list; /* pointers to the cuts in the list */ -int *ncod; /* number of cuts with a given code in the pool */ -} pool_cut_list; - -typedef struct { -int *ccoef; /* coefficients of the cut */ -int crhs; /* right hand side of the cut */ -int pool_index; /* index of the cut in the pool */ -double score; /* cut score (to be maximized) */ -} select_cut; - -typedef struct { -int n_it_zero; /* number of consecutive iterations (starting from the - last and going backward) in which each variable took - the value 0 in the LP solution */ -} log_var; -/** 012Cut Generator Class - - This class is to make Cgl01cut thread safe etc -*/ - -class Cgl012Cut { - -public: - - /**@name Generate Cuts */ - //@{ -int sep_012_cut( -/* - INPUT parameters: -*/ -int mr, /* number of rows in the ILP matrix */ -int mc, /* number of columns in the ILP matrix */ -int mnz, /* number of nonzero's in the ILP matrix */ -int *mtbeg, /* starting position of each row in arrays mtind and mtval */ -int *mtcnt, /* number of entries of each row in arrays mtind and mtval */ -int *mtind, /* column indices of the nonzero entries of the ILP matrix */ -int *mtval, /* values of the nonzero entries of the ILP matrix */ -int *vlb, /* lower bounds on the variables */ -int *vub, /* upper bounds on the variables */ -int *mrhs, /* right hand sides of the constraints */ -char *msense, /* senses of the constraints: 'L', 'G' or 'E' */ -const double *xstar, /* current optimal solution of the LP relaxation */ -bool aggressive, /* flag asking whether as many cuts as possible are - required on output (TRUE) or not (FALSE) */ -/* - OUTPUT parameters (the memory for the vectors is allocated INTERNALLY - by the procedure: if some memory is already allocated, it is FREED): -*/ -int *cnum, /* number of violated 0-1/2 cuts identified by the procedure */ -int *cnzcnt, /* overall number of nonzero's in the cuts */ -int **cbeg, /* starting position of each cut in arrays cind and cval */ -int **ccnt, /* number of entries of each cut in arrays cind and cval */ -int **cind, /* column indices of the nonzero entries of the cuts */ -int **cval, /* values of the nonzero entries of the cuts */ -int **crhs, /* right hand sides of the cuts */ -char **csense /* senses of the cuts: 'L', 'G' or 'E' */ -/* - NOTE that all the numerical input/output vectors are INTEGER (with - the exception of xstar), since the procedure is intended to work - with pure ILP's, and that the ILP matrix has to be given on input - in ROW format. -*/ - ); -void ilp_load( - int mr, /* number of rows in the ILP matrix */ - int mc, /* number of columns in the ILP matrix */ - int mnz, /* number of nonzero's in the ILP matrix */ - int *mtbeg, /* starting position of each row in arrays mtind and mtval */ - int *mtcnt, /* number of entries of each row in arrays mtind and mtval */ - int *mtind, /* column indices of the nonzero entries of the ILP matrix */ - int *mtval, /* values of the nonzero entries of the ILP matrix */ - int *vlb, /* lower bounds on the variables */ - int *vub, /* upper bounds on the variables */ - int *mrhs, /* right hand sides of the constraints */ - char *msense /* senses of the constraints: 'L', 'G' or 'E' */ - ); -void free_ilp(); -/* alloc_parity_ilp: allocate the memory for the parity ILP data structure */ - -void alloc_parity_ilp( - int mr, /* number of rows in the ILP matrix */ - int mc, /* number of columns in the ILP matrix */ - int mnz /* number of nonzero's in the ILP matrix */ - ); -void free_parity_ilp(); - void initialize_log_var(); -/* free_log_var */ - void free_log_var(); -private: -/* best_weakening: find the best upper/lower bound weakening of a set - of variables */ - -int best_weakening( - int n_to_weak, /* number of variables to weaken */ -int *vars_to_weak, /* indices of the variables to weaken */ -short int original_parity, /* original parity of the constraint to weaken */ -double original_slack, /* original slack of the constraint to weaken */ -double *best_even_slack, /* best possible slack of a weakened constraint - with even right-hand-side */ -double *best_odd_slack, /* best possible slack of a weakened constraint - with odd right-hand-side */ -info_weak **info_even_weak, /* weakening information about the best possible - even weakened constraint */ -info_weak **info_odd_weak, /* weakening information about the best possible - odd weakened constraint */ -short int only_odd, /* flag which tells whether only an odd weakening is of - interest (TRUE) or both weakenings are (FALSE) */ -short int only_viol /* flag which tells whether only an inequality of - slack smaller than MAX_SLACK is of interest (TRUE) - otherwise (FALSE) */ - ); - -/* best_cut: find the coefficients, the rhs and the violation of the - best possible cut that can be obtained by weakening a given set of - coefficients to even and a rhs to odd, dividing by 2 and rounding */ - -short int best_cut( - int *ccoef, /* vector of the coefficients */ - int *crhs, /* pointer to rhs value */ - double *violation, /* violation of the cut */ - short int update, /* TRUE/FALSE: if TRUE, the new ccoef and crhs are - given on output */ - short int only_viol /* flag which tells whether only an inequality of - slack smaller than MAX_SLACK is of interest (TRUE) - otherwise (FALSE) */ - ); -/* get_cut: extract a hopefully violated cut from an odd cycle of the - separation graph */ - -cut *get_cut( - cycle *s_cyc /* shortest odd cycles identified in the separation graph */ - ); - -/* update_log_var: update the log information for the problem variables */ - void update_log_var(); - -/* basic_separation: try to identify violated 0-1/2 cuts by using the - original procedure described in Caprara and Fischetti's MP paper */ - - cut_list *basic_separation(); - -/* score_by_moving: compute the score of the best cut obtainable from - the current local search solution by inserting/deleting a constraint */ - -double score_by_moving( - int i, /* constraint to be moved */ - short int itype, /* type of move - ADD or DEL */ - double thresh /* minimum value of an interesting score */ - ); -/* modify_current: update the current local search solution by inserting/ - deleting a constraint */ - -void modify_current( - int i, /* constraint to be moved */ - short int itype /* type of move - ADD or DEL */ - ); - -/* best neighbour: find the cut to be added/deleted from the current - solution among those allowed by the tabu rules */ - - short int best_neighbour(cut_list *out_cuts /* list of the violated cuts found */); - -/* add_tight_constraint: initialize the current cut by adding a tight - constraint to it */ - - void add_tight_constraint(); - -/* tabu_012: try to identify violated 0-1/2 cuts by a simple tabu search - procedure adapted from that used by Battiti and Protasi for finding - large cliques */ - - cut_list *tabu_012(); -/* initialize: initialize the data structures for local search */ - - void initialize(); -/* restart: perform a restart of the search - IMPORTANT: in the current - implementation vector last_moved is not cleared at restart */ - - void restart(short int failure /* flag forcing the restart if some trouble occurred */); - void print_constr(int i /* constraint to be printed */); - void print_parity_ilp(); - -/* get_parity_ilp: construct an internal data structure containing all the - information which can be useful for 0-1/2 cut separation */ - - void get_parity_ilp(); -/* initialize_sep_graph: allocate and initialize the data structure - to contain the information associated with a separation graph */ - - separation_graph *initialize_sep_graph(); - void print_cut(cut *v_cut); -/* get_ori_cut_coef: get the coefficients of a cut, before dividing by 2 and - rounding, starting from the list of the constraints combined to get - the cut */ - -short int get_ori_cut_coef( - int n_of_constr, /* number of constraints combined */ - int *constr_list, /* list of the constraints combined */ - int *ccoef, /* cut left hand side coefficients */ - int *crhs, /* cut right hand side */ - short int only_viol /* flag which tells whether only an inequality of - slack smaller than MAX_SLACK is of interest (TRUE) - otherwise (FALSE) */ - ); -/* define_cut: construct a cut data structure from a vector of - coefficients and a right-hand-side */ - -cut *define_cut( - int *ccoef, /* coefficients of the cut */ - int crhs /* right hand side of the cut */ - ); - -/* cut_score: define the score of a (violated) cut */ - -double cut_score( - int *ccoef, /* cut left hand side coefficients */ - int crhs, /* cut right hand side */ - double viol, /* cut violation */ - short int only_viol /* flag which tells whether only an inequality of - slack smaller than MAX_SLACK is of interest (TRUE) - otherwise (FALSE) */ - ); -/* get_current_cut: return a cut data type with the information about - the current cut of the search procedure */ - - cut *get_current_cut(); -/* print_cur_cut: display cur_cut on output */ - - void print_cur_cut(); - void print_cut_list(cut_list *cuts); - //@} -public: - /**@name Constructors and destructors */ - //@{ - /// Default constructor - Cgl012Cut (); - - /// Copy constructor - Cgl012Cut ( - const Cgl012Cut &); - - /// Assignment operator - Cgl012Cut & - operator=( - const Cgl012Cut& rhs); - - /// Destructor - virtual ~Cgl012Cut (); - //@} - -private: - - // Private member methods - - /**@name Private methods */ - //@{ - //@} - - - /**@name Private member data */ - //@{ - -ilp *inp_ilp; /* input ILP data structure */ -parity_ilp *p_ilp; /* parity ILP data structure */ -int iter; -double gap; -double maxgap; -int errorNo; -int sep_iter; /* number of the current separation iteration */ -log_var **vlog; /* information about the value attained - by the variables in the last iterations, - used to possibly set to 0 some coefficient - > 0 in a cut to be added */ -bool aggr; /* flag saying whether as many cuts as possible are required - from the separation procedure (TRUE) or not (FALSE) */ - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CglAllDifferent.hpp b/thirdparty/linux/include/coin1/CglAllDifferent.hpp deleted file mode 100644 index ed369d1c..00000000 --- a/thirdparty/linux/include/coin1/CglAllDifferent.hpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglAllDifferent_H -#define CglAllDifferent_H - -#include - -#include "CglCutGenerator.hpp" - -/** AllDifferent Cut Generator Class - This has a number of sets. All the members in each set are general integer - variables which have to be different from all others in the set. - - At present this only generates column cuts - - At present it is very primitive compared to proper CSP implementations - */ -class CglAllDifferent : public CglCutGenerator { - -public: - - - /**@name Generate Cuts */ - //@{ - /** This fixes (or reduces bounds) on sets of all different variables - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglAllDifferent (); - - /// Useful constructot - CglAllDifferent(int numberSets, const int * starts, const int * which); - - /// Copy constructor - CglAllDifferent ( - const CglAllDifferent &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglAllDifferent & - operator=( - const CglAllDifferent& rhs); - - /// Destructor - virtual - ~CglAllDifferent (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - /** - Returns true if may generate Row cuts in tree (rather than root node). - Used so know if matrix will change in tree. Really - meant so column cut generators can still be active - without worrying code. - Default is true - */ - virtual bool mayGenerateRowCutsInTree() const - { return false;} - //@} - /**@name Sets and Gets */ - //@{ - /// Set log level - inline void setLogLevel(int value) - { logLevel_=value;} - /// Get log level - inline int getLogLevel() const - { return logLevel_;} - /// Set Maximum number of sets to look at at once - inline void setMaxLook(int value) - { maxLook_=value;} - /// Get Maximum number of sets to look at at once - inline int getMaxLook() const - { return maxLook_;} - //@} - -private: - - // Private member methods - /**@name */ - //@{ - //@} - - // Private member data - - /**@name Private member data */ - //@{ - /// Number of sets - int numberSets_; - /// Total number of variables in all different sets - int numberDifferent_; - /// Maximum number of sets to look at at once - int maxLook_; - /// Log level - 0 none, 1 - a bit, 2 - more details - int logLevel_; - /// Start of each set - int * start_; - /// Members (0,1,....) not as in original model - int * which_; - /// Original members - int * originalWhich_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CglClique.hpp b/thirdparty/linux/include/coin1/CglClique.hpp deleted file mode 100644 index 5b47b40a..00000000 --- a/thirdparty/linux/include/coin1/CglClique.hpp +++ /dev/null @@ -1,308 +0,0 @@ -// $Id: CglClique.hpp 1119 2013-04-06 20:24:18Z stefan $ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef _CglClique_h_ -#define _CglClique_h_ - -#include "CglCutGenerator.hpp" - -//class OsiCuts; -//class OsiSolverInterface; - -class CglClique : public CglCutGenerator { - - friend void CglCliqueUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); -public: - /// Copy constructor - CglClique(const CglClique& rhs); - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglClique& operator=(const CglClique& rhs); - -public: - - virtual void - generateCuts(const OsiSolverInterface& si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /**@name Constructors and destructors */ - //@{ - /** Default constructor. - If the setPacking argument is set to true then CglClique will assume that the - problem in the solverinterface passed to the generateCuts() method - describes a set packing problem, i.e., - - all variables are binary - - the matrix is a 0-1 matrix - - all constraints are '= 1' or '<= 1' - - Otherwise the user can use the considerRows() method to set the list of - clique rows, that is, - - all coeffs corresponding to binary variables at fractional level is 1 - - all other coeffs are non-negative - - the constraint is '= 1' or '<= 1'. - - If the user does not set the list of clique rows then CglClique will - start the generateCuts() methods by scanning the matrix for them. - Also justOriginalRows can be set to true to limit clique creation - */ - CglClique(bool setPacking = false, bool justOriginalRows = false); - /// Destructor - virtual ~CglClique() {} - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - - void considerRows(const int numRows, const int* rowInd); - -public: - /** possible choices for selecting the next node in the star clique search - */ - enum scl_next_node_method { - SCL_MIN_DEGREE, - SCL_MAX_DEGREE, - SCL_MAX_XJ_MAX_DEG - }; - - void setStarCliqueNextNodeMethod(scl_next_node_method method) { - scl_next_node_rule = method; - } - - void setStarCliqueCandidateLengthThreshold(int maxlen) { - scl_candidate_length_threshold = maxlen; - } - void setRowCliqueCandidateLengthThreshold(int maxlen) { - rcl_candidate_length_threshold = maxlen; - } - - void setStarCliqueReport(bool yesno = true) { scl_report_result = yesno; } - void setRowCliqueReport(bool yesno = true) { rcl_report_result = yesno; } - - void setDoStarClique(bool yesno = true) { do_star_clique = yesno; } - void setDoRowClique(bool yesno = true) { do_row_clique = yesno; } - - void setMinViolation(double minviol) { petol = minviol; } - double getMinViolation() const { return petol; } - -private: - - struct frac_graph ; - friend struct frac_graph ; - - /** A node of the fractional graph. There is a node for every variable at - fractional level. */ - struct fnode { - /** pointer into all_nbr */ - int *nbrs; - /** 1-x_i-x_j, needed for odd holes, in the same order as the adj list, - pointer into all_edgecost */ - double *edgecosts; - /** degree of the node */ - int degree; - /** the fractional value of the variable corresponding to this node */ - double val; - }; - - /** A graph corresponding to a fractional solution of an LP. Two nodes are - adjacent iff their columns are non-orthogonal. */ - struct frac_graph { - /** # of nodes = # of fractional values in the LP solution */ - int nodenum; - /** # of edges in the graph */ - int edgenum; - /** density= edgenum/(nodenum choose 2) */ - double density; - int min_deg_node; - int min_degree; - int max_deg_node; - int max_degree; - /** The array of the nodes in the graph */ - fnode *nodes; - /** The array of all the neighbors. First the indices of the nodes - adjacent to node 0 are listed, then those adjacent to node 1, etc. */ - int *all_nbr; - /** The array of the costs of the edges going to the neighbors */ - double *all_edgecost; - - frac_graph() : - nodenum(0), edgenum(0), density(0), - min_deg_node(0), min_degree(0), max_deg_node(0), max_degree(0), - nodes(0), all_nbr(0), all_edgecost(0) {} - }; - -protected: - /** An indicator showing whether the whole matrix in the solverinterface is - a set packing problem or not */ - bool setPacking_; - /// True if just look at original rows - bool justOriginalRows_; - /** pieces of the set packing part of the solverinterface */ - int sp_numrows; - int* sp_orig_row_ind; - int sp_numcols; - int* sp_orig_col_ind; - double* sp_colsol; - int* sp_col_start; - int* sp_col_ind; - int* sp_row_start; - int* sp_row_ind; - - /** the intersection graph corresponding to the set packing problem */ - frac_graph fgraph; - /** the node-node incidence matrix of the intersection graph. */ - bool* node_node; - - /** The primal tolerance in the solverinterface. */ - double petol; - - /** data for the star clique algorithm */ - - /** Parameters */ - /**@{*/ - /** whether to do the row clique algorithm or not. */ - bool do_row_clique; - /** whether to do the star clique algorithm or not. */ - bool do_star_clique; - - /** How the next node to be added to the star clique should be selected */ - scl_next_node_method scl_next_node_rule; - /** In the star clique method the maximal length of the candidate list - (those nodes that are in a star, i.e., connected to the center of the - star) to allow complete enumeration of maximal cliques. Otherwise a - greedy algorithm is used. */ - int scl_candidate_length_threshold; - /** whether to give a detailed statistics on the star clique method */ - bool scl_report_result; - - /** In the row clique method the maximal length of the candidate list - (those nodes that can extend the row clique, i.e., connected to all - nodes in the row clique) to allow complete enumeration of maximal - cliques. Otherwise a greedy algorithm is used. */ - int rcl_candidate_length_threshold; - /** whether to give a detailed statistics on the row clique method */ - bool rcl_report_result; - /**@}*/ - - /** variables/arrays that are used across many methods */ - /**@{*/ - /** List of indices that must be in the to be created clique. This is just - a pointer, it is never new'd and therefore does not need to be - delete[]'d either. */ - const int* cl_perm_indices; - /** The length of cl_perm_indices */ - int cl_perm_length; - - /** List of indices that should be considered for extending the ones listed - in cl_perm_indices. */ - int* cl_indices; - /** The length of cl_indices */ - int cl_length; - - /** An array of nodes discarded from the candidate list. These are - rechecked when a maximal clique is found just to make sure that the - clique is really maximal. */ - int* cl_del_indices; - /** The length of cl_del_indices */ - int cl_del_length; - - /**@}*/ - -private: - /** Scan through the variables and select those that are binary and are at - a fractional level. */ - void selectFractionalBinaries(const OsiSolverInterface& si); - /** Scan through the variables and select those that are at a fractional - level. We already know that everything is binary. */ - void selectFractionals(const OsiSolverInterface& si); - /** */ - void selectRowCliques(const OsiSolverInterface& si,int numOriginalRows); - /** */ - void createSetPackingSubMatrix(const OsiSolverInterface& si); - /** */ - void createFractionalGraph(); - /** */ - int createNodeNode(); - /** */ - void deleteSetPackingSubMatrix(); - /** */ - void deleteFractionalGraph(); - /** */ - void find_scl(OsiCuts& cs); - /** */ - void find_rcl(OsiCuts& cs); - /** */ - int scl_choose_next_node(const int current_nodenum, - const int *current_indices, - const int *current_degrees, - const double *current_values); - /** */ - void scl_delete_node(const int del_ind, int& current_nodenum, - int *current_indices, int *current_degrees, - double *current_values); - /** */ - int enumerate_maximal_cliques(int& pos, bool* scl_label, OsiCuts& cs); - /** */ - int greedy_maximal_clique(OsiCuts& cs); - /** */ - void recordClique(const int len, int* indices, OsiCuts& cs); -}; -//############################################################################# -/** A function that tests the methods in the CglClique class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglCliqueUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); -/// This works on a fake solver i.e. invented rows -class CglProbing; -class CglFakeClique : public CglClique { - -public: - /// Copy constructor - CglFakeClique(const CglFakeClique& rhs); - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglFakeClique& operator=(const CglFakeClique& rhs); - - virtual void - generateCuts(const OsiSolverInterface& si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /**@name Constructors and destructors */ - //@{ - /** Default constructor. - If the setPacking argument is set to true then CglFakeClique will assume that the - problem in the solverinterface passed to the generateCuts() method - describes a set packing problem, i.e., - - all variables are binary - - the matrix is a 0-1 matrix - - all constraints are '= 1' or '<= 1' - - Otherwise the user can use the considerRows() method to set the list of - clique rows, that is, - - all coeffs corresponding to binary variables at fractional level is 1 - - all other coeffs are non-negative - - the constraint is '= 1' or '<= 1'. - - If the user does not set the list of clique rows then CglFakeClique will - start the generateCuts() methods by scanning the matrix for them. - */ - CglFakeClique(OsiSolverInterface * solver=NULL,bool setPacking = false); - /// Destructor - virtual ~CglFakeClique(); - /// Assign solver (generator takes over ownership) - void assignSolver(OsiSolverInterface * fakeSolver); -protected: - /// fake solver to use - OsiSolverInterface * fakeSolver_; - /// Probing object - CglProbing * probing_; -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglConfig.h b/thirdparty/linux/include/coin1/CglConfig.h deleted file mode 100644 index bca5553a..00000000 --- a/thirdparty/linux/include/coin1/CglConfig.h +++ /dev/null @@ -1,19 +0,0 @@ -/* src/config_cgl.h. Generated by configure. */ -/* src/config_cgl.h.in. */ - -#ifndef __CONFIG_CGL_H__ -#define __CONFIG_CGL_H__ - -/* Version number of project */ -#define CGL_VERSION "0.59.4" - -/* Major Version number of project */ -#define CGL_VERSION_MAJOR 0 - -/* Minor Version number of project */ -#define CGL_VERSION_MINOR 59 - -/* Release Version number of project */ -#define CGL_VERSION_RELEASE 4 - -#endif diff --git a/thirdparty/linux/include/coin1/CglCutGenerator.hpp b/thirdparty/linux/include/coin1/CglCutGenerator.hpp deleted file mode 100644 index 76291403..00000000 --- a/thirdparty/linux/include/coin1/CglCutGenerator.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglCutGenerator_H -#define CglCutGenerator_H - -#include "OsiCuts.hpp" -#include "OsiSolverInterface.hpp" -#include "CglTreeInfo.hpp" - -//------------------------------------------------------------------- -// -// Abstract base class for generating cuts. -// -//------------------------------------------------------------------- -/// -/** Cut Generator Base Class - -This is an abstract base class for generating cuts. A specific cut -generator will inherit from this class. -*/ -class CglCutGenerator { - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate cuts for the model data contained in si. - The generated cuts are inserted into and returned in the - collection of cuts cs. - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo())=0; - //@} - - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglCutGenerator (); - - /// Copy constructor - CglCutGenerator ( const CglCutGenerator &); - - /// Clone - virtual CglCutGenerator * clone() const = 0; - - /// Assignment operator - CglCutGenerator & operator=(const CglCutGenerator& rhs); - - /// Destructor - virtual ~CglCutGenerator (); - - /** Create C++ lines to set the generator in the current state. - The output must be parsed by the calling code, as each line - starts with a key indicating the following:
      - 0: must be kept (for #includes etc)
      - 3: Set to changed (not default) values
      - 4: Set to default values (redundant)
      - - Keys 1, 2, 5, 6, 7, 8 are defined, but not applicable to - cut generators. - */ - virtual std::string generateCpp( FILE * ) {return "";} - - /// This can be used to refresh any information - virtual void refreshSolver(OsiSolverInterface * ) {} - //@} - - /**@name Gets and Sets */ - //@{ - /** - Get Aggressiveness - 0 = neutral, 100 is normal root node. - Really just a hint to cut generator - */ - inline int getAggressiveness() const - { return aggressive_;} - - /** - Set Aggressiveness - 0 = neutral, 100 is normal root node. - Really just a hint to cut generator - */ - inline void setAggressiveness(int value) - { aggressive_=value;} - /// Set whether can do global cuts - inline void setGlobalCuts(bool trueOrFalse) - { canDoGlobalCuts_ = trueOrFalse;} - /// Say whether can do global cuts - inline bool canDoGlobalCuts() const - {return canDoGlobalCuts_;} - /** - Returns true if may generate Row cuts in tree (rather than root node). - Used so know if matrix will change in tree. Really - meant so column cut generators can still be active - without worrying code. - Default is true - */ - virtual bool mayGenerateRowCutsInTree() const; - /// Return true if needs optimal basis to do cuts - virtual bool needsOptimalBasis() const; - /// Return maximum length of cut in tree - virtual int maximumLengthOfCutInTree() const - { return COIN_INT_MAX;} - //@} - - // test this class - //static void unitTest(); - -// private: - - /** - Aggressiveness - 0 = neutral, 100 is normal root node. - Really just a hint to cut generator - */ - int aggressive_; - /// True if can do global cuts i.e. no general integers - bool canDoGlobalCuts_; -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglDuplicateRow.hpp b/thirdparty/linux/include/coin1/CglDuplicateRow.hpp deleted file mode 100644 index b40f9697..00000000 --- a/thirdparty/linux/include/coin1/CglDuplicateRow.hpp +++ /dev/null @@ -1,189 +0,0 @@ -// $Id: CglDuplicateRow.hpp 1119 2013-04-06 20:24:18Z stefan $ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglDuplicateRow_H -#define CglDuplicateRow_H - -#include - -#include "CglCutGenerator.hpp" -class CglStored; - -/** DuplicateRow Cut Generator Class */ -class CglDuplicateRow : public CglCutGenerator { - -public: - - - /**@name Generate Cuts */ - //@{ - /** Fix variables and find duplicate/dominated rows for the model of the - solver interface, si. - - This is a very simple minded idea but I (JJF) am using it in a project so thought - I might as well add it. It should really be called before first solve and I may - modify CBC to allow for that. - - This is designed for problems with few rows and many integer variables where the rhs - are <= or == and all coefficients and rhs are small integers. - - If effective rhs is K then we can fix all variables with coefficients > K to their lower bounds - (effective rhs just means original with variables with nonzero lower bounds subtracted out). - - If one row is a subset of another and the effective rhs are same we can fix some variables - and then the two rows are identical. - - The generator marks identical rows so can be taken out in solve - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); -private: - /// Does work for modes 1,2 - void generateCuts12( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - /// Does work for mode 4 - void generateCuts4( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - /// Does work for mode 8 - void generateCuts8( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); -public: - /** Fix variables and find duplicate/dominated rows for the model of the - solver interface, si. - - This is a very simple minded idea but I (JJF) am using it in a project so thought - I might as well add it. It should really be called before first solve and I may - modify CBC to allow for that. - - This is designed for problems with few rows and many integer variables where the rhs - are <= or == and all coefficients and rhs are small integers. - - If effective rhs is K then we can fix all variables with coefficients > K to their lower bounds - (effective rhs just means original with variables with nonzero lower bounds subtracted out). - - If one row is a subset of another and the effective rhs are same we can fix some variables - and then the two rows are identical. - - This version does deletions and fixings and may return stored cuts for - dominated columns - */ - CglStored * outDuplicates( OsiSolverInterface * solver); - - //@} - - /**@name Get information on size of problem */ - //@{ - /// Get duplicate row list, -1 means still in, -2 means out (all fixed), k>= means same as row k - inline const int * duplicate() const - { return duplicate_;} - /// Size of dynamic program - inline int sizeDynamic() const - { return sizeDynamic_;} - /// Number of rows in original problem - inline int numberOriginalRows() const - { return matrix_.getNumRows();} - //@} - - /**@name Get information on size of problem */ - //@{ - /// logLevel - inline int logLevel() const - { return logLevel_;} - inline void setLogLevel(int value) - { logLevel_ = value;} - //@} - - - /**@name We only check for duplicates amongst rows with effective rhs <= this */ - //@{ - /// Get - inline int maximumRhs() const - { return maximumRhs_;} - /// Set - inline void setMaximumRhs(int value) - { maximumRhs_=value;} - //@} - - /**@name We only check for dominated amongst groups of columns whose size <= this */ - //@{ - /// Get - inline int maximumDominated() const - { return maximumDominated_;} - /// Set - inline void setMaximumDominated(int value) - { maximumDominated_=value;} - //@} - /**@name gets and sets */ - //@{ - /// Get mode - inline int mode() const - { return mode_;} - /// Set mode - inline void setMode(int value) - { mode_=value;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglDuplicateRow (); - - /// Useful constructor - CglDuplicateRow (OsiSolverInterface * solver); - - /// Copy constructor - CglDuplicateRow ( - const CglDuplicateRow & rhs); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglDuplicateRow & - operator=( - const CglDuplicateRow& rhs); - - /// Destructor - virtual - ~CglDuplicateRow (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - - /// This can be used to refresh any information - virtual void refreshSolver(OsiSolverInterface * solver); - //@} - -protected: - - - // Protected member data - - /**@name Protected member data */ - //@{ - /// Matrix - CoinPackedMatrix matrix_; - /// Matrix by row - CoinPackedMatrix matrixByRow_; - /// Possible rhs (if 0 then not possible) - int * rhs_; - /// Marks duplicate rows - int * duplicate_; - /// To allow for <= rows - int * lower_; - /// Stored cuts if we found dominance cuts - CglStored * storedCuts_; - /// Check dominated columns if less than this number of candidates - int maximumDominated_; - /// Check duplicates if effective rhs <= this - int maximumRhs_; - /// Size of dynamic program - int sizeDynamic_; - /// 1 do rows, 2 do columns, 3 do both - int mode_; - /// Controls print out - int logLevel_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CglFlowCover.hpp b/thirdparty/linux/include/coin1/CglFlowCover.hpp deleted file mode 100644 index eea070f6..00000000 --- a/thirdparty/linux/include/coin1/CglFlowCover.hpp +++ /dev/null @@ -1,371 +0,0 @@ -// $Id: CglFlowCover.hpp 1119 2013-04-06 20:24:18Z stefan $ -//----------------------------------------------------------------------------- -// name: Cgl Lifted Simple Generalized Flow Cover Cut Generator -// author: Yan Xu email: yan.xu@sas.com -// Jeff Linderoth email: jtl3@lehigh.edu -// Martin Savelsberg email: martin.savelsbergh@isye.gatech.edu -// date: 05/01/2003 -// comments: please scan this file for '???' and read the comments -//----------------------------------------------------------------------------- -// Copyright (C) 2003, Yan Xu, Jeff Linderoth, Martin Savelsberg and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. - -#ifndef CglFlowCover_H -#define CglFlowCover_H - -#include - -#include "CoinError.hpp" - -#include "CglCutGenerator.hpp" - -//============================================================================= - -//============================================================================= - -/** This enumerative constant describes the various col types.*/ -enum CglFlowColType { - /** The column(variable) is a negative binary variable.*/ - CGLFLOW_COL_BINNEG = -2, - /** The column is a negative continous variable.*/ - CGLFLOW_COL_CONTNEG, - /** The column is a positive continous variable.*/ - CGLFLOW_COL_CONTPOS = 1, - /** The column is a positive binary variable.*/ - CGLFLOW_COL_BINPOS -}; - -enum CglFlowColStatus{ -}; - -/** This enumerative constant describes the various stati of vars in - a cut or not.*/ -enum CglFlowColCut{ - /** The column is NOT in cover.*/ - CGLFLOW_COL_OUTCUT = 0, - /** The column is in cover now. */ - CGLFLOW_COL_INCUT, - /** The column is decided to be in cover. */ - CGLFLOW_COL_INCUTDONE, - /** The column is in L-. */ - CGLFLOW_COL_INLMIN, - /** The column is decided to be in L-. */ - CGLFLOW_COL_INLMINDONE, - /** The column is in L--.*/ - CGLFLOW_COL_INLMINMIN, - /** This enumerative constant describes the various stati of vars in - determining the cover.*/ - /** The column is a prime candidate. */ - CGLFLOW_COL_PRIME, - /** The column is a secondary candidate. */ - CGLFLOW_COL_SECONDARY -}; - -/** This enumerative constant describes the various row types.*/ -enum CglFlowRowType { - /** The row type of this row is NOT defined yet.*/ - CGLFLOW_ROW_UNDEFINED, - /** After the row is flipped to 'L', the row has exactly two variables: - one is negative binary and the other is continous, and the RHS - is zero.*/ - CGLFLOW_ROW_VARUB, - /** After the row is flipped to 'L', the row has exactlytwo variables: - one is positive binary and the other is continous, and the RHS - is zero.*/ - CGLFLOW_ROW_VARLB, - /** The row sense is 'E', the row has exactly two variables: - one is binary and the other is a continous, and the RHS is zero.*/ - CGLFLOW_ROW_VAREQ, - /** Rows can not be classfied into other types and the row sense - is NOT 'E'.*/ - CGLFLOW_ROW_MIXUB, - /** Rows can not be classfied into other types and the row sense is 'E'.*/ - CGLFLOW_ROW_MIXEQ, - /** All variables are NOT binary and the row sense is NOT 'E'. */ - CGLFLOW_ROW_NOBINUB, - /** All variables are NOT binary and the row sense is 'E'. */ - CGLFLOW_ROW_NOBINEQ, - /** The row has one binary and 2 or more other types of variables and - the row sense is NOT 'E'. */ - CGLFLOW_ROW_SUMVARUB, - /** The row has one binary and 2 or more other types of variables and - the row sense is 'E'. */ - CGLFLOW_ROW_SUMVAREQ, - /** All variables are binary. */ - CGLFLOW_ROW_UNINTERSTED -}; - -//============================================================================= - -/** Variable upper bound class. */ -class CglFlowVUB -{ -protected: - int varInd_; /** The index of the associated 0-1 variable.*/ - double upper_; /** The Value of the associated upper bound.*/ - -public: - CglFlowVUB() : varInd_(-1), upper_(-1) {} - - CglFlowVUB(const CglFlowVUB& source) { - varInd_= source.varInd_; - upper_ = source.upper_; - } - - CglFlowVUB& operator=(const CglFlowVUB& rhs) { - if (this == &rhs) - return *this; - varInd_= rhs.varInd_; - upper_ = rhs.upper_; - return *this; - } - - /**@name Query and set functions for associated 0-1 variable index - and value. - */ - //@{ - inline int getVar() const { return varInd_; } - inline double getVal() const { return upper_; } - inline void setVar(const int v) { varInd_ = v; } - inline void setVal(const double v) { upper_ = v; } - //@} -}; - -//============================================================================= - -/** Variable lower bound class, which is the same as vub. */ -typedef CglFlowVUB CglFlowVLB; - -/** Overloaded operator<< for printing VUB and VLB.*/ -std::ostream& operator<<( std::ostream& os, const CglFlowVUB &v ); - -//============================================================================= - -/** - * Lifed Simple Generalized Flow Cover Cut Generator Class. - */ -class CglFlowCover : public CglCutGenerator { - friend void CglFlowCoverUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - /** - * Do the following tasks: - *
        - *
      • classify row types - *
      • indentify vubs and vlbs - *
      - * This function is called by - * generateCuts(const OsiSolverInterface & si, OsiCuts & cs). - */ - void flowPreprocess(const OsiSolverInterface& si); - - /**@name Generate Cuts */ - //@{ - /** Generate Lifed Simple Generalized flow cover cuts for the model data - contained in si. The generated cuts are inserted into and returned - in the collection of cuts cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Functions to query and set maximum number of cuts can be - generated. */ - //@{ - inline int getMaxNumCuts() const { return maxNumCuts_; } - inline void setMaxNumCuts(int mc) { maxNumCuts_ = mc; } - //@} - - /**@name Functions to query and set the number of cuts have been - generated. */ - //@{ - static int getNumFlowCuts() { return numFlowCuts_; } - static void setNumFlowCuts(int fc) { numFlowCuts_ = fc; } - static void incNumFlowCuts(int fc = 1) { numFlowCuts_ += fc; } - //@} - - //------------------------------------------------------------------------- - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglFlowCover (); - - /// Copy constructor - CglFlowCover ( - const CglFlowCover &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglFlowCover & - operator=( - const CglFlowCover& rhs); - - /// Destructor - virtual - ~CglFlowCover (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - -private: - //------------------------------------------------------------------------- - // Private member functions - - /** Based a given row, a LP solution and other model data, this function - tries to generate a violated lifted simple generalized flow cover. - */ - bool generateOneFlowCut( const OsiSolverInterface & si, - const int rowLen, - int* ind, - double* coef, - char sense, - double rhs, - OsiRowCut& flowCut, - double& violation ); - - - /** Transform a row from ">=" to "<=", and vice versa. */ - void flipRow(int rowLen, double* coef, double& rhs) const; - - /** Transform a row from ">=" to "<=", and vice versa. Have 'sense'. */ - void flipRow(int rowLen, double* coef, char& sen, double& rhs) const; - - /** Determine the type of a given row. */ - CglFlowRowType determineOneRowType(const OsiSolverInterface& si, - int rowLen, int* ind, - double* coef, char sen, - double rhs) const; - /** Lift functions */ - void liftMinus(double &movement, /* Output */ - int t, - int r, - double z, - double dPrimePrime, - double lambda, - double ml, - double *M, - double *rho) const; - - bool liftPlus(double &alpha, - double &beta, - int r, - double m_j, - double lambda, - double y_j, - double x_j, - double dPrimePrime, - double *M) const; - - - //------------------------------------------------------------------------- - //**@name Query and set the row type of a givne row. */ - //@{ - inline const CglFlowRowType* getRowTypes() const - { return rowTypes_; } - inline CglFlowRowType getRowType(const int i) const - { return rowTypes_[i]; } - /** Set rowtypes, take over the ownership. */ - inline void setRowTypes(CglFlowRowType* rt) - { rowTypes_ = rt; rt = 0; } - inline void setRowTypes(const CglFlowRowType rt, const int i) { - if (rowTypes_ != 0) - rowTypes_[i] = rt; - else { - std::cout << "ERROR: Should allocate memory for rowType_ before " - << "using it " << std::endl; - throw CoinError("Forgot to allocate memory for rowType_", - "setRowType", "CglFlowCover"); - } - } - //@} - - //------------------------------------------------------------------------- - //**@name Query and set vubs. */ - //@{ - inline const CglFlowVUB* getVubs() const { return vubs_; } - inline const CglFlowVUB& getVubs(int i) const { return vubs_[i]; } - /** Set CglFlowVUBs,take over the ownership. */ - inline void setVubs(CglFlowVUB* vubs) { vubs_ = vubs; vubs = 0; } - inline void setVubs(const CglFlowVUB& vub, int i) { - if (vubs_ != 0) - vubs_[i] = vub; - else { - std::cout << "ERROR: Should allocate memory for vubs_ before " - << "using it " << std::endl; - throw CoinError("Forgot to allocate memory for vubs_", "setVubs", - "CglFlowCover"); - } - } - inline void printVubs(std::ostream& os) const { - for (int i = 0; i < numCols_; ++i) { - os << "ix: " << i << ", " << vubs_[i]; - } - } - //@} - - //------------------------------------------------------------------------- - //**@name Query and set vlbs. */ - //@{ - inline const CglFlowVLB* getVlbs() const { return vlbs_; } - inline const CglFlowVLB& getVlbs(int i) const { return vlbs_[i]; } - /** Set CglFlowVLBs,take over the ownership. */ - inline void setVlbs(CglFlowVLB* vlbs) { vlbs_ = vlbs; vlbs = 0; } - inline void setVlbs(const CglFlowVLB& vlb, int i) { - if (vlbs_ != 0) - vlbs_[i] = vlb; - else { - std::cout << "ERROR: Should allocate memory for vlbs_ before " - << "using it " << std::endl; - throw CoinError("Forgot to allocate memory for vlbs_", "setVlbs", - "CglFlowCover"); - } - } - //@} - -private: - //------------------------------------------------------------------------ - // Private member data - - /** The maximum number of flow cuts to be generated. Default is 1000. */ - int maxNumCuts_; - /** Tolerance used for numerical purpose. */ - double EPSILON_; - /** The variable upper bound of a flow is not indentified yet.*/ - int UNDEFINED_; - /** Very large number. */ - double INFTY_; - /** If violation of a cut is greater that this number, the cut is useful.*/ - double TOLERANCE_; - /** First time preprocessing */ - bool firstProcess_; - /** The number rows of the problem.*/ - int numRows_; - /** The number columns of the problem.*/ - int numCols_; - /** The number flow cuts found.*/ - static int numFlowCuts_; - /** Indicate whether initial flow preprecessing has been done. */ - bool doneInitPre_; - /** The array of CglFlowVUBs. */ - CglFlowVUB* vubs_; - /** The array of CglFlowVLBs. */ - CglFlowVLB* vlbs_; - /** CglFlowRowType of the rows in model. */ - CglFlowRowType* rowTypes_; -}; - -//############################################################################# -/** A function that tests the methods in the CglFlowCover class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglFlowCoverUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -#endif diff --git a/thirdparty/linux/include/coin1/CglGMI.hpp b/thirdparty/linux/include/coin1/CglGMI.hpp deleted file mode 100644 index 240f6adc..00000000 --- a/thirdparty/linux/include/coin1/CglGMI.hpp +++ /dev/null @@ -1,364 +0,0 @@ -// Last edit: 02/05/2013 -// -// Name: CglGMI.hpp -// Author: Giacomo Nannicini -// Singapore University of Technology and Design, Singapore -// email: nannicini@sutd.edu.sg -// Date: 11/17/09 -//----------------------------------------------------------------------------- -// Copyright (C) 2009, Giacomo Nannicini. All Rights Reserved. - -#ifndef CglGMI_H -#define CglGMI_H - -#include "CglCutGenerator.hpp" -#include "CglGMIParam.hpp" -#include "CoinWarmStartBasis.hpp" -#include "CoinFactorization.hpp" - -/* Enable tracking of rejection of cutting planes. If this is disabled, - the cut generator is slightly faster. If defined, it enables proper use - of setTrackRejection and related functions. */ -//#define TRACK_REJECT - -/* Debug output */ -//#define GMI_TRACE - -/* Debug output: print optimal tableau */ -//#define GMI_TRACETAB - -/* Print reason for cut rejection, whenever a cut is discarded */ -//#define GMI_TRACE_CLEAN - -/** Gomory cut generator with several cleaning procedures, used to test - * the numerical safety of the resulting cuts - */ - -class CglGMI : public CglCutGenerator { - - friend void CglGMIUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); -public: - - /** Public enum: all possible reasons for cut rejection */ - enum RejectionType{ - failureFractionality, - failureDynamism, - failureViolation, - failureSupport, - failureScale - }; - - /**@name generateCuts */ - //@{ - /** Generate Gomory Mixed-Integer cuts for the model of the solver - interface si. - - Insert the generated cuts into OsiCuts cs. - - Warning: This generator currently works only with the Lp solvers Clp or - Cplex9.0 or higher. It requires access to the optimal tableau and - optimal basis inverse and makes assumptions on the way slack variables - are added by the solver. The Osi implementations for Clp and Cplex - verify these assumptions. - - When calling the generator, the solver interface si must contain - an optimized problem and information related to the optimal - basis must be available through the OsiSolverInterface methods - (si->optimalBasisIsAvailable() must return 'true'). It is also - essential that the integrality of structural variable i can be - obtained using si->isInteger(i). - - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /// Return true if needs optimal basis to do cuts (will return true) - virtual bool needsOptimalBasis() const { return true; } - //@} - - /**@name Common Methods */ - //@{ - // Function for checking equality with user tolerance - inline bool areEqual(double x, double y, - double epsAbs = 1e-12, - double epsRel = 1e-12) { - return (fabs((x) - (y)) <= - std::max(epsAbs, epsRel * std::max(fabs(x), fabs(y)))); - } - - // Function for checking is a number is zero - inline bool isZero(double x, double epsZero = 1e-20) { - return (fabs(x) <= epsZero); - } - - - // Function for checking if a number is integer - inline bool isIntegerValue(double x, - double intEpsAbs = 1e-9, - double intEpsRel = 1e-15) { - return (fabs((x) - floor((x)+0.5)) <= - std::max(intEpsAbs, intEpsRel * fabs(x))); - } - - - //@} - - - /**@name Public Methods */ - //@{ - - // Set the parameters to the values of the given CglGMIParam object. - void setParam(const CglGMIParam &source); - // Return the CglGMIParam object of the generator. - inline CglGMIParam getParam() const {return param;} - inline CglGMIParam & getParam() {return param;} - - // Compute entries of is_integer. - void computeIsInteger(); - - /// Print the current simplex tableau - void printOptTab(OsiSolverInterface *solver) const; - - /// Set/get tracking of the rejection of cutting planes. - /// Note that all rejection related functions will not do anything - /// unless the generator is compiled with the define GMI_TRACK_REJECTION - void setTrackRejection(bool value); - bool getTrackRejection(); - - /// Get number of cuts rejected for given reason; see above - int getNumberRejectedCuts(RejectionType reason); - - /// Reset counters for cut rejection tracking; see above - void resetRejectionCounters(); - - /// Get total number of generated cuts since last resetRejectionCounters() - int getNumberGeneratedCuts(); - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglGMI(); - - /// Constructor with specified parameters - CglGMI(const CglGMIParam ¶m); - - /// Copy constructor - CglGMI(const CglGMI &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglGMI & operator=(const CglGMI& rhs); - - /// Destructor - virtual ~CglGMI(); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - - //@} - -private: - - // Private member methods - -/**@name Private member methods */ - - //@{ - - // Method generating the cuts after all CglGMI members are properly set. - void generateCuts(OsiCuts & cs); - - /// Compute the fractional part of value, allowing for small error. - inline double aboveInteger(double value) const; - - /// Compute the fractionalities involved in the cut, and the cut rhs. - /// Returns true if cut is accepted, false if discarded - inline bool computeCutFractionality(double varRhs, double& cutRhs); - - /// Compute the cut coefficient on a given variable - inline double computeCutCoefficient(double rowElem, int index); - - /// Use multiples of the initial inequalities to cancel out the coefficient - /// on a slack variables. - inline void eliminateSlack(double cutElem, int cutIndex, double* cut, - double& cutRhs, const double *elements, - const int *rowStart, const int *indices, - const int *rowLength, const double *rhs); - - /// Change the sign of the coefficients of the non basic - /// variables at their upper bound. - inline void flip(double& rowElem, int rowIndex); - - /// Change the sign of the coefficients of the non basic - /// variables at their upper bound and do the translations restoring - /// the original bounds. Modify the right hand side - /// accordingly. Two functions: one for original variables, one for slacks. - inline void unflipOrig(double& rowElem, int rowIndex, double& rowRhs); - inline void unflipSlack(double& rowElem, int rowIndex, double& rowRhs, - const double* slack_val); - - /// Pack a row of ncol elements - inline void packRow(double* row, double* rowElem, int* rowIndex, - int& rowNz); - - /// Clean the cutting plane; the cleaning procedure does several things - /// like removing small coefficients, scaling, and checks several - /// acceptance criteria. If this returns false, the cut should be discarded. - /// There are several cleaning procedures available, that can be selected - /// via the parameter param.setCLEANING_PROCEDURE(int value) - bool cleanCut(double* cutElem, int* cutIndex, int& cutNz, - double& cutRhs, const double* xbar); - - /// Cut cleaning procedures: return true if successfull, false if - /// cut should be discarded by the caller of if problems encountered - - /// Check the violation - bool checkViolation(const double* cutElem, const int* cutIndex, - int cutNz, double cutrhs, const double* xbar); - - /// Check the dynamism - bool checkDynamism(const double* cutElem, const int* cutIndex, - int cutNz); - - /// Check the support - bool checkSupport(int cutNz); - - /// Remove small coefficients and adjust the rhs accordingly - bool removeSmallCoefficients(double* cutElem, int* cutIndex, - int& cutNz, double& cutRhs); - - /// Adjust the rhs by relaxing by a small amount (relative or absolute) - void relaxRhs(double& rhs); - - /// Scale the cutting plane in different ways; - /// scaling_type possible values: - /// 0 : scale to obtain integral cut - /// 1 : scale based on norm, to obtain cut norm equal to ncol - /// 2 : scale to obtain largest coefficient equal to 1 - bool scaleCut(double* cutElem, int* cutIndex, int cutNz, - double& cutRhs, int scalingType); - - /// Scale the cutting plane in order to generate integral coefficients - bool scaleCutIntegral(double* cutElem, int* cutIndex, int cutNz, - double& cutRhs); - - /// Compute the nearest rational number; used by scale_row_integral - bool nearestRational(double val, double maxdelta, long maxdnom, - long& numerator, long& denominator); - - /// Compute the greatest common divisor - long computeGcd(long a, long b); - - /// print a vector of integers - void printvecINT(const char *vecstr, const int *x, int n) const; - /// print a vector of doubles: dense form - void printvecDBL(const char *vecstr, const double *x, int n) const; - /// print a vector of doubles: sparse form - void printvecDBL(const char *vecstr, const double *elem, const int * index, - int nz) const; - - /// Recompute the simplex tableau for want of a better accuracy. - /// Requires an empty CoinFactorization object to do the computations, - /// and two empty (already allocated) arrays which will contain - /// the basis indices on exit. Returns 0 if successfull. - int factorize(CoinFactorization & factorization, - int* colBasisIndex, int* rowBasisIndex); - - - //@} - - - // Private member data - -/**@name Private member data */ - - //@{ - - /// Object with CglGMIParam members. - CglGMIParam param; - - /// Number of rows ( = number of slack variables) in the current LP. - int nrow; - - /// Number of structural variables in the current LP. - int ncol; - - /// Lower bounds for structural variables - const double *colLower; - - /// Upper bounds for structural variables - const double *colUpper; - - /// Lower bounds for constraints - const double *rowLower; - - /// Upper bounds for constraints - const double *rowUpper; - - /// Righ hand side for constraints (upper bound for ranged constraints). - const double *rowRhs; - - /// Characteristic vectors of structural integer variables or continuous - /// variables currently fixed to integer values. - bool *isInteger; - - /// Current basis status: columns - int *cstat; - - /// Current basis status: rows - int *rstat; - - /// Pointer on solver. Reset by each call to generateCuts(). - OsiSolverInterface *solver; - - /// Pointer on point to separate. Reset by each call to generateCuts(). - const double *xlp; - - /// Pointer on row activity. Reset by each call to generateCuts(). - const double *rowActivity; - - /// Pointer on matrix of coefficient ordered by rows. - /// Reset by each call to generateCuts(). - const CoinPackedMatrix *byRow; - - /// Pointer on matrix of coefficient ordered by columns. - /// Reset by each call to generateCuts(). - const CoinPackedMatrix *byCol; - - /// Fractionality of the cut and related quantities. - double f0; - double f0compl; - double ratiof0compl; - -#if defined(TRACK_REJECT) || defined (TRACK_REJECT_SIMPLE) - /// Should we track the reason of each cut rejection? - bool trackRejection; - /// Number of failures by type - int fracFail; - int dynFail; - int violFail; - int suppFail; - int smallCoeffFail; - int scaleFail; - /// Total number of generated cuts - int numGeneratedCuts; -#endif - - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CglGMI class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglGMIUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - - -#endif diff --git a/thirdparty/linux/include/coin1/CglGMIParam.hpp b/thirdparty/linux/include/coin1/CglGMIParam.hpp deleted file mode 100644 index a1aae417..00000000 --- a/thirdparty/linux/include/coin1/CglGMIParam.hpp +++ /dev/null @@ -1,313 +0,0 @@ -// Name: CglGMIParam.hpp -// Author: Giacomo Nannicini -// Singapore University of Technology and Design -// email: nannicini@sutd.edu.sg -// based on CglRedSplitParam.hpp by Francois Margot -// Date: 11/17/09 -//----------------------------------------------------------------------------- -// Copyright (C) 2009, Giacomo Nannicini and others. All Rights Reserved. - -#ifndef CglGMIParam_H -#define CglGMIParam_H - -#include "CglParam.hpp" - - - /**@name CglGMI Parameters */ - //@{ - - /** Class collecting parameters for the GMI cut generator. - - Parameters of the generator are listed below. Modifying the default - values for parameters other than the last four might result in - invalid cuts. - - - MAXDYN: Maximum ratio between largest and smallest non zero - coefficients in a cut. See method setMAXDYN(). - - EPS_ELIM: Precision for deciding if a coefficient is zero when - eliminating slack variables. See method setEPS_ELIM(). - - MINVIOL: Minimum violation for the current basic solution in - a generated cut. See method setMINVIOL(). - - USE_INTSLACKS: Use integer slacks to generate cuts. - (not implemented yet, will be in the future). - See method setUSE_INTSLACKS(). - - AWAY: Look only at basic integer variables whose current value is at - least this value away from being integer. See method setAway(). - - CHECK_DUPLICATES: Should we check for duplicates when adding a cut - to the collection? Can be slow. - Default 0 - do not check, add cuts anyway. - - CLEAN_PROC: Cleaning procedure that should be used. Look below at the - enumeration CleaningProcedure for possible values. - - INTEGRAL_SCALE_CONT: If we try to scale cut coefficients so that - they become integral, do we also scale on - continuous variables? - Default 0 - do not scale continuous vars. - Used only if CLEAN_PROC does integral scaling. - - ENFORCE_SCALING: Discard badly scaled cuts, or keep them (unscaled). - Default 1 - yes. - - */ - //@} - -class CglGMIParam : public CglParam { - -public: - - /**@name Enumerations */ - enum CleaningProcedure{ - /* CglLandP procedure I */ - CP_CGLLANDP1, - /* CglLandP procedure II */ - CP_CGLLANDP2, - /* CglRedSplit procedure I */ - CP_CGLREDSPLIT, - /* Only integral cuts, i.e. cuts with integral coefficients */ - CP_INTEGRAL_CUTS, - /* CglLandP procedure I with integral scaling */ - CP_CGLLANDP1_INT, - /* CglLandP procedure I with scaling of the max element to 1 if possible */ - CP_CGLLANDP1_SCALEMAX, - /* CglLandP procedure I with scaling of the rhs to 1 if possible */ - CP_CGLLANDP1_SCALERHS - }; - - /**@name Set/get methods */ - - //@{ - /** Aliases for parameter get/set method in the base class CglParam */ - - /** Value for Infinity. Default: DBL_MAX */ - inline void setInfinity(double value) {setINFINIT(value);} - inline double getInfinity() const {return INFINIT;} - - /** Epsilon for comparing numbers. Default: 1.0e-6 */ - inline void setEps(double value) {setEPS(value);} - inline double getEps() const {return EPS;} - - /** Epsilon for zeroing out coefficients. Default: 1.0e-5 */ - inline void setEpsCoeff(double value) {setEPS_COEFF(value);} - inline double getEpsCoeff() const {return EPS_COEFF;} - - /** Maximum support of the cutting planes. Default: INT_MAX */ - inline void setMaxSupport(int value) {setMAX_SUPPORT(value);} - inline int getMaxSupport() const {return MAX_SUPPORT;} - /** Alias for consistency with our naming scheme */ - inline void setMaxSupportAbs(int value) {setMAX_SUPPORT(value);} - inline int getMaxSupportAbs() const {return MAX_SUPPORT;} - inline int getMAX_SUPPORT_ABS() const {return MAX_SUPPORT;} - - /** Set AWAY, the minimum distance from being integer used for selecting - rows for cut generation; all rows whose pivot variable should be - integer but is more than away from integrality will be selected; - Default: 0.005 */ - virtual void setAway(double value); - /** Get value of away */ - inline double getAway() const {return AWAY;} - /// Aliases - inline void setAWAY(double value) {setAway(value);} - inline double getAWAY() const {return AWAY;} - - /** Set the value of EPS_ELIM, epsilon for values of coefficients when - eliminating slack variables; - Default: 0 */ - virtual void setEPS_ELIM(double value); - /** Get the value of EPS_ELIM */ - inline double getEPS_ELIM() const {return EPS_ELIM;} - /// Aliases - inline void setEpsElim(double value) {setEPS_ELIM(value);} - inline double getEpsElim() const {return EPS_ELIM;} - - /** Set EPS_RELAX_ABS */ - virtual void setEPS_RELAX_ABS(double value); - /** Get value of EPS_RELAX_ABS */ - inline double getEPS_RELAX_ABS() const {return EPS_RELAX_ABS;} - /// Aliases - inline void setEpsRelaxAbs(double value) {setEPS_RELAX_ABS(value);} - inline double getEpsRelaxAbs() const {return EPS_RELAX_ABS;} - - /** Set EPS_RELAX_REL */ - virtual void setEPS_RELAX_REL(double value); - /** Get value of EPS_RELAX_REL */ - inline double getEPS_RELAX_REL() const {return EPS_RELAX_REL;} - /// Aliases - inline void setEpsRelaxRel(double value) {setEPS_RELAX_REL(value);} - inline double getEpsRelaxRel() const {return EPS_RELAX_REL;} - - // Set the maximum ratio between largest and smallest non zero - // coefficients in a cut. Default: 1e6. - virtual void setMAXDYN(double value); - /** Get the value of MAXDYN */ - inline double getMAXDYN() const {return MAXDYN;} - /// Aliases - inline void setMaxDyn(double value) {setMAXDYN(value);} - inline double getMaxDyn() const {return MAXDYN;} - - /** Set the value of MINVIOL, the minimum violation for the current - basic solution in a generated cut. Default: 1e-7 */ - virtual void setMINVIOL(double value); - /** Get the value of MINVIOL */ - inline double getMINVIOL() const {return MINVIOL;} - /// Aliases - inline void setMinViol(double value) {setMINVIOL(value);} - inline double getMinViol() const {return MINVIOL;} - - /** Set the value of MAX_SUPPORT_REL, the factor contributing to the - maximum support relative to the number of columns. Maximum - allowed support is: MAX_SUPPORT_ABS + - MAX_SUPPORT_REL*ncols. Default: 0.1 */ - virtual void setMAX_SUPPORT_REL(double value); - /** Get the value of MINVIOL */ - inline double getMAX_SUPPORT_REL() const {return MAX_SUPPORT_REL;} - /// Aliases - inline void setMaxSupportRel(double value) {setMAX_SUPPORT_REL(value);} - inline double getMaxSupportRel() const {return MAX_SUPPORT_REL;} - - /** Set the value of USE_INTSLACKS. Default: 0 */ - virtual void setUSE_INTSLACKS(bool value); - /** Get the value of USE_INTSLACKS */ - inline bool getUSE_INTSLACKS() const {return USE_INTSLACKS;} - /// Aliases - inline void setUseIntSlacks(bool value) {setUSE_INTSLACKS(value);} - inline int getUseIntSlacks() const {return USE_INTSLACKS;} - - /** Set the value of CHECK_DUPLICATES. Default: 0 */ - virtual void setCHECK_DUPLICATES(bool value); - /** Get the value of CHECK_DUPLICATES */ - inline bool getCHECK_DUPLICATES() const {return CHECK_DUPLICATES;} - /// Aliases - inline void setCheckDuplicates(bool value) {setCHECK_DUPLICATES(value);} - inline bool getCheckDuplicates() const {return CHECK_DUPLICATES;} - - /** Set the value of CLEAN_PROC. Default: CP_CGLLANDP1 */ - virtual void setCLEAN_PROC(CleaningProcedure value); - /** Get the value of CLEAN_PROC. */ - inline CleaningProcedure getCLEAN_PROC() const {return CLEAN_PROC;} - /// Aliases - inline void setCleanProc(CleaningProcedure value) {setCLEAN_PROC(value);} - inline CleaningProcedure getCleaningProcedure() const {return CLEAN_PROC;} - - /** Set the value of INTEGRAL_SCALE_CONT. Default: 0 */ - virtual void setINTEGRAL_SCALE_CONT(bool value); - /** Get the value of INTEGRAL_SCALE_CONT. */ - inline bool getINTEGRAL_SCALE_CONT() const {return INTEGRAL_SCALE_CONT;} - /// Aliases - inline void setIntegralScaleCont(bool value) {setINTEGRAL_SCALE_CONT(value);} - inline bool getIntegralScaleCont() const {return INTEGRAL_SCALE_CONT;} - - /** Set the value of ENFORCE_SCALING. Default: 1 */ - virtual void setENFORCE_SCALING(bool value); - /** Get the value of ENFORCE_SCALING. */ - inline bool getENFORCE_SCALING() const {return ENFORCE_SCALING;} - /// Aliases - inline void setEnforceScaling(bool value) {setENFORCE_SCALING(value);} - inline bool getEnforcescaling() const {return ENFORCE_SCALING;} - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglGMIParam(double eps = 1e-12, - double away = 0.005, - double eps_coeff = 1e-11, - double eps_elim = 0, - double eps_relax_abs = 1e-11, - double eps_relax_rel = 1e-13, - double max_dyn = 1e6, - double min_viol = 1e-4, - int max_supp_abs = 1000, - double max_supp_rel = 0.1, - CleaningProcedure clean_proc = CP_CGLLANDP1, - bool use_int_slacks = false, - bool check_duplicates = false, - bool integral_scale_cont = false, - bool enforce_scaling = true); - - /// Constructor from CglParam - CglGMIParam(CglParam &source, - double away = 0.005, - double eps_elim = 1e-12, - double eps_relax_abs = 1e-11, - double eps_relax_rel = 1e-13, - double max_dyn = 1e6, - double min_viol = 1e-4, - double max_supp_rel = 0.1, - CleaningProcedure clean_proc = CP_CGLLANDP1, - bool use_int_slacks = false, - bool check_duplicates = false, - bool integral_scale_cont = false, - bool enforce_scaling = true); - - /// Copy constructor - CglGMIParam(const CglGMIParam &source); - - /// Clone - virtual CglGMIParam* clone() const; - - /// Assignment operator - virtual CglGMIParam& operator=(const CglGMIParam &rhs); - - /// Destructor - virtual ~CglGMIParam(); - //@} - -protected: - - /**@name Parameters */ - //@{ - - /** Use row only if pivot variable should be integer but is more - than AWAY from being integer. */ - double AWAY; - - /** Epsilon for value of coefficients when eliminating slack variables. - Default: 0. */ - double EPS_ELIM; - - /** Value added to the right hand side of each generated cut to relax it. - Default: 1e-11 */ - double EPS_RELAX_ABS; - - /** For a generated cut with right hand side rhs_val, - EPS_RELAX_EPS * fabs(rhs_val) is used to relax the constraint. - Default: 1.e-13 */ - double EPS_RELAX_REL; - - /** Maximum ratio between largest and smallest non zero - coefficients in a cut. Default: 1e6. */ - double MAXDYN; - - /** Minimum violation for the current basic solution in a generated cut. - Default: 1e-4. */ - double MINVIOL; - - /** Maximum support relative to number of columns. Must be between 0 - and 1. Default: 0. */ - double MAX_SUPPORT_REL; - - /** Which cleaning procedure should be used? */ - CleaningProcedure CLEAN_PROC; - - /** Use integer slacks to generate cuts if USE_INTSLACKS = 1. Default: 0. */ - bool USE_INTSLACKS; - - /** Check for duplicates when adding the cut to the collection? */ - bool CHECK_DUPLICATES; - - /** Should we try to rescale cut coefficients on continuous variables - so that they become integral, or do we only rescale coefficients - on integral variables? Used only by cleaning procedure that try - the integral scaling. */ - bool INTEGRAL_SCALE_CONT; - - /** Should we discard badly scaled cuts (according to the scaling - procedure in use)? If false, CglGMI::scaleCut always returns - true, even though it still scales cuts whenever possible, but - not cut is rejected for scaling. Default true. Used only by - cleaning procedure that try to scale. */ - bool ENFORCE_SCALING; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglGomory.hpp b/thirdparty/linux/include/coin1/CglGomory.hpp deleted file mode 100644 index 2d7f5c54..00000000 --- a/thirdparty/linux/include/coin1/CglGomory.hpp +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglGomory_H -#define CglGomory_H - -#include - -#include "CglCutGenerator.hpp" - -class CoinWarmStartBasis; -/** Gomory Cut Generator Class */ -class CglGomory : public CglCutGenerator { - friend void CglGomoryUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - - /**@name Generate Cuts */ - //@{ - /** Generate Mixed Integer Gomory cuts for the model of the - solver interface, si. - - Insert the generated cuts into OsiCut, cs. - - There is a limit option, which will only generate cuts with - less than this number of entries. - - We can also only look at 0-1 variables a certain distance - from integer. - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - /** Generates cuts given matrix and solution etc, - returns number of cuts generated */ - int generateCuts( const OsiRowCutDebugger * debugger, - OsiCuts & cs, - const CoinPackedMatrix & columnCopy, - const CoinPackedMatrix & rowCopy, - const double * colsol, - const double * colLower, const double * colUpper, - const double * rowLower, const double * rowUpper, - const char * intVar , - const CoinWarmStartBasis* warm, - const CglTreeInfo info = CglTreeInfo()); - /** Generates cuts given matrix and solution etc, - returns number of cuts generated (no row copy passed in) */ - int generateCuts( const OsiRowCutDebugger * debugger, - OsiCuts & cs, - const CoinPackedMatrix & columnCopy, - const double * colsol, - const double * colLower, const double * colUpper, - const double * rowLower, const double * rowUpper, - const char * intVar , - const CoinWarmStartBasis* warm, - const CglTreeInfo info = CglTreeInfo()); - - /// Return true if needs optimal basis to do cuts (will return true) - virtual bool needsOptimalBasis() const { return true; } - //@} - - /**@name Change way Gomory works */ - //@{ - /// Pass in a copy of original solver (clone it) - void passInOriginalSolver(OsiSolverInterface * solver); - /// Returns original solver - inline OsiSolverInterface * originalSolver() const - { return originalSolver_;} - /// Set type - 0 normal, 1 add original matrix one, 2 replace - inline void setGomoryType(int type) - { gomoryType_=type;} - /// Return type - inline int gomoryType() const - { return gomoryType_;} - //@} - - /**@name Change limit on how many variables in cut (default 50) */ - //@{ - /// Set - void setLimit(int limit); - /// Get - int getLimit() const; - /// Set at root (if - -#include "CglCutGenerator.hpp" -#include "CglTreeInfo.hpp" - -/** Knapsack Cover Cut Generator Class */ -class CglKnapsackCover : public CglCutGenerator { - friend void CglKnapsackCoverUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - /** A method to set which rows should be tested for knapsack covers */ - void setTestedRowIndices(int num, const int* ind); - - /**@name Generate Cuts */ - //@{ - /** Generate knapsack cover cuts for the model of the solver interface, si. - Insert the generated cuts into OsiCut, cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglKnapsackCover (); - - /// Copy constructor - CglKnapsackCover ( - const CglKnapsackCover &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglKnapsackCover & - operator=( - const CglKnapsackCover& rhs); - - /// Destructor - virtual - ~CglKnapsackCover (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - /// This can be used to refresh any information - virtual void refreshSolver(OsiSolverInterface * solver); - //@} - - - /**@name Sets and gets */ - //@{ - /// Set limit on number in knapsack - inline void setMaxInKnapsack(int value) - { if (value>0) maxInKnapsack_ = value;} - /// get limit on number in knapsack - inline int getMaxInKnapsack() const - {return maxInKnapsack_;} - /// Switch off expensive cuts - inline void switchOffExpensive() - { expensiveCuts_=false;} - /// Switch on expensive cuts - inline void switchOnExpensive() - { expensiveCuts_=true;} -private: - - // Private member methods - - - /**@name Private methods */ - //@{ - - /** deriveAKnapsack - returns 1 if it is able to derive - a (canonical) knapsack inequality - in binary variables of the form ax<=b - from the rowIndex-th row in the model, - returns 0 otherwise. - */ - int deriveAKnapsack( - const OsiSolverInterface & si, - OsiCuts & cs, - CoinPackedVector & krow, - bool treatAsLRow, - double & b, - int * complement, - double * xstar, - int rowIndex, - int numberElements, - const int * index, - const double * element); - - int deriveAKnapsack( - const OsiSolverInterface & si, - OsiCuts & cs, - CoinPackedVector & krow, - double & b, - int * complement, - double * xstar, - int rowIndex, - const CoinPackedVectorBase & matrixRow); - - /** Find a violated minimal cover from - a canonical form knapsack inequality by - solving the -most- violated cover problem - and postprocess to ensure minimality - */ - int findExactMostViolatedMinCover( - int nCols, - int row, - CoinPackedVector & krow, - double b, - double * xstar, - CoinPackedVector & cover, - CoinPackedVector & remainder); - - /** Find the most violate minimum cover by solving the lp-relaxation of the - most-violate-min-cover problem - */ - int findLPMostViolatedMinCover( - int nCols, - int row, - CoinPackedVector & krow, - double & b, - double * xstar, - CoinPackedVector & cover, - CoinPackedVector & remainder); - -/// find a minimum cover by a simple greedy approach - int findGreedyCover( - int row, - CoinPackedVector & krow, - double & b, - double * xstar, - CoinPackedVector & cover, - CoinPackedVector & remainder - ); - - /// lift the cover inequality - int liftCoverCut( - double & b, - int nRowElem, - CoinPackedVector & cover, - CoinPackedVector & remainder, - CoinPackedVector & cut ); - - /// sequence-independent lift and uncomplement and add the resulting cut to the cut set - int liftAndUncomplementAndAdd( - double rowub, - CoinPackedVector & krow, - double & b, - int * complement, - int row, - CoinPackedVector & cover, - CoinPackedVector & remainder, - OsiCuts & cs ); - - /// sequence-dependent lift, uncomplement and add the resulting cut to the cut set -void seqLiftAndUncomplementAndAdd( - int nCols, - double * xstar, - int * complement, - int row, - int nRowElem, - double & b, - CoinPackedVector & cover, // need not be violated - CoinPackedVector & remainder, - OsiCuts & cs ); - - /// sequence-dependent lift binary variables either up or down, uncomplement and add to the cut set -void liftUpDownAndUncomplementAndAdd( - int nCols, - double * xstar, - int * complement, - int row, - int nRowElem, - double & b, - - // the following 3 packed vectors partition the krow: - CoinPackedVector & fracCover, // vars have frac soln values in lp relaxation - // and form cover with the vars atOne - CoinPackedVector & atOne, // vars have soln value of 1 in lp relaxation - // and together with fracCover form minimal (?) cover. - CoinPackedVector & remainder, - OsiCuts & cs ); - - /// find a cover using a variation of the logic found in OSL (w/o SOS) - int findPseudoJohnAndEllisCover ( - int row, - CoinPackedVector & krow, - double & b, - double * xstar, - CoinPackedVector & cover, - CoinPackedVector & remainder); - - /// find a cover using the basic logic found in OSL (w/o SOS) - int findJohnAndEllisCover ( - int row, - CoinPackedVector & krow, - double & b, - double * xstar, - CoinPackedVector & fracCover, - CoinPackedVector & atOnes, - CoinPackedVector & remainder); - - - /** A C-style implementation of the Horowitz-Sahni exact solution - procedure for solving knapsack problem. - - (ToDo: implement the more efficient dynamic programming approach) - - (Reference: Martello and Toth, Knapsack Problems, Wiley, 1990, p30.) - */ - int exactSolveKnapsack( - int n, - double c, - double const *pp, - double const *ww, - double & z, - int * x); - /// For testing gub stuff - int gubifyCut(CoinPackedVector & cut); -public: - /** Creates cliques for use by probing. - Only cliques >= minimumSize and < maximumSize created - Can also try and extend cliques as a result of probing (root node). - Returns number of cliques found. - */ - int createCliques( OsiSolverInterface & si, - int minimumSize=2, int maximumSize=100, bool extendCliques=false); -private: - /// Delete all clique information - void deleteCliques(); - //@} - - // Private member data - - /**@name Private member data */ - //@{ - /// epsilon - double epsilon_; - /// Tolerance to use for violation - bigger than epsilon_ - double epsilon2_; - /// 1-epsilon - double onetol_; - /// Maximum in knapsack - int maxInKnapsack_; - /** which rows to look at. If specified, only these rows will be considered - for generating knapsack covers. Otherwise all rows will be tried */ - int numRowsToCheck_; - int* rowsToCheck_; - /// exactKnapsack can be expensive - this switches off some - bool expensiveCuts_; - /// Cliques - /// **** TEMP so can reference from listing - const OsiSolverInterface * solver_; - int whichRow_; - int * complement_; - double * elements_; - /// Number of cliques - int numberCliques_; - /// Clique type - typedef struct { - unsigned int equality:1; // nonzero if clique is == - } CliqueType; - CliqueType * cliqueType_; - /// Start of each clique - int * cliqueStart_; - /// Entries for clique - CliqueEntry * cliqueEntry_; - /** Start of oneFixes cliques for a column in matrix or -1 if not - in any clique */ - int * oneFixStart_; - /** Start of zeroFixes cliques for a column in matrix or -1 if not - in any clique */ - int * zeroFixStart_; - /// End of fixes for a column - int * endFixStart_; - /// Clique numbers for one or zero fixes - int * whichClique_; - /// Number of columns - int numberColumns_; - /** For each column with nonzero in row copy this gives a clique "number". - So first clique mentioned in row is always 0. If no entries for row - then no cliques. If sequence > numberColumns then not in clique. - */ - //CliqueEntry * cliqueRow_; - /// cliqueRow_ starts for each row - //int * cliqueRowStart_; - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CglKnapsackCover class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglKnapsackCoverUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -#endif diff --git a/thirdparty/linux/include/coin1/CglLandP.hpp b/thirdparty/linux/include/coin1/CglLandP.hpp deleted file mode 100644 index 64447e70..00000000 --- a/thirdparty/linux/include/coin1/CglLandP.hpp +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright (C) 2005-2009, Pierre Bonami and others. All Rights Reserved. -// Author: Pierre Bonami -// Tepper School of Business -// Carnegie Mellon University, Pittsburgh, PA 15213 -// Date: 07/21/05 -// -// $Id: CglLandP.hpp 1122 2013-04-06 20:39:53Z stefan $ -// -// This code is licensed under the terms of the Eclipse Public License (EPL). -//--------------------------------------------------------------------------- -#ifndef CglLandP_H -#define CglLandP_H - -#include "CglLandPValidator.hpp" -#include "CglCutGenerator.hpp" -#include "CglParam.hpp" - -#include -class CoinWarmStartBasis; -/** Performs one round of Lift & Project using CglLandPSimplex - to build cuts -*/ - -namespace LAP -{ -enum LapMessagesTypes -{ - BEGIN_ROUND, - END_ROUND, - DURING_SEP, - CUT_REJECTED, - CUT_FAILED, - CUT_GAP, - LAP_CUT_FAILED_DO_MIG, - LAP_MESSAGES_DUMMY_END -}; -/** Output messages for Cgl */ -class LapMessages : public CoinMessages -{ -public: - /** Constructor */ - LapMessages( ); - /** destructor.*/ - virtual ~LapMessages() {} -}; -class CglLandPSimplex; -} - -class CglLandP : public CglCutGenerator -{ - friend void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir); - - friend class LAP::CglLandPSimplex; - friend class CftCglp; - -public: - - enum SelectionRules - { - mostNegativeRc /** select most negative reduced cost */, - bestPivot /** select best possible pivot.*/, - initialReducedCosts/** Select only those rows which had initialy a 0 reduced cost.*/ - }; - - enum ExtraCutsMode - { - none/** Generate no extra cuts.*/, - AtOptimalBasis /** Generate cuts from the optimal basis.*/, - WhenEnteringBasis /** Generate cuts as soon as a structural enters the basis.*/, - AllViolatedMigs/** Generate all violated Mixed integer Gomory cuts in the course of the optimization.*/ - }; - - /** Space where cuts are optimized.*/ - enum SeparationSpaces - { - Fractional=0 /** True fractional space.*/, - Fractional_rc/** Use fractional space only for computing reduced costs.*/, - Full /** Work in full space.*/ - }; - - /** Normalization */ - enum Normalization - { - Unweighted = 0, - WeightRHS, - WeightLHS, - WeightBoth - }; - - enum LHSnorm - { - L1 = 0, - L2, - SupportSize, - Infinity, - Average, - Uniform - }; - /** RHS weight in normalization.*/ - enum RhsWeightType - { - Fixed = 0 /** 2*initial number of constraints. */, - Dynamic /** 2 * current number of constraints. */ - }; - /** Class storing parameters. - \remark I take all parameters from Ionut's code */ - class Parameters : public CglParam - { - public: - /** Default constructor (with default values)*/ - Parameters(); - /** Copy constructor */ - Parameters(const Parameters &other); - /** Assignment opertator */ - Parameters & operator=(const Parameters &other); - /// @name integer parameters - ///@{ - - /** Max number of pivots before we generate the cut - \default 20 */ - int pivotLimit; - /** Max number of pivots at regular nodes. Put a value if you want it lower than the global pivot limit. - \default 100.*/ - int pivotLimitInTree; - /** Maximum number of cuts generated at a given round*/ - int maxCutPerRound; - /** Maximum number of failed pivots before aborting */ - int failedPivotLimit; - /** maximum number of consecutive degenerate pivots - \default 0 */ - int degeneratePivotLimit; - /** Maximum number of extra rows to generate per round.*/ - int extraCutsLimit; - ///@} - /// @name double parameters - ///@{ - /** Tolerance for small pivots values (should be the same as the solver */ - double pivotTol; - /** A variable have to be at least away from integrity to be generated */ - double away; - /** Total time limit for cut generation.*/ - double timeLimit; - /** Time limit for generating a single cut.*/ - double singleCutTimeLimit; - /** Weight to put in RHS of normalization if static.*/ - double rhsWeight; - ///@} - - /// @name Flags - ///@{ - /** Do we use tableau row or the disjunction (I don't really get that there should be a way to always use the tableau)*/ - bool useTableauRow; - /** Do we apply Egon Balas's Heuristic for modularized cuts */ - bool modularize; - /** Do we strengthen the final cut (always do if modularize is 1) */ - bool strengthen; - /** Wether to limit or not the number of mistaken RC (when perturbation is applied).*/ - bool countMistakenRc; - /** Work in the reduced space (only non-structurals enter the basis) */ - SeparationSpaces sepSpace; - /** Apply perturbation procedure. */ - bool perturb; - /** How to weight normalization.*/ - Normalization normalization; - /** How to weight RHS of normalization.*/ - RhsWeightType rhsWeightType; - /** How to weight LHS of normalization.*/ - LHSnorm lhs_norm; - /** Generate extra constraints from optimal lift-and-project basis.*/ - ExtraCutsMode generateExtraCuts; - /** Which rule to apply for choosing entering and leaving variables.*/ - SelectionRules pivotSelection; - ///@} - }; - - - /** Constructor for the class*/ - CglLandP(const CglLandP::Parameters ¶ms = CglLandP::Parameters(), - const LAP::Validator &validator = LAP::Validator()); - /** Destructor */ - ~CglLandP(); - /** Copy constructor */ - CglLandP(const CglLandP &source); - /** Assignment operator */ - CglLandP& operator=(const CglLandP &rhs); - /** Clone function */ - CglCutGenerator * clone() const; - - /**@name Generate Cuts */ - //@{ - - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - //@} - - virtual bool needsOptimalBasis() const - { - return true; - } - - LAP::Validator & validator() - { - return validator_; - } - /** set level of log for cut generation procedure : -
        -
      1. for none
      2. -
      3. for log at begin and end of procedure + at some time interval
      4. -
      5. for log at every cut generated
      6. -
      - */ - void setLogLevel(int level) - { - handler_->setLogLevel(level); - } - - class NoBasisError : public CoinError - { - public: - NoBasisError(): CoinError("No basis available","LandP","") {} - }; - - class SimplexInterfaceError : public CoinError - { - public: - SimplexInterfaceError(): CoinError("Invalid conversion to simplex interface", "CglLandP","CglLandP") {} - }; - Parameters & parameter() - { - return params_; - } -private: - - - void scanExtraCuts(OsiCuts& cs, const double * colsol) const; - - Parameters params_; - - /** Some informations that will be changed by the pivots and that we want to keep*/ - struct CachedData - { - CachedData(int nBasics = 0 , int nNonBasics = 0); - CachedData(const CachedData & source); - - CachedData& operator=(const CachedData &source); - /** Get the data from a problem */ - void getData(const OsiSolverInterface &si); - - void clean(); - - ~CachedData(); - /** Indices of basic variables in starting basis (ordered if variable basics_[i] s basic in row i)*/ - int * basics_; - /** Indices of non-basic variables */ - int *nonBasics_; - /** number of basics variables */ - int nBasics_; - /** number of non-basics */ - int nNonBasics_; - /** Optimal basis */ - CoinWarmStartBasis * basis_; - /** Stores the value of the solution to cut */ - double * colsol_; - /** Stores the values of the slacks */ - double * slacks_; - /** Stores wheter slacks are integer constrained */ - bool * integers_; - /** Solver before pivots */ - OsiSolverInterface * solver_; - }; - /** Retrieve sorted integer variables which are fractional in the solution. - Return the number of variables.*/ - int getSortedFractionals(CoinPackedVector &xFrac, - const CachedData & data, - const CglLandP::Parameters& params) const; - /** Retrieve sorted integer variables which are fractional in the solution. - Return the number of variables.*/ - void getSortedFractionalIndices(std::vector& indices, - const CachedData &data, - const CglLandP::Parameters & params) const; - /** Cached informations about problem.*/ - CachedData cached_; - /** message handler */ - CoinMessageHandler * handler_; - /** messages */ - CoinMessages messages_; - /** cut validator */ - LAP::Validator validator_; - /** number of rows in the original problems. */ - int numrows_; - /** number of columns in the original problems. */ - int numcols_; - /** Original lower bounds for the problem (for lifting cuts).*/ - double * originalColLower_; - /** Original upper bounds for the problem (for lifting cuts).*/ - double * originalColUpper_; - /** Flag to say if cuts can be lifted.*/ - bool canLift_; - /** Store some extra cut which could be cheaply generated but do not cut current incumbent.*/ - OsiCuts extraCuts_; -}; -void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir); - -#endif - diff --git a/thirdparty/linux/include/coin1/CglLandPValidator.hpp b/thirdparty/linux/include/coin1/CglLandPValidator.hpp deleted file mode 100644 index 8b055971..00000000 --- a/thirdparty/linux/include/coin1/CglLandPValidator.hpp +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (C) 2005-2009, Pierre Bonami and others. All Rights Reserved. -// Author: Pierre Bonami -// Tepper School of Business -// Carnegie Mellon University, Pittsburgh, PA 15213 -// Date: 11/22/05 -// -// $Id: CglLandPValidator.hpp 1122 2013-04-06 20:39:53Z stefan $ -// -// This code is licensed under the terms of the Eclipse Public License (EPL). -//--------------------------------------------------------------------------- - -#ifndef CglLandPValidator_H -#define CglLandPValidator_H -#include "OsiSolverInterface.hpp" -#include "CglParam.hpp" -#include - -/** constants describing rejection codes*/ -//[5] = {"Accepted", "violation too small", "small coefficient too small", "big dynamic","too dense"} - - -namespace LAP -{ - -/** Class to validate or reject a cut */ -class Validator -{ -public: - /** Reasons for rejecting a cut */ - enum RejectionsReasons - { - NoneAccepted=0 /**Cut was accepted*/, - SmallViolation /** Violation of the cut is too small */, - SmallCoefficient /** There is a small coefficient we can not get rid off.*/, - BigDynamic /** Dynamic of coefficinet is too important. */, - DenseCut/**cut is too dense */, - EmptyCut/**After cleaning cut has become empty*/, - DummyEnd/** dummy*/ - }; - - /** Constructor with default values */ - Validator(double maxFillIn = 1., - double maxRatio = 1e8, - double minViolation = 0, - bool scale = false, - double rhsScale = 1); - - /** Clean an OsiCut */ - int cleanCut(OsiRowCut & aCut, const double * solCut,const OsiSolverInterface &si, const CglParam & par, - const double * colLower, const double * colUpper); - /** Clean an OsiCut by another method */ - int cleanCut2(OsiRowCut & aCut, const double * solCut, const OsiSolverInterface &si, const CglParam & par, - const double * colLower, const double * colUpper); - /** Call the cut cleaner */ - int operator()(OsiRowCut & aCut, const double * solCut,const OsiSolverInterface &si, const CglParam & par, - const double * colLower, const double * colUpper) - { - return cleanCut(aCut, solCut, si, par, colLower, colUpper); - } - /** @name set functions */ - /** @{ */ - void setMaxFillIn(double value) - { - maxFillIn_ = value; - } - void setMaxRatio(double value) - { - maxRatio_ = value; - } - void setMinViolation(double value) - { - minViolation_ = value; - } - - void setRhsScale(double v) - { - rhsScale_ = v; - } - /** @} */ - /** @name get functions */ - /** @{ */ - double getMaxFillIn() - { - return maxFillIn_; - } - double getMaxRatio() - { - return maxRatio_; - } - double getMinViolation() - { - return minViolation_; - } - /** @} */ - - const std::string& failureString(RejectionsReasons code) const - { - return rejections_[static_cast (code)]; - } - const std::string& failureString(int code) const - { - return rejections_[ code]; - } - int numRejected(RejectionsReasons code)const - { - return numRejected_[static_cast (code)]; - } - int numRejected(int code)const - { - return numRejected_[ code]; - } -private: - static void fillRejectionReasons(); - /** max percentage of given formulation fillIn should be accepted for cut fillin.*/ - double maxFillIn_; - /** max ratio between smallest and biggest coefficient */ - double maxRatio_; - /** minimum violation for accepting a cut */ - double minViolation_; - /** Do we do scaling? */ - bool scale_; - /** Scale of right-hand-side.*/ - double rhsScale_; - /** Strings explaining reason for rejections */ - static std::vector rejections_; - /** Number of cut rejected for each of the reasons.*/ - std::vector numRejected_; -}; - -}/* Ends namespace LAP.*/ -#endif diff --git a/thirdparty/linux/include/coin1/CglLiftAndProject.hpp b/thirdparty/linux/include/coin1/CglLiftAndProject.hpp deleted file mode 100644 index 364ba5a0..00000000 --- a/thirdparty/linux/include/coin1/CglLiftAndProject.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglLiftAndProject_H -#define CglLiftAndProject_H - -#include - -#include "CglCutGenerator.hpp" - -/** Lift And Project Cut Generator Class */ -class CglLiftAndProject : public CglCutGenerator { - friend void CglLiftAndProjectUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - /**@name Generate Cuts */ - //@{ - /** Generate lift-and-project cuts for the - model of the solver interface, si. - Insert the generated cuts into OsiCut, cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /** Get the normalization : Either beta=+1 or beta=-1. - */ - - double getBeta() const { - return beta_; - } - - /** Set the normalization : Either beta=+1 or beta=-1. - Default value is 1. - */ - void setBeta(int oneOrMinusOne){ - if (oneOrMinusOne==1 || oneOrMinusOne==-1){ - beta_= static_cast(oneOrMinusOne); - } - else { - throw CoinError("Unallowable value. Beta must be 1 or -1", - "cutGeneration","CglLiftAndProject"); - } - } - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglLiftAndProject (); - - /// Copy constructor - CglLiftAndProject ( - const CglLiftAndProject &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglLiftAndProject & - operator=( - const CglLiftAndProject& rhs); - - /// Destructor - virtual - ~CglLiftAndProject (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - -private: - - // Private member methods - - /**@name Private methods */ - //@{ - - //@} - - // Private member data - - /**@name Private member data */ - //@{ - /// The normalization is beta_=1 or beta_=-1 - double beta_; - /// epsilon - double epsilon_; - /// 1-epsilon - double onetol_; - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CglLiftAndProject class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglLiftAndProjectUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -#endif diff --git a/thirdparty/linux/include/coin1/CglMessage.hpp b/thirdparty/linux/include/coin1/CglMessage.hpp deleted file mode 100644 index 5f080e8f..00000000 --- a/thirdparty/linux/include/coin1/CglMessage.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// $Id: CglMessage.hpp 1105 2013-03-19 12:43:52Z forrest $ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglMessage_H -#define CglMessage_H - - -#include "CoinPragma.hpp" - -// This deals with Cgl messages (as against Osi messages etc) - -#include "CoinMessageHandler.hpp" -enum CGL_Message -{ - CGL_INFEASIBLE, - CGL_CLIQUES, - CGL_FIXED, - CGL_PROCESS_STATS, - CGL_SLACKS, - CGL_PROCESS_STATS2, - CGL_PROCESS_SOS1, - CGL_PROCESS_SOS2, - CGL_UNBOUNDED, - CGL_ELEMENTS_CHANGED1, - CGL_ELEMENTS_CHANGED2, - CGL_MADE_INTEGER, - CGL_ADDED_INTEGERS, - CGL_POST_INFEASIBLE, - CGL_POST_CHANGED, - CGL_GENERAL, - CGL_DUMMY_END -}; - -/** This deals with Cgl messages (as against Osi messages etc) - */ -class CglMessage : public CoinMessages { - -public: - - /**@name Constructors etc */ - //@{ - /** Constructor */ - CglMessage(Language language=us_en); - //@} - -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglMixedIntegerRounding.hpp b/thirdparty/linux/include/coin1/CglMixedIntegerRounding.hpp deleted file mode 100644 index 10580cb7..00000000 --- a/thirdparty/linux/include/coin1/CglMixedIntegerRounding.hpp +++ /dev/null @@ -1,429 +0,0 @@ -// LAST EDIT: -//----------------------------------------------------------------------------- -// name: Mixed Integer Rounding Cut Generator -// authors: Joao Goncalves (jog7@lehigh.edu) -// Laszlo Ladanyi (ladanyi@us.ibm.com) -// date: August 11, 2004 -//----------------------------------------------------------------------------- -// Copyright (C) 2004, International Business Machines Corporation and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. - -#ifndef CglMixedIntegerRounding_H -#define CglMixedIntegerRounding_H - -#include -#include -//#include - -#include "CoinError.hpp" - -#include "CglCutGenerator.hpp" - -//============================================================================= - -#ifndef CGL_DEBUG -#define CGL_DEBUG 0 -#endif - -//============================================================================= - -// Class to store variable upper bounds (VUB) -class CglMixIntRoundVUB -{ - // Variable upper bounds have the form x_j <= a y_j, where x_j is - // a continuous variable and y_j is an integer variable - -protected: - int var_; // The index of y_j - double val_; // The value of a - -public: - // Default constructor - CglMixIntRoundVUB() : var_(-1), val_(-1) {} - - // Copy constructor - CglMixIntRoundVUB(const CglMixIntRoundVUB& source) { - var_ = source.var_; - val_ = source.val_; - } - - // Assignment operator - CglMixIntRoundVUB& operator=(const CglMixIntRoundVUB& rhs) { - if (this != &rhs) { - var_ = rhs.var_; - val_ = rhs.val_; - } - return *this; - } - - // Destructor - ~CglMixIntRoundVUB() {} - - // Query and set functions - int getVar() const { return var_; } - double getVal() const { return val_; } - void setVar(const int v) { var_ = v; } - void setVal(const double v) { val_ = v; } -}; - -//============================================================================= - -// Class to store variable lower bounds (VLB). -// It is the same as the class to store variable upper bounds -typedef CglMixIntRoundVUB CglMixIntRoundVLB; - -//============================================================================= - -/** Mixed Integer Rounding Cut Generator Class */ - -// Reference: -// Hugues Marchand and Laurence A. Wolsey -// Aggregation and Mixed Integer Rounding to Solve MIPs -// Operations Research, 49(3), May-June 2001. -// Also published as CORE Dicusion Paper 9839, June 1998. - -class CglMixedIntegerRounding : public CglCutGenerator { - - friend void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - - -private: - //--------------------------------------------------------------------------- - // Enumeration constants that describe the various types of rows - enum RowType { - // The row type of this row is NOT defined yet. - ROW_UNDEFINED, - /** After the row is flipped to 'L', the row has exactly two variables: - one is negative binary and the other is a continous, - and the RHS is zero.*/ - ROW_VARUB, - /** After the row is flipped to 'L', the row has exactly two variables: - one is positive binary and the other is a continous, - and the RHS is zero.*/ - ROW_VARLB, - /** The row sense is 'E', the row has exactly two variables: - one is binary and the other is a continous, and the RHS is zero.*/ - ROW_VAREQ, - // The row contains continuous and integer variables; - // the total number of variables is at least 2 - ROW_MIX, - // The row contains only continuous variables - ROW_CONT, - // The row contains only integer variables - ROW_INT, - // The row contains other types of rows - ROW_OTHER - }; - - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate Mixed Integer Rounding cuts for the model data - contained in si. The generated cuts are inserted - in the collection of cuts cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - //--------------------------------------------------------------------------- - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglMixedIntegerRounding (); - - /// Alternate Constructor - CglMixedIntegerRounding (const int maxaggr, - const bool multiply, - const int criterion, - const int preproc = -1); - - /// Copy constructor - CglMixedIntegerRounding ( - const CglMixedIntegerRounding &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglMixedIntegerRounding & - operator=( - const CglMixedIntegerRounding& rhs); - - /// Destructor - virtual - ~CglMixedIntegerRounding (); - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - - //--------------------------------------------------------------------------- - /**@name Set and get methods */ - //@{ - /// Set MAXAGGR_ - inline void setMAXAGGR_ (int maxaggr) { - if (maxaggr > 0) { - MAXAGGR_ = maxaggr; - } - else { - throw CoinError("Unallowable value. maxaggr must be > 0", - "gutsOfConstruct","CglMixedIntegerRounding"); - } - } - - /// Get MAXAGGR_ - inline int getMAXAGGR_ () const { return MAXAGGR_; } - - /// Set MULTIPLY_ - inline void setMULTIPLY_ (bool multiply) { MULTIPLY_ = multiply; } - - /// Get MULTIPLY_ - inline bool getMULTIPLY_ () const { return MULTIPLY_; } - - /// Set CRITERION_ - inline void setCRITERION_ (int criterion) { - if ((criterion >= 1) && (criterion <= 3)) { - CRITERION_ = criterion; - } - else { - throw CoinError("Unallowable value. criterion must be 1, 2 or 3", - "gutsOfConstruct","CglMixedIntegerRounding"); - } - } - - /// Get CRITERION_ - inline int getCRITERION_ () const { return CRITERION_; } - - - /// Set doPreproc - void setDoPreproc(int value); - /// Get doPreproc - bool getDoPreproc() const; - - //@} - -private: - //-------------------------------------------------------------------------- - // Private member methods - - // Construct - void gutsOfConstruct (const int maxaggr, - const bool multiply, - const int criterion, - const int preproc); - - // Delete - void gutsOfDelete(); - - // Copy - void gutsOfCopy (const CglMixedIntegerRounding& rhs); - - // Do preprocessing. - // It determines the type of each row. It also identifies the variable - // upper bounds and variable lower bounds. - // It may change sense and RHS for ranged rows - void mixIntRoundPreprocess(const OsiSolverInterface& si); - - // Determine the type of a given row. - RowType determineRowType(const OsiSolverInterface& si, - const int rowLen, const int* ind, - const double* coef, const char sense, - const double rhs) const; - - // Generate MIR cuts - void generateMirCuts( const OsiSolverInterface& si, - const double* xlp, - const double* colUpperBound, - const double* colLowerBound, - const CoinPackedMatrix& matrixByRow, - const double* LHS, - const double* coefByRow, - const int* colInds, - const int* rowStarts, - const int* rowLengths, - //const CoinPackedMatrix& matrixByCol, - const double* coefByCol, - const int* rowInds, - const int* colStarts, - const int* colLengths, - OsiCuts& cs ) const; - - // Copy row selected to CoinPackedVector - void copyRowSelected( const int iAggregate, - const int rowSelected, - std::set& setRowsAggregated, - int* listRowsAggregated, - double* xlpExtra, - const char sen, - const double rhs, - const double lhs, - const CoinPackedMatrix& matrixByRow, - CoinPackedVector& rowToAggregate, - double& rhsToAggregate) const; - - // Select a row to aggregate - bool selectRowToAggregate( const OsiSolverInterface& si, - const CoinPackedVector& rowAggregated, - const double* colUpperBound, - const double* colLowerBound, - const std::set& setRowsAggregated, - const double* xlp, const double* coefByCol, - const int* rowInds, const int* colStarts, - const int* colLengths, - int& rowSelected, - int& colSelected ) const; - - // Aggregation heuristic. - // Combines one or more rows of the original matrix - void aggregateRow( const int colSelected, - CoinPackedVector& rowToAggregate, double rhs, - CoinPackedVector& rowAggregated, - double& rhsAggregated ) const; - - // Choose the bound substitution based on the criteria defined by the user - inline bool isLowerSubst(const double inf, - const double aj, - const double xlp, - const double LB, - const double UB) const; - - // Bound substitution heuristic - bool boundSubstitution( const OsiSolverInterface& si, - const CoinPackedVector& rowAggregated, - const double* xlp, - const double* xlpExtra, - const double* colUpperBound, - const double* colLowerBound, - CoinPackedVector& mixedKnapsack, - double& rhsMixedKnapsack, double& sStar, - CoinPackedVector& contVariablesInS ) const; - - // c-MIR separation heuristic - bool cMirSeparation ( const OsiSolverInterface& si, - const CoinPackedMatrix& matrixByRow, - const CoinPackedVector& rowAggregated, - const int* listRowsAggregated, - const char* sense, const double* RHS, - //const double* coefByRow, - //const int* colInds, const int* rowStarts, - //const int* rowLengths, - const double* xlp, const double sStar, - const double* colUpperBound, - const double* colLowerBound, - const CoinPackedVector& mixedKnapsack, - const double& rhsMixedKnapsack, - const CoinPackedVector& contVariablesInS, - OsiRowCut& flowCut ) const; - - // function to create one c-MIR inequality - void cMirInequality( const int numInt, - const double delta, - const double numeratorBeta, - const int *knapsackIndices, - const double* knapsackElements, - const double* xlp, - const double sStar, - const double* colUpperBound, - const std::set& setC, - CoinPackedVector& cMIR, - double& rhscMIR, - double& sCoef, - double& violation) const; - - // function to compute G - inline double functionG( const double d, const double f ) const; - - // function to print statistics (used only in debug mode) - void printStats( - std::ofstream & fout, - const bool hasCut, - const OsiSolverInterface& si, - const CoinPackedVector& rowAggregated, - const double& rhsAggregated, const double* xlp, - const double* xlpExtra, - const int* listRowsAggregated, - const int* listColsSelected, - const int level, - const double* colUpperBound, - const double* colLowerBound ) const; - - -private: - //--------------------------------------------------------------------------- - // Private member data - - // Maximum number of rows to aggregate - int MAXAGGR_; - // Flag that indicates if an aggregated row is also multiplied by -1 - bool MULTIPLY_; - // The criterion to use in the bound substitution - int CRITERION_; - // Tolerance used for numerical purposes - double EPSILON_; - /// There is no variable upper bound or variable lower bound defined - int UNDEFINED_; - // If violation of a cut is greater that this number, the cut is accepted - double TOLERANCE_; - /** Controls the preprocessing of the matrix to identify rows suitable for - cut generation.
        -
      • -1: preprocess according to solver settings; -
      • 0: Do preprocessing only if it has not yet been done; -
      • 1: Do preprocessing. -
      - Default value: -1 **/ - int doPreproc_; - // The number of rows of the problem. - int numRows_; - // The number columns of the problem. - int numCols_; - // Indicates whether preprocessing has been done. - bool doneInitPre_; - // The array of CglMixIntRoundVUBs. - CglMixIntRoundVUB* vubs_; - // The array of CglMixIntRoundVLBs. - CglMixIntRoundVLB* vlbs_; - // Array with the row types of the rows in the model. - RowType* rowTypes_; - // The indices of the rows of the initial matrix - int* indRows_; - // The number of rows of type ROW_MIX - int numRowMix_; - // The indices of the rows of type ROW_MIX - int* indRowMix_; - // The number of rows of type ROW_CONT - int numRowCont_; - // The indices of the rows of type ROW_CONT - int* indRowCont_; - // The number of rows of type ROW_INT - int numRowInt_; - // The indices of the rows of type ROW_INT - int* indRowInt_; - // The number of rows of type ROW_CONT that have at least one variable - // with variable upper or lower bound - int numRowContVB_; - // The indices of the rows of type ROW_CONT that have at least one variable - // with variable upper or lower bound - int* indRowContVB_; - // Sense of rows (modified if ranges) - char * sense_; - // RHS of rows (modified if ranges) - double * RHS_; - -}; - -//############################################################################# -// A function that tests the methods in the CglMixedIntegerRounding class. The -// only reason for it not to be a member method is that this way it doesn't -// have to be compiled into the library. And that's a gain, because the -// library should be compiled with optimization on, but this method should be -// compiled with debugging. -void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - -#endif diff --git a/thirdparty/linux/include/coin1/CglMixedIntegerRounding2.hpp b/thirdparty/linux/include/coin1/CglMixedIntegerRounding2.hpp deleted file mode 100644 index abf2530d..00000000 --- a/thirdparty/linux/include/coin1/CglMixedIntegerRounding2.hpp +++ /dev/null @@ -1,427 +0,0 @@ -// LAST EDIT: -//----------------------------------------------------------------------------- -// name: Mixed Integer Rounding Cut Generator -// authors: Joao Goncalves (jog7@lehigh.edu) -// Laszlo Ladanyi (ladanyi@us.ibm.com) -// date: August 11, 2004 -//----------------------------------------------------------------------------- -// Copyright (C) 2004, International Business Machines Corporation and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. - -#ifndef CglMixedIntegerRounding2_H -#define CglMixedIntegerRounding2_H - -#include -#include -//#include - -#include "CoinError.hpp" - -#include "CglCutGenerator.hpp" -#include "CoinIndexedVector.hpp" - -//============================================================================= - -#ifndef CGL_DEBUG -#define CGL_DEBUG 0 -#endif - -//============================================================================= - -// Class to store variable upper bounds (VUB) -class CglMixIntRoundVUB2 -{ - // Variable upper bounds have the form x_j <= a y_j, where x_j is - // a continuous variable and y_j is an integer variable - -protected: - int var_; // The index of y_j - double val_; // The value of a - -public: - // Default constructor - CglMixIntRoundVUB2() : var_(-1), val_(-1) {} - - // Copy constructor - CglMixIntRoundVUB2(const CglMixIntRoundVUB2& source) { - var_ = source.var_; - val_ = source.val_; - } - - // Assignment operator - CglMixIntRoundVUB2& operator=(const CglMixIntRoundVUB2& rhs) { - if (this != &rhs) { - var_ = rhs.var_; - val_ = rhs.val_; - } - return *this; - } - - // Destructor - ~CglMixIntRoundVUB2() {} - - // Query and set functions - int getVar() const { return var_; } - double getVal() const { return val_; } - void setVar(const int v) { var_ = v; } - void setVal(const double v) { val_ = v; } -}; - -//============================================================================= - -// Class to store variable lower bounds (VLB). -// It is the same as the class to store variable upper bounds -typedef CglMixIntRoundVUB2 CglMixIntRoundVLB2; - -//============================================================================= - -/** Mixed Integer Rounding Cut Generator Class */ - -// Reference: -// Hugues Marchand and Laurence A. Wolsey -// Aggregation and Mixed Integer Rounding to Solve MIPs -// Operations Research, 49(3), May-June 2001. -// Also published as CORE Dicusion Paper 9839, June 1998. - -class CglMixedIntegerRounding2 : public CglCutGenerator { - - friend void CglMixedIntegerRounding2UnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - - -private: - //--------------------------------------------------------------------------- - // Enumeration constants that describe the various types of rows - enum RowType { - // The row type of this row is NOT defined yet. - ROW_UNDEFINED, - /** After the row is flipped to 'L', the row has exactly two variables: - one is negative binary and the other is a continous, - and the RHS is zero.*/ - ROW_VARUB, - /** After the row is flipped to 'L', the row has exactly two variables: - one is positive binary and the other is a continous, - and the RHS is zero.*/ - ROW_VARLB, - /** The row sense is 'E', the row has exactly two variables: - one is binary and the other is a continous, and the RHS is zero.*/ - ROW_VAREQ, - // The row contains continuous and integer variables; - // the total number of variables is at least 2 - ROW_MIX, - // The row contains only continuous variables - ROW_CONT, - // The row contains only integer variables - ROW_INT, - // The row contains other types of rows - ROW_OTHER - }; - - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate Mixed Integer Rounding cuts for the model data - contained in si. The generated cuts are inserted - in the collection of cuts cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - //--------------------------------------------------------------------------- - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglMixedIntegerRounding2 (); - - /// Alternate Constructor - CglMixedIntegerRounding2 (const int maxaggr, - const bool multiply, - const int criterion, - const int preproc = -1); - - /// Copy constructor - CglMixedIntegerRounding2 ( - const CglMixedIntegerRounding2 &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglMixedIntegerRounding2 & - operator=( - const CglMixedIntegerRounding2& rhs); - - /// Destructor - virtual - ~CglMixedIntegerRounding2 (); - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - - //--------------------------------------------------------------------------- - /**@name Set and get methods */ - //@{ - /// Set MAXAGGR_ - inline void setMAXAGGR_ (int maxaggr) { - if (maxaggr > 0) { - MAXAGGR_ = maxaggr; - } - else { - throw CoinError("Unallowable value. maxaggr must be > 0", - "gutsOfConstruct","CglMixedIntegerRounding2"); - } - } - - /// Get MAXAGGR_ - inline int getMAXAGGR_ () const { return MAXAGGR_; } - - /// Set MULTIPLY_ - inline void setMULTIPLY_ (bool multiply) { MULTIPLY_ = multiply; } - - /// Get MULTIPLY_ - inline bool getMULTIPLY_ () const { return MULTIPLY_; } - - /// Set CRITERION_ - inline void setCRITERION_ (int criterion) { - if ((criterion >= 1) && (criterion <= 3)) { - CRITERION_ = criterion; - } - else { - throw CoinError("Unallowable value. criterion must be 1, 2 or 3", - "gutsOfConstruct","CglMixedIntegerRounding2"); - } - } - - /// Get CRITERION_ - inline int getCRITERION_ () const { return CRITERION_; } - - /// Set doPreproc - void setDoPreproc(int value); - /// Get doPreproc - bool getDoPreproc() const; - //@} - -private: - //-------------------------------------------------------------------------- - // Private member methods - - // Construct - void gutsOfConstruct ( const int maxaggr, - const bool multiply, - const int criterion, - const int preproc); - - // Delete - void gutsOfDelete(); - - // Copy - void gutsOfCopy (const CglMixedIntegerRounding2& rhs); - - // Do preprocessing. - // It determines the type of each row. It also identifies the variable - // upper bounds and variable lower bounds. - // It may change sense and RHS for ranged rows - void mixIntRoundPreprocess(const OsiSolverInterface& si); - - // Determine the type of a given row. - RowType determineRowType(//const OsiSolverInterface& si, - const int rowLen, const int* ind, - const double* coef, const char sense, - const double rhs) const; - - // Generate MIR cuts - void generateMirCuts( const OsiSolverInterface& si, - const double* xlp, - const double* colUpperBound, - const double* colLowerBound, - const CoinPackedMatrix& matrixByRow, - const double* LHS, - //const double* coefByRow, - //const int* colInds, - //const int* rowStarts, - //const CoinPackedMatrix& matrixByCol, - const double* coefByCol, - const int* rowInds, - const int* colStarts, - OsiCuts& cs ) const; - - // Copy row selected to CoinIndexedVector - void copyRowSelected( const int iAggregate, - const int rowSelected, - CoinIndexedVector& setRowsAggregated, - int* listRowsAggregated, - double* xlpExtra, - const char sen, - const double rhs, - const double lhs, - const CoinPackedMatrix& matrixByRow, - CoinIndexedVector& rowToAggregate, - double& rhsToAggregate) const; - - // Select a row to aggregate - bool selectRowToAggregate( //const OsiSolverInterface& si, - const CoinIndexedVector& rowAggregated, - const double* colUpperBound, - const double* colLowerBound, - const CoinIndexedVector& setRowsAggregated, - const double* xlp, const double* coefByCol, - const int* rowInds, const int* colStarts, - int& rowSelected, - int& colSelected ) const; - - // Aggregation heuristic. - // Combines one or more rows of the original matrix - void aggregateRow( const int colSelected, - CoinIndexedVector& rowToAggregate, double rhs, - CoinIndexedVector& rowAggregated, - double& rhsAggregated ) const; - - // Choose the bound substitution based on the criteria defined by the user - inline bool isLowerSubst(const double inf, - const double aj, - const double xlp, - const double LB, - const double UB) const; - - // Bound substitution heuristic - bool boundSubstitution( const OsiSolverInterface& si, - const CoinIndexedVector& rowAggregated, - const double* xlp, - const double* xlpExtra, - const double* colUpperBound, - const double* colLowerBound, - CoinIndexedVector& mixedKnapsack, - double& rhsMixedKnapsack, double& sStar, - CoinIndexedVector& contVariablesInS ) const; - - // c-MIR separation heuristic - bool cMirSeparation ( const OsiSolverInterface& si, - const CoinPackedMatrix& matrixByRow, - const CoinIndexedVector& rowAggregated, - const int* listRowsAggregated, - const char* sense, const double* RHS, - //const double* coefByRow, - //const int* colInds, const int* rowStarts, - const double* xlp, const double sStar, - const double* colUpperBound, - const double* colLowerBound, - const CoinIndexedVector& mixedKnapsack, - const double& rhsMixedKnapsack, - const CoinIndexedVector& contVariablesInS, - CoinIndexedVector * workVector, - OsiRowCut& flowCut ) const; - - // function to create one c-MIR inequality - void cMirInequality( const int numInt, - const double delta, - const double numeratorBeta, - const int *knapsackIndices, - const double* knapsackElements, - const double* xlp, - const double sStar, - const double* colUpperBound, - const CoinIndexedVector& setC, - CoinIndexedVector& cMIR, - double& rhscMIR, - double& sCoef, - double& violation) const; - - // function to compute G - inline double functionG( const double d, const double f ) const; - - // function to print statistics (used only in debug mode) - void printStats( - std::ofstream & fout, - const bool hasCut, - const OsiSolverInterface& si, - const CoinIndexedVector& rowAggregated, - const double& rhsAggregated, const double* xlp, - const double* xlpExtra, - const int* listRowsAggregated, - const int* listColsSelected, - const int level, - const double* colUpperBound, - const double* colLowerBound ) const; - - -private: - //--------------------------------------------------------------------------- - // Private member data - - // Maximum number of rows to aggregate - int MAXAGGR_; - // Flag that indicates if an aggregated row is also multiplied by -1 - bool MULTIPLY_; - // The criterion to use in the bound substitution - int CRITERION_; - // Tolerance used for numerical purposes - double EPSILON_; - /// There is no variable upper bound or variable lower bound defined - int UNDEFINED_; - // If violation of a cut is greater that this number, the cut is accepted - double TOLERANCE_; - /** Controls the preprocessing of the matrix to identify rows suitable for - cut generation.
        -
      • -1: preprocess according to solver settings; -
      • 0: Do preprocessing only if it has not yet been done; -
      • 1: Do preprocessing. -
      - Default value: -1 **/ - int doPreproc_; - // The number of rows of the problem. - int numRows_; - // The number columns of the problem. - int numCols_; - // Indicates whether preprocessing has been done. - bool doneInitPre_; - // The array of CglMixIntRoundVUB2s. - CglMixIntRoundVUB2* vubs_; - // The array of CglMixIntRoundVLB2s. - CglMixIntRoundVLB2* vlbs_; - // Array with the row types of the rows in the model. - RowType* rowTypes_; - // The indices of the rows of the initial matrix - int* indRows_; - // The number of rows of type ROW_MIX - int numRowMix_; - // The indices of the rows of type ROW_MIX - int* indRowMix_; - // The number of rows of type ROW_CONT - int numRowCont_; - // The indices of the rows of type ROW_CONT - int* indRowCont_; - // The number of rows of type ROW_INT - int numRowInt_; - // The indices of the rows of type ROW_INT - int* indRowInt_; - // The number of rows of type ROW_CONT that have at least one variable - // with variable upper or lower bound - int numRowContVB_; - // The indices of the rows of type ROW_CONT that have at least one variable - // with variable upper or lower bound - int* indRowContVB_; - // If integer - for speed - char * integerType_; - // Sense of rows (modified if ranges) - char * sense_; - // RHS of rows (modified if ranges) - double * RHS_; - -}; - -//############################################################################# -// A function that tests the methods in the CglMixedIntegerRounding2 class. The -// only reason for it not to be a member method is that this way it doesn't -// have to be compiled into the library. And that's a gain, because the -// library should be compiled with optimization on, but this method should be -// compiled with debugging. -void CglMixedIntegerRounding2UnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - -#endif diff --git a/thirdparty/linux/include/coin1/CglOddHole.hpp b/thirdparty/linux/include/coin1/CglOddHole.hpp deleted file mode 100644 index 3b80caae..00000000 --- a/thirdparty/linux/include/coin1/CglOddHole.hpp +++ /dev/null @@ -1,160 +0,0 @@ -// $Id: CglOddHole.hpp 1119 2013-04-06 20:24:18Z stefan $ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglOddHole_H -#define CglOddHole_H - -#include - -#include "CglCutGenerator.hpp" - -/** Odd Hole Cut Generator Class */ -class CglOddHole : public CglCutGenerator { - friend void CglOddHoleUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - - /**@name Generate Cuts */ - //@{ - /** Generate odd hole cuts for the model of the solver interface, si. - This looks at all rows of type sum x(i) <= 1 (or == 1) (x 0-1) - and sees if there is an odd cycle cut. See Grotschel, Lovasz - and Schrijver (1988) for method. - This is then lifted by using the corresponding Chvatal cut i.e. - Take all rows in cycle and add them together. RHS will be odd so - weaken all odd coefficients so 1.0 goes to 0.0 etc - then - constraint is sum even(j)*x(j) <= odd which can be replaced by - sum (even(j)/2)*x(j) <= (odd-1.0)/2. - A similar cut can be generated for sum x(i) >= 1. - - Insert the generated cuts into OsiCut, cs. - - This is only done for rows with unsatisfied 0-1 variables. If there - are many of these it will be slow. Improvements would do a - randomized subset and also speed up shortest path algorithm used. - - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Create Row List */ - //@{ - /// Create a list of rows which might yield cuts - /// this is to speed up process - /// The possible parameter is a list to cut down search - void createRowList( const OsiSolverInterface & si, - const int * possible=NULL); - /// This version passes in a list - 1 marks possible - void createRowList(int numberRows, const int * whichRow); - //@} - - /**@name Create Clique List */ - //@{ - /// Create a list of extra row cliques which may not be in matrix - /// At present these are classical cliques - void createCliqueList(int numberCliques, const int * cliqueStart, - const int * cliqueMember); - //@} - - /**@name Number Possibilities */ - //@{ - /// Returns how many rows might give odd hole cuts - int numberPossible(); - //@} - /**@name Gets and Sets */ - //@{ - /// Minimum violation - double getMinimumViolation() const; - void setMinimumViolation(double value); - /// Minimum violation per entry - double getMinimumViolationPer() const; - void setMinimumViolationPer(double value); - /// Maximum number of entries in a cut - int getMaximumEntries() const; - void setMaximumEntries(int value); - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglOddHole (); - - /// Copy constructor - CglOddHole ( - const CglOddHole &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglOddHole & - operator=( - const CglOddHole& rhs); - - /// Destructor - virtual - ~CglOddHole (); - - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - //@} - -private: - - // Private member methods - - - /**@name Private methods */ - //@{ - /// Generate cuts from matrix copy and solution - /// If packed true then <=1 rows, otherwise >=1 rows. - void generateCuts(const OsiRowCutDebugger * debugger, - const CoinPackedMatrix & rowCopy, - const double * solution, const double * dj, - OsiCuts & cs, const int * suitableRow, - const int * fixedColumn,const CglTreeInfo info, - bool packed); - //@} - - // Private member data - - /**@name Private member data */ - //@{ - /// list of suitableRows - int * suitableRows_; - /// start of each clique - int * startClique_; - /// clique members - int * member_; - /// epsilon - double epsilon_; - /// 1-epsilon - double onetol_; - /// Minimum violation - double minimumViolation_; - /// Minimum violation per entry - double minimumViolationPer_; - /// Maximum number of entries in a cut - int maximumEntries_; - /// number of rows when suitability tested - int numberRows_; - /// number of cliques - int numberCliques_; - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CglOddHole class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglOddHoleUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -#endif diff --git a/thirdparty/linux/include/coin1/CglParam.hpp b/thirdparty/linux/include/coin1/CglParam.hpp deleted file mode 100644 index 4463ef57..00000000 --- a/thirdparty/linux/include/coin1/CglParam.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// Name: CglParam.hpp -// Author: Francois Margot -// Tepper School of Business -// Carnegie Mellon University, Pittsburgh, PA 15213 -// email: fmargot@andrew.cmu.edu -// Date: 11/24/06 -// -// $Id: CglParam.hpp 1122 2013-04-06 20:39:53Z stefan $ -// -// This code is licensed under the terms of the Eclipse Public License (EPL). -//----------------------------------------------------------------------------- -// Copyright (C) 2006, Francois Margot and others. All Rights Reserved. - -#ifndef CglParam_H -#define CglParam_H -#include "CglConfig.h" -#include "CoinFinite.hpp" -/** Class collecting parameters for all cut generators. Each generator - may have a derived class to add parameters. Each generator might - also set different default values for the parameters in CglParam. */ - -class CglParam { - -public: - - /**@name Public Set/get methods */ - //@{ - - /** Set INFINIT */ - virtual void setINFINIT(const double inf); - /** Get value of INFINIT */ - inline double getINFINIT() const {return INFINIT;} - - /** Set EPS */ - virtual void setEPS(const double eps); - /** Get value of EPS */ - inline double getEPS() const {return EPS;} - - /** Set EPS_COEFF */ - virtual void setEPS_COEFF(const double eps_c); - /** Get value of EPS_COEFF */ - inline double getEPS_COEFF() const {return EPS_COEFF;} - - /** Set MAX_SUPPORT */ - virtual void setMAX_SUPPORT(const int max_s); - /** Get value of MAX_SUPPORT */ - inline int getMAX_SUPPORT() const {return MAX_SUPPORT;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglParam(const double inf = COIN_DBL_MAX, const double eps = 1e-6, - const double eps_c = 1e-5, const int max_s = COIN_INT_MAX); - - /// Copy constructor - CglParam(const CglParam&); - - /// Clone - virtual CglParam* clone() const; - - /// Assignment operator - CglParam& operator=(const CglParam &rhs); - - /// Destructor - virtual ~CglParam(); - //@} - -protected: - - // Protected member data - - /**@name Protected member data */ - - //@{ - // Value for infinity. Default: COIN_DBL_MAX. - double INFINIT; - - // EPSILON for double comparisons. Default: 1e-6. - double EPS; - - // Returned cuts do not have coefficients with absolute value smaller - // than EPS_COEFF. Default: 1e-5. - double EPS_COEFF; - - /** Maximum number of non zero coefficients in a generated cut; - Default: COIN_INT_MAX */ - int MAX_SUPPORT; - //@} - -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglPreProcess.hpp b/thirdparty/linux/include/coin1/CglPreProcess.hpp deleted file mode 100644 index 65c04ca5..00000000 --- a/thirdparty/linux/include/coin1/CglPreProcess.hpp +++ /dev/null @@ -1,492 +0,0 @@ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglPreProcess_H -#define CglPreProcess_H - -#include -#include - -#include "CoinMessageHandler.hpp" -#include "OsiSolverInterface.hpp" -#include "CglStored.hpp" -#include "OsiPresolve.hpp" -#include "CglCutGenerator.hpp" - -//############################################################################# - -/** Class for preProcessing and postProcessing. - - While cuts can be added at any time in the tree, some cuts are actually just - stronger versions of existing constraints. In this case they can replace those - constraints rather than being added as new constraints. This is awkward in the - tree but reasonable at the root node. - - This is a general process class which uses other cut generators to strengthen - constraints, establish that constraints are redundant, fix variables and - find relationships such as x + y == 1. - - Presolve will also be done. - - If row names existed they may be replaced by R0000000 etc - -*/ - -class CglPreProcess { - -public: - - ///@name Main methods - //@{ - /** preProcess problem - returning new problem. - If makeEquality true then <= cliques converted to ==. - Presolve will be done numberPasses times. - - Returns NULL if infeasible - - This version uses default strategy. For more control copy and edit - code from this function i.e. call preProcessNonDefault - */ - OsiSolverInterface * preProcess(OsiSolverInterface & model, - bool makeEquality=false, int numberPasses=5); - /** preProcess problem - returning new problem. - If makeEquality true then <= cliques converted to ==. - Presolve will be done numberPasses times. - - Returns NULL if infeasible - - This version assumes user has added cut generators to CglPreProcess object - before calling it. As an example use coding in preProcess - If makeEquality is 1 add slacks to get cliques, - if 2 add slacks to get sos (but only if looks plausible) and keep sos info - */ - OsiSolverInterface * preProcessNonDefault(OsiSolverInterface & model, - int makeEquality=0, int numberPasses=5, - int tuning=0); - /// Creates solution in original model - void postProcess(OsiSolverInterface &model - ,bool deleteStuff=true); - /** Tightens primal bounds to make dual and branch and cutfaster. Unless - fixed or integral, bounds are slightly looser than they could be. - Returns non-zero if problem infeasible - Fudge for branch and bound - put bounds on columns of factor * - largest value (at continuous) - should improve stability - in branch and bound on infeasible branches (0.0 is off) - */ - int tightenPrimalBounds(OsiSolverInterface & model,double factor=0.0); - /** Fix some of problem - returning new problem. - Uses reduced costs. - Optional signed character array - 1 always keep, -1 always discard, 0 use djs - - */ - OsiSolverInterface * someFixed(OsiSolverInterface & model, - double fractionToKeep=0.25, - bool fixContinuousAsWell=false, - char * keep=NULL) const; - /** Replace cliques by more maximal cliques - Returns NULL if rows not reduced by greater than cliquesNeeded*rows - - */ - OsiSolverInterface * cliqueIt(OsiSolverInterface & model, - double cliquesNeeded=0.0) const; - /// If we have a cutoff - fix variables - int reducedCostFix(OsiSolverInterface & model); - //@} - - //--------------------------------------------------------------------------- - - /**@name Parameter set/get methods - - The set methods return true if the parameter was set to the given value, - false if the value of the parameter is out of range. - - The get methods return the value of the parameter. - - */ - //@{ - /** Set cutoff bound on the objective function. - - When using strict comparison, the bound is adjusted by a tolerance to - avoid accidentally cutting off the optimal solution. - */ - void setCutoff(double value) ; - - /// Get the cutoff bound on the objective function - always as minimize - double getCutoff() const; - /// The original solver associated with this model. - inline OsiSolverInterface * originalModel() const - { return originalModel_;} - /// Solver after making clique equalities (may == original) - inline OsiSolverInterface * startModel() const - { return startModel_;} - /// Copies of solver at various stages after presolve - inline OsiSolverInterface * modelAtPass(int iPass) const - { if (iPass>=0&&iPass=0&&iPass=0&&iPass - -#include "CglCutGenerator.hpp" - /** Only useful type of disaggregation is most normal - For now just done for 0-1 variables - Can be used for building cliques - */ - typedef struct { - //unsigned int zeroOne:1; // nonzero if affected variable is 0-1 - //unsigned int whenAtUB:1; // nonzero if fixing happens when this variable at 1 - //unsigned int affectedToUB:1; // nonzero if affected variable fixed to UB - //unsigned int affected:29; // If 0-1 then 0-1 sequence, otherwise true - unsigned int affected; - } disaggregationAction; - -/** Probing Cut Generator Class */ -class CglProbing : public CglCutGenerator { - friend void CglProbingUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - - /**@name Generate Cuts */ - //@{ - /** Generate probing/disaggregation cuts for the model of the - solver interface, si. - - This is a simplification of probing ideas put into OSL about - ten years ago. The only known documentation is a copy of a - talk handout - we think Robin Lougee-Heimer has a copy! - - For selected integer variables (e.g. unsatisfied ones) the effect of - setting them up or down is investigated. Setting a variable up - may in turn set other variables (continuous as well as integer). - There are various possible results: - - 1) It is shown that problem is infeasible (this may also be - because objective function or reduced costs show worse than - best solution). If the other way is feasible we can generate - a column cut (and continue probing), if not feasible we can - say problem infeasible. - - 2) If both ways are feasible, it can happen that x to 0 implies y to 1 - ** and x to 1 implies y to 1 (again a column cut). More common - is that x to 0 implies y to 1 and x to 1 implies y to 0 so we could - substitute for y which might lead later to more powerful cuts. - ** This is not done in this code as there is no mechanism for - returning information. - - 3) When x to 1 a constraint went slack by c. We can tighten the - constraint ax + .... <= b (where a may be zero) to - (a+c)x + .... <= b. If this cut is violated then it is - generated. - - 4) Similarly we can generate implied disaggregation cuts - - Note - differences to cuts in OSL. - - a) OSL had structures intended to make this faster. - b) The "chaining" in 2) was done - c) Row cuts modified original constraint rather than adding cut - b) This code can cope with general integer variables. - - Insert the generated cuts into OsiCut, cs. - - If a "snapshot" of a matrix exists then this will be used. - Presumably this will give global cuts and will be faster. - No check is done to see if cuts will be global. - - Otherwise use current matrix. - - Both row cuts and column cuts may be returned - - The mode options are: - 0) Only unsatisfied integer variables will be looked at. - If no information exists for that variable then - probing will be done so as a by-product you "may" get a fixing - or infeasibility. This will be fast and is only available - if a snapshot exists (otherwise as 1). - The bounds in the snapshot are the ones used. - 1) Look at unsatisfied integer variables, using current bounds. - Probing will be done on all looked at. - 2) Look at all integer variables, using current bounds. - Probing will be done on all - - ** If generateCutsAndModify is used then new relaxed - row bounds and tightened column bounds are generated - Returns number of infeasibilities - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - int generateCutsAndModify( const OsiSolverInterface & si, OsiCuts & cs, - CglTreeInfo * info); - //@} - - /**@name snapshot etc */ - //@{ - /** Create a copy of matrix which is to be used - this is to speed up process and to give global cuts - Can give an array with 1 set to select, 0 to ignore - column bounds are tightened - If array given then values of 1 will be set to 0 if redundant. - Objective may be added as constraint - Returns 1 if infeasible otherwise 0 - */ - int snapshot ( const OsiSolverInterface & si, - char * possible=NULL, - bool withObjective=true); - /// Deletes snapshot - void deleteSnapshot ( ); - /** Creates cliques for use by probing. - Only cliques >= minimumSize and < maximumSize created - Can also try and extend cliques as a result of probing (root node). - Returns number of cliques found. - */ - int createCliques( OsiSolverInterface & si, - int minimumSize=2, int maximumSize=100); - /// Delete all clique information - void deleteCliques(); - /** Create a fake model by adding cliques - if type&4 then delete rest of model first, - if 1 then add proper cliques, 2 add fake cliques */ - OsiSolverInterface * cliqueModel(const OsiSolverInterface * model, - int type); - //@} - - /**@name Get tighter column bounds */ - //@{ - /// Lower - const double * tightLower() const; - /// Upper - const double * tightUpper() const; - /// Array which says tighten continuous - const char * tightenBounds() const - { return tightenBounds_;} - //@} - - /**@name Get possible freed up row bounds - only valid after mode==3 */ - //@{ - /// Lower - const double * relaxedRowLower() const; - /// Upper - const double * relaxedRowUpper() const; - //@} - - /**@name Change mode */ - //@{ - /// Set - void setMode(int mode); - /// Get - int getMode() const; - //@} - - /**@name Change maxima */ - //@{ - /// Set maximum number of passes per node - void setMaxPass(int value); - /// Get maximum number of passes per node - int getMaxPass() const; - /// Set log level - 0 none, 1 - a bit, 2 - more details - void setLogLevel(int value); - /// Get log level - int getLogLevel() const; - /// Set maximum number of unsatisfied variables to look at - void setMaxProbe(int value); - /// Get maximum number of unsatisfied variables to look at - int getMaxProbe() const; - /// Set maximum number of variables to look at in one probe - void setMaxLook(int value); - /// Get maximum number of variables to look at in one probe - int getMaxLook() const; - /// Set maximum number of elements in row for it to be considered - void setMaxElements(int value); - /// Get maximum number of elements in row for it to be considered - int getMaxElements() const; - /// Set maximum number of passes per node (root node) - void setMaxPassRoot(int value); - /// Get maximum number of passes per node (root node) - int getMaxPassRoot() const; - /// Set maximum number of unsatisfied variables to look at (root node) - void setMaxProbeRoot(int value); - /// Get maximum number of unsatisfied variables to look at (root node) - int getMaxProbeRoot() const; - /// Set maximum number of variables to look at in one probe (root node) - void setMaxLookRoot(int value); - /// Get maximum number of variables to look at in one probe (root node) - int getMaxLookRoot() const; - /// Set maximum number of elements in row for it to be considered (root node) - void setMaxElementsRoot(int value); - /// Get maximum number of elements in row for it to be considered (root node) - int getMaxElementsRoot() const; - /** - Returns true if may generate Row cuts in tree (rather than root node). - Used so know if matrix will change in tree. Really - meant so column cut generators can still be active - without worrying code. - Default is true - */ - virtual bool mayGenerateRowCutsInTree() const; - //@} - - /**@name Get information back from probing */ - //@{ - /// Number looked at this time - inline int numberThisTime() const - { return numberThisTime_;} - /// Which ones looked at this time - inline const int * lookedAt() const - { return lookedAt_;} - //@} - - /**@name Stop or restart row cuts (otherwise just fixing from probing) */ - //@{ - /// Set - /// 0 no cuts, 1 just disaggregation type, 2 coefficient ( 3 both) - void setRowCuts(int type); - /// Get - int rowCuts() const; - //@} - /// Clique type - typedef struct { - unsigned int equality:1; // nonzero if clique is == - } CliqueType; - - /**@name Information on cliques */ - //@{ - /// Number of cliques - inline int numberCliques() const - { return numberCliques_;} - /// Clique type - inline CliqueType * cliqueType() const - { return cliqueType_;} - /// Start of each clique - inline int * cliqueStart() const - { return cliqueStart_;} - /// Entries for clique - inline CliqueEntry * cliqueEntry() const - { return cliqueEntry_;} - //@} - - /**@name Whether use objective as constraint */ - //@{ - /** Set - 0 don't - 1 do - -1 don't even think about it - */ - void setUsingObjective(int yesNo); - /// Get - int getUsingObjective() const; - //@} - - /**@name Mark which continuous variables are to be tightened */ - //@{ - /// Mark variables to be tightened - void tightenThese(const OsiSolverInterface & solver, int number, const int * which); - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglProbing (); - - /// Copy constructor - CglProbing ( - const CglProbing &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglProbing & - operator=( - const CglProbing& rhs); - - /// Destructor - virtual - ~CglProbing (); - - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - -private: - - // Private member methods - /**@name probe */ - //@{ - /// Does probing and adding cuts (without cliques and mode_!=0) - int probe( const OsiSolverInterface & si, - const OsiRowCutDebugger * debugger, - OsiCuts & cs, - double * colLower, double * colUpper, CoinPackedMatrix *rowCopy, - CoinPackedMatrix *columnCopy,const CoinBigIndex * rowStartPos, - const int * realRow, const double * rowLower, const double * rowUpper, - const char * intVar, double * minR, double * maxR, int * markR, - CglTreeInfo * info); - /// Does probing and adding cuts (with cliques) - int probeCliques( const OsiSolverInterface & si, - const OsiRowCutDebugger * debugger, - OsiCuts & cs, - double * colLower, double * colUpper, CoinPackedMatrix *rowCopy, - CoinPackedMatrix *columnCopy, const int * realRow, - double * rowLower, double * rowUpper, - char * intVar, double * minR, double * maxR, int * markR, - CglTreeInfo * info); - /// Does probing and adding cuts for clique slacks - int probeSlacks( const OsiSolverInterface & si, - const OsiRowCutDebugger * debugger, - OsiCuts & cs, - double * colLower, double * colUpper, CoinPackedMatrix *rowCopy, - CoinPackedMatrix *columnCopy, - double * rowLower, double * rowUpper, - char * intVar, double * minR, double * maxR,int * markR, - CglTreeInfo * info); - /** Does most of work of generateCuts - Returns number of infeasibilities */ - int gutsOfGenerateCuts( const OsiSolverInterface & si, - OsiCuts & cs, - double * rowLower, double * rowUpper, - double * colLower, double * colUpper, - CglTreeInfo * info); - /// Sets up clique information for each row - void setupRowCliqueInformation(const OsiSolverInterface & si); - /** This tightens column bounds (and can declare infeasibility) - It may also declare rows to be redundant */ - int tighten(double *colLower, double * colUpper, - const int *column, const double *rowElements, - const CoinBigIndex *rowStart,const CoinBigIndex * rowStartPos, - const int * rowLength, - double *rowLower, double *rowUpper, - int nRows,int nCols,char * intVar,int maxpass, - double tolerance); - /// This just sets minima and maxima on rows - void tighten2(double *colLower, double * colUpper, - const int *column, const double *rowElements, - const CoinBigIndex *rowStart, - const int * rowLength, - double *rowLower, double *rowUpper, - double * minR, double * maxR, int * markR, - int nRows); - //@} - - // Private member data - - struct disaggregation_struct_tag ; - friend struct CglProbing::disaggregation_struct_tag ; - - /**@name Private member data */ - //@{ - /// Row copy (only if snapshot) - CoinPackedMatrix * rowCopy_; - /// Column copy (only if snapshot) - CoinPackedMatrix * columnCopy_; - /// Lower bounds on rows - double * rowLower_; - /// Upper bounds on rows - double * rowUpper_; - /// Lower bounds on columns - double * colLower_; - /// Upper bounds on columns - double * colUpper_; - /// Number of rows in snapshot (or when cliqueRow stuff computed) - int numberRows_; - /// Number of columns in problem ( must == current) - int numberColumns_; - /// Tolerance to see if infeasible - double primalTolerance_; - /** Mode - 0 lazy using snapshot, 1 just unsatisfied, 2 all. - 16 bit set if want to extend cliques at root node - */ - int mode_; - /** Row cuts flag - 0 no cuts, 1 just disaggregation type, 2 coefficient ( 3 both), 4 just column cuts - -n as +n but just fixes variables unless at root - */ - int rowCuts_; - /// Maximum number of passes to do in probing - int maxPass_; - /// Log level - 0 none, 1 - a bit, 2 - more details - int logLevel_; - /// Maximum number of unsatisfied variables to probe - int maxProbe_; - /// Maximum number of variables to look at in one probe - int maxStack_; - /// Maximum number of elements in row for scan - int maxElements_; - /// Maximum number of passes to do in probing at root - int maxPassRoot_; - /// Maximum number of unsatisfied variables to probe at root - int maxProbeRoot_; - /// Maximum number of variables to look at in one probe at root - int maxStackRoot_; - /// Maximum number of elements in row for scan at root - int maxElementsRoot_; - /// Whether to include objective as constraint - int usingObjective_; - /// Number of integer variables - int numberIntegers_; - /// Number of 0-1 integer variables - int number01Integers_; - /// Number looked at this time - int numberThisTime_; - /// Total number of times called - int totalTimesCalled_; - /// Which ones looked at this time - int * lookedAt_; - /// Disaggregation cuts and for building cliques - typedef struct disaggregation_struct_tag { - int sequence; // integer variable - // index will be NULL if no probing done yet - int length; // length of newValue - disaggregationAction * index; // columns whose bounds will be changed - } disaggregation; - disaggregation * cutVector_; - /// Cliques - /// Number of cliques - int numberCliques_; - /// Clique type - CliqueType * cliqueType_; - /// Start of each clique - int * cliqueStart_; - /// Entries for clique - CliqueEntry * cliqueEntry_; - /** Start of oneFixes cliques for a column in matrix or -1 if not - in any clique */ - int * oneFixStart_; - /** Start of zeroFixes cliques for a column in matrix or -1 if not - in any clique */ - int * zeroFixStart_; - /// End of fixes for a column - int * endFixStart_; - /// Clique numbers for one or zero fixes - int * whichClique_; - /** For each column with nonzero in row copy this gives a clique "number". - So first clique mentioned in row is always 0. If no entries for row - then no cliques. If sequence > numberColumns then not in clique. - */ - CliqueEntry * cliqueRow_; - /// cliqueRow_ starts for each row - int * cliqueRowStart_; - /// If not null and [i] !=0 then also tighten even if continuous - char * tightenBounds_; - //@} -}; -inline int affectedInDisaggregation(const disaggregationAction & dis) -{ return dis.affected&0x1fffffff;} -inline void setAffectedInDisaggregation(disaggregationAction & dis, - int affected) -{ dis.affected = affected|(dis.affected&0xe0000000);} -#ifdef NDEBUG -inline bool zeroOneInDisaggregation(const disaggregationAction & ) -{ return true;} -#else -inline bool zeroOneInDisaggregation(const disaggregationAction & dis) -//{ return (dis.affected&0x80000000)!=0;} -{ assert ((dis.affected&0x80000000)!=0); return true;} -#endif -inline void setZeroOneInDisaggregation(disaggregationAction & dis,bool zeroOne) -{ dis.affected = (zeroOne ? 0x80000000 : 0)|(dis.affected&0x7fffffff);} -inline bool whenAtUBInDisaggregation(const disaggregationAction & dis) -{ return (dis.affected&0x40000000)!=0;} -inline void setWhenAtUBInDisaggregation(disaggregationAction & dis,bool whenAtUB) -{ dis.affected = (whenAtUB ? 0x40000000 : 0)|(dis.affected&0xbfffffff);} -inline bool affectedToUBInDisaggregation(const disaggregationAction & dis) -{ return (dis.affected&0x20000000)!=0;} -inline void setAffectedToUBInDisaggregation(disaggregationAction & dis,bool affectedToUB) -{ dis.affected = (affectedToUB ? 0x20000000 : 0)|(dis.affected&0xdfffffff);} - -//############################################################################# -/** A function that tests the methods in the CglProbing class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglProbingUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); -/// This just uses implication info -class CglImplication : public CglCutGenerator { - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate cuts from implication table - Insert generated cuts into the cut set cs. - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglImplication (); - - /// Constructor with info - CglImplication (CglTreeProbingInfo * info); - - /// Copy constructor - CglImplication ( - const CglImplication &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglImplication & - operator=( - const CglImplication& rhs); - - /// Destructor - virtual - ~CglImplication (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - /**@name Set implication */ - //@{ - /// Set implication - inline void setProbingInfo(CglTreeProbingInfo * info) - { probingInfo_=info;} - //@} - -private: - /**@name Private member data */ - //@{ - /// Pointer to tree probing info - CglTreeProbingInfo * probingInfo_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CglRedSplit.hpp b/thirdparty/linux/include/coin1/CglRedSplit.hpp deleted file mode 100644 index 1265b1d0..00000000 --- a/thirdparty/linux/include/coin1/CglRedSplit.hpp +++ /dev/null @@ -1,448 +0,0 @@ -// Last edit: 4/20/07 -// -// Name: CglRedSplit.hpp -// Author: Francois Margot -// Tepper School of Business -// Carnegie Mellon University, Pittsburgh, PA 15213 -// email: fmargot@andrew.cmu.edu -// Date: 2/6/05 -// -// $Id: CglRedSplit.hpp 1119 2013-04-06 20:24:18Z stefan $ -//----------------------------------------------------------------------------- -// Copyright (C) 2005, Francois Margot and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglRedSplit_H -#define CglRedSplit_H - -#include "CglCutGenerator.hpp" -#include "CglRedSplitParam.hpp" - -/** Gomory Reduce-and-Split Cut Generator Class; See method generateCuts(). - Based on the paper by K. Anderson, G. Cornuejols, Yanjun Li, - "Reduce-and-Split Cuts: Improving the Performance of Mixed Integer - Gomory Cuts", Management Science 51 (2005). */ - -class CglRedSplit : public CglCutGenerator { - - friend void CglRedSplitUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); -public: - /**@name generateCuts */ - //@{ - /** Generate Reduce-and-Split Mixed Integer Gomory cuts - for the model of the solver interface si. - - Insert the generated cuts into OsiCuts cs. - - Warning: This generator currently works only with the Lp solvers Clp or - Cplex9.0 or higher. It requires access to the optimal tableau and - optimal basis inverse and makes assumptions on the way slack variables - are added by the solver. The Osi implementations for Clp and Cplex - verify these assumptions. - - When calling the generator, the solver interface si - must contain an optimized - problem and information related to the optimal basis must be available - through the OsiSolverInterface methods (si->optimalBasisIsAvailable() - must return 'true'). It is also essential that the integrality of - structural variable i can be obtained using si->isInteger(i). - - Reduce-and-Split cuts are variants of Gomory cuts: Starting from - the current optimal tableau, linear combinations of the rows of - the current optimal simplex tableau are used for generating Gomory - cuts. The choice of the linear combinations is driven by the objective - of reducing the coefficients of the non basic continuous variables - in the resulting row. - Note that this generator might not be able to generate cuts for some - solutions violating integrality constraints. - - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /// Return true if needs optimal basis to do cuts (will return true) - virtual bool needsOptimalBasis() const; - //@} - - - /**@name Public Methods */ - //@{ - - // Set the parameters to the values of the given CglRedSplitParam object. - void setParam(const CglRedSplitParam &source); - // Return the CglRedSplitParam object of the generator. - inline CglRedSplitParam getParam() const {return param;} - - // Compute entries of low_is_lub and up_is_lub. - void compute_is_lub(); - - // Compute entries of is_integer. - void compute_is_integer(); - - /// Set given_optsol to the given optimal solution given_sol. - /// If given_optsol is set using this method, - /// the code will stop as soon as - /// a generated cut is violated by the given solution; exclusively - /// for debugging purposes. - void set_given_optsol(const double *given_sol, const int card_sol); - - /// Print some of the data members - void print() const; - - /// Print the current simplex tableau - void printOptTab(OsiSolverInterface *solver) const; - - //@} - - /**@name Public Methods (soon to be obsolete)*/ - //@{ - //************************************************************ - // TO BE REMOVED - /** Set limit, the maximum number of non zero coefficients in generated cut; - Default: 50 */ - void setLimit(int limit); - /** Get value of limit */ - int getLimit() const; - - /** Set away, the minimum distance from being integer used for selecting - rows for cut generation; all rows whose pivot variable should be - integer but is more than away from integrality will be selected; - Default: 0.05 */ - void setAway(double value); - /// Get value of away - double getAway() const; - /** Set the value of LUB, value considered large for the absolute value of - a lower or upper bound on a variable; - Default: 1000 */ - void setLUB(double value); - /** Get the value of LUB */ - double getLUB() const; - - /** Set the value of EPS, epsilon for double computations; - Default: 1e-7 */ - void setEPS(double value); - /** Get the value of EPS */ - double getEPS() const; - - /** Set the value of EPS_COEFF, epsilon for values of coefficients; - Default: 1e-8 */ - void setEPS_COEFF(double value); - /** Get the value of EPS_COEFF */ - double getEPS_COEFF() const; - - /** Set the value of EPS_COEFF_LUB, epsilon for values of coefficients for - variables with absolute value of lower or upper bound larger than LUB; - Default: 1e-13 */ - void setEPS_COEFF_LUB(double value); - /** Get the value of EPS_COEFF_LUB */ - double getEPS_COEFF_LUB() const; - - /** Set the value of EPS_RELAX, value used for relaxing the right hand side - of each generated cut; - Default: 1e-8 */ - void setEPS_RELAX(double value); - /** Get the value of EPS_RELAX */ - double getEPS_RELAX() const; - - /** Set the value of normIsZero, the threshold for considering a norm to be - 0; Default: 1e-5 */ - void setNormIsZero(double value); - /** Get the value of normIsZero */ - double getNormIsZero() const; - - /** Set the value of minReduc, threshold for relative norm improvement for - performing a reduction; Default: 0.05 */ - void setMinReduc(double value); - /// Get the value of minReduc - double getMinReduc() const; - - /** Set the maximum allowed value for (mTab * mTab * CoinMax(mTab, nTab)) where - mTab is the number of rows used in the combinations and nTab is the - number of continuous non basic variables. The work of the generator is - proportional to (mTab * mTab * CoinMax(mTab, nTab)). Reducing the value of - maxTab makes the generator faster, but weaker. Default: 1e7. */ - void setMaxTab(double value); - /// Get the value of maxTab - double getMaxTab() const; - // END TO BE REMOVED - //************************************************************ - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglRedSplit(); - - /// Constructor with specified parameters - CglRedSplit(const CglRedSplitParam &RS_param); - - /// Copy constructor - CglRedSplit (const CglRedSplit &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglRedSplit & - operator=( - const CglRedSplit& rhs); - - /// Destructor - virtual - ~CglRedSplit (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - -private: - - // Private member methods - -/**@name Private member methods */ - - //@{ - - // Method generating the cuts after all CglRedSplit members are properly set. - void generateCuts(OsiCuts & cs); - - /// Compute the fractional part of value, allowing for small error. - inline double rs_above_integer(double value); - - /// Perform row r1 of pi := row r1 of pi - step * row r2 of pi. - void update_pi_mat(int r1, int r2, int step); - - /// Perform row r1 of tab := row r1 of tab - step * row r2 of tab. - void update_redTab(int r1, int r2, int step); - - /// Find optimal integer step for changing row r1 by adding to it a - /// multiple of another row r2. - void find_step(int r1, int r2, int *step, - double *reduc, double *norm); - - /// Test if an ordered pair of rows yields a reduction. Perform the - /// reduction if it is acceptable. - int test_pair(int r1, int r2, double *norm); - - /// Reduce rows of contNonBasicTab. - void reduce_contNonBasicTab(); - - /// Generate a row of the current LP tableau. - void generate_row(int index_row, double *row); - - /// Generate a mixed integer Chvatal-Gomory cut, when all non basic - /// variables are non negative and at their lower bound. - int generate_cgcut(double *row, double *rhs); - - /// Generate a mixed integer Chvatal-Gomory cut, when all non basic - /// variables are non negative and at their lower bound (different formula) - int generate_cgcut_2(int basic_ind, double *row, double *rhs); - - /// Use multiples of the initial inequalities to cancel out the coefficients - /// of the slack variables. - void eliminate_slacks(double *row, - const double *elements, - const int *start, - const int *indices, - const int *rowLength, - const double *rhs, double *rowrhs); - - /// Change the sign of the coefficients of the continuous non basic - /// variables at their upper bound. - void flip(double *row); - - /// Change the sign of the coefficients of the continuous non basic - /// variables at their upper bound and do the translations restoring - /// the original bounds. Modify the right hand side - /// accordingly. - void unflip(double *row, double *rowrhs, double *slack_val); - - /// Return the scale factor for the row. - /// Compute max_coeff: maximum absolute value of the coefficients. - /// Compute min_coeff: minimum absolute value of the coefficients - /// larger than EPS_COEFF. - /// Return -1 if max_coeff < EPS_COEFF or if max_coeff/min_coeff > MAXDYN - /// or MAXDYN_LUB (depending if the row has a non zero coeff. for a variable - /// with large lower/upper bound) */. - double row_scale_factor(double *row); - - /// Generate the packed cut from the row representation. - int generate_packed_row(const double *xlp, double *row, - int *rowind, double *rowelem, - int *card_row, double & rhs); - - /// Check that the generated cuts do not cut a given optimal solution. - void check_optsol(const int calling_place, - const double *xlp, const double *slack_val, - const int do_flip); - - /// Check that the generated cuts do not cut a given optimal solution. - void check_optsol(const int calling_place, - const double *xlp, const double *slack_val, - const double *ck_row, const double ck_rhs, - const int cut_number, const int do_flip); - - // Check that two vectors are different. - bool rs_are_different_vectors(const int *vect1, - const int *vect2, - const int dim); - - // Check that two vectors are different. - bool rs_are_different_vectors(const double *vect1, - const double *vect2, - const int dim); - - // Check that two matrices are different. - bool rs_are_different_matrices(const CoinPackedMatrix *mat1, - const CoinPackedMatrix *mat2, - const int nmaj, - const int nmin); - //@} - - - // Private member data - -/**@name Private member data */ - - //@{ - - /// Object with CglRedSplitParam members. - CglRedSplitParam param; - - /// Number of rows ( = number of slack variables) in the current LP. - int nrow; - - /// Number of structural variables in the current LP. - int ncol; - - /// Lower bounds for structural variables - const double *colLower; - - /// Upper bounds for structural variables - const double *colUpper; - - /// Lower bounds for constraints - const double *rowLower; - - /// Upper bounds for constraints - const double *rowUpper; - - /// Righ hand side for constraints (upper bound for ranged constraints). - const double *rowRhs; - - /// Number of integer basic structural variables that are fractional in the - /// current lp solution (at least param.away_ from being integer). - int card_intBasicVar_frac; - - /// Number of integer non basic structural variables in the - /// current lp solution. - int card_intNonBasicVar; - - /// Number of continuous non basic variables (structural or slack) in the - /// current lp solution. - int card_contNonBasicVar; - - /// Number of non basic variables (structural or slack) at their - /// upper bound in the current lp solution. - int card_nonBasicAtUpper; - - /// Number of non basic variables (structural or slack) at their - /// lower bound in the current lp solution. - int card_nonBasicAtLower; - - /// Characteristic vector for integer basic structural variables - /// with non integer value in the current lp solution. - int *cv_intBasicVar_frac; - - /// List of integer structural basic variables - /// (in order of pivot in selected rows for cut generation). - int *intBasicVar_frac; - - /// List of integer structural non basic variables. - int *intNonBasicVar; - - /// List of continuous non basic variables (structural or slack). - // slacks are considered continuous (no harm if this is not the case). - int *contNonBasicVar; - - /// List of non basic variables (structural or slack) at their - /// upper bound. - int *nonBasicAtUpper; - - /// List of non basic variables (structural or slack) at their lower - /// bound. - int *nonBasicAtLower; - - /// Number of rows in the reduced tableau (= card_intBasicVar_frac). - int mTab; - - /// Number of columns in the reduced tableau (= card_contNonBasicVar) - int nTab; - - /// Tableau of multipliers used to alter the rows used in generation. - /// Dimensions: mTab by mTab. Initially, pi_mat is the identity matrix. - int **pi_mat; - - /// Current tableau for continuous non basic variables (structural or slack). - /// Only rows used for generation. - /// Dimensions: mTab by nTab. - double **contNonBasicTab; - - /// Current tableau for integer non basic structural variables. - /// Only rows used for generation. - // Dimensions: mTab by card_intNonBasicVar. - double **intNonBasicTab; - - /// Right hand side of the tableau. - /// Only rows used for generation. - double *rhsTab ; - - /// Given optimal solution that should not be cut; only for debug. - const double *given_optsol; - - /// Number of entries in given_optsol. - int card_given_optsol; - - /// Characteristic vectors of structural integer variables or continuous - /// variables currently fixed to integer values. - int *is_integer; - - /// Characteristic vector of the structural variables whose lower bound - /// in absolute value is larger than LUB. - int *low_is_lub; - - /// Characteristic vector of the structural variables whose upper bound - /// in absolute value is larger than LUB. - int *up_is_lub; - - /// Pointer on solver. Reset by each call to generateCuts(). - OsiSolverInterface *solver; - - /// Pointer on point to separate. Reset by each call to generateCuts(). - const double *xlp; - - /// Pointer on row activity. Reset by each call to generateCuts(). - const double *rowActivity; - - /// Pointer on column type. Reset by each call to generateCuts(). - const char *colType; - - /// Pointer on matrix of coefficient ordered by rows. - /// Reset by each call to generateCuts(). - const CoinPackedMatrix *byRow; - - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CglRedSplit class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglRedSplitUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - - -#endif diff --git a/thirdparty/linux/include/coin1/CglRedSplit2.hpp b/thirdparty/linux/include/coin1/CglRedSplit2.hpp deleted file mode 100644 index c66e1cad..00000000 --- a/thirdparty/linux/include/coin1/CglRedSplit2.hpp +++ /dev/null @@ -1,494 +0,0 @@ -// Last edit: 04/03/10 -// -// Name: CglRedSplit2.hpp -// Author: Giacomo Nannicini -// Singapore University of Technology and Design -// Singapore -// email: nannicini@sutd.edu.sg -// based on CglRedSplit by Francois Margot -// Date: 03/09/09 -//----------------------------------------------------------------------------- -// Copyright (C) 2010, Giacomo Nannicini and others. All Rights Reserved. - -#ifndef CglRedSplit2_H -#define CglRedSplit2_H - -#include "CglCutGenerator.hpp" -#include "CglRedSplit2Param.hpp" -#include "CoinWarmStartBasis.hpp" -#include "CoinHelperFunctions.hpp" -#include "CoinTime.hpp" - -/** Reduce-and-Split Cut Generator Class; See method generateCuts(). - Based on the papers "Practical strategies for generating rank-1 - split cuts in mixed-integer linear programming" by G. Cornuejols - and G. Nannicini, published on Mathematical Programming - Computation, and "Combining Lift-and-Project and Reduce-and-Split" - by E. Balas, G. Cornuejols, T. Kis and G. Nannicini, published on - INFORMS Journal on Computing. Part of this code is based on - CglRedSplit by F. Margot. */ - -class CglRedSplit2 : public CglCutGenerator { - - friend void CglRedSplit2UnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); -public: - /**@name generateCuts */ - //@{ - /** Generate Reduce-and-Split Mixed Integer Gomory cuts - for the model of the solver interface si. - - Insert the generated cuts into OsiCuts cs. - - This generator currently works only with the Lp solvers Clp or - Cplex9.0 or higher. It requires access to the optimal tableau - and optimal basis inverse and makes assumptions on the way slack - variables are added by the solver. The Osi implementations for - Clp and Cplex verify these assumptions. - - When calling the generator, the solver interface si must contain - an optimized problem and information related to the optimal - basis must be available through the OsiSolverInterface methods - (si->optimalBasisIsAvailable() must return 'true'). It is also - essential that the integrality of structural variable i can be - obtained using si->isInteger(i). - - Reduce-and-Split cuts are a class of split cuts. We compute - linear combinations of the rows of the simplex tableau, trying - to reduce some of the coefficients on the nonbasic continuous - columns. We have a large number of heuristics to choose which - coefficients should be reduced, and by using which rows. The - paper explains everything in detail. - - Note that this generator can potentially generate a huge number - of cuts, depending on how it is parametered. Default parameters - should be good for most situations; if you want to go heavy on - split cuts, use more row selection strategies or a different - number of rows in the linear combinations. Again, look at the - paper for details. If you want to generate a small number of - cuts, default parameters are not the best choice. - - A combination of Reduce-and-Split with Lift & Project is - described in the paper "Combining Lift-and-Project and - Reduce-and-Split". The Reduce-and-Split code for the - implementation used in that paper is included here. - - This generator does not generate the same cuts as CglRedSplit, - therefore both generators can be used in conjunction. - - */ - - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - - /// Return true if needs optimal basis to do cuts (will return true) - virtual bool needsOptimalBasis() const; - - // Generate the row multipliers computed by Reduce-and-Split from the - // given OsiSolverInterface. The multipliers are written in lambda; - // lambda should be of size nrow*maxNumMultipliers. We generate at most - // maxNumMultipliers m-vectors of row multipliers, and return the number - // of m-vectors that were generated. - // If the caller wants to know which variables are basic in each row - // (same order as lambda), basicVariables should be non-NULL (size nrow). - // This method can also generate the cuts corresponding to the multipliers - // returned; it suffices to pass non-NULL OsiCuts. - // This method is not needed by the typical user; however, it is useful - // in the context of generating Lift & Project cuts. - int generateMultipliers(const OsiSolverInterface& si, int* lambda, - int maxNumMultipliers, int* basicVariables = NULL, - OsiCuts* cs = NULL); - - // Try to improve a Lift & Project cut, by employing the - // Reduce-and-Split procedure. We start from a row of a L&P tableau, - // and generate a cut trying to reduce the coefficients on the - // nonbasic variables. Note that this L&P tableau will in general - // have nonbasic variables which are nonzero in the point that we - // want to cut off, so we should be careful. Arguments: - // OsiSolverInterface which contains the simplex tableau, initial - // row from which the cut is derived, row rhs, row number of the - // source row (if it is in the simplex tableau; otherwise, a - // negative number; needed to avoid using duplicate rows), point - // that we want to cut off (note: this is NOT a basic solution for - // the OsiSolverInterace!), list of variables which are basic in - // xbar but are nonbasic in the OsiSolverInterface. The computed cut - // is written in OsiRowCut* cs. Finally, if a starting disjunction - // is provided in the vector lambda (of size ncols, i.e. a - // disjunction on the structural variables), the disjunction is - // modified according to the cut which is produced. - int tiltLandPcut(const OsiSolverInterface* si, double* row, - double rowRhs, int rownumber, const double* xbar, - const int* newnonbasics, OsiRowCut* cs, int* lambda = NULL); - - //@} - - - /**@name Public Methods */ - //@{ - - // Set the parameters to the values of the given CglRedSplit2Param object. - void setParam(const CglRedSplit2Param &source); - // Return the CglRedSplit2Param object of the generator. - inline CglRedSplit2Param& getParam() {return param;} - - /// Print some of the data members; used for debugging - void print() const; - - /// Print the current simplex tableau - void printOptTab(OsiSolverInterface *solver) const; - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglRedSplit2(); - - /// Constructor with specified parameters - CglRedSplit2(const CglRedSplit2Param &RS_param); - - /// Copy constructor - CglRedSplit2(const CglRedSplit2 &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglRedSplit2 & operator=(const CglRedSplit2& rhs); - - /// Destructor - virtual ~CglRedSplit2 (); - - //@} - -private: - - // Private member methods - -/**@name Private member methods */ - - //@{ - - // Method generating the cuts after all CglRedSplit2 members are - // properly set. This does the actual work. Returns the number of - // generated cuts (or multipliers). - // Will generate cuts if cs != NULL, and will generate multipliers - // if lambda != NULL. - int generateCuts(OsiCuts* cs, int maxNumCuts, int* lambda = NULL); - - /// Compute the fractional part of value, allowing for small error. - inline double rs_above_integer(const double value) const; - - /// Fill workNonBasicTab, depending on the column selection strategy. - /// Accepts a list of variables indices that should be ignored; by - /// default, this list is empty (it is only used by Lift & Project). - /// The list ignore_list contains -1 as the last element. - /// Note that the implementation of the ignore_list is not very efficient - /// if the list is long, so it should be used only if its short. - void fill_workNonBasicTab(CglRedSplit2Param::ColumnSelectionStrategy - strategy, const int* ignore_list = NULL); - - /// Fill workNonBasicTab, alternate version for Lift & Project: also - /// reduces columns which are now nonbasic but are basic in xbar. - /// This function should be called only when CglRedSplit2 is used in - /// conjunction with CglLandP to generate L&P+RS cuts. - void fill_workNonBasicTab(const int* newnonbasics, const double* xbar, - CglRedSplit2Param::ColumnScalingStrategy scaling); - - /// Reduce rows of workNonBasicTab, i.e. compute integral linear - /// combinations of the rows in order to reduce row coefficients on - /// workNonBasicTab - void reduce_workNonBasicTab(int numRows, - CglRedSplit2Param::RowSelectionStrategy - rowSelectionStrategy, - int maxIterations); - - /// Generate a linear combination of the rows of the current LP - /// tableau, using the row multipliers stored in the matrix pi_mat - /// on the row of index index_row - void generate_row(int index_row, double *row); - - /// Generate a mixed integer Gomory cut, when all non basic - /// variables are non negative and at their lower bound. - int generate_cgcut(double *row, double *rhs); - - /// Use multiples of the initial inequalities to cancel out the coefficients - /// of the slack variables. - void eliminate_slacks(double *row, - const double *elements, - const int *start, - const int *indices, - const int *rowLength, - const double *rhs, double *rowrhs); - - /// Change the sign of the coefficients of the continuous non basic - /// variables at their upper bound. - void flip(double *row); - - /// Change the sign of the coefficients of the continuous non basic - /// variables at their upper bound and do the translations restoring - /// the original bounds. Modify the right hand side - /// accordingly. - void unflip(double *row, double *rowrhs); - - /// Returns 1 if the row has acceptable max/min coeff ratio. - /// Compute max_coeff: maximum absolute value of the coefficients. - /// Compute min_coeff: minimum absolute value of the coefficients - /// larger than EPS_COEFF. - /// Return 0 if max_coeff/min_coeff > MAXDYN. - int check_dynamism(double *row); - - /// Generate the packed cut from the row representation. - int generate_packed_row(const double *xlp, double *row, - int *rowind, double *rowelem, - int *card_row, double & rhs); - - // Compute entries of is_integer. - void compute_is_integer(); - - // Check that two vectors are different. - bool rs_are_different_vectors(const int *vect1, - const int *vect2, - const int dim); - - // allocate matrix of integers - void rs_allocmatINT(int ***v, int m, int n); - // deallocate matrix of integers - void rs_deallocmatINT(int ***v, int m); - // allocate matrix of doubles - void rs_allocmatDBL(double ***v, int m, int n); - // deallocate matrix of doubles - void rs_deallocmatDBL(double ***v, int m); - // print a vector of integers - void rs_printvecINT(const char *vecstr, const int *x, int n) const; - // print a vector of doubles - void rs_printvecDBL(const char *vecstr, const double *x, int n) const; - // print a matrix of integers - void rs_printmatINT(const char *vecstr, const int * const *x, int m, int n) const; - // print a matrix of doubles - void rs_printmatDBL(const char *vecstr, const double * const *x, int m, int n) const; - // dot product - double rs_dotProd(const double *u, const double *v, int dim) const; - double rs_dotProd(const int *u, const double *v, int dim) const; - // From Numerical Recipes in C: LU decomposition - int ludcmp(double **a, int n, int *indx, double *d, double* vv) const; - // from Numerical Recipes in C: backward substitution - void lubksb(double **a, int n, int *indx, double *b) const; - - // Check if the linear combination given by listOfRows with given multipliers - // improves the norm of row #rowindex; note: multipliers are rounded! - // Returns the difference with respect to the old norm (if negative there is - // an improvement, if positive norm increases) - double compute_norm_change(double oldnorm, const int* listOfRows, - int numElemList, const double* multipliers) const; - - // Compute the list of rows that should be used to reduce row #rowIndex - int get_list_rows_reduction(int rowIndex, int numRowsReduction, - int* list, const double* norm, - CglRedSplit2Param::RowSelectionStrategy - rowSelectionStrategy) const; - - // Sorts the rows by increasing number of nonzeroes with respect to a given - // row (rowIndex), on the nonbasic variables (whichTab == 0 means only - // integer, whichTab == 1 means only workTab, whichTab == 2 means both). - // The array for sorting must be allocated (and deleted) by caller. - // Corresponds to BRS1 in the paper. - int sort_rows_by_nonzeroes(struct sortElement* array, int rowIndex, - int maxRows, int whichTab) const; - - // Greedy variant of the previous function; slower but typically - // more effective. Corresponds to BRS2 in the paper. - int sort_rows_by_nonzeroes_greedy(struct sortElement* array, int rowIndex, - int maxRows, int whichTab) const; - - // Sorts the rows by decreasing absolute value of the cosine of the - // angle with respect to a given row (rowIndex), on the nonbasic - // variables (whichTab == 0 means only integer, whichTab == 1 means - // only workTab, whichTab == 2 means both). The array for sorting - // must be allocated (and deleted) by caller. Very effective - // strategy in practice. Corresponds to BRS3 in the paper. - int sort_rows_by_cosine(struct sortElement* array, int rowIndex, - int maxRows, int whichTab) const; - - // Did we hit the time limit? - inline bool checkTime() const{ - if ((CoinCpuTime() - startTime) < param.getTimeLimit()){ - return true; - } - return false; - } - - //@} - - - // Private member data - - /**@name Private member data */ - - //@{ - - /// Object with CglRedSplit2Param members. - CglRedSplit2Param param; - - /// Number of rows ( = number of slack variables) in the current LP. - int nrow; - - /// Number of structural variables in the current LP. - int ncol; - - /// Number of rows which have been reduced - int numRedRows; - - /// Lower bounds for structural variables - const double *colLower; - - /// Upper bounds for structural variables - const double *colUpper; - - /// Lower bounds for constraints - const double *rowLower; - - /// Upper bounds for constraints - const double *rowUpper; - - /// Righ hand side for constraints (upper bound for ranged constraints). - const double *rowRhs; - - /// Reduced costs for columns - const double *reducedCost; - - /// Row price - const double *rowPrice; - - /// Objective coefficients - const double* objective; - - /// Number of integer basic structural variables - int card_intBasicVar; - - /// Number of integer basic structural variables that are fractional in the - /// current lp solution (at least param.away_ from being integer). - int card_intBasicVar_frac; - - /// Number of integer non basic structural variables in the - /// current lp solution. - int card_intNonBasicVar; - - /// Number of continuous non basic variables (structural or slack) in the - /// current lp solution. - int card_contNonBasicVar; - - /// Number of continuous non basic variables (structural or slack) in the - /// current working set for coefficient reduction - int card_workNonBasicVar; - - /// Number of non basic variables (structural or slack) at their - /// upper bound in the current lp solution. - int card_nonBasicAtUpper; - - /// Number of non basic variables (structural or slack) at their - /// lower bound in the current lp solution. - int card_nonBasicAtLower; - - /// Characteristic vector for integer basic structural variables - int *cv_intBasicVar; - - /// Characteristic vector for integer basic structural variables - /// with non integer value in the current lp solution. - int *cv_intBasicVar_frac; - - /// Characteristic vector for rows of the tableau selected for reduction - /// with non integer value in the current lp solution - int *cv_fracRowsTab; - - /// List of integer structural basic variables - /// (in order of pivot in selected rows for cut generation). - int *intBasicVar; - - /// List of integer structural basic variables with fractional value - /// (in order of pivot in selected rows for cut generation). - int *intBasicVar_frac; - - /// List of integer structural non basic variables. - int *intNonBasicVar; - - /// List of continuous non basic variables (structural or slack). - // slacks are considered continuous (no harm if this is not the case). - int *contNonBasicVar; - - /// List of non basic variables (structural or slack) at their - /// upper bound. - int *nonBasicAtUpper; - - /// List of non basic variables (structural or slack) at their lower - /// bound. - int *nonBasicAtLower; - - /// Number of rows in the reduced tableau (= card_intBasicVar). - int mTab; - - /// Number of columns in the reduced tableau (= card_contNonBasicVar) - int nTab; - - /// Tableau of multipliers used to alter the rows used in generation. - /// Dimensions: mTab by mTab. Initially, pi_mat is the identity matrix. - int **pi_mat; - - /// Simplex tableau for continuous non basic variables (structural or slack). - /// Only rows used for generation. - /// Dimensions: mTab by card_contNonBasicVar. - double **contNonBasicTab; - - /// Current tableau for continuous non basic variables (structural or slack). - /// Only columns used for coefficient reduction. - /// Dimensions: mTab by card_workNonBasicVar. - double **workNonBasicTab; - - /// Simplex tableau for integer non basic structural variables. - /// Only rows used for generation. - // Dimensions: mTab by card_intNonBasicVar. - double **intNonBasicTab; - - /// Right hand side of the tableau. - /// Only rows used for generation. - double *rhsTab; - - /// Norm of rows in workNonBasicTab; needed for faster computations - double *norm; - - /// Characteristic vectors of structural integer variables or continuous - /// variables currently fixed to integer values. - int *is_integer; - - /// Pointer on solver. Reset by each call to generateCuts(). - OsiSolverInterface *solver; - - /// Pointer on point to separate. Reset by each call to generateCuts(). - const double *xlp; - - /// Pointer on row activity. Reset by each call to generateCuts(). - const double *rowActivity; - - /// Pointer on matrix of coefficient ordered by rows. - /// Reset by each call to generateCuts(). - const CoinPackedMatrix *byRow; - - /// Time at which cut computations began. - /// Reset by each call to generateCuts(). - double startTime; - - //@} -}; - -//############################################################################# -/** A function that tests some of the methods in the CglRedSplit2 - class. The only reason for it not to be a member method is that - this way it doesn't have to be compiled into the library. And - that's a gain, because the library should be compiled with - optimization on, but this method should be compiled with - debugging. */ -void CglRedSplit2UnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - - -#endif diff --git a/thirdparty/linux/include/coin1/CglRedSplit2Param.hpp b/thirdparty/linux/include/coin1/CglRedSplit2Param.hpp deleted file mode 100644 index 369c6763..00000000 --- a/thirdparty/linux/include/coin1/CglRedSplit2Param.hpp +++ /dev/null @@ -1,495 +0,0 @@ -// Name: CglRedSplit2Param.hpp -// Author: Giacomo Nannicini -// Singapore University of Technology and Design -// Singapore -// email: nannicini@sutd.edu.sg -// Date: 03/09/09 -//----------------------------------------------------------------------------- -// Copyright (C) 2010, Giacomo Nannicini and others. All Rights Reserved. - -#ifndef CglRedSplit2Param_H -#define CglRedSplit2Param_H - -#include "CglParam.hpp" -#include - - /**@name CglRedSplit2 Parameters */ - //@{ - - /** Class collecting parameters the Reduced-and-split cut generator. - - An important thing to note is that the cut generator allows for - the selection of a number of strategies that can be combined - together. By default, a selection that typically yields a good - compromise between speed and cut strenght is made. The selection - can be changed by resetting the default choices (see the - functions whose name starts with "reset") or by setting the - parameter use_default_strategies to false in the - constructors. After this, the chosen strategies can be added to - the list by using the functions whose name starts with - "add". All strategies will be combined together: if we choose 3 - row selection strategies, 2 column selection strategies, and 2 - possible numbers of rows, we end up with a total of 3*2*2 - combinations. - - For a detailed explanation of the parameters and their meaning, - see the paper by Cornuejols and Nannicini: "Practical strategies - for generating rank-1 split cuts in mixed-integer linear - programming", on Mathematical Programming Computation. - - Parameters of the generator are listed below. - - - MAXDYN: Maximum ratio between largest and smallest non zero - coefficients in a cut. See method setMAXDYN(). - - EPS_ELIM: Precision for deciding if a coefficient is zero when - eliminating slack variables. See method setEPS_ELIM(). - - MINVIOL: Minimum violation for the current basic solution in - a generated cut. See method setMINVIOL(). - - EPS_RELAX_ABS: Absolute relaxation of cut rhs. - - EPS_RELAX_REL: Relative relaxation of cut rhs. - - MAX_SUPP_ABS: Maximum cut support (absolute). - - MAX_SUPP_REL: Maximum cut support (relative): the formula to - compute maximum cut support is - MAX_SUPP_ABS + ncol*MAX_SUPP_REL. - - USE_INTSLACKS: Use integer slacks to generate cuts. (not implemented). - See method setUSE_INTSLACKS(). - - normIsZero: Norm of a vector is considered zero if smaller than - this value. See method setNormIsZero(). - - minNormReduction: a cut is generated if the new norm of the row on the - continuous nonbasics is reduced by at least - this factor (relative reduction). - - away: Look only at basic integer variables whose current value - is at least this value from being integer. See method setAway(). - - maxSumMultipliers: maximum sum (in absolute value) of row multipliers - - normalization: normalization factor for the norm of lambda in the - coefficient reduction algorithm (convex min problem) - - numRowsReduction: Maximum number of rows in the linear system for - norm reduction. - - columnSelectionStrategy: parameter to select which columns should be - used for coefficient reduction. - - rowSelectionStrategy: parameter to select which rows should be - used for coefficient reduction. - - timeLimit: Time limit (in seconds) for cut generation. - - maxNumCuts: Maximum number of cuts that can be returned at each pass; - we could generate more cuts than this number (see below) - - maxNumComputedCuts: Maximum number of cuts that can be computed - by the generator at each pass - - maxNonzeroesTab : Rows of the simplex tableau with more than - this number of nonzeroes will not be - considered for reduction. Only works if - RS_FAST_* are defined in CglRedSplit2. - - skipGomory: Skip traditional Gomory cuts, i.e. GMI cuts arising from - a single row of the tableau (instead of a combination). - Default is 1 (true), because we assume that they are - generated by a traditional Gomory generator anyway. - */ - //@} - -class CglRedSplit2Param : public CglParam { - -public: - /** Enumerations for parameters */ - - /** Row selection strategies; same names as in the paper */ - enum RowSelectionStrategy{ - /* Pick rows that introduce the fewest nonzeroes on integer nonbasics */ - RS1, - /* Pick rows that introduce the fewest nonzeroes on the set of working - continuous nonbasics */ - RS2, - /* Pick rows that introduce the fewest nonzeroes on both integer and - working continuous nonbasics */ - RS3, - /* Same as RS0 but with greedy algorithm */ - RS4, - /* Same as RS1 but with greedy algorithm */ - RS5, - /* Same as RS2 but with greedy algorithm */ - RS6, - /* Pick rows with smallest angle in the space of integer and working - continuous nonbasics */ - RS7, - /* Pick rows with smallest angle in the space of working - continuous nonbasics */ - RS8, - /* Use all strategies */ - RS_ALL, - /* Use best ones - that is, RS8 and RS7 */ - RS_BEST - }; - - /** Column selection strategies; again, look them up in the paper. */ - enum ColumnSelectionStrategy{ - /* C-3P */ - CS1, CS2, CS3, - /* C-5P */ - CS4, CS5, CS6, CS7, CS8, - /* I-2P-2/3 */ - CS9, CS10, - /* I-2P-4/5 */ - CS11, CS12, - /* I-2P-1/2 */ - CS13, CS14, - /* I-3P */ - CS15, CS16, CS17, - /* I-4P */ - CS18, CS19, CS20, CS21, - /* Use all strategies up to this point */ - CS_ALL, - /* Use best strategies (same effect as CS_ALL, because it turns out that - using all strategies is the best thing to do) */ - CS_BEST, - /* Optimize over all continuous nonbasic columns; this does not give - good results, but we use it for testing Lift & Project + RedSplit */ - CS_ALLCONT, - /* Lift & Project specific strategy: only select variables which - are nonbasic in the tableau but are basic in the point to cut - off. This strategy cannot be used outside L&P. It is not very - effective even with L&P, but is left here for testing.*/ - CS_LAP_NONBASICS - }; - - /** Scaling strategies for new nonbasic columns for Lift & Project; - * "factor" is the value of columnScalingBoundLAP_ */ - enum ColumnScalingStrategy{ - /* No scaling */ - SC_NONE, - /* Multiply by |xbar[i]| where xbar[i] is the value of the - corresponding component of the point that we want to cut off */ - SC_LINEAR, - /* Multiply by min(factor,|xbar[i]|) */ - SC_LINEAR_BOUNDED, - /* Multiply by min(factor,log(|xbar[i]|)) */ - SC_LOG_BOUNDED, - /* Multiply all new nonbasics by factor */ - SC_UNIFORM, - /* Multiply only nonzero coefficients by factor */ - SC_UNIFORM_NZ - }; - - /**@name Set/get methods */ - //@{ - /** Set away, the minimum distance from being integer used for selecting - rows for cut generation; all rows whose pivot variable should be - integer but is more than away from integrality will be selected; - Default: 0.005 */ - virtual void setAway(double value); - /// Get value of away - inline double getAway() const {return away_;} - - /** Set the value of EPS_ELIM, epsilon for values of coefficients when - eliminating slack variables; - Default: 0.0 */ - void setEPS_ELIM(double value); - /** Get the value of EPS_ELIM */ - double getEPS_ELIM() const {return EPS_ELIM;} - - /** Set EPS_RELAX_ABS */ - virtual void setEPS_RELAX_ABS(double eps_ra); - /** Get value of EPS_RELAX_ABS */ - inline double getEPS_RELAX_ABS() const {return EPS_RELAX_ABS;} - - /** Set EPS_RELAX_REL */ - virtual void setEPS_RELAX_REL(double eps_rr); - /** Get value of EPS_RELAX_REL */ - inline double getEPS_RELAX_REL() const {return EPS_RELAX_REL;} - - // Set the maximum ratio between largest and smallest non zero - // coefficients in a cut. Default: 1e6. - virtual void setMAXDYN(double value); - /** Get the value of MAXDYN */ - inline double getMAXDYN() const {return MAXDYN;} - - /** Set the value of MINVIOL, the minimum violation for the current - basic solution in a generated cut. Default: 1e-3 */ - virtual void setMINVIOL(double value); - /** Get the value of MINVIOL */ - inline double getMINVIOL() const {return MINVIOL;} - - /** Maximum absolute support of the cutting planes. Default: INT_MAX. - Aliases for consistency with our naming scheme. */ - inline void setMAX_SUPP_ABS(int value) {setMAX_SUPPORT(value);} - inline int getMAX_SUPP_ABS() const {return MAX_SUPPORT;} - - /** Maximum relative support of the cutting planes. Default: 0.0. - The maximum support is MAX_SUPP_ABS + MAX_SUPPREL*ncols. */ - inline void setMAX_SUPP_REL(double value); - inline double getMAX_SUPP_REL() const {return MAX_SUPP_REL;} - - /** Set the value of USE_INTSLACKS. Default: 0 */ - virtual void setUSE_INTSLACKS(int value); - /** Get the value of USE_INTSLACKS */ - inline int getUSE_INTSLACKS() const {return USE_INTSLACKS;} - - /** Set the value of normIsZero, the threshold for considering a norm to be - 0; Default: 1e-5 */ - virtual void setNormIsZero(double value); - /** Get the value of normIsZero */ - inline double getNormIsZero() const {return normIsZero_;} - - /** Set the value of minNormReduction; Default: 0.1 */ - virtual void setMinNormReduction(double value); - /** Get the value of normIsZero */ - inline double getMinNormReduction() const {return minNormReduction_;} - - /** Set the value of maxSumMultipliers; Default: 10 */ - virtual void setMaxSumMultipliers(int value); - /** Get the value of maxSumMultipliers */ - inline int getMaxSumMultipliers() const {return maxSumMultipliers_;} - - /** Set the value of normalization; Default: 0.0001 */ - virtual void setNormalization(double value); - /** Get the value of normalization */ - inline double getNormalization() const {return normalization_;} - - /** Set the value of numRowsReduction, max number of rows that are used - * for each row reduction step. In particular, the linear system will - * involve a numRowsReduction*numRowsReduction matrix */ - virtual void addNumRowsReduction(int value); - /// get the value - inline std::vector getNumRowsReduction() const {return numRowsReduction_;} - /// reset - inline void resetNumRowsReduction() {numRowsReduction_.clear();} - - /** Add the value of columnSelectionStrategy */ - virtual void addColumnSelectionStrategy(ColumnSelectionStrategy value); - /// get the value - inline std::vector getColumnSelectionStrategy() const {return columnSelectionStrategy_;} - /// reset - inline void resetColumnSelectionStrategy(){columnSelectionStrategy_.clear();} - - /** Set the value for rowSelectionStrategy, which changes the way we choose - * the rows for the reduction step */ - virtual void addRowSelectionStrategy(RowSelectionStrategy value); - /// get the value - inline std::vector getRowSelectionStrategy() const {return rowSelectionStrategy_;}; - /// reset - inline void resetRowSelectionStrategy() {rowSelectionStrategy_.clear();} - - /** Set the value of numRowsReductionLAP, max number of rows that are used - * for each row reduction step during Lift & Project. - * In particular, the linear system will involve a - * numRowsReduction*numRowsReduction matrix */ - virtual void addNumRowsReductionLAP(int value); - /// get the value - inline std::vector getNumRowsReductionLAP() const {return numRowsReductionLAP_;} - /// reset - inline void resetNumRowsReductionLAP() {numRowsReductionLAP_.clear();} - - /** Add the value of columnSelectionStrategyLAP */ - virtual void addColumnSelectionStrategyLAP(ColumnSelectionStrategy value); - /// get the value - inline std::vector getColumnSelectionStrategyLAP() const {return columnSelectionStrategyLAP_;} - /// reset - inline void resetColumnSelectionStrategyLAP(){columnSelectionStrategyLAP_.clear();} - - /** Set the value for rowSelectionStrategyLAP, which changes the way we - * choose the rows for the reduction step */ - virtual void addRowSelectionStrategyLAP(RowSelectionStrategy value); - /// get the value - inline std::vector getRowSelectionStrategyLAP() const {return rowSelectionStrategyLAP_;}; - /// reset - inline void resetRowSelectionStrategyLAP() {rowSelectionStrategyLAP_.clear();} - - /** Set the value for columnScalingStrategyLAP, which sets the way nonbasic - * columns that are basic in the fractional point to cut off are scaled */ - virtual void setColumnScalingStrategyLAP(ColumnScalingStrategy value); - /// get the value - inline ColumnScalingStrategy getColumnScalingStrategyLAP() const {return columnScalingStrategyLAP_; }; - - /** Set the value for the bound in the column scaling factor */ - virtual void setColumnScalingBoundLAP(double value); - /// get the value - inline double getColumnScalingBoundLAP() const {return columnScalingBoundLAP_;}; - - /** Set the value of the time limit for cut generation (in seconds) */ - virtual void setTimeLimit(double value); - /// get the value - inline double getTimeLimit() const {return timeLimit_;} - - /** Set the value for the maximum number of cuts that can be returned */ - virtual void setMaxNumCuts(int value); - /// get the value - inline int getMaxNumCuts() const {return maxNumCuts_;} - - /** Set the value for the maximum number of cuts that can be computed */ - virtual void setMaxNumComputedCuts(int value); - /// get the value - inline int getMaxNumComputedCuts() const {return maxNumComputedCuts_;} - - /** Set the value for the maximum number of nonzeroes in a row of - * the simplex tableau for the row to be considered */ - virtual void setMaxNonzeroesTab(int value); - /// get the value - inline int getMaxNonzeroesTab() const {return maxNonzeroesTab_;} - - /** Set the value of skipGomory: should we skip simple Gomory cuts, - * i.e. GMI cuts derived from a single row of the simple tableau? - * This is 1 (true) by default: we only generate cuts from linear - * combinations of at least two rows. */ - virtual void setSkipGomory(int value); - /// get the value - inline int getSkipGomory() const {return skipGomory_;} - - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor. If use_default_strategies is true, we add - /// to the list of strategies the default ones. If is false, the - /// list of strategies is left empty (must be populated before usage!). - CglRedSplit2Param(bool use_default_strategies = true, - double eps = 1e-12, - double eps_coeff = 1e-11, - double eps_elim = 0.0, - double eps_relax_abs = 1e-11, - double eps_relax_rel = 1e-13, - double max_dyn = 1e6, - double min_viol = 1e-3, - int max_supp_abs = 1000, - double max_supp_rel = 0.1, - int use_int_slacks = 0, - double norm_zero = 1e-5, - double minNormReduction = 0.1, - int maxSumMultipliers = 10, - double normalization = 0.0001, - double away = 0.005, - double timeLimit = 60, - int maxNumCuts = 10000, - int maxNumComputedCuts = 10000, - int maxNonzeroesTab = 1000, - double columnScalingBoundLAP = 5.0, - int skipGomory = 1); - - /// Constructor from CglParam. If use_default_strategies is true, we - /// add to the list of strategies the default ones. If is false, the - /// list of strategies is left empty (must be populated before - /// usage!). - CglRedSplit2Param(const CglParam &source, - bool use_default_strategies = true, - double eps_elim = 0.0, - double eps_relax_abs = 1e-11, - double eps_relax_rel = 1e-13, - double max_dyn = 1e6, - double min_viol = 1e-3, - double max_supp_rel = 0.1, - int use_int_slacks = 0, - double norm_zero = 1e-5, - double minNormReduction = 0.1, - int maxSumMultipliers = 10, - double normalization = 0.0001, - double away = 0.005, - double timeLimit = 60, - int maxNumCuts = 10000, - int maxNumComputedCuts = 10000, - int maxNonzeroesTab = 1000, - double columnScalingBoundLAP = 5.0, - int skipGomory = 1); - - /// Copy constructor - CglRedSplit2Param(const CglRedSplit2Param &source); - - /// Clone - virtual CglRedSplit2Param* clone() const; - - /// Assignment operator - virtual CglRedSplit2Param& operator=(const CglRedSplit2Param &rhs); - - /// Destructor - virtual ~CglRedSplit2Param(); - //@} - -protected: - - /**@name Parameters */ - //@{ - - /** Epsilon for value of coefficients when eliminating slack variables. - Default: 0.0. */ - double EPS_ELIM; - - /** Value added to the right hand side of each generated cut to relax it. - Default: 1e-11 */ - double EPS_RELAX_ABS; - - /** For a generated cut with right hand side rhs_val, - EPS_RELAX_EPS * fabs(rhs_val) is used to relax the constraint. - Default: 1e-13 */ - double EPS_RELAX_REL; - - // Maximum ratio between largest and smallest non zero - // coefficients in a cut. Default: 1e6. - double MAXDYN; - - /// Minimum violation for the current basic solution in a generated cut. - /// Default: 1e-3. - double MINVIOL; - - /// Maximum support - relative part of the formula - double MAX_SUPP_REL; - - /// Use integer slacks to generate cuts if USE_INTSLACKS = 1. Default: 0. - int USE_INTSLACKS; - - /// Norm of a vector is considered zero if smaller than normIsZero; - /// Default: 1e-5. - double normIsZero_; - - /// Minimum reduction to accept a new row. - double minNormReduction_; - - /// Maximum sum of the vector of row multipliers to generate a cut - int maxSumMultipliers_; - - /// Normalization factor for the norm of lambda in the quadratic - /// minimization problem that is solved during the coefficient reduction step - double normalization_; - - /// Use row only if pivot variable should be integer but is more - /// than away_ from being integer. Default: 0.005 - double away_; - - /// Maximum number of rows to use for the reduction of a given row. - std::vector numRowsReduction_; - - /// Column selection method - std::vector columnSelectionStrategy_; - - /// Row selection method - std::vector rowSelectionStrategy_; - - /// Maximum number of rows to use for the reduction during Lift & Project - std::vector numRowsReductionLAP_; - - /// Column selection method for Lift & Project - std::vector columnSelectionStrategyLAP_; - - /// Row selection method for Lift & Project - std::vector rowSelectionStrategyLAP_; - - /// Column scaling strategy for the nonbasics columns that were basic in - /// the point that we want to cut off (Lift & Project only) - ColumnScalingStrategy columnScalingStrategyLAP_; - - /// Minimum value for column scaling (Lift & Project only) - double columnScalingBoundLAP_; - - /// Time limit - double timeLimit_; - - /// Maximum number of returned cuts - int maxNumCuts_; - - /// Maximum number of computed cuts - int maxNumComputedCuts_; - - /// Maximum number of nonzeroes in tableau row for reduction - int maxNonzeroesTab_; - - /// Skip simple Gomory cuts - int skipGomory_; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglRedSplitParam.hpp b/thirdparty/linux/include/coin1/CglRedSplitParam.hpp deleted file mode 100644 index 2601fb2e..00000000 --- a/thirdparty/linux/include/coin1/CglRedSplitParam.hpp +++ /dev/null @@ -1,272 +0,0 @@ -// Name: CglRedSplitParam.hpp -// Author: Francois Margot -// Tepper School of Business -// Carnegie Mellon University, Pittsburgh, PA 15213 -// email: fmargot@andrew.cmu.edu -// Date: 11/24/06 -// -// $Id: CglRedSplitParam.hpp 1122 2013-04-06 20:39:53Z stefan $ -//----------------------------------------------------------------------------- -// Copyright (C) 2006, Francois Margot and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglRedSplitParam_H -#define CglRedSplitParam_H - -#include "CglParam.hpp" - - - /**@name CglRedSplit Parameters */ - //@{ - - /** Class collecting parameters the Reduced-and-split cut generator. - - Parameters of the generator are listed below. Modifying the default - values for parameters other than the last four might result in - invalid cuts. - - - LUB: Value considered large for the absolute value of a lower or upper - bound on a variable. See method setLUB(). - - MAXDYN: Maximum ratio between largest and smallest non zero - coefficients in a cut. See method setMAXDYN(). - - MAXDYN_LUB: Maximum ratio between largest and smallest non zero - coefficients in a cut involving structural variables with - lower or upper bound in absolute value larger than LUB. - Should logically be larger or equal to MAXDYN. - See method setMAXDYN_LUB(). - - EPS_ELIM: Precision for deciding if a coefficient is zero when - eliminating slack variables. See method setEPS_ELIM(). - - EPS_COEFF_LUB: Precision for deciding if a coefficient of a - generated cut is zero when the corresponding - variable has a lower or upper bound larger than - LUB in absolute value. See method setEPS_COEFF_LUB(). - - MINVIOL: Minimum violation for the current basic solution in - a generated cut. See method setMINVIOL(). - - USE_INTSLACKS: Use integer slacks to generate cuts. (not implemented). - See method setUSE_INTSLACKS(). - - USE_CG2: Use alternative formula to generate a mixed integer Gomory - cut (see methods CglRedSPlit::generate_cgcut() - and CglRedSPlit::generate_cgcut_2()). See method setUSE_CG2(). - - normIsZero: Norm of a vector is considered zero if smaller than - this value. See method setNormIsZero(). - - minReduc: Reduction is performed only if the norm of the vector is - reduced by this fraction. See method setMinReduc(). - - away: Look only at basic integer variables whose current value - is at least this value from being integer. See method setAway(). - - maxTab: Controls the number of rows selected for the generation. See - method setMaxTab(). - */ - //@} - -class CglRedSplitParam : public CglParam { - -public: - - /**@name Set/get methods */ - //@{ - /** Set away, the minimum distance from being integer used for selecting - rows for cut generation; all rows whose pivot variable should be - integer but is more than away from integrality will be selected; - Default: 0.05 */ - virtual void setAway(const double value); - /// Get value of away - inline double getAway() const {return away_;} - - /** Set the value of LUB, value considered large for the absolute value of - a lower or upper bound on a variable; - Default: 1000 */ - virtual void setLUB(const double value); - /** Get the value of LUB */ - inline double getLUB() const {return LUB;} - - /** Set the value of EPS_ELIM, epsilon for values of coefficients when - eliminating slack variables; - Default: 1e-12 */ - void setEPS_ELIM(const double value); - /** Get the value of EPS_ELIM */ - double getEPS_ELIM() const {return EPS_ELIM;} - - /** Set EPS_RELAX_ABS */ - virtual void setEPS_RELAX_ABS(const double eps_ra); - /** Get value of EPS_RELAX_ABS */ - inline double getEPS_RELAX_ABS() const {return EPS_RELAX_ABS;} - - /** Set EPS_RELAX_REL */ - virtual void setEPS_RELAX_REL(const double eps_rr); - /** Get value of EPS_RELAX_REL */ - inline double getEPS_RELAX_REL() const {return EPS_RELAX_REL;} - - // Set the maximum ratio between largest and smallest non zero - // coefficients in a cut. Default: 1e8. - virtual void setMAXDYN(double value); - /** Get the value of MAXDYN */ - inline double getMAXDYN() const {return MAXDYN_LUB;} - - // Set the maximum ratio between largest and smallest non zero - // coefficient in a cut involving structural variables with - // lower or upper bound in absolute value larger than LUB. - // Should logically be larger or equal to MAXDYN. Default: 1e13. - virtual void setMAXDYN_LUB(double value); - /** Get the value of MAXDYN_LUB */ - inline double getMAXDYN_LUB() const {return MAXDYN_LUB;} - - /** Set the value of EPS_COEFF_LUB, epsilon for values of coefficients for - variables with absolute value of lower or upper bound larger than LUB; - Default: 1e-13 */ - virtual void setEPS_COEFF_LUB(const double value); - /** Get the value of EPS_COEFF_LUB */ - inline double getEPS_COEFF_LUB() const {return EPS_COEFF_LUB;} - - /** Set the value of MINVIOL, the minimum violation for the current - basic solution in a generated cut. Default: 1e-7 */ - virtual void setMINVIOL(double value); - /** Get the value of MINVIOL */ - inline double getMINVIOL() const {return MINVIOL;} - - /** Set the value of USE_INTSLACKS. Default: 0 */ - virtual void setUSE_INTSLACKS(int value); - /** Get the value of USE_INTSLACKS */ - inline int getUSE_INTSLACKS() const {return USE_INTSLACKS;} - - /** Set the value of USE_CG2. Default: 0 */ - virtual void setUSE_CG2(int value); - /** Get the value of USE_CG2 */ - inline int getUSE_CG2() const {return USE_CG2;} - - /** Set the value of normIsZero, the threshold for considering a norm to be - 0; Default: 1e-5 */ - virtual void setNormIsZero(const double value); - /** Get the value of normIsZero */ - inline double getNormIsZero() const {return normIsZero;} - - /** Set the value of minReduc, threshold for relative norm improvement for - performing a reduction; Default: 0.05 */ - virtual void setMinReduc(const double value); - /// Get the value of minReduc - inline double getMinReduc() const {return minReduc;} - - /** Set the maximum allowed value for (mTab * mTab * CoinMax(mTab, nTab)) where - mTab is the number of rows used in the combinations and nTab is the - number of continuous non basic variables. The work of the generator is - proportional to (mTab * mTab * CoinMax(mTab, nTab)). Reducing the value of - maxTab makes the generator faster, but weaker. Default: 1e7. */ - virtual void setMaxTab(const double value); - /// Get the value of maxTab - inline double getMaxTab() const {return maxTab_;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglRedSplitParam(const double lub = 1000.0, - const double eps_elim = 1e-12, - const double eps_relax_abs = 1e-8, - const double eps_relax_rel = 0.0, - const double max_dyn = 1e8, - const double max_dyn_lub = 1e13, - const double eps_coeff_lub = 1e-13, - const double min_viol = 1e-7, - const int use_int_slacks = 0, - const int use_cg2 = 0, - const double norm_zero = 1e-5, - const double min_reduc = 0.05, - const double away = 0.05, - const double max_tab = 1e7); - - /// Constructor from CglParam - CglRedSplitParam(const CglParam &source, - const double lub = 1000.0, - const double eps_elim = 1e-12, - const double eps_relax_abs = 1e-8, - const double eps_relax_rel = 0.0, - const double max_dyn = 1e8, - const double max_dyn_lub = 1e13, - const double eps_coeff_lub = 1e-13, - const double min_viol = 1e-7, - const int use_int_slacks = 0, - const int use_cg2 = 0, - const double norm_zero = 1e-5, - const double min_reduc = 0.05, - const double away = 0.05, - const double max_tab = 1e7); - - /// Copy constructor - CglRedSplitParam(const CglRedSplitParam &source); - - /// Clone - virtual CglRedSplitParam* clone() const; - - /// Assignment operator - virtual CglRedSplitParam& operator=(const CglRedSplitParam &rhs); - - /// Destructor - virtual ~CglRedSplitParam(); - //@} - -protected: - - /**@name Parameters */ - //@{ - - /** Value considered large for the absolute value of lower or upper - bound on a variable. Default: 1000. */ - double LUB; - - /** Epsilon for value of coefficients when eliminating slack variables. - Default: 1e-12. */ - double EPS_ELIM; - - /** Value added to the right hand side of each generated cut to relax it. - Default: 1e-8 */ - double EPS_RELAX_ABS; - - /** For a generated cut with right hand side rhs_val, - EPS_RELAX_EPS * fabs(rhs_val) is used to relax the constraint. - Default: 0 */ - double EPS_RELAX_REL; - - // Maximum ratio between largest and smallest non zero - // coefficients in a cut. Default: 1e8. - double MAXDYN; - - // Maximum ratio between largest and smallest non zero - // coefficients in a cut involving structural variables with - // lower or upper bound in absolute value larger than LUB. - // Should logically be larger or equal to MAXDYN. Default: 1e13. - double MAXDYN_LUB; - - /// Epsilon for value of coefficients for variables with absolute value of - /// lower or upper bound larger than LUB. Default: 1e-13. - double EPS_COEFF_LUB; - - /// Minimum violation for the current basic solution in a generated cut. - /// Default: 1e-7. - double MINVIOL; - - /// Use integer slacks to generate cuts if USE_INTSLACKS = 1. Default: 0. - int USE_INTSLACKS; - - /// Use second way to generate a mixed integer Gomory cut - /// (see methods generate_cgcut()) and generate_cgcut_2()). Default: 0. - int USE_CG2; - - /// Norm of a vector is considered zero if smaller than normIsZero; - /// Default: 1e-5. - double normIsZero; - - /// Minimum reduction in percent that must be achieved by a potential - /// reduction step in order to be performed; Between 0 and 1, default: 0.05. - double minReduc; - - /// Use row only if pivot variable should be integer but is more - /// than away_ from being integer. - double away_; - - /// Maximum value for (mTab * mTab * CoinMax(mTab, nTab)). See method - /// setMaxTab(). - double maxTab_; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CglResidualCapacity.hpp b/thirdparty/linux/include/coin1/CglResidualCapacity.hpp deleted file mode 100644 index 1e26e46a..00000000 --- a/thirdparty/linux/include/coin1/CglResidualCapacity.hpp +++ /dev/null @@ -1,240 +0,0 @@ -// LAST EDIT: -//----------------------------------------------------------------------------- -// Implementation of Residual Capacity Inequalities -// Francisco Barahona (barahon@us.ibm.com) -// -// date: May 18, 2006 -//----------------------------------------------------------------------------- -// Copyright (C) 2004, International Business Machines Corporation and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. - -#ifndef CglResidualCapacity_H -#define CglResidualCapacity_H - -#include -#include -//#include - -#include "CoinError.hpp" - -#include "CglCutGenerator.hpp" - -//============================================================================= - -#ifndef CGL_DEBUG -#define CGL_DEBUG 0 -#endif - -//============================================================================= - - - - -//============================================================================= - -/** Residual Capacity Inequalities Cut Generator Class - - References: - T Magnanti, P Mirchandani, R Vachani, - "The convex hull of two core capacitated network design problems," - Math Programming 60 (1993), 233-250. - - A Atamturk, D Rajan, - "On splittable and unsplittable flow capacitated network design - arc-set polyhedra," Math Programming 92 (2002), 315-333. **/ - -class CglResidualCapacity : public CglCutGenerator { - - friend void CglResidualCapacityUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - - -private: - //--------------------------------------------------------------------------- - // Enumeration constants that describe the various types of rows - enum RowType { - /** row of the type a_1 c_1 + + a_k c_k - d z_1 - - d z_p <= b, - where c_i are continuous variables and z_j are integer variables - */ - ROW_L, - /** row of the type -a_1 c_1 - - a_k c_k + d z_1 + + d z_p >= b, - where c_i are continuous variables and z_j are integer variables - */ - ROW_G, - /** equation that can be treated as ROW_L and ROW_G - */ - ROW_BOTH, - /** Other types of rows - */ - ROW_OTHER - }; - - -public: - /**@name Get and Set Parameters */ - //@{ - /// Set Epsilon - void setEpsilon(double value); - /// Get Epsilon - double getEpsilon() const; - /// Set Tolerance - void setTolerance(double value); - /// Get Tolerance - double getTolerance() const; - /// Set doPreproc - void setDoPreproc(int value); - /// Get doPreproc - bool getDoPreproc() const; - //@} - - /**@name Generate Cuts */ - //@{ - /** Generate Residual Capacity cuts for the model data - contained in si. The generated cuts are inserted - in the collection of cuts cs. - */ - virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - //--------------------------------------------------------------------------- - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglResidualCapacity (); - - /// Alternate Constructor - CglResidualCapacity ( const double tolerance ); - - /// Copy constructor - CglResidualCapacity ( - const CglResidualCapacity &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglResidualCapacity & - operator=( - const CglResidualCapacity& rhs); - - /// Destructor - virtual - ~CglResidualCapacity (); - /// This is to refresh preprocessing - virtual void refreshPrep(); - //@} - - - -private: - //-------------------------------------------------------------------------- - // Private member methods - - // Construct - void gutsOfConstruct ( const double tolerance); - - // Delete - void gutsOfDelete(); - - // Copy - void gutsOfCopy (const CglResidualCapacity& rhs); - - // Do preprocessing. - // It determines the type of each row. - // It may change sense and RHS for ranged rows - void resCapPreprocess(const OsiSolverInterface& si); - - // Determine the type of a given row. - RowType determineRowType(const OsiSolverInterface& si, - const int rowLen, const int* ind, - const double* coef, const char sense, - const double rhs, - const double* colLowerBound, - const double* colUpperBound) const; - // helps the function above - bool treatAsLessThan(const OsiSolverInterface& si, - const int rowLen, const int* ind, - const double* coef, - const double rhs, - const double* colLowerBound, - const double* colUpperBound) const; - - // Generate Residual Capacity cuts - void generateResCapCuts( const OsiSolverInterface& si, - const double* xlp, - const double* colUpperBound, - const double* colLowerBound, - const CoinPackedMatrix& matrixByRow, - const double* LHS, - const double* coefByRow, - const int* colInds, - const int* rowStarts, - const int* rowLengths, - OsiCuts& cs ) const; - - - // Residual Capacity separation - bool resCapSeparation(const OsiSolverInterface& si, - const int rowLen, const int* ind, - const double* coef, - const double rhs, - const double *xlp, - const double* colUpperBound, - const double* colLowerBound, - OsiRowCut& resCapCut) const; - - - -private: - //--------------------------------------------------------------------------- - // Private member data - /** Tolerance used for numerical purposes, default value: 1.e-6 **/ - double EPSILON_; - /** If violation of a cut is greater that this number, - the cut is accepted, default value: 1.e-4 **/ - double TOLERANCE_; - /** Controls the preprocessing of the matrix to identify rows suitable for - cut generation.
        -
      • -1: preprocess according to solver settings; -
      • 0: Do preprocessing only if it has not yet been done; -
      • 1: Do preprocessing. -
      - Default value: -1 **/ - int doPreproc_; - // The number of rows of the problem. - int numRows_; - // The number columns of the problem. - int numCols_; - // Indicates whether preprocessing has been done. - bool doneInitPre_; - // Array with the row types of the rows in the model. - RowType* rowTypes_; - // The indices of the rows of the initial matrix - int* indRows_; - // Sense of rows (modified if ranges) - char * sense_; - // RHS of rows (modified if ranges) - double * RHS_; - // The number of rows of type ROW_L - int numRowL_; - // The indices of the rows of type ROW_L - int* indRowL_; - // The number of rows of type ROW_G - int numRowG_; - // The indices of the rows of type ROW_G - int* indRowG_; -}; - -//############################################################################# -/** A function that tests the methods in the CglResidualCapacity class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglResidualCapacityUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - - -#endif diff --git a/thirdparty/linux/include/coin1/CglSimpleRounding.hpp b/thirdparty/linux/include/coin1/CglSimpleRounding.hpp deleted file mode 100644 index b93c8bf6..00000000 --- a/thirdparty/linux/include/coin1/CglSimpleRounding.hpp +++ /dev/null @@ -1,174 +0,0 @@ -// $Id: CglSimpleRounding.hpp 1149 2013-10-21 18:23:53Z tkr $ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglSimpleRounding_H -#define CglSimpleRounding_H - -#include - -#include "CglCutGenerator.hpp" -#include "CoinPackedMatrix.hpp" - -/** Simple Rounding Cut Generator Class - - This class generates simple rounding cuts via the following method: - For each contraint, - attempt to derive a <= inequality in all integer variables - by netting out any continuous variables. - Divide the resulting integer inequality through by - the greatest common denomimator (gcd) of the lhs coefficients. - Round down the rhs. - - Warning: Use with careful attention to data precision. - - (Reference: Nemhauser and Wolsey, Integer and Combinatorial Optimization, 1988, pg 211.) -*/ - -class CglSimpleRounding : public CglCutGenerator { - friend void CglSimpleRoundingUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate simple rounding cuts for the model accessed through the solver interface. - Insert generated cuts into the cut set cs. - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglSimpleRounding (); - - /// Copy constructor - CglSimpleRounding ( - const CglSimpleRounding &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglSimpleRounding & - operator=( - const CglSimpleRounding& rhs); - - /// Destructor - virtual - ~CglSimpleRounding (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - //@} - -private: - - // Private member methods - - /**@name Private methods */ - //@{ - - /// Derive a <= inequality in integer variables from the rowIndex-th constraint - bool deriveAnIntegerRow( - const OsiSolverInterface & si, - int rowIndex, - const CoinShallowPackedVector & matrixRow, - CoinPackedVector & irow, - double & b, - bool * negative) const; - - - /** Given a vector of doubles, x, with size elements and a positive tolerance, - dataTol, this method returns the smallest power of 10 needed so that - x[i]*10**power "is integer" for all i=0,...,size-1. - - ** change of definition of dataTol so that it refers to original - data, not to scaled data as that seems to lead to problems. - - So if xScaled is x[i]*10**power and xInt is rounded(xScaled) - then fabs(xScaled-xInt) <= dataTol*10**power. This means that - dataTol should be smaller - say 1.0e-12 rather tahn 1.0e-8 - - Returns -number of times overflowed if the power is so big that it will - cause overflow (i.e. integer stored will be bigger than 2**31). - Test in cut generator. - */ - int power10ToMakeDoubleAnInt( - int size, // the length of the vector x - const double * x, - double dataTol ) const; // the precision of the data, i.e. the positive - // epsilon, which is equivalent to zero - - /**@name Greatest common denominators methods */ - //@{ - /// Returns the greatest common denominator of two positive integers, a and b. - inline int gcd(int a, int b) const; - - /** Returns the greatest common denominator of a vector of - positive integers, vi, of length n. - */ - inline int gcdv(int n, const int * const vi) const; - //@} - - //@} - - /**@name Private member data */ - //@{ - /// A value within an epsilon_ neighborhood of 0 is considered to be 0. - double epsilon_; - //@} -}; - - -//------------------------------------------------------------------- -// Returns the greatest common denominator of two -// positive integers, a and b, found using Euclid's algorithm -//------------------------------------------------------------------- -int -CglSimpleRounding::gcd(int a, int b) const -{ - if(a > b) { - // Swap a and b - int temp = a; - a = b; - b = temp; - } - int remainder = b % a; - if (remainder == 0) return a; - else return gcd(remainder,a); -} - -//------------------------------------------------------------------- -// Returns the greatest common denominator of a vector of -// positive integers, vi, of length n. -//------------------------------------------------------------------- -int -CglSimpleRounding::gcdv(int n, const int* const vi) const -{ - if (n==0) - abort(); - - if (n==1) - return vi[0]; - - int retval=gcd(vi[0], vi[1]); - for (int i=2; i - -#include "CglCutGenerator.hpp" - -class CoinWarmStartBasis; -class CglTreeProbingInfo; -/** Stored Cut Generator Class */ -class CglStored : public CglCutGenerator { - -public: - - - /**@name Generate Cuts */ - //@{ - /** Generate Mixed Integer Stored cuts for the model of the - solver interface, si. - - Insert the generated cuts into OsiCut, cs. - - This generator just looks at previously stored cuts - and inserts any that are violated by enough - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Change criterion on whether to include cut. - Violations of more than this will be added to current cut list - (default 1.0e-5) */ - //@{ - /// Set - inline void setRequiredViolation(double value) - { requiredViolation_=value;} - /// Get - inline double getRequiredViolation() const - { return requiredViolation_;} - /// Takes over ownership of probing info - inline void setProbingInfo(CglTreeProbingInfo * info) - { probingInfo_ = info;} - //@} - - /**@name Cut stuff */ - //@{ - /// Add cuts - void addCut(const OsiCuts & cs); - /// Add a row cut - void addCut(const OsiRowCut & cut); - /// Add a row cut from a packed vector - void addCut(double lb, double ub, const CoinPackedVector & vector); - /// Add a row cut from elements - void addCut(double lb, double ub, int size, const int * colIndices, const double * elements); - inline int sizeRowCuts() const - { return cuts_.sizeRowCuts();} - const OsiRowCut * rowCutPointer(int index) const - { return cuts_.rowCutPtr(index);} - /// Save stuff - void saveStuff(double bestObjective, const double * bestSolution, - const double * lower, const double * upper); - /// Best solution (or NULL) - inline const double * bestSolution() const - { return bestSolution_;} - /// Best objective - double bestObjective() const; - /// Tight lower bounds - const double * tightLower() const - { return bounds_;} - /// Tight upper bounds - const double * tightUpper() const - { return bounds_+numberColumns_;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglStored (int numberColumns=0); - - /// Copy constructor - CglStored (const CglStored & rhs); - - /// Constructor from file - CglStored (const char * fileName); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglStored & - operator=(const CglStored& rhs); - - /// Destructor - virtual - ~CglStored (); - //@} - -protected: - - // Protected member methods - - // Protected member data - - /**@name Protected member data */ - //@{ - /// Only add if more than this requiredViolation - double requiredViolation_; - /// Pointer to probing information - CglTreeProbingInfo * probingInfo_; - /// Cuts - OsiCuts cuts_; - /// Number of columns in model - int numberColumns_; - /// Best solution (objective at end) - double * bestSolution_; - /// Tight bounds - double * bounds_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CglTreeInfo.hpp b/thirdparty/linux/include/coin1/CglTreeInfo.hpp deleted file mode 100644 index 4f85aca1..00000000 --- a/thirdparty/linux/include/coin1/CglTreeInfo.hpp +++ /dev/null @@ -1,180 +0,0 @@ -// $Id: CglTreeInfo.hpp 1201 2014-03-07 17:24:04Z forrest $ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglTreeInfo_H -#define CglTreeInfo_H - -#include "OsiCuts.hpp" -#include "OsiSolverInterface.hpp" -#include "CoinHelperFunctions.hpp" -class CglStored; -/** Information about where the cut generator is invoked from. */ - -class CglTreeInfo { -public: - /// The level of the search tree node - int level; - /** How many times the cut generator was already invoked in this search tree - node */ - int pass; - /** The number of rows in the original formulation. Some generators may not - want to consider already generated rows when generating new ones. */ - int formulation_rows; - /** Options - 1 - treat costed integers as important - 2 - switch off some stuff as variables semi-integer - 4 - set global cut flag if at root node - 8 - set global cut flag if at root node and first pass - 16 - set global cut flag and make cuts globally valid - 32 - last round of cuts did nothing - maybe be more aggressive - 64 - in preprocessing stage - 128 - looks like solution - 256 - want alternate cuts - 512 - in sub tree (i.e. parent model) - 1024 - in must call again mode or after everything mode - */ - int options; - /// Set true if in tree (to avoid ambiguity at first branch) - bool inTree; - /** Replacement array. Before Branch and Cut it may be beneficial to strengthen rows - rather than adding cuts. If this array is not NULL then the cut generator can - place a pointer to the stronger cut in this array which is number of rows in size. - - A null (i.e. zero elements and free rhs) cut indicates that the row is useless - and can be removed. - - The calling function can then replace those rows. - */ - OsiRowCut ** strengthenRow; - /// Optional pointer to thread specific random number generator - CoinThreadRandom * randomNumberGenerator; - /// Default constructor - CglTreeInfo (); - - /// Copy constructor - CglTreeInfo ( - const CglTreeInfo &); - /// Clone - virtual CglTreeInfo * clone() const; - - /// Assignment operator - CglTreeInfo & - operator=( - const CglTreeInfo& rhs); - - /// Destructor - virtual - ~CglTreeInfo (); - /// Take action if cut generator can fix a variable (toValue -1 for down, +1 for up) - virtual bool fixes(int , int , int ,bool) {return false;} - /** Initalizes fixing arrays etc - returns >0 if we want to save info - 0 if we don't and -1 if is to be used */ - virtual int initializeFixing(const OsiSolverInterface * ) {return 0;} - -}; - -/** Derived class to pick up probing info. */ -typedef struct { - //unsigned int oneFixed:1; // nonzero if variable to 1 fixes all - //unsigned int sequence:31; // variable (in matrix) (but also see cliqueRow_) - unsigned int fixes; -} CliqueEntry; - -class CglTreeProbingInfo : public CglTreeInfo { -public: - /// Default constructor - CglTreeProbingInfo (); - /// Constructor from model - CglTreeProbingInfo (const OsiSolverInterface * model); - - /// Copy constructor - CglTreeProbingInfo ( - const CglTreeProbingInfo &); - /// Clone - virtual CglTreeInfo * clone() const; - - /// Assignment operator - CglTreeProbingInfo & - operator=( - const CglTreeProbingInfo& rhs); - - /// Destructor - virtual - ~CglTreeProbingInfo (); - OsiSolverInterface * analyze(const OsiSolverInterface & si, int createSolver=0, - int numberExtraCliques=0,const int * starts=NULL, - const CliqueEntry * entries=NULL,const char * type=NULL); - /** Take action if cut generator can fix a variable - (toValue -1 for down, +1 for up) - Returns true if still room, false if not */ - virtual bool fixes(int variable, int toValue, int fixedVariable,bool fixedToLower); - /** Initalizes fixing arrays etc - returns >0 if we want to save info - 0 if we don't and -1 if is to be used */ - virtual int initializeFixing(const OsiSolverInterface * model) ; - /// Fix entries in a solver using implications - int fixColumns(OsiSolverInterface & si) const; - /// Fix entries in a solver using implications for one variable - int fixColumns(int iColumn, int value, OsiSolverInterface & si) const; - /// Packs down entries - int packDown(); - /// Generate cuts from implications - void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info) const; - /// Entries for fixing variables - inline CliqueEntry * fixEntries() - { convert(); return fixEntry_;} - /// Starts of integer variable going to zero - inline int * toZero() - { convert(); return toZero_;} - /// Starts of integer variable going to one - inline int * toOne() - { convert(); return toOne_;} - /// List of 0-1 integer variables - inline int * integerVariable() const - { return integerVariable_;} - /// Backward look up - inline int * backward() const - { return backward_;} - /// Number of variables - inline int numberVariables() const - { return numberVariables_;} - /// Number of 0-1 variables - inline int numberIntegers() const - { return numberIntegers_;} -private: - /// Converts to ordered - void convert(); -protected: - /// Entries for fixing variables - CliqueEntry * fixEntry_; - /// Starts of integer variable going to zero - int * toZero_; - /// Starts of integer variable going to one - int * toOne_; - /// List of 0-1 integer variables - int * integerVariable_; - /// Backward look up - int * backward_; - /// Entries for fixing variable when collecting - int * fixingEntry_; - /// Number of variables - int numberVariables_; - /// Number of 0-1 variables - int numberIntegers_; - /// Maximum number in fixEntry_ - int maximumEntries_; - /// Number entries in fixingEntry_ (and fixEntry_) or -2 if correct style - int numberEntries_; -}; -inline int sequenceInCliqueEntry(const CliqueEntry & cEntry) -{ return cEntry.fixes&0x7fffffff;} -inline void setSequenceInCliqueEntry(CliqueEntry & cEntry,int sequence) -{ cEntry.fixes = sequence|(cEntry.fixes&0x80000000);} -inline bool oneFixesInCliqueEntry(const CliqueEntry & cEntry) -{ return (cEntry.fixes&0x80000000)!=0;} -inline void setOneFixesInCliqueEntry(CliqueEntry & cEntry,bool oneFixes) -{ cEntry.fixes = (oneFixes ? 0x80000000 : 0)|(cEntry.fixes&0x7fffffff);} - -#endif diff --git a/thirdparty/linux/include/coin1/CglTwomir.hpp b/thirdparty/linux/include/coin1/CglTwomir.hpp deleted file mode 100644 index ba00380a..00000000 --- a/thirdparty/linux/include/coin1/CglTwomir.hpp +++ /dev/null @@ -1,565 +0,0 @@ -// $Id: CglTwomir.hpp 1119 2013-04-06 20:24:18Z stefan $ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CglTwomir_H -#define CglTwomir_H -#include - -#include "CglCutGenerator.hpp" -#include "CoinFactorization.hpp" - -typedef struct -{ - - int nz; /* current length of arrays index[] and coeff[] */ - int max_nz; /* max length of arrays index[] and coeff[] */ - double *coeff; /* coefficient of each variable in the constraint */ - int *index; /* index of the variable (value in 0 ... nrow+ncol) */ - double rhs; /* rhs of the constraint */ - char sense; /* ?? is it necessary */ - -} DGG_constraint_t; - -typedef struct{ - int n; - DGG_constraint_t **c; - int *ctype; - double *alpha; -} DGG_list_t; - -/******************** BASIS INFORMATION ADTs **********************************/ -typedef struct{ - int q_min; - int q_max; - int t_min; - int t_max; - int a_max; - int max_elements; -} cutParams; - -typedef struct -{ - double gomory_threshold; /* factional variable must be this away from int */ - int ncol, /* number of columns in LP */ - nrow, /* number of constaints in LP */ - ninteger; /* number of integer variables in LP */ - - int nbasic_col, /* number of basic columns in the LP */ - nbasic_row; /* number of basic rows in the LP */ - - /* the following arrays are all of size (ncol+nrow) */ - int *info; /* description of each variable (see below) */ - double *lb; /* specifies the lower bound (if any) of each variable */ - double *ub; /* specifies the upper bound (if any) of each variable */ - double *x; /* current solution */ - double *rc; /* current reduced cost */ - double *opt_x; - - cutParams cparams; -} DGG_data_t; - -/* the following macros allow us to decode the info of the DGG_data - type. The encoding is as follows, - bit 1 : if the variable is basic or not (non-basic). - bit 2 : if the variable is integer or or not (rational). - bit 3 : if the variable is structural or not (artifical). - bit 4 : if the variable is non-basic and at its upper bound - (else if non-basic at lower bound). */ - -#define DGG_isBasic(data,idx) ((data->info[idx])&1) -#define DGG_isInteger(data,idx) ((data->info[idx] >> 1)&1) -#define DGG_isStructural(data,idx) ((data->info[idx] >> 2)&1) -#define DGG_isEqualityConstraint(data,idx) ((data->info[idx] >> 3)&1) -#define DGG_isNonBasicAtUB(data,idx) ((data->info[idx] >> 4)&1) -#define DGG_isNonBasicAtLB(data,idx) ((data->info[idx] >> 5)&1) -#define DGG_isConstraintBoundedAbove(data,idx) ((data->info[idx] >> 6)&1) -#define DGG_isConstraintBoundedBelow(data,idx) ((data->info[idx] >> 7)&1) - -#define DGG_setIsBasic(data,idx) ((data->info[idx]) |= 1) -#define DGG_setIsInteger(data,idx) ((data->info[idx]) |= (1<<1)) -#define DGG_setIsStructural(data,idx) ((data->info[idx]) |= (1<<2)) -#define DGG_setEqualityConstraint(data,idx) ((data->info[idx]) |= (1<<3)) -#define DGG_setIsNonBasicAtUB(data,idx) ((data->info[idx]) |= (1<<4)) -#define DGG_setIsNonBasicAtLB(data,idx) ((data->info[idx]) |= (1<<5)) -#define DGG_setIsConstraintBoundedAbove(data,idx) ((data->info[idx]) |= (1<<6)) -#define DGG_setIsConstraintBoundedBelow(data,idx) ((data->info[idx]) |= (1<<7)) - -class CoinWarmStartBasis; -/** Twostep MIR Cut Generator Class */ -class CglTwomir : public CglCutGenerator { - - friend void CglTwomirUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - - -public: - - /// Problem name - std::string probname_; - - /**@name Generate Cuts */ - //@{ - /** Generate Two step MIR cuts either from the tableau rows or from the - formulation rows - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - /// Return true if needs optimal basis to do cuts (will return true) - virtual bool needsOptimalBasis() const; - - /**@name Change criterion on which scalings to use (default = 1,1,1,1) */ - //@{ - /// Set - void setMirScale (int tmin, int tmax) {t_min_ = tmin; t_max_ = tmax;} - void setTwomirScale (int qmin, int qmax) {q_min_ = qmin; q_max_ = qmax;} - void setAMax (int a) {a_max_ = a;} - void setMaxElements (int n) {max_elements_ = n;} - void setMaxElementsRoot (int n) {max_elements_root_ = n;} - void setCutTypes (bool mir, bool twomir, bool tab, bool form) - { do_mir_ = mir; do_2mir_ = twomir; do_tab_ = tab; do_form_ = form;} - void setFormulationRows (int n) {form_nrows_ = n;} - - /// Get - int getTmin() const {return t_min_;} - int getTmax() const {return t_max_;} - int getQmin() const {return q_min_;} - int getQmax() const {return q_max_;} - int getAmax() const {return a_max_;} - int getMaxElements() const {return max_elements_;} - int getMaxElementsRoot() const {return max_elements_root_;} - int getIfMir() const { return do_mir_;} - int getIfTwomir() const { return do_2mir_;} - int getIfTableau() const { return do_tab_;} - int getIfFormulation() const { return do_form_;} - //@} - - /**@name Change criterion on which variables to look at. All ones - more than "away" away from integrality will be investigated - (default 0.05) */ - //@{ - /// Set away - void setAway(double value); - /// Get away - double getAway() const; - /// Set away at root - void setAwayAtRoot(double value); - /// Get away at root - double getAwayAtRoot() const; - /// Return maximum length of cut in tree - virtual int maximumLengthOfCutInTree() const - { return max_elements_;} - //@} - - /**@name Change way TwoMir works */ - //@{ - /// Pass in a copy of original solver (clone it) - void passInOriginalSolver(OsiSolverInterface * solver); - /// Returns original solver - inline OsiSolverInterface * originalSolver() const - { return originalSolver_;} - /// Set type - 0 normal, 1 add original matrix one, 2 replace - inline void setTwomirType(int type) - { twomirType_=type;} - /// Return type - inline int twomirType() const - { return twomirType_;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglTwomir (); - - /// Copy constructor - CglTwomir (const CglTwomir &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglTwomir & operator=(const CglTwomir& rhs); - - /// Destructor - virtual ~CglTwomir (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - /// This can be used to refresh any inforamtion - virtual void refreshSolver(OsiSolverInterface * solver); - //@} - -private: - // Private member data - /**@name Private member data */ - //@{ - /// Threadsafe random number generator - CoinThreadRandom randomNumberGenerator_; - /// Original solver - OsiSolverInterface * originalSolver_; - /// Only investigate if more than this away from integrality - double away_; - /// Only investigate if more than this away from integrality (at root) - double awayAtRoot_; - /// Type - 0 normal, 1 add original matrix one, 2 replace - int twomirType_; - bool do_mir_; - bool do_2mir_; - bool do_tab_; - bool do_form_; - - int t_min_; /// t_min - first value of t to use for tMIR inequalities - int t_max_; /// t_max - last value of t to use for tMIR inequalities - int q_min_; /// q_min - first value of t to use for 2-Step tMIR inequalities - int q_max_; /// q_max - last value of t to use for 2-Step tMIR inequalities - int a_max_; /// a_max - maximum value of bhat/alpha - int max_elements_; /// Maximum number of elements in cut - int max_elements_root_; /// Maximum number of elements in cut at root - int form_nrows_; //number of rows on which formulation cuts will be generated - //@} -}; - -//############################################################################# - -/* -#include -#include -#include -#include -#include -#include -#include -*/ - -/******************** DEBUG DEFINITIONS ***************************************/ - -#define DGG_DEBUG_DGG 1 -#define DGG_TRACE_ERRORS 0 -#define DGG_DISPLAY 0 -#define DGG_AUTO_CHECK_CUT_OFF_OPTIMAL 1 - -/******************** CONFIGURATION DEFAULTS **********************************/ - -#define DGG_DEFAULT_METHOD 2 -#define DGG_DEFAULT_TMIN 1 -#define DGG_DEFAULT_TMAX 1 -#define DGG_DEFAULT_TAUMIN 2 -#define DGG_DEFAULT_TAUMAX 6 -#define DGG_DEFAULT_MAX_CUTS 500 -#define DGG_DEFAULT_IMPROVEMENT_THRESH 0.001 -#define DGG_DEFAULT_NBELOW_THRESH INT_MAX -#define DGG_DEFAULT_NROOT_ROUNDS 2 -#define DGG_DEFAULT_NEGATIVE_SCALED_TWOSTEPS 0 -#define DGG_DEFAULT_ALPHA_RULE 0 -#define DGG_DEFAULT_CUT_INC 250 -#define DGG_DEFAULT_CUT_FORM 0 -#define DGG_DEFAULT_NICEFY 0 -#define DGG_DEFAULT_ONLY_DELAYED 0 -#define DGG_DEFAULT_DELAYED_FREQ 9999999 -#define DGG_DEFAULT_LPROWS_FREQ 9999999 -#define DGG_DEFAULT_WHICH_FORMULATION_CUTS 2 - -/******************** SOLVER CONFIGURATION DEFINITIONS ************************/ - -#define DGG_OSI 0 -#define DGG_CPX 1 -#define DGG_QSO 2 - -/* determines the solver to be used */ -#define DGG_SOLVER DGG_OSI - -/* adds checking routines to make sure solver works as expected */ -#define DGG_DEBUG_SOLVER 0 - -/* turn off screen output from solver */ -#define DGG_SOLVER_SCREEN_FLAG 0 - -/******************** CUT DEFINITIONS *****************************************/ - -/* internal names for cut types */ -#define DGG_TMIR_CUT 1 -#define DGG_2STEP_CUT 2 - -/* internal names for alpha-selection rules */ -#define DGG_ALPHA_MIN_SUM 0 -#define DGG_ALPHA_RANDOM_01 1 -#define DGG_ALPHA_RANDOM_COEFF 2 -#define DGG_ALPHA_ALL 3 -#define DGG_ALPHA_MAX_STEEP 5 - -/******************** PRECISION & NUMERICAL ISSUES DEFINITIONS ****************/ - -/* how steep a cut must be before adding it to the lp */ -#define DGG_MIN_STEEPNESS 1.0e-4 -#define DGG_MAX_L2NORM 1.0e7 - -/* 0 = min steepness, 1 = max norm */ -#define DGG_NORM_CRITERIA 1 - -/* internal representation of +infinity */ -#define UB_MAX DBL_MAX - -/* used to define how fractional a basic-integer variable must be - before choosing to use it to generate a TMIR cut on. - OSI's default is 1.0e-7 */ -#define DGG_GOMORY_THRESH 0.005 - -#define DGG_RHS_THRESH 0.005 - -/* used for comparing variables to their upper bounds. - OSI's default is 1.0e-7. - We set it to 1.0e6 because e-7 seems too sensitive. - In fact, with e-7 the problem dsbmip.mps complains. */ -#define DGG_BOUND_THRESH 1.0e-6 - -/* used for comparing the lhs (activity) value of a tableau row - with the rhs. This is only used for debugging purposes. */ -#define DGG_EQUALITY_THRESH 1.0e-5 - -/* used for comparing a variable's lower bound to 0.0 - and determining if we need to shift the variable */ -#define DGG_SHIFT_THRESH 1.0e-6 - -/* used for determing how far from an integer is still an integer. - This value is used for comparing coefficients to integers. - OSI's default is 1.0e-10. */ -#define DGG_INTEGRALITY_THRESH 1.0e-10 - -/* the min value that a coeff can have in the tableau row - before being set to zero. */ -#define CBC_CHECK_CUT -#ifndef CBC_CHECK_CUT -#define DGG_MIN_TABLEAU_COEFFICIENT 1.0e-8 -#else -#define DGG_MIN_TABLEAU_COEFFICIENT 1.0e-12 -#endif - -/* smallest value rho is allowed to have for a simple 2-step MIR - (ie: not an extended two-step MIR) */ -#define DGG_MIN_RHO 1.0e-7 -#define DGG_MIN_ALPHA 1.0e-7 - -/* when a slack is null: used to check if a cut is satisfied or not. */ -#define DGG_NULL_SLACK 1.0e-5 - -/* nicefy constants */ -#define DGG_NICEFY_MIN_ABSVALUE 1.0e-13 -#define DGG_NICEFY_MIN_FIX 1.0e-7 -#define DGG_NICEFY_MAX_PADDING 1.0e-6 -#define DGG_NICEFY_MAX_RATIO 1.0e9 - - -/******************** ERROR-CATCHING MACROS ***********************************/ -#if DGG_TRACE_ERRORS > 0 - -#define __DGG_PRINT_LOC__(F) fprintf(((F==0)?stdout:F), " in %s (%s:%d)\n", __func__, __FILE__, __LINE__) - -#define DGG_THROW(A,REST...) {\ - fprintf(stdout, ##REST); \ - __DGG_PRINT_LOC__(stdout); \ - return (A);} - -#define DGG_IF_EXIT(A,B,REST...) {\ - if(A) {\ - fprintf(stdout, ##REST); \ - __DGG_PRINT_LOC__(stdout); \ - exit(B);}} - -#define DGG_CHECKRVAL(A,B) {\ - if(A) {\ - __DGG_PRINT_LOC__(stdout); \ - return B; } } - -#define DGG_CHECKRVAL1(A,B) {\ - if(A) {\ - __DGG_PRINT_LOC__(stdout); \ - rval = B; goto CLEANUP; } } - -#define DGG_WARNING(A, REST...) {\ - if(A) {\ - fprintf(stdout, ##REST); \ - __DGG_PRINT_LOC__(stdout); \ - }} - -#define DGG_TEST(A,B,REST...) {\ - if(A) DGG_THROW(B,##REST) } - -#define DGG_TEST2(A,B,C,REST) {DGG_TEST(A,B,C,REST) } -#define DGG_TEST3(A,B,C,D,REST) {DGG_TEST(A,B,C,D,REST) } - -#else - -#define DGG_IF_EXIT(A,B,REST) {if(A) {fprintf(stdout, REST);exit(B);}} - -#define DGG_THROW(A,B) return(A) - -#define DGG_CHECKRVAL(A,B) { if(A) return(B); } -#define DGG_CHECKRVAL1(A,B){ if(A) { rval = B; goto CLEANUP; } } - -#define DGG_TEST(A,B,REST) { if(A) return(B);} -#define DGG_TEST2(A,B,REST,C) { DGG_TEST(A,B,REST) } -#define DGG_TEST3(A,B,REST,C,D) { DGG_TEST(A,B,REST) } - -#endif - -/******************** SIMPLE MACROS AND FUNCTIONS *****************************/ - -#define DGG_MIN(a,b) ( (ab)?a:b ) -#define KREM(vht,alpha,tau) (DGG_MIN( ceil(vht / alpha), tau ) - 1) -#define LMIN(vht, d, bht) (DGG_MIN( floor(d*bht/bht), d)) -#define ABOV(v) (v - floor(v)) -#define QINT(vht,bht,tau) ( (int)floor( (vht*(tau-1))/bht ) ) -#define V2I(bht,tau,i) ( ((i+1)*bht / tau) ) - -int DGG_is_even(double vht, double bht, int tau, int q); -double frac_part(double value); -int DGG_is_a_multiple_of_b(double a, double b); - - -/* free function for DGG_data_t. Frees internal arrays and data structure */ -int DGG_freeData( DGG_data_t *data ); - -/******************** CONSTRAINT ADTs *****************************************/ -DGG_constraint_t* DGG_newConstraint(int max_arrays); -void DGG_freeConstraint(DGG_constraint_t *c); -DGG_constraint_t *DGG_copyConstraint(DGG_constraint_t *c); -void DGG_scaleConstraint(DGG_constraint_t *c, int t); - -/******************** CONFIGURATION *******************************************/ -void DGG_list_init (DGG_list_t *l); -int DGG_list_addcut (DGG_list_t *l, DGG_constraint_t *cut, int ctype, double alpha); -void DGG_list_delcut (DGG_list_t *l, int i); -void DGG_list_free(DGG_list_t *l); - -/******************* SOLVER SPECIFIC METHODS **********************************/ -DGG_data_t *DGG_getData(const void *solver_ptr); - -/******************* CONSTRAINT MANIPULATION **********************************/ - -/* DGG_transformConstraint: manipulates a constraint in the following way: - -packs everything in output - -1 - variables at their upper bounds are substituted for their -complements. This is done by adjusting the coefficients and -the right hand side (simple substitution). - -2 - variables with non-zero lower bounds are shifted. */ - -int DGG_transformConstraint( DGG_data_t *data, - double **x_out, - double **rc_out, - char **isint_out, - DGG_constraint_t *constraint ); - -/* DGG_unTransformConstraint : - -1 - Undoes step (1) of DGG_transformConstraint -2 - Undoes step (2) of DGG_transformConstraint */ - -int DGG_unTransformConstraint( DGG_data_t *data, - DGG_constraint_t *constraint ); - -/* substitutes each slack variable by the structural variables which - define it. This function, hence, changes the constraint 'cut'. */ - -int DGG_substituteSlacks( const void *solver_ptr, - DGG_data_t *data, - DGG_constraint_t *cut ); - -int DGG_nicefyConstraint( const void *solver_ptr, - DGG_data_t *data, - DGG_constraint_t *cut); - -/******************* CUT GENERATION *******************************************/ -int DGG_getFormulaConstraint( int row_idx, - const void *solver_ptr, - DGG_data_t *data, - DGG_constraint_t* row ); - -int DGG_getTableauConstraint( int index, - const void *solver_ptr, - DGG_data_t *data, - DGG_constraint_t* tabrow, - const int * colIsBasic, - const int * rowIsBasic, - CoinFactorization & factorization, - int mode ); - -DGG_constraint_t* DGG_getSlackExpression(const void *solver_ptr, DGG_data_t* data, int row_index); - - int DGG_generateTabRowCuts( DGG_list_t *list, - DGG_data_t *data, - const void *solver_ptr ); - - int DGG_generateFormulationCuts( DGG_list_t *list, - DGG_data_t *data, - const void *solver_ptr, - int nrows, - CoinThreadRandom & generator); - - - int DGG_generateFormulationCutsFromBase( DGG_constraint_t *base, - double slack, - DGG_list_t *list, - DGG_data_t *data, - const void *solver_ptr, - CoinThreadRandom & generator); - - int DGG_generateCutsFromBase( DGG_constraint_t *base, - DGG_list_t *list, - DGG_data_t *data, - const void *solver_ptr ); - -int DGG_buildMir( char *isint, - DGG_constraint_t *base, - DGG_constraint_t **cut_out ); - -int DGG_build2step( double alpha, - char *isint, - DGG_constraint_t *base, - DGG_constraint_t **cut_out ); - - int DGG_addMirToList ( DGG_constraint_t *base, - char *isint, - double *x, - DGG_list_t *list, - DGG_data_t *data, - DGG_constraint_t *orig_base ); - - int DGG_add2stepToList ( DGG_constraint_t *base, - char *isint, - double *x, - double *rc, - DGG_list_t *list, - DGG_data_t *data, - DGG_constraint_t *orig_base ); - -/******************* CUT INFORMATION ******************************************/ - -double DGG_cutLHS(DGG_constraint_t *c, double *x); -int DGG_isCutDesirable(DGG_constraint_t *c, DGG_data_t *d); - -/******************* TEST / DEBUGGING ROUTINES ********************************/ - -int DGG_isConstraintViolated(DGG_data_t *d, DGG_constraint_t *c); - -int DGG_isBaseTrivial(DGG_data_t *d, DGG_constraint_t* c); -int DGG_is2stepValid(double alpha, double bht); - -int DGG_cutsOffPoint(double *x, DGG_constraint_t *cut); - -//############################################################################# -/** A function that tests the methods in the CglTwomir class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglTwomirUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir); - - -#endif - - diff --git a/thirdparty/linux/include/coin1/CglZeroHalf.hpp b/thirdparty/linux/include/coin1/CglZeroHalf.hpp deleted file mode 100644 index 929269a4..00000000 --- a/thirdparty/linux/include/coin1/CglZeroHalf.hpp +++ /dev/null @@ -1,133 +0,0 @@ -// $Id: CglZeroHalf.hpp 1122 2013-04-06 20:39:53Z stefan $ -// Copyright (C) 2010, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -#ifndef CglZeroHalf_H -#define CglZeroHalf_H - -#include - -#include "CglCutGenerator.hpp" -#include "CoinPackedMatrix.hpp" -#include "Cgl012cut.hpp" - -/** Zero Half Cut Generator Class - - This class generates zero half cuts via the following method: - - See - - -G. Andreello, A. Caprara, M. Fischetti, - “Embedding Cuts in a Branch and Cut Framework: a Computational Study - with {0,1/2}-Cuts”, INFORMS Journal on Computing 19(2), 229-238, 2007. - -*/ - -class CglZeroHalf : public CglCutGenerator { - friend void CglZeroHalfUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -public: - - /**@name Generate Cuts */ - //@{ - /** Generate zero half cuts for the model accessed through the solver interface. - Insert generated cuts into the cut set cs. - */ - virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs, - const CglTreeInfo info = CglTreeInfo()); - //@} - - /**@name Sets and Gets */ - //@{ - /// Get flags - inline int getFlags() const - { return flags_;} - /// Set flags - inline void setFlags(int value) - { flags_ = value;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - CglZeroHalf (); - - /// Copy constructor - CglZeroHalf ( - const CglZeroHalf &); - - /// Clone - virtual CglCutGenerator * clone() const; - - /// Assignment operator - CglZeroHalf & - operator=( - const CglZeroHalf& rhs); - - /// Destructor - virtual - ~CglZeroHalf (); - /// Create C++ lines to get to current state - virtual std::string generateCpp( FILE * fp); - /// This can be used to refresh any information - virtual void refreshSolver(OsiSolverInterface * solver); - //@} - -private: - - // Private member methods - - /**@name Private methods */ - //@{ - //@} - - - /**@name Private member data */ - //@{ - /// number of rows in the ILP matrix - int mr_; - /// number of columns in the ILP matrix - int mc_; - /// number of nonzero's in the ILP matrix - int mnz_; - /// starting position of each row in arrays mtind and mtval - int *mtbeg_; - /// number of entries of each row in arrays mtind and mtval - int *mtcnt_; - /// column indices of the nonzero entries of the ILP matrix - int *mtind_; - /// values of the nonzero entries of the ILP matrix - int *mtval_; - /// lower bounds on the variables - int *vlb_; - /// upper bounds on the variables - int *vub_; - /// right hand sides of the constraints - int *mrhs_; - /// senses of the constraints: 'L', 'G' or 'E' - char *msense_; - /// Cgl012Cut object to make thread safe - Cgl012Cut cutInfo_; - /** Flags - 1 bit - global cuts - */ - int flags_; - //@} -}; -/// A simple Dijkstra shortest path - make better later -#ifndef CGL_NEW_SHORT -void cglShortestPath(cgl_graph * graph, int source, int maximumLength); -#else -void cglShortestPath(auxiliary_graph * graph, int source, int maximumLength); -#endif -//############################################################################# -/** A function that tests the methods in the CglZeroHalf class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void CglZeroHalfUnitTest(const OsiSolverInterface * siP, - const std::string mpdDir ); - -#endif diff --git a/thirdparty/linux/include/coin1/ClpCholeskyBase.hpp b/thirdparty/linux/include/coin1/ClpCholeskyBase.hpp deleted file mode 100644 index 815af014..00000000 --- a/thirdparty/linux/include/coin1/ClpCholeskyBase.hpp +++ /dev/null @@ -1,294 +0,0 @@ -/* $Id: ClpCholeskyBase.hpp 1722 2011-04-17 09:58:37Z stefan $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpCholeskyBase_H -#define ClpCholeskyBase_H - -#include "CoinPragma.hpp" -#include "CoinTypes.hpp" -//#define CLP_LONG_CHOLESKY 0 -#ifndef CLP_LONG_CHOLESKY -#define CLP_LONG_CHOLESKY 0 -#endif -/* valid combinations are - CLP_LONG_CHOLESKY 0 and COIN_LONG_WORK 0 - CLP_LONG_CHOLESKY 1 and COIN_LONG_WORK 1 - CLP_LONG_CHOLESKY 2 and COIN_LONG_WORK 1 -*/ -#if COIN_LONG_WORK==0 -#if CLP_LONG_CHOLESKY>0 -#define CHOLESKY_BAD_COMBINATION -#endif -#else -#if CLP_LONG_CHOLESKY==0 -#define CHOLESKY_BAD_COMBINATION -#endif -#endif -#ifdef CHOLESKY_BAD_COMBINATION -# warning("Bad combination of CLP_LONG_CHOLESKY and COIN_BIG_DOUBLE/COIN_LONG_WORK"); -"Bad combination of CLP_LONG_CHOLESKY and COIN_LONG_WORK" -#endif -#if CLP_LONG_CHOLESKY>1 -typedef long double longDouble; -#define CHOL_SMALL_VALUE 1.0e-15 -#elif CLP_LONG_CHOLESKY==1 -typedef double longDouble; -#define CHOL_SMALL_VALUE 1.0e-11 -#else -typedef double longDouble; -#define CHOL_SMALL_VALUE 1.0e-11 -#endif -class ClpInterior; -class ClpCholeskyDense; -class ClpMatrixBase; - -/** Base class for Clp Cholesky factorization - Will do better factorization. very crude ordering - - Derived classes may be using more sophisticated methods -*/ - -class ClpCholeskyBase { - -public: - /**@name Virtual methods that the derived classes may provide */ - //@{ - /** Orders rows and saves pointer to matrix.and model. - returns non-zero if not enough memory. - You can use preOrder to set up ADAT - If using default symbolic etc then must set sizeFactor_ to - size of input matrix to order (and to symbolic). - Also just permute_ and permuteInverse_ should be created */ - virtual int order(ClpInterior * model); - /** Does Symbolic factorization given permutation. - This is called immediately after order. If user provides this then - user must provide factorize and solve. Otherwise the default factorization is used - returns non-zero if not enough memory */ - virtual int symbolic(); - /** Factorize - filling in rowsDropped and returning number dropped. - If return code negative then out of memory */ - virtual int factorize(const CoinWorkDouble * diagonal, int * rowsDropped) ; - /** Uses factorization to solve. */ - virtual void solve (CoinWorkDouble * region) ; - /** Uses factorization to solve. - given as if KKT. - region1 is rows+columns, region2 is rows */ - virtual void solveKKT (CoinWorkDouble * region1, CoinWorkDouble * region2, const CoinWorkDouble * diagonal, - CoinWorkDouble diagonalScaleFactor); -private: - /// AMD ordering - int orderAMD(); -public: - //@} - - /**@name Gets */ - //@{ - /// status. Returns status - inline int status() const { - return status_; - } - /// numberRowsDropped. Number of rows gone - inline int numberRowsDropped() const { - return numberRowsDropped_; - } - /// reset numberRowsDropped and rowsDropped. - void resetRowsDropped(); - /// rowsDropped - which rows are gone - inline char * rowsDropped() const { - return rowsDropped_; - } - /// choleskyCondition. - inline double choleskyCondition() const { - return choleskyCondition_; - } - /// goDense i.e. use dense factoriaztion if > this (default 0.7). - inline double goDense() const { - return goDense_; - } - /// goDense i.e. use dense factoriaztion if > this (default 0.7). - inline void setGoDense(double value) { - goDense_ = value; - } - /// rank. Returns rank - inline int rank() const { - return numberRows_ - numberRowsDropped_; - } - /// Return number of rows - inline int numberRows() const { - return numberRows_; - } - /// Return size - inline CoinBigIndex size() const { - return sizeFactor_; - } - /// Return sparseFactor - inline longDouble * sparseFactor() const { - return sparseFactor_; - } - /// Return diagonal - inline longDouble * diagonal() const { - return diagonal_; - } - /// Return workDouble - inline longDouble * workDouble() const { - return workDouble_; - } - /// If KKT on - inline bool kkt() const { - return doKKT_; - } - /// Set KKT - inline void setKKT(bool yesNo) { - doKKT_ = yesNo; - } - /// Set integer parameter - inline void setIntegerParameter(int i, int value) { - integerParameters_[i] = value; - } - /// get integer parameter - inline int getIntegerParameter(int i) { - return integerParameters_[i]; - } - /// Set double parameter - inline void setDoubleParameter(int i, double value) { - doubleParameters_[i] = value; - } - /// get double parameter - inline double getDoubleParameter(int i) { - return doubleParameters_[i]; - } - //@} - - -public: - - /**@name Constructors, destructor - */ - //@{ - /** Constructor which has dense columns activated. - Default is off. */ - ClpCholeskyBase(int denseThreshold = -1); - /** Destructor (has to be public) */ - virtual ~ClpCholeskyBase(); - /// Copy - ClpCholeskyBase(const ClpCholeskyBase&); - /// Assignment - ClpCholeskyBase& operator=(const ClpCholeskyBase&); - //@} - //@{ - ///@name Other - /// Clone - virtual ClpCholeskyBase * clone() const; - - /// Returns type - inline int type() const { - if (doKKT_) return 100; - else return type_; - } -protected: - /// Sets type - inline void setType(int type) { - type_ = type; - } - /// model. - inline void setModel(ClpInterior * model) { - model_ = model; - } - //@} - - /**@name Symbolic, factor and solve */ - //@{ - /** Symbolic1 - works out size without clever stuff. - Uses upper triangular as much easier. - Returns size - */ - int symbolic1(const CoinBigIndex * Astart, const int * Arow); - /** Symbolic2 - Fills in indices - Uses lower triangular so can do cliques etc - */ - void symbolic2(const CoinBigIndex * Astart, const int * Arow); - /** Factorize - filling in rowsDropped and returning number dropped - in integerParam. - */ - void factorizePart2(int * rowsDropped) ; - /** solve - 1 just first half, 2 just second half - 3 both. - If 1 and 2 then diagonal has sqrt of inverse otherwise inverse - */ - void solve(CoinWorkDouble * region, int type); - /// Forms ADAT - returns nonzero if not enough memory - int preOrder(bool lowerTriangular, bool includeDiagonal, bool doKKT); - /// Updates dense part (broken out for profiling) - void updateDense(longDouble * d, /*longDouble * work,*/ int * first); - //@} - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// type (may be useful) if > 20 do KKT - int type_; - /// Doing full KKT (only used if default symbolic and factorization) - bool doKKT_; - /// Go dense at this fraction - double goDense_; - /// choleskyCondition. - double choleskyCondition_; - /// model. - ClpInterior * model_; - /// numberTrials. Number of trials before rejection - int numberTrials_; - /// numberRows. Number of Rows in factorization - int numberRows_; - /// status. Status of factorization - int status_; - /// rowsDropped - char * rowsDropped_; - /// permute inverse. - int * permuteInverse_; - /// main permute. - int * permute_; - /// numberRowsDropped. Number of rows gone - int numberRowsDropped_; - /// sparseFactor. - longDouble * sparseFactor_; - /// choleskyStart - element starts - CoinBigIndex * choleskyStart_; - /// choleskyRow (can be shorter than sparsefactor) - int * choleskyRow_; - /// Index starts - CoinBigIndex * indexStart_; - /// Diagonal - longDouble * diagonal_; - /// double work array - longDouble * workDouble_; - /// link array - int * link_; - // Integer work array - CoinBigIndex * workInteger_; - // Clique information - int * clique_; - /// sizeFactor. - CoinBigIndex sizeFactor_; - /// Size of index array - CoinBigIndex sizeIndex_; - /// First dense row - int firstDense_; - /// integerParameters - int integerParameters_[64]; - /// doubleParameters; - double doubleParameters_[64]; - /// Row copy of matrix - ClpMatrixBase * rowCopy_; - /// Dense indicators - char * whichDense_; - /// Dense columns (updated) - longDouble * denseColumn_; - /// Dense cholesky - ClpCholeskyDense * dense_; - /// Dense threshold (for taking out of Cholesky) - int denseThreshold_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpCholeskyDense.hpp b/thirdparty/linux/include/coin1/ClpCholeskyDense.hpp deleted file mode 100644 index d8428b60..00000000 --- a/thirdparty/linux/include/coin1/ClpCholeskyDense.hpp +++ /dev/null @@ -1,162 +0,0 @@ -/* $Id: ClpCholeskyDense.hpp 1910 2013-01-27 02:00:13Z stefan $ */ -/* - Copyright (C) 2003, International Business Machines Corporation - and others. All Rights Reserved. - - This code is licensed under the terms of the Eclipse Public License (EPL). -*/ -#ifndef ClpCholeskyDense_H -#define ClpCholeskyDense_H - -#include "ClpCholeskyBase.hpp" -class ClpMatrixBase; - -class ClpCholeskyDense : public ClpCholeskyBase { - -public: - /**@name Virtual methods that the derived classes provides */ - /**@{*/ - /** Orders rows and saves pointer to matrix.and model. - Returns non-zero if not enough memory */ - virtual int order(ClpInterior * model) ; - /** Does Symbolic factorization given permutation. - This is called immediately after order. If user provides this then - user must provide factorize and solve. Otherwise the default factorization is used - returns non-zero if not enough memory */ - virtual int symbolic(); - /** Factorize - filling in rowsDropped and returning number dropped. - If return code negative then out of memory */ - virtual int factorize(const CoinWorkDouble * diagonal, int * rowsDropped) ; - /** Uses factorization to solve. */ - virtual void solve (CoinWorkDouble * region) ; - /**@}*/ - - /**@name Non virtual methods for ClpCholeskyDense */ - /**@{*/ - /** Reserves space. - If factor not NULL then just uses passed space - Returns non-zero if not enough memory */ - int reserveSpace(const ClpCholeskyBase * factor, int numberRows) ; - /** Returns space needed */ - CoinBigIndex space( int numberRows) const; - /** part 2 of Factorize - filling in rowsDropped */ - void factorizePart2(int * rowsDropped) ; - /** part 2 of Factorize - filling in rowsDropped - blocked */ - void factorizePart3(int * rowsDropped) ; - /** Forward part of solve */ - void solveF1(longDouble * a, int n, CoinWorkDouble * region); - void solveF2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2); - /** Backward part of solve */ - void solveB1(longDouble * a, int n, CoinWorkDouble * region); - void solveB2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2); - int bNumber(const longDouble * array, int &, int&); - /** A */ - inline longDouble * aMatrix() const { - return sparseFactor_; - } - /** Diagonal */ - inline longDouble * diagonal() const { - return diagonal_; - } - /**@}*/ - - - /**@name Constructors, destructor */ - /**@{*/ - /** Default constructor. */ - ClpCholeskyDense(); - /** Destructor */ - virtual ~ClpCholeskyDense(); - /** Copy */ - ClpCholeskyDense(const ClpCholeskyDense&); - /** Assignment */ - ClpCholeskyDense& operator=(const ClpCholeskyDense&); - /** Clone */ - virtual ClpCholeskyBase * clone() const ; - /**@}*/ - - -private: - /**@name Data members */ - /**@{*/ - /** Just borrowing space */ - bool borrowSpace_; - /**@}*/ -}; - -/* structure for C */ -typedef struct { - longDouble * diagonal_; - longDouble * a; - longDouble * work; - int * rowsDropped; - double doubleParameters_[1]; /* corresponds to 10 */ - int integerParameters_[2]; /* corresponds to 34, nThreads */ - int n; - int numberBlocks; -} ClpCholeskyDenseC; - -extern "C" { - void ClpCholeskySpawn(void *); -} -/**Non leaf recursive factor */ -void -ClpCholeskyCfactor(ClpCholeskyDenseC * thisStruct, - longDouble * a, int n, int numberBlocks, - longDouble * diagonal, longDouble * work, int * rowsDropped); - -/**Non leaf recursive triangle rectangle update */ -void -ClpCholeskyCtriRec(ClpCholeskyDenseC * thisStruct, - longDouble * aTri, int nThis, - longDouble * aUnder, longDouble * diagonal, - longDouble * work, - int nLeft, int iBlock, int jBlock, - int numberBlocks); -/**Non leaf recursive rectangle triangle update */ -void -ClpCholeskyCrecTri(ClpCholeskyDenseC * thisStruct, - longDouble * aUnder, int nTri, int nDo, - int iBlock, int jBlock, longDouble * aTri, - longDouble * diagonal, longDouble * work, - int numberBlocks); -/** Non leaf recursive rectangle rectangle update, - nUnder is number of rows in iBlock, - nUnderK is number of rows in kBlock -*/ -void -ClpCholeskyCrecRec(ClpCholeskyDenseC * thisStruct, - longDouble * above, int nUnder, int nUnderK, - int nDo, longDouble * aUnder, longDouble *aOther, - longDouble * work, - int iBlock, int jBlock, - int numberBlocks); -/**Leaf recursive factor */ -void -ClpCholeskyCfactorLeaf(ClpCholeskyDenseC * thisStruct, - longDouble * a, int n, - longDouble * diagonal, longDouble * work, - int * rowsDropped); -/**Leaf recursive triangle rectangle update */ -void -ClpCholeskyCtriRecLeaf(/*ClpCholeskyDenseC * thisStruct,*/ - longDouble * aTri, longDouble * aUnder, - longDouble * diagonal, longDouble * work, - int nUnder); -/**Leaf recursive rectangle triangle update */ -void -ClpCholeskyCrecTriLeaf(/*ClpCholeskyDenseC * thisStruct, */ - longDouble * aUnder, longDouble * aTri, - /*longDouble * diagonal,*/ longDouble * work, int nUnder); -/** Leaf recursive rectangle rectangle update, - nUnder is number of rows in iBlock, - nUnderK is number of rows in kBlock -*/ -void -ClpCholeskyCrecRecLeaf(/*ClpCholeskyDenseC * thisStruct, */ - const longDouble * COIN_RESTRICT above, - const longDouble * COIN_RESTRICT aUnder, - longDouble * COIN_RESTRICT aOther, - const longDouble * COIN_RESTRICT work, - int nUnder); -#endif diff --git a/thirdparty/linux/include/coin1/ClpConfig.h b/thirdparty/linux/include/coin1/ClpConfig.h deleted file mode 100644 index d10a2066..00000000 --- a/thirdparty/linux/include/coin1/ClpConfig.h +++ /dev/null @@ -1,17 +0,0 @@ -/* src/config_clp.h. Generated by configure. */ -/* src/config_clp.h.in. */ - -/* Define to 1, 2, 3, or 4 if Aboca should be build. */ -/* #undef CLP_HAS_ABC */ - -/* Version number of project */ -#define CLP_VERSION "1.16.6" - -/* Major Version number of project */ -#define CLP_VERSION_MAJOR 1 - -/* Minor Version number of project */ -#define CLP_VERSION_MINOR 16 - -/* Release Version number of project */ -#define CLP_VERSION_RELEASE 6 diff --git a/thirdparty/linux/include/coin1/ClpConstraint.hpp b/thirdparty/linux/include/coin1/ClpConstraint.hpp deleted file mode 100644 index be43bb82..00000000 --- a/thirdparty/linux/include/coin1/ClpConstraint.hpp +++ /dev/null @@ -1,125 +0,0 @@ -/* $Id: ClpConstraint.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2007, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpConstraint_H -#define ClpConstraint_H - - -//############################################################################# -class ClpSimplex; -class ClpModel; - -/** Constraint Abstract Base Class - -Abstract Base Class for describing a constraint or objective function - -*/ -class ClpConstraint { - -public: - - ///@name Stuff - //@{ - - /** Fills gradient. If Linear then solution may be NULL, - also returns true value of function and offset so we can use x not deltaX in constraint - If refresh is false then uses last solution - Uses model for scaling - Returns non-zero if gradient undefined at current solution - */ - virtual int gradient(const ClpSimplex * model, - const double * solution, - double * gradient, - double & functionValue , - double & offset, - bool useScaling = false, - bool refresh = true) const = 0; - /// Constraint function value - virtual double functionValue (const ClpSimplex * model, - const double * solution, - bool useScaling = false, - bool refresh = true) const ; - /// Resize constraint - virtual void resize(int newNumberColumns) = 0; - /// Delete columns in constraint - virtual void deleteSome(int numberToDelete, const int * which) = 0; - /// Scale constraint - virtual void reallyScale(const double * columnScale) = 0; - /** Given a zeroed array sets nonlinear columns to 1. - Returns number of nonlinear columns - */ - virtual int markNonlinear(char * which) const = 0; - /** Given a zeroed array sets possible nonzero coefficients to 1. - Returns number of nonzeros - */ - virtual int markNonzero(char * which) const = 0; - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpConstraint(); - - /// Copy constructor - ClpConstraint(const ClpConstraint &); - - /// Assignment operator - ClpConstraint & operator=(const ClpConstraint& rhs); - - /// Destructor - virtual ~ClpConstraint (); - - /// Clone - virtual ClpConstraint * clone() const = 0; - - //@} - - ///@name Other - //@{ - /// Returns type, 0 linear, 1 nonlinear - inline int type() { - return type_; - } - /// Row number (-1 is objective) - inline int rowNumber() const { - return rowNumber_; - } - - /// Number of possible coefficients in gradient - virtual int numberCoefficients() const = 0; - - /// Stored constraint function value - inline double functionValue () const { - return functionValue_; - } - - /// Constraint offset - inline double offset () const { - return offset_; - } - /// Say we have new primal solution - so may need to recompute - virtual void newXValues() {} - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected member data - //@{ - /// Gradient at last evaluation - mutable double * lastGradient_; - /// Value of non-linear part of constraint - mutable double functionValue_; - /// Value of offset for constraint - mutable double offset_; - /// Type of constraint - linear is 1 - int type_; - /// Row number (-1 is objective) - int rowNumber_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpConstraintLinear.hpp b/thirdparty/linux/include/coin1/ClpConstraintLinear.hpp deleted file mode 100644 index fd0a4dab..00000000 --- a/thirdparty/linux/include/coin1/ClpConstraintLinear.hpp +++ /dev/null @@ -1,110 +0,0 @@ -/* $Id: ClpConstraintLinear.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2007, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpConstraintLinear_H -#define ClpConstraintLinear_H - -#include "ClpConstraint.hpp" - -//############################################################################# - -/** Linear Constraint Class - -*/ - -class ClpConstraintLinear : public ClpConstraint { - -public: - - ///@name Stuff - //@{ - - - /** Fills gradient. If Linear then solution may be NULL, - also returns true value of function and offset so we can use x not deltaX in constraint - If refresh is false then uses last solution - Uses model for scaling - Returns non-zero if gradient udefined at current solution - */ - virtual int gradient(const ClpSimplex * model, - const double * solution, - double * gradient, - double & functionValue , - double & offset, - bool useScaling = false, - bool refresh = true) const ; - /// Resize constraint - virtual void resize(int newNumberColumns) ; - /// Delete columns in constraint - virtual void deleteSome(int numberToDelete, const int * which) ; - /// Scale constraint - virtual void reallyScale(const double * columnScale) ; - /** Given a zeroed array sets nonlinear columns to 1. - Returns number of nonlinear columns - */ - virtual int markNonlinear(char * which) const ; - /** Given a zeroed array sets possible nonzero coefficients to 1. - Returns number of nonzeros - */ - virtual int markNonzero(char * which) const; - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpConstraintLinear(); - - /// Constructor from constraint - ClpConstraintLinear(int row, int numberCoefficients, int numberColumns, - const int * column, const double * element); - - /** Copy constructor . - */ - ClpConstraintLinear(const ClpConstraintLinear & rhs); - - /// Assignment operator - ClpConstraintLinear & operator=(const ClpConstraintLinear& rhs); - - /// Destructor - virtual ~ClpConstraintLinear (); - - /// Clone - virtual ClpConstraint * clone() const; - //@} - ///@name Gets and sets - //@{ - /// Number of coefficients - virtual int numberCoefficients() const; - /// Number of columns in linear constraint - inline int numberColumns() const { - return numberColumns_; - } - /// Columns - inline const int * column() const { - return column_; - } - /// Coefficients - inline const double * coefficient() const { - return coefficient_; - } - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - /// Column - int * column_; - /// Coefficients - double * coefficient_; - /// Useful to have number of columns about - int numberColumns_; - /// Number of coefficients - int numberCoefficients_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpConstraintQuadratic.hpp b/thirdparty/linux/include/coin1/ClpConstraintQuadratic.hpp deleted file mode 100644 index 2eff6cc5..00000000 --- a/thirdparty/linux/include/coin1/ClpConstraintQuadratic.hpp +++ /dev/null @@ -1,119 +0,0 @@ -/* $Id: ClpConstraintQuadratic.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2007, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpConstraintQuadratic_H -#define ClpConstraintQuadratic_H - -#include "ClpConstraint.hpp" - -//############################################################################# - -/** Quadratic Constraint Class - -*/ - -class ClpConstraintQuadratic : public ClpConstraint { - -public: - - ///@name Stuff - //@{ - - - /** Fills gradient. If Quadratic then solution may be NULL, - also returns true value of function and offset so we can use x not deltaX in constraint - If refresh is false then uses last solution - Uses model for scaling - Returns non-zero if gradient udefined at current solution - */ - virtual int gradient(const ClpSimplex * model, - const double * solution, - double * gradient, - double & functionValue , - double & offset, - bool useScaling = false, - bool refresh = true) const ; - /// Resize constraint - virtual void resize(int newNumberColumns) ; - /// Delete columns in constraint - virtual void deleteSome(int numberToDelete, const int * which) ; - /// Scale constraint - virtual void reallyScale(const double * columnScale) ; - /** Given a zeroed array sets nonquadratic columns to 1. - Returns number of nonquadratic columns - */ - virtual int markNonlinear(char * which) const ; - /** Given a zeroed array sets possible nonzero coefficients to 1. - Returns number of nonzeros - */ - virtual int markNonzero(char * which) const; - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpConstraintQuadratic(); - - /// Constructor from quadratic - ClpConstraintQuadratic(int row, int numberQuadraticColumns, int numberColumns, - const CoinBigIndex * start, - const int * column, const double * element); - - /** Copy constructor . - */ - ClpConstraintQuadratic(const ClpConstraintQuadratic & rhs); - - /// Assignment operator - ClpConstraintQuadratic & operator=(const ClpConstraintQuadratic& rhs); - - /// Destructor - virtual ~ClpConstraintQuadratic (); - - /// Clone - virtual ClpConstraint * clone() const; - //@} - ///@name Gets and sets - //@{ - /// Number of coefficients - virtual int numberCoefficients() const; - /// Number of columns in constraint - inline int numberColumns() const { - return numberColumns_; - } - /// Column starts - inline CoinBigIndex * start() const { - return start_; - } - /// Columns - inline const int * column() const { - return column_; - } - /// Coefficients - inline const double * coefficient() const { - return coefficient_; - } - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - /// Column starts - CoinBigIndex * start_; - /// Column (if -1 then linear coefficient) - int * column_; - /// Coefficients - double * coefficient_; - /// Useful to have number of columns about - int numberColumns_; - /// Number of coefficients in gradient - int numberCoefficients_; - /// Number of quadratic columns - int numberQuadraticColumns_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpDualRowDantzig.hpp b/thirdparty/linux/include/coin1/ClpDualRowDantzig.hpp deleted file mode 100644 index 73b42b33..00000000 --- a/thirdparty/linux/include/coin1/ClpDualRowDantzig.hpp +++ /dev/null @@ -1,71 +0,0 @@ -/* $Id: ClpDualRowDantzig.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDualRowDantzig_H -#define ClpDualRowDantzig_H - -#include "ClpDualRowPivot.hpp" - -//############################################################################# - -/** Dual Row Pivot Dantzig Algorithm Class - -This is simplest choice - choose largest infeasibility - -*/ - -class ClpDualRowDantzig : public ClpDualRowPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /// Returns pivot row, -1 if none - virtual int pivotRow(); - - /** Updates weights and returns pivot alpha. - Also does FT update */ - virtual double updateWeights(CoinIndexedVector * input, - CoinIndexedVector * spare, - CoinIndexedVector * spare2, - CoinIndexedVector * updatedColumn); - /** Updates primal solution (and maybe list of candidates) - Uses input vector which it deletes - Computes change in objective function - */ - virtual void updatePrimalSolution(CoinIndexedVector * input, - double theta, - double & changeInObjective); - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpDualRowDantzig(); - - /// Copy constructor - ClpDualRowDantzig(const ClpDualRowDantzig &); - - /// Assignment operator - ClpDualRowDantzig & operator=(const ClpDualRowDantzig& rhs); - - /// Destructor - virtual ~ClpDualRowDantzig (); - - /// Clone - virtual ClpDualRowPivot * clone(bool copyData = true) const; - - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpDualRowPivot.hpp b/thirdparty/linux/include/coin1/ClpDualRowPivot.hpp deleted file mode 100644 index f1f57a6a..00000000 --- a/thirdparty/linux/include/coin1/ClpDualRowPivot.hpp +++ /dev/null @@ -1,129 +0,0 @@ -/* $Id: ClpDualRowPivot.hpp 2070 2014-11-18 11:12:54Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDualRowPivot_H -#define ClpDualRowPivot_H - -class ClpSimplex; -class CoinIndexedVector; - -//############################################################################# - -/** Dual Row Pivot Abstract Base Class - -Abstract Base Class for describing an interface to an algorithm -to choose row pivot in dual simplex algorithm. For some algorithms -e.g. Dantzig choice then some functions may be null. - -*/ - -class ClpDualRowPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /// Returns pivot row, -1 if none - virtual int pivotRow() = 0; - - /** Updates weights and returns pivot alpha. - Also does FT update */ - virtual double updateWeights(CoinIndexedVector * input, - CoinIndexedVector * spare, - CoinIndexedVector * spare2, - CoinIndexedVector * updatedColumn) = 0; - - /** Updates primal solution (and maybe list of candidates) - Uses input vector which it deletes - Computes change in objective function - Would be faster if we kept basic regions, but on other hand it - means everything is always in sync - */ - /* FIXME: this was pure virtul (=0). Why? */ - virtual void updatePrimalSolution(CoinIndexedVector * input, - double theta, - double & changeInObjective) = 0; - /** Saves any weights round factorization as pivot rows may change - Will be empty unless steepest edge (will save model) - May also recompute infeasibility stuff - 1) before factorization - 2) after good factorization (if weights empty may initialize) - 3) after something happened but no factorization - (e.g. check for infeasible) - 4) as 2 but restore weights from previous snapshot - 5) for strong branching - initialize to 1 , infeasibilities - 6) scale back - 7) for strong branching - initialize full weights , infeasibilities - */ - virtual void saveWeights(ClpSimplex * model, int mode); - /// checks accuracy and may re-initialize (may be empty) - virtual void checkAccuracy(); - /// Gets rid of last update (may be empty) - virtual void unrollWeights(); - /// Gets rid of all arrays (may be empty) - virtual void clearArrays(); - /// Returns true if would not find any row - virtual bool looksOptimal() const { - return false; - } - /// Called when maximum pivots changes - virtual void maximumPivotsChanged() {} - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpDualRowPivot(); - - /// Copy constructor - ClpDualRowPivot(const ClpDualRowPivot &); - - /// Assignment operator - ClpDualRowPivot & operator=(const ClpDualRowPivot& rhs); - - /// Destructor - virtual ~ClpDualRowPivot (); - - /// Clone - virtual ClpDualRowPivot * clone(bool copyData = true) const = 0; - - //@} - - ///@name Other - //@{ - /// Returns model - inline ClpSimplex * model() { - return model_; - } - - /// Sets model (normally to NULL) - inline void setModel(ClpSimplex * newmodel) { - model_ = newmodel; - } - - /// Returns type (above 63 is extra information) - inline int type() { - return type_; - } - - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected member data - //@{ - /// Pointer to model - ClpSimplex * model_; - /// Type of row pivot algorithm - int type_; - //@} -}; -#ifndef CLP_DUAL_COLUMN_MULTIPLIER -//#define CLP_DUAL_COLUMN_MULTIPLIER 0.99999 -#endif -#endif diff --git a/thirdparty/linux/include/coin1/ClpDualRowSteepest.hpp b/thirdparty/linux/include/coin1/ClpDualRowSteepest.hpp deleted file mode 100644 index 7e2cc622..00000000 --- a/thirdparty/linux/include/coin1/ClpDualRowSteepest.hpp +++ /dev/null @@ -1,153 +0,0 @@ -/* $Id: ClpDualRowSteepest.hpp 2070 2014-11-18 11:12:54Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDualRowSteepest_H -#define ClpDualRowSteepest_H - -#include "ClpDualRowPivot.hpp" -class CoinIndexedVector; - - -//############################################################################# - -/** Dual Row Pivot Steepest Edge Algorithm Class - -See Forrest-Goldfarb paper for algorithm - -*/ - -class ClpDualRowSteepest : public ClpDualRowPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /// Returns pivot row, -1 if none - virtual int pivotRow(); - - /** Updates weights and returns pivot alpha. - Also does FT update */ - virtual double updateWeights(CoinIndexedVector * input, - CoinIndexedVector * spare, - CoinIndexedVector * spare2, - CoinIndexedVector * updatedColumn); - - /** Updates primal solution (and maybe list of candidates) - Uses input vector which it deletes - Computes change in objective function - */ - virtual void updatePrimalSolution(CoinIndexedVector * input, - double theta, - double & changeInObjective); - - /** Saves any weights round factorization as pivot rows may change - Save model - May also recompute infeasibility stuff - 1) before factorization - 2) after good factorization (if weights empty may initialize) - 3) after something happened but no factorization - (e.g. check for infeasible) - 4) as 2 but restore weights from previous snapshot - 5) for strong branching - initialize (uninitialized) , infeasibilities - */ - virtual void saveWeights(ClpSimplex * model, int mode); - /// Pass in saved weights - void passInSavedWeights(const CoinIndexedVector * saved); - /// Get saved weights - inline CoinIndexedVector * savedWeights() - { return savedWeights_;} - /// Gets rid of last update - virtual void unrollWeights(); - /// Gets rid of all arrays - virtual void clearArrays(); - /// Returns true if would not find any row - virtual bool looksOptimal() const; - /// Called when maximum pivots changes - virtual void maximumPivotsChanged(); - //@} - - /** enums for persistence - */ - enum Persistence { - normal = 0x00, // create (if necessary) and destroy - keep = 0x01 // create (if necessary) and leave - }; - - ///@name Constructors and destructors - //@{ - /** Default Constructor - 0 is uninitialized, 1 full, 2 is partial uninitialized, - 3 starts as 2 but may switch to 1. - By partial is meant that the weights are updated as normal - but only part of the infeasible basic variables are scanned. - This can be faster on very easy problems. - */ - ClpDualRowSteepest(int mode = 3); - - /// Copy constructor - ClpDualRowSteepest(const ClpDualRowSteepest &); - - /// Assignment operator - ClpDualRowSteepest & operator=(const ClpDualRowSteepest& rhs); - - /// Fill most values - void fill(const ClpDualRowSteepest& rhs); - - /// Destructor - virtual ~ClpDualRowSteepest (); - - /// Clone - virtual ClpDualRowPivot * clone(bool copyData = true) const; - - //@} - /**@name gets and sets */ - //@{ - /// Mode - inline int mode() const { - return mode_; - } - /// Set mode - inline void setMode(int mode) { - mode_ = mode; - } - /// Set/ get persistence - inline void setPersistence(Persistence life) { - persistence_ = life; - } - inline Persistence persistence() const { - return persistence_ ; - } -//@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - /** Status - 0) Normal - -1) Needs initialization - 1) Weights are stored by sequence number - */ - int state_; - /** If 0 then we are using uninitialized weights, 1 then full, - if 2 then uninitialized partial, 3 switchable */ - int mode_; - /// Life of weights - Persistence persistence_; - /// weight array - double * weights_; - /// square of infeasibility array (just for infeasible rows) - CoinIndexedVector * infeasible_; - /// alternate weight array (so we can unroll) - CoinIndexedVector * alternateWeights_; - /// save weight array (so we can use checkpoint) - CoinIndexedVector * savedWeights_; - /// Dubious weights - int * dubiousWeights_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpDummyMatrix.hpp b/thirdparty/linux/include/coin1/ClpDummyMatrix.hpp deleted file mode 100644 index 1b4a2d45..00000000 --- a/thirdparty/linux/include/coin1/ClpDummyMatrix.hpp +++ /dev/null @@ -1,183 +0,0 @@ -/* $Id: ClpDummyMatrix.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDummyMatrix_H -#define ClpDummyMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpMatrixBase.hpp" - -/** This implements a dummy matrix as derived from ClpMatrixBase. - This is so you can do ClpPdco but may come in useful elsewhere. - It just has dimensions but no data -*/ - - -class ClpDummyMatrix : public ClpMatrixBase { - -public: - /**@name Useful methods */ - //@{ - /// Return a complete CoinPackedMatrix - virtual CoinPackedMatrix * getPackedMatrix() const; - /** Whether the packed matrix is column major ordered or not. */ - virtual bool isColOrdered() const { - return true; - } - /** Number of entries in the packed matrix. */ - virtual CoinBigIndex getNumElements() const { - return numberElements_; - } - /** Number of columns. */ - virtual int getNumCols() const { - return numberColumns_; - } - /** Number of rows. */ - virtual int getNumRows() const { - return numberRows_; - } - - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with vectorStarts and vectorLengths. */ - virtual const double * getElements() const; - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with vectorStarts and - vectorLengths. */ - virtual const int * getIndices() const; - - virtual const CoinBigIndex * getVectorStarts() const; - /** The lengths of the major-dimension vectors. */ - virtual const int * getVectorLengths() const; - - /** Delete the columns whose indices are listed in indDel. */ - virtual void deleteCols(const int numDel, const int * indDel); - /** Delete the rows whose indices are listed in indDel. */ - virtual void deleteRows(const int numDel, const int * indDel); - /** Returns a new matrix in reverse order without gaps */ - virtual ClpMatrixBase * reverseOrderedCopy() const; - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis(const int * whichColumn, - int & numberColumnBasic); - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element); - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const ; - /** Unpacks a column into an CoinIndexedvector - ** in packed foramt - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const ; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const; - /// Allow any parts of a created CoinMatrix to be deleted - /// Allow any parts of a created CoinPackedMatrix to be deleted - virtual void releasePackedMatrix() const {} - //@} - - /**@name Matrix times vector methods */ - //@{ - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void times(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - virtual void transposeTimes(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void transposeTimes(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale) const; - - using ClpMatrixBase::transposeTimes ; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x *A in z but - just for indices in y. - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const; - //@} - - /**@name Other */ - //@{ - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpDummyMatrix(); - /// Constructor with data - ClpDummyMatrix(int numberColumns, int numberRows, - int numberElements); - /** Destructor */ - virtual ~ClpDummyMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpDummyMatrix(const ClpDummyMatrix&); - /** The copy constructor from an CoinDummyMatrix. */ - ClpDummyMatrix(const CoinPackedMatrix&); - - ClpDummyMatrix& operator=(const ClpDummyMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Number of rows - int numberRows_; - /// Number of columns - int numberColumns_; - /// Number of elements - int numberElements_; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpDynamicExampleMatrix.hpp b/thirdparty/linux/include/coin1/ClpDynamicExampleMatrix.hpp deleted file mode 100644 index 81fe5ba3..00000000 --- a/thirdparty/linux/include/coin1/ClpDynamicExampleMatrix.hpp +++ /dev/null @@ -1,186 +0,0 @@ -/* $Id: ClpDynamicExampleMatrix.hpp 1936 2013-04-09 10:29:27Z forrest $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDynamicExampleMatrix_H -#define ClpDynamicExampleMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpDynamicMatrix.hpp" -class ClpSimplex; -/** This implements a dynamic matrix when we have a limit on the number of - "interesting rows". This version inherits from ClpDynamicMatrix and knows that - the real matrix is gub. This acts just like ClpDynamicMatrix but generates columns. - This "generates" columns by choosing from stored set. It is maent as a starting point - as to how you could use shortest path to generate columns. - - So it has its own copy of all data needed. It populates ClpDynamicWatrix with enough - to allow for gub keys and active variables. In turn ClpDynamicMatrix populates - a CoinPackedMatrix with active columns and rows. - - As there is one copy here and one in ClpDynamicmatrix these names end in Gen_ - - It is obviously more efficient to just use ClpDynamicMatrix but the ideas is to - show how much code a user would have to write. - - This does not work very well with bounds - -*/ - -class ClpDynamicExampleMatrix : public ClpDynamicMatrix { - -public: - /**@name Main functions provided */ - //@{ - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - - /** Creates a variable. This is called after partial pricing and will modify matrix. - Will update bestSequence. - */ - virtual void createVariable(ClpSimplex * model, int & bestSequence); - /** If addColumn forces compression then this allows descendant to know what to do. - If >= then entry stayed in, if -1 then entry went out to lower bound.of zero. - Entries at upper bound (really nonzero) never go out (at present). - */ - virtual void packDown(const int * in, int numberToPack); - //@} - - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpDynamicExampleMatrix(); - /** This is the real constructor. - It assumes factorization frequency will not be changed. - This resizes model !!!! - The contents of original matrix in model will be taken over and original matrix - will be sanitized so can be deleted (to avoid a very small memory leak) - */ - ClpDynamicExampleMatrix(ClpSimplex * model, int numberSets, - int numberColumns, const int * starts, - const double * lower, const double * upper, - const int * startColumn, const int * row, - const double * element, const double * cost, - const double * columnLower = NULL, const double * columnUpper = NULL, - const unsigned char * status = NULL, - const unsigned char * dynamicStatus = NULL, - int numberIds = 0, const int *ids = NULL); -#if 0 - /// This constructor just takes over ownership (except for lower, upper) - ClpDynamicExampleMatrix(ClpSimplex * model, int numberSets, - int numberColumns, int * starts, - const double * lower, const double * upper, - int * startColumn, int * row, - double * element, double * cost, - double * columnLower = NULL, double * columnUpper = NULL, - const unsigned char * status = NULL, - const unsigned char * dynamicStatus = NULL, - int numberIds = 0, const int *ids = NULL); -#endif - /** Destructor */ - virtual ~ClpDynamicExampleMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpDynamicExampleMatrix(const ClpDynamicExampleMatrix&); - ClpDynamicExampleMatrix& operator=(const ClpDynamicExampleMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - //@} - /**@name gets and sets */ - //@{ - /// Starts of each column - inline CoinBigIndex * startColumnGen() const { - return startColumnGen_; - } - /// rows - inline int * rowGen() const { - return rowGen_; - } - /// elements - inline double * elementGen() const { - return elementGen_; - } - /// costs - inline double * costGen() const { - return costGen_; - } - /// full starts - inline int * fullStartGen() const { - return fullStartGen_; - } - /// ids in next level matrix - inline int * idGen() const { - return idGen_; - } - /// Optional lower bounds on columns - inline double * columnLowerGen() const { - return columnLowerGen_; - } - /// Optional upper bounds on columns - inline double * columnUpperGen() const { - return columnUpperGen_; - } - /// size - inline int numberColumns() const { - return numberColumns_; - } - inline void setDynamicStatusGen(int sequence, DynamicStatus status) { - unsigned char & st_byte = dynamicStatusGen_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | status); - } - inline DynamicStatus getDynamicStatusGen(int sequence) const { - return static_cast (dynamicStatusGen_[sequence] & 7); - } - /// Whether flagged - inline bool flaggedGen(int i) const { - return (dynamicStatusGen_[i] & 8) != 0; - } - inline void setFlaggedGen(int i) { - dynamicStatusGen_[i] = static_cast(dynamicStatusGen_[i] | 8); - } - inline void unsetFlagged(int i) { - dynamicStatusGen_[i] = static_cast(dynamicStatusGen_[i] & ~8); - } - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// size - int numberColumns_; - /// Starts of each column - CoinBigIndex * startColumnGen_; - /// rows - int * rowGen_; - /// elements - double * elementGen_; - /// costs - double * costGen_; - /// start of each set - int * fullStartGen_; - /// for status and which bound - unsigned char * dynamicStatusGen_; - /** identifier for each variable up one level (startColumn_, etc). This is - of length maximumGubColumns_. For this version it is just sequence number - at this level */ - int * idGen_; - /// Optional lower bounds on columns - double * columnLowerGen_; - /// Optional upper bounds on columns - double * columnUpperGen_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpDynamicMatrix.hpp b/thirdparty/linux/include/coin1/ClpDynamicMatrix.hpp deleted file mode 100644 index da4e1444..00000000 --- a/thirdparty/linux/include/coin1/ClpDynamicMatrix.hpp +++ /dev/null @@ -1,381 +0,0 @@ -/* $Id: ClpDynamicMatrix.hpp 1755 2011-06-28 18:24:31Z lou $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpDynamicMatrix_H -#define ClpDynamicMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpPackedMatrix.hpp" -class ClpSimplex; -/** This implements a dynamic matrix when we have a limit on the number of - "interesting rows". This version inherits from ClpPackedMatrix and knows that - the real matrix is gub. A later version could use shortest path to generate columns. - -*/ - -class ClpDynamicMatrix : public ClpPackedMatrix { - -public: - /// enums for status of various sorts - enum DynamicStatus { - soloKey = 0x00, - inSmall = 0x01, - atUpperBound = 0x02, - atLowerBound = 0x03 - }; - /**@name Main functions provided */ - //@{ - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - - /** - update information for a pivot (and effective rhs) - */ - virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue); - /** Returns effective RHS offset if it is being used. This is used for long problems - or big dynamic or anywhere where going through full columns is - expensive. This may re-compute */ - virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false, - bool check = false); - - using ClpPackedMatrix::times ; - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /// Modifies rhs offset - void modifyOffset(int sequence, double amount); - /// Gets key value when none in small - double keyValue(int iSet) const; - /** - mode=0 - Set up before "updateTranspose" and "transposeTimes" for duals using extended - updates array (and may use other if dual values pass) - mode=1 - Update dual solution after "transposeTimes" using extended rows. - mode=2 - Compute all djs and compute key dual infeasibilities - mode=3 - Report on key dual infeasibilities - mode=4 - Modify before updateTranspose in partial pricing - */ - virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array, - double * other, int mode); - /** - mode=0 - Create list of non-key basics in pivotVariable_ using - number as numberBasic in and out - mode=1 - Set all key variables as basic - mode=2 - return number extra rows needed, number gives maximum number basic - mode=3 - before replaceColumn - mode=4 - return 1 if can do primal, 2 if dual, 3 if both - mode=5 - save any status stuff (when in good state) - mode=6 - restore status stuff - mode=7 - flag given variable (normally sequenceIn) - mode=8 - unflag all variables - mode=9 - synchronize costs - mode=10 - return 1 if there may be changing bounds on variable (column generation) - mode=11 - make sure set is clean (used when a variable rejected - but not flagged) - mode=12 - after factorize but before permute stuff - mode=13 - at end of simplex to delete stuff - */ - virtual int generalExpanded(ClpSimplex * model, int mode, int & number); - /** Purely for column generation and similar ideas. Allows - matrix and any bounds or costs to be updated (sensibly). - Returns non-zero if any changes. - */ - virtual int refresh(ClpSimplex * model); - /** Creates a variable. This is called after partial pricing and will modify matrix. - Will update bestSequence. - */ - virtual void createVariable(ClpSimplex * model, int & bestSequence); - /// Returns reduced cost of a variable - virtual double reducedCost( ClpSimplex * model, int sequence) const; - /// Does gub crash - void gubCrash(); - /// Writes out model (without names) - void writeMps(const char * name); - /// Populates initial matrix from dynamic status - void initialProblem(); - /** Adds in a column to gub structure (called from descendant) and returns sequence */ - int addColumn(int numberEntries, const int * row, const double * element, - double cost, double lower, double upper, int iSet, - DynamicStatus status); - /** If addColumn forces compression then this allows descendant to know what to do. - If >=0 then entry stayed in, if -1 then entry went out to lower bound.of zero. - Entries at upper bound (really nonzero) never go out (at present). - */ - virtual void packDown(const int * , int ) {} - /// Gets lower bound (to simplify coding) - inline double columnLower(int sequence) const { - if (columnLower_) return columnLower_[sequence]; - else return 0.0; - } - /// Gets upper bound (to simplify coding) - inline double columnUpper(int sequence) const { - if (columnUpper_) return columnUpper_[sequence]; - else return COIN_DBL_MAX; - } - - //@} - - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpDynamicMatrix(); - /** This is the real constructor. - It assumes factorization frequency will not be changed. - This resizes model !!!! - The contents of original matrix in model will be taken over and original matrix - will be sanitized so can be deleted (to avoid a very small memory leak) - */ - ClpDynamicMatrix(ClpSimplex * model, int numberSets, - int numberColumns, const int * starts, - const double * lower, const double * upper, - const CoinBigIndex * startColumn, const int * row, - const double * element, const double * cost, - const double * columnLower = NULL, const double * columnUpper = NULL, - const unsigned char * status = NULL, - const unsigned char * dynamicStatus = NULL); - - /** Destructor */ - virtual ~ClpDynamicMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpDynamicMatrix(const ClpDynamicMatrix&); - /** The copy constructor from an CoinPackedMatrix. */ - ClpDynamicMatrix(const CoinPackedMatrix&); - - ClpDynamicMatrix& operator=(const ClpDynamicMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - //@} - /**@name gets and sets */ - //@{ - /// Status of row slacks - inline ClpSimplex::Status getStatus(int sequence) const { - return static_cast (status_[sequence] & 7); - } - inline void setStatus(int sequence, ClpSimplex::Status status) { - unsigned char & st_byte = status_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | status); - } - /// Whether flagged slack - inline bool flaggedSlack(int i) const { - return (status_[i] & 8) != 0; - } - inline void setFlaggedSlack(int i) { - status_[i] = static_cast(status_[i] | 8); - } - inline void unsetFlaggedSlack(int i) { - status_[i] = static_cast(status_[i] & ~8); - } - /// Number of sets (dynamic rows) - inline int numberSets() const { - return numberSets_; - } - /// Number of possible gub variables - inline int numberGubEntries() const - { return startSet_[numberSets_];} - /// Sets - inline int * startSets() const - { return startSet_;} - /// Whether flagged - inline bool flagged(int i) const { - return (dynamicStatus_[i] & 8) != 0; - } - inline void setFlagged(int i) { - dynamicStatus_[i] = static_cast(dynamicStatus_[i] | 8); - } - inline void unsetFlagged(int i) { - dynamicStatus_[i] = static_cast(dynamicStatus_[i] & ~8); - } - inline void setDynamicStatus(int sequence, DynamicStatus status) { - unsigned char & st_byte = dynamicStatus_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | status); - } - inline DynamicStatus getDynamicStatus(int sequence) const { - return static_cast (dynamicStatus_[sequence] & 7); - } - /// Saved value of objective offset - inline double objectiveOffset() const { - return objectiveOffset_; - } - /// Starts of each column - inline CoinBigIndex * startColumn() const { - return startColumn_; - } - /// rows - inline int * row() const { - return row_; - } - /// elements - inline double * element() const { - return element_; - } - /// costs - inline double * cost() const { - return cost_; - } - /// ids of active columns (just index here) - inline int * id() const { - return id_; - } - /// Optional lower bounds on columns - inline double * columnLower() const { - return columnLower_; - } - /// Optional upper bounds on columns - inline double * columnUpper() const { - return columnUpper_; - } - /// Lower bounds on sets - inline double * lowerSet() const { - return lowerSet_; - } - /// Upper bounds on sets - inline double * upperSet() const { - return upperSet_; - } - /// size - inline int numberGubColumns() const { - return numberGubColumns_; - } - /// first free - inline int firstAvailable() const { - return firstAvailable_; - } - /// first dynamic - inline int firstDynamic() const { - return firstDynamic_; - } - /// number of columns in dynamic model - inline int lastDynamic() const { - return lastDynamic_; - } - /// number of rows in original model - inline int numberStaticRows() const { - return numberStaticRows_; - } - /// size of working matrix (max) - inline int numberElements() const { - return numberElements_; - } - inline int * keyVariable() const { - return keyVariable_; - } - /// Switches off dj checking each factorization (for BIG models) - void switchOffCheck(); - /// Status region for gub slacks - inline unsigned char * gubRowStatus() const { - return status_; - } - /// Status region for gub variables - inline unsigned char * dynamicStatus() const { - return dynamicStatus_; - } - /// Returns which set a variable is in - int whichSet (int sequence) const; - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Sum of dual infeasibilities - double sumDualInfeasibilities_; - /// Sum of primal infeasibilities - double sumPrimalInfeasibilities_; - /// Sum of Dual infeasibilities using tolerance based on error in duals - double sumOfRelaxedDualInfeasibilities_; - /// Sum of Primal infeasibilities using tolerance based on error in primals - double sumOfRelaxedPrimalInfeasibilities_; - /// Saved best dual on gub row in pricing - double savedBestGubDual_; - /// Saved best set in pricing - int savedBestSet_; - /// Backward pointer to pivot row !!! - int * backToPivotRow_; - /// Key variable of set (only accurate if none in small problem) - mutable int * keyVariable_; - /// Backward pointer to extra row - int * toIndex_; - // Reverse pointer from index to set - int * fromIndex_; - /// Number of sets (dynamic rows) - int numberSets_; - /// Number of active sets - int numberActiveSets_; - /// Saved value of objective offset - double objectiveOffset_; - /// Lower bounds on sets - double * lowerSet_; - /// Upper bounds on sets - double * upperSet_; - /// Status of slack on set - unsigned char * status_; - /// Pointer back to model - ClpSimplex * model_; - /// first free - int firstAvailable_; - /// first free when iteration started - int firstAvailableBefore_; - /// first dynamic - int firstDynamic_; - /// number of columns in dynamic model - int lastDynamic_; - /// number of rows in original model - int numberStaticRows_; - /// size of working matrix (max) - int numberElements_; - /// Number of dual infeasibilities - int numberDualInfeasibilities_; - /// Number of primal infeasibilities - int numberPrimalInfeasibilities_; - /** If pricing will declare victory (i.e. no check every factorization). - -1 - always check - 0 - don't check - 1 - in don't check mode but looks optimal - */ - int noCheck_; - /// Infeasibility weight when last full pass done - double infeasibilityWeight_; - /// size - int numberGubColumns_; - /// current maximum number of columns (then compress) - int maximumGubColumns_; - /// current maximum number of elemnts (then compress) - int maximumElements_; - /// Start of each set - int * startSet_; - /// next in chain - int * next_; - /// Starts of each column - CoinBigIndex * startColumn_; - /// rows - int * row_; - /// elements - double * element_; - /// costs - double * cost_; - /// ids of active columns (just index here) - int * id_; - /// for status and which bound - unsigned char * dynamicStatus_; - /// Optional lower bounds on columns - double * columnLower_; - /// Optional upper bounds on columns - double * columnUpper_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpEventHandler.hpp b/thirdparty/linux/include/coin1/ClpEventHandler.hpp deleted file mode 100644 index 0a49c830..00000000 --- a/thirdparty/linux/include/coin1/ClpEventHandler.hpp +++ /dev/null @@ -1,186 +0,0 @@ -/* $Id: ClpEventHandler.hpp 1825 2011-11-20 16:02:57Z forrest $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpEventHandler_H -#define ClpEventHandler_H - -#include "ClpSimplex.hpp" -/** Base class for Clp event handling - -This is just here to allow for event handling. By event I mean a Clp event -e.g. end of values pass. - -One use would be to let a user handle a system event e.g. Control-C. This could be done -by deriving a class MyEventHandler which knows about such events. If one occurs -MyEventHandler::event() could clear event status and return 3 (stopped). - -Clp would then return to user code. - -As it is called every iteration this should be fine grained enough. - -User can derive and construct from CbcModel - not pretty - -*/ - -class ClpEventHandler { - -public: - /** enums for what sort of event. - - These will also be returned in ClpModel::secondaryStatus() as int - */ - enum Event { - endOfIteration = 100, // used to set secondary status - endOfFactorization, // after gutsOfSolution etc - endOfValuesPass, - node, // for Cbc - treeStatus, // for Cbc - solution, // for Cbc - theta, // hit in parametrics - pivotRow, // used to choose pivot row - presolveStart, // ClpSolve presolve start - presolveSize, // sees if ClpSolve presolve too big or too small - presolveInfeasible, // ClpSolve presolve infeasible - presolveBeforeSolve, // ClpSolve presolve before solve - presolveAfterFirstSolve, // ClpSolve presolve after solve - presolveAfterSolve, // ClpSolve presolve after solve - presolveEnd, // ClpSolve presolve end - goodFactorization, // before gutsOfSolution - complicatedPivotIn, // in modifyCoefficients - noCandidateInPrimal, // tentative end - looksEndInPrimal, // About to declare victory (or defeat) - endInPrimal, // Victory (or defeat) - beforeStatusOfProblemInPrimal, - startOfStatusOfProblemInPrimal, - complicatedPivotOut, // in modifyCoefficients - noCandidateInDual, // tentative end - looksEndInDual, // About to declare victory (or defeat) - endInDual, // Victory (or defeat) - beforeStatusOfProblemInDual, - startOfStatusOfProblemInDual, - startOfIterationInDual, - updateDualsInDual, - endOfCreateRim, - slightlyInfeasible, - modifyMatrixInMiniPresolve, - moreMiniPresolve, - modifyMatrixInMiniPostsolve, - noTheta // At end (because no pivot) - }; - /**@name Virtual method that the derived classes should provide. - The base class instance does nothing and as event() is only useful method - it would not be very useful NOT providing one! - */ - //@{ - /** This can do whatever it likes. If return code -1 then carries on - if 0 sets ClpModel::status() to 5 (stopped by event) and will return to user. - At present if <-1 carries on and if >0 acts as if 0 - this may change. - For ClpSolve 2 -> too big return status of -2 and -> too small 3 - */ - virtual int event(Event whichEvent); - /** This can do whatever it likes. Return code -1 means no action. - This passes in something - */ - virtual int eventWithInfo(Event whichEvent, void * info) ; - //@} - - - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - ClpEventHandler(ClpSimplex * model = NULL); - /** Destructor */ - virtual ~ClpEventHandler(); - // Copy - ClpEventHandler(const ClpEventHandler&); - // Assignment - ClpEventHandler& operator=(const ClpEventHandler&); - /// Clone - virtual ClpEventHandler * clone() const; - - //@} - - /**@name Sets/gets */ - - //@{ - /** set model. */ - void setSimplex(ClpSimplex * model); - /// Get model - inline ClpSimplex * simplex() const { - return model_; - } - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Pointer to simplex - ClpSimplex * model_; - //@} -}; -/** Base class for Clp disaster handling - -This is here to allow for disaster handling. By disaster I mean that Clp -would otherwise give up - -*/ - -class ClpDisasterHandler { - -public: - /**@name Virtual methods that the derived classe should provide. - */ - //@{ - /// Into simplex - virtual void intoSimplex() = 0; - /// Checks if disaster - virtual bool check() const = 0; - /// saves information for next attempt - virtual void saveInfo() = 0; - /// Type of disaster 0 can fix, 1 abort - virtual int typeOfDisaster(); - //@} - - - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - ClpDisasterHandler(ClpSimplex * model = NULL); - /** Destructor */ - virtual ~ClpDisasterHandler(); - // Copy - ClpDisasterHandler(const ClpDisasterHandler&); - // Assignment - ClpDisasterHandler& operator=(const ClpDisasterHandler&); - /// Clone - virtual ClpDisasterHandler * clone() const = 0; - - //@} - - /**@name Sets/gets */ - - //@{ - /** set model. */ - void setSimplex(ClpSimplex * model); - /// Get model - inline ClpSimplex * simplex() const { - return model_; - } - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Pointer to simplex - ClpSimplex * model_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/ClpFactorization.hpp b/thirdparty/linux/include/coin1/ClpFactorization.hpp deleted file mode 100644 index dda8ff79..00000000 --- a/thirdparty/linux/include/coin1/ClpFactorization.hpp +++ /dev/null @@ -1,432 +0,0 @@ -/* $Id: ClpFactorization.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpFactorization_H -#define ClpFactorization_H - - -#include "CoinPragma.hpp" - -#include "CoinFactorization.hpp" -class ClpMatrixBase; -class ClpSimplex; -class ClpNetworkBasis; -class CoinOtherFactorization; -#ifndef CLP_MULTIPLE_FACTORIZATIONS -#define CLP_MULTIPLE_FACTORIZATIONS 4 -#endif -#ifdef CLP_MULTIPLE_FACTORIZATIONS -#include "CoinDenseFactorization.hpp" -#include "ClpSimplex.hpp" -#endif -#ifndef COIN_FAST_CODE -#define COIN_FAST_CODE -#endif -#ifndef CLP_FACTORIZATION_NEW_TIMING -#define CLP_FACTORIZATION_NEW_TIMING 1 -#endif - -/** This just implements CoinFactorization when an ClpMatrixBase object - is passed. If a network then has a dummy CoinFactorization and - a genuine ClpNetworkBasis object -*/ -class ClpFactorization -#ifndef CLP_MULTIPLE_FACTORIZATIONS - : public CoinFactorization -#endif -{ - - //friend class CoinFactorization; - -public: - /**@name factorization */ - //@{ - /** When part of LP - given by basic variables. - Actually does factorization. - Arrays passed in have non negative value to say basic. - If status is okay, basic variables have pivot row - this is only needed - if increasingRows_ >1. - Allows scaling - If status is singular, then basic variables have pivot row - and ones thrown out have -1 - returns 0 -okay, -1 singular, -2 too many in basis, -99 memory */ - int factorize (ClpSimplex * model, int solveType, bool valuesPass); - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpFactorization(); - /** Destructor */ - ~ClpFactorization(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor from an CoinFactorization. */ - ClpFactorization(const CoinFactorization&); - /** The copy constructor. */ - ClpFactorization(const ClpFactorization&, int denseIfSmaller = 0); -#ifdef CLP_MULTIPLE_FACTORIZATIONS - /** The copy constructor from an CoinOtherFactorization. */ - ClpFactorization(const CoinOtherFactorization&); -#endif - ClpFactorization& operator=(const ClpFactorization&); - //@} - - /* **** below here is so can use networkish basis */ - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - int replaceColumn ( const ClpSimplex * model, - CoinIndexedVector * regionSparse, - CoinIndexedVector * tableauColumn, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying = false, - double acceptablePivot = 1.0e-8); - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from region2 - Tries to do FT update - number returned is negative if no room - region1 starts as zero and is zero at end */ - int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2); - /** Updates one column (FTRAN) from region2 - region1 starts as zero and is zero at end */ - int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute = false) const; - /** Updates one column (FTRAN) from region2 - Tries to do FT update - number returned is negative if no room. - Also updates region3 - region1 starts as zero and is zero at end */ - int updateTwoColumnsFT ( CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermuteRegion3 = false) ; - /// For debug (no statistics update) - int updateColumnForDebug ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute = false) const; - /** Updates one column (BTRAN) from region2 - region1 starts as zero and is zero at end */ - int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - //@} -#ifdef CLP_MULTIPLE_FACTORIZATIONS - /**@name Lifted from CoinFactorization */ - //@{ - /// Total number of elements in factorization - inline int numberElements ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->numberElements(); - else return coinFactorizationB_->numberElements() ; - } - /// Returns address of permute region - inline int *permute ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->permute(); - else return coinFactorizationB_->permute() ; - } - /// Returns address of pivotColumn region (also used for permuting) - inline int *pivotColumn ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->pivotColumn(); - else return coinFactorizationB_->permute() ; - } - /// Maximum number of pivots between factorizations - inline int maximumPivots ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->maximumPivots(); - else return coinFactorizationB_->maximumPivots() ; - } - /// Set maximum number of pivots between factorizations - inline void maximumPivots ( int value) { - if (coinFactorizationA_) coinFactorizationA_->maximumPivots(value); - else coinFactorizationB_->maximumPivots(value); - } - /// Returns number of pivots since factorization - inline int pivots ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->pivots(); - else return coinFactorizationB_->pivots() ; - } - /// Whether larger areas needed - inline double areaFactor ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->areaFactor(); - else return 0.0 ; - } - /// Set whether larger areas needed - inline void areaFactor ( double value) { - if (coinFactorizationA_) coinFactorizationA_->areaFactor(value); - } - /// Zero tolerance - inline double zeroTolerance ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->zeroTolerance(); - else return coinFactorizationB_->zeroTolerance() ; - } - /// Set zero tolerance - inline void zeroTolerance ( double value) { - if (coinFactorizationA_) coinFactorizationA_->zeroTolerance(value); - else coinFactorizationB_->zeroTolerance(value); - } - /// Set tolerances to safer of existing and given - void saferTolerances ( double zeroTolerance, double pivotTolerance); - /** get sparse threshold */ - inline int sparseThreshold ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->sparseThreshold(); - else return 0 ; - } - /** Set sparse threshold */ - inline void sparseThreshold ( int value) { - if (coinFactorizationA_) coinFactorizationA_->sparseThreshold(value); - } - /// Returns status - inline int status ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->status(); - else return coinFactorizationB_->status() ; - } - /// Sets status - inline void setStatus ( int value) { - if (coinFactorizationA_) coinFactorizationA_->setStatus(value); - else coinFactorizationB_->setStatus(value) ; - } - /// Returns number of dense rows - inline int numberDense() const { - if (coinFactorizationA_) return coinFactorizationA_->numberDense(); - else return 0 ; - } -#if 1 - /// Returns number in U area - inline CoinBigIndex numberElementsU ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->numberElementsU(); - else return -1 ; - } - /// Returns number in L area - inline CoinBigIndex numberElementsL ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->numberElementsL(); - else return -1 ; - } - /// Returns number in R area - inline CoinBigIndex numberElementsR ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->numberElementsR(); - else return 0 ; - } -#endif - bool timeToRefactorize() const; -#if CLP_FACTORIZATION_NEW_TIMING>1 - void statsRefactor(char when) const; -#endif - /// Level of detail of messages - inline int messageLevel ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->messageLevel(); - else return 1 ; - } - /// Set level of detail of messages - inline void messageLevel ( int value) { - if (coinFactorizationA_) coinFactorizationA_->messageLevel(value); - } - /// Get rid of all memory - inline void clearArrays() { - if (coinFactorizationA_) - coinFactorizationA_->clearArrays(); - else if (coinFactorizationB_) - coinFactorizationB_->clearArrays(); - } - /// Number of Rows after factorization - inline int numberRows ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->numberRows(); - else return coinFactorizationB_->numberRows() ; - } - /// Gets dense threshold - inline int denseThreshold() const { - if (coinFactorizationA_) return coinFactorizationA_->denseThreshold(); - else return 0 ; - } - /// Sets dense threshold - inline void setDenseThreshold(int value) { - if (coinFactorizationA_) coinFactorizationA_->setDenseThreshold(value); - } - /// Pivot tolerance - inline double pivotTolerance ( ) const { - if (coinFactorizationA_) return coinFactorizationA_->pivotTolerance(); - else if (coinFactorizationB_) return coinFactorizationB_->pivotTolerance(); - return 1.0e-8 ; - } - /// Set pivot tolerance - inline void pivotTolerance ( double value) { - if (coinFactorizationA_) coinFactorizationA_->pivotTolerance(value); - else if (coinFactorizationB_) coinFactorizationB_->pivotTolerance(value); - } - /// Allows change of pivot accuracy check 1.0 == none >1.0 relaxed - inline void relaxAccuracyCheck(double value) { - if (coinFactorizationA_) coinFactorizationA_->relaxAccuracyCheck(value); - } - /** Array persistence flag - If 0 then as now (delete/new) - 1 then only do arrays if bigger needed - 2 as 1 but give a bit extra if bigger needed - */ - inline int persistenceFlag() const { - if (coinFactorizationA_) return coinFactorizationA_->persistenceFlag(); - else return 0 ; - } - inline void setPersistenceFlag(int value) { - if (coinFactorizationA_) coinFactorizationA_->setPersistenceFlag(value); - } - /// Delete all stuff (leaves as after CoinFactorization()) - inline void almostDestructor() { - if (coinFactorizationA_) - coinFactorizationA_->almostDestructor(); - else if (coinFactorizationB_) - coinFactorizationB_->clearArrays(); - } - /// Returns areaFactor but adjusted for dense - inline double adjustedAreaFactor() const { - if (coinFactorizationA_) return coinFactorizationA_->adjustedAreaFactor(); - else return 0.0 ; - } - inline void setBiasLU(int value) { - if (coinFactorizationA_) coinFactorizationA_->setBiasLU(value); - } - /// true if Forrest Tomlin update, false if PFI - inline void setForrestTomlin(bool value) { - if (coinFactorizationA_) coinFactorizationA_->setForrestTomlin(value); - } - /// Sets default values - inline void setDefaultValues() { - if (coinFactorizationA_) { - // row activities have negative sign -#ifndef COIN_FAST_CODE - coinFactorizationA_->slackValue(-1.0); -#endif - coinFactorizationA_->zeroTolerance(1.0e-13); - } - } - /// If nonzero force use of 1,dense 2,small 3,osl - void forceOtherFactorization(int which); - /// Get switch to osl if number rows <= this - inline int goOslThreshold() const { - return goOslThreshold_; - } - /// Set switch to osl if number rows <= this - inline void setGoOslThreshold(int value) { - goOslThreshold_ = value; - } - /// Get switch to dense if number rows <= this - inline int goDenseThreshold() const { - return goDenseThreshold_; - } - /// Set switch to dense if number rows <= this - inline void setGoDenseThreshold(int value) { - goDenseThreshold_ = value; - } - /// Get switch to small if number rows <= this - inline int goSmallThreshold() const { - return goSmallThreshold_; - } - /// Set switch to small if number rows <= this - inline void setGoSmallThreshold(int value) { - goSmallThreshold_ = value; - } - /// Go over to dense or small code if small enough - void goDenseOrSmall(int numberRows) ; - /// Sets factorization - void setFactorization(ClpFactorization & factorization); - /// Return 1 if dense code - inline int isDenseOrSmall() const { - return coinFactorizationB_ ? 1 : 0; - } -#else - inline bool timeToRefactorize() const { - return (pivots() * 3 > maximumPivots() * 2 && - numberElementsR() * 3 > (numberElementsL() + numberElementsU()) * 2 + 1000 && - !numberDense()); - } - /// Sets default values - inline void setDefaultValues() { - // row activities have negative sign -#ifndef COIN_FAST_CODE - slackValue(-1.0); -#endif - zeroTolerance(1.0e-13); - } - /// Go over to dense code - inline void goDense() {} -#endif - //@} - - /**@name other stuff */ - //@{ - /** makes a row copy of L for speed and to allow very sparse problems */ - void goSparse(); - /// Cleans up i.e. gets rid of network basis - void cleanUp(); - /// Says whether to redo pivot order - bool needToReorder() const; -#ifndef SLIM_CLP - /// Says if a network basis - inline bool networkBasis() const { - return (networkBasis_ != NULL); - } -#else - /// Says if a network basis - inline bool networkBasis() const { - return false; - } -#endif - /// Fills weighted row list - void getWeights(int * weights) const; - //@} - -////////////////// data ////////////////// -private: - - /**@name data */ - //@{ - /// Pointer to network basis -#ifndef SLIM_CLP - ClpNetworkBasis * networkBasis_; -#endif -#ifdef CLP_MULTIPLE_FACTORIZATIONS - /// Pointer to CoinFactorization - CoinFactorization * coinFactorizationA_; - /// Pointer to CoinOtherFactorization - CoinOtherFactorization * coinFactorizationB_; -#ifdef CLP_REUSE_ETAS - /// Pointer to model - ClpSimplex * model_; -#endif - /// If nonzero force use of 1,dense 2,small 3,osl - int forceB_; - /// Switch to osl if number rows <= this - int goOslThreshold_; - /// Switch to small if number rows <= this - int goSmallThreshold_; - /// Switch to dense if number rows <= this - int goDenseThreshold_; -#endif -#ifdef CLP_FACTORIZATION_NEW_TIMING - /// For guessing when to re-factorize - mutable double shortestAverage_; - mutable double totalInR_; - mutable double totalInIncreasingU_; - mutable int endLengthU_; - mutable int lastNumberPivots_; - mutable int effectiveStartNumberU_; -#endif - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpGubDynamicMatrix.hpp b/thirdparty/linux/include/coin1/ClpGubDynamicMatrix.hpp deleted file mode 100644 index 2d13e6d0..00000000 --- a/thirdparty/linux/include/coin1/ClpGubDynamicMatrix.hpp +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: ClpGubDynamicMatrix.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpGubDynamicMatrix_H -#define ClpGubDynamicMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpGubMatrix.hpp" -/** This implements Gub rows plus a ClpPackedMatrix. - This a dynamic version which stores the gub part and dynamically creates matrix. - All bounds are assumed to be zero and infinity - - This is just a simple example for real column generation -*/ - -class ClpGubDynamicMatrix : public ClpGubMatrix { - -public: - /**@name Main functions provided */ - //@{ - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - /** This is local to Gub to allow synchronization: - mode=0 when status of basis is good - mode=1 when variable is flagged - mode=2 when all variables unflagged (returns number flagged) - mode=3 just reset costs (primal) - mode=4 correct number of dual infeasibilities - mode=5 return 4 if time to re-factorize - mode=8 - make sure set is clean - mode=9 - adjust lower, upper on set by incoming - */ - virtual int synchronize(ClpSimplex * model, int mode); - /// Sets up an effective RHS and does gub crash if needed - virtual void useEffectiveRhs(ClpSimplex * model, bool cheapest = true); - /** - update information for a pivot (and effective rhs) - */ - virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue); - /// Add a new variable to a set - void insertNonBasic(int sequence, int iSet); - /** Returns effective RHS offset if it is being used. This is used for long problems - or big gub or anywhere where going through full columns is - expensive. This may re-compute */ - virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false, - bool check = false); - - using ClpPackedMatrix::times ; - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /** Just for debug - Returns sum and number of primal infeasibilities. Recomputes keys - */ - virtual int checkFeasible(ClpSimplex * model, double & sum) const; - /// Cleans data after setWarmStart - void cleanData(ClpSimplex * model); - //@} - - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpGubDynamicMatrix(); - /** Destructor */ - virtual ~ClpGubDynamicMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpGubDynamicMatrix(const ClpGubDynamicMatrix&); - /** This is the real constructor. - It assumes factorization frequency will not be changed. - This resizes model !!!! - */ - ClpGubDynamicMatrix(ClpSimplex * model, int numberSets, - int numberColumns, const int * starts, - const double * lower, const double * upper, - const int * startColumn, const int * row, - const double * element, const double * cost, - const double * lowerColumn = NULL, const double * upperColumn = NULL, - const unsigned char * status = NULL); - - ClpGubDynamicMatrix& operator=(const ClpGubDynamicMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - //@} - /**@name gets and sets */ - //@{ - /// enums for status of various sorts - enum DynamicStatus { - inSmall = 0x01, - atUpperBound = 0x02, - atLowerBound = 0x03 - }; - /// Whether flagged - inline bool flagged(int i) const { - return (dynamicStatus_[i] & 8) != 0; - } - inline void setFlagged(int i) { - dynamicStatus_[i] = static_cast(dynamicStatus_[i] | 8); - } - inline void unsetFlagged(int i) { - dynamicStatus_[i] = static_cast(dynamicStatus_[i] & ~8); - } - inline void setDynamicStatus(int sequence, DynamicStatus status) { - unsigned char & st_byte = dynamicStatus_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | status); - } - inline DynamicStatus getDynamicStatus(int sequence) const { - return static_cast (dynamicStatus_[sequence] & 7); - } - /// Saved value of objective offset - inline double objectiveOffset() const { - return objectiveOffset_; - } - /// Starts of each column - inline CoinBigIndex * startColumn() const { - return startColumn_; - } - /// rows - inline int * row() const { - return row_; - } - /// elements - inline double * element() const { - return element_; - } - /// costs - inline double * cost() const { - return cost_; - } - /// full starts - inline int * fullStart() const { - return fullStart_; - } - /// ids of active columns (just index here) - inline int * id() const { - return id_; - } - /// Optional lower bounds on columns - inline double * lowerColumn() const { - return lowerColumn_; - } - /// Optional upper bounds on columns - inline double * upperColumn() const { - return upperColumn_; - } - /// Optional true lower bounds on sets - inline double * lowerSet() const { - return lowerSet_; - } - /// Optional true upper bounds on sets - inline double * upperSet() const { - return upperSet_; - } - /// size - inline int numberGubColumns() const { - return numberGubColumns_; - } - /// first free - inline int firstAvailable() const { - return firstAvailable_; - } - /// set first free - inline void setFirstAvailable(int value) { - firstAvailable_ = value; - } - /// first dynamic - inline int firstDynamic() const { - return firstDynamic_; - } - /// number of columns in dynamic model - inline int lastDynamic() const { - return lastDynamic_; - } - /// size of working matrix (max) - inline int numberElements() const { - return numberElements_; - } - /// Status region for gub slacks - inline unsigned char * gubRowStatus() const { - return status_; - } - /// Status region for gub variables - inline unsigned char * dynamicStatus() const { - return dynamicStatus_; - } - /// Returns which set a variable is in - int whichSet (int sequence) const; - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Saved value of objective offset - double objectiveOffset_; - /// Starts of each column - CoinBigIndex * startColumn_; - /// rows - int * row_; - /// elements - double * element_; - /// costs - double * cost_; - /// full starts - int * fullStart_; - /// ids of active columns (just index here) - int * id_; - /// for status and which bound - unsigned char * dynamicStatus_; - /// Optional lower bounds on columns - double * lowerColumn_; - /// Optional upper bounds on columns - double * upperColumn_; - /// Optional true lower bounds on sets - double * lowerSet_; - /// Optional true upper bounds on sets - double * upperSet_; - /// size - int numberGubColumns_; - /// first free - int firstAvailable_; - /// saved first free - int savedFirstAvailable_; - /// first dynamic - int firstDynamic_; - /// number of columns in dynamic model - int lastDynamic_; - /// size of working matrix (max) - int numberElements_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpGubMatrix.hpp b/thirdparty/linux/include/coin1/ClpGubMatrix.hpp deleted file mode 100644 index 26c3f624..00000000 --- a/thirdparty/linux/include/coin1/ClpGubMatrix.hpp +++ /dev/null @@ -1,358 +0,0 @@ -/* $Id: ClpGubMatrix.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpGubMatrix_H -#define ClpGubMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpPackedMatrix.hpp" -class ClpSimplex; -/** This implements Gub rows plus a ClpPackedMatrix. - - There will be a version using ClpPlusMinusOne matrix but - there is no point doing one with ClpNetworkMatrix (although - an embedded network is attractive). - -*/ - -class ClpGubMatrix : public ClpPackedMatrix { - -public: - /**@name Main functions provided */ - //@{ - /** Returns a new matrix in reverse order without gaps (GUB wants NULL) */ - virtual ClpMatrixBase * reverseOrderedCopy() const; - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis(const int * whichColumn, - int & numberColumnBasic); - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element); - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const ; - /** Unpacks a column into an CoinIndexedvector - ** in packed foramt - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const ; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const; - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - /// Returns number of hidden rows e.g. gub - virtual int hiddenRows() const; - //@} - - /**@name Matrix times vector methods */ - //@{ - - using ClpPackedMatrix::transposeTimes ; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex. - This version uses row copy*/ - virtual void transposeTimesByRow(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x *A in z but - just for indices in y. - Note - z always packed mode */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** expands an updated column to allow for extra rows which the main - solver does not know about and returns number added if mode 0. - If mode 1 deletes extra entries - - This active in Gub - */ - virtual int extendUpdated(ClpSimplex * model, CoinIndexedVector * update, int mode); - /** - mode=0 - Set up before "update" and "times" for primal solution using extended rows - mode=1 - Cleanup primal solution after "times" using extended rows. - mode=2 - Check (or report on) primal infeasibilities - */ - virtual void primalExpanded(ClpSimplex * model, int mode); - /** - mode=0 - Set up before "updateTranspose" and "transposeTimes" for duals using extended - updates array (and may use other if dual values pass) - mode=1 - Update dual solution after "transposeTimes" using extended rows. - mode=2 - Compute all djs and compute key dual infeasibilities - mode=3 - Report on key dual infeasibilities - mode=4 - Modify before updateTranspose in partial pricing - */ - virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array, - double * other, int mode); - /** - mode=0 - Create list of non-key basics in pivotVariable_ using - number as numberBasic in and out - mode=1 - Set all key variables as basic - mode=2 - return number extra rows needed, number gives maximum number basic - mode=3 - before replaceColumn - mode=4 - return 1 if can do primal, 2 if dual, 3 if both - mode=5 - save any status stuff (when in good state) - mode=6 - restore status stuff - mode=7 - flag given variable (normally sequenceIn) - mode=8 - unflag all variables - mode=9 - synchronize costs - mode=10 - return 1 if there may be changing bounds on variable (column generation) - mode=11 - make sure set is clean (used when a variable rejected - but not flagged) - mode=12 - after factorize but before permute stuff - mode=13 - at end of simplex to delete stuff - */ - virtual int generalExpanded(ClpSimplex * model, int mode, int & number); - /** - update information for a pivot (and effective rhs) - */ - virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue); - /// Sets up an effective RHS and does gub crash if needed - virtual void useEffectiveRhs(ClpSimplex * model, bool cheapest = true); - /** Returns effective RHS offset if it is being used. This is used for long problems - or big gub or anywhere where going through full columns is - expensive. This may re-compute */ - virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false, - bool check = false); - /** This is local to Gub to allow synchronization: - mode=0 when status of basis is good - mode=1 when variable is flagged - mode=2 when all variables unflagged (returns number flagged) - mode=3 just reset costs (primal) - mode=4 correct number of dual infeasibilities - mode=5 return 4 if time to re-factorize - mode=6 - return 1 if there may be changing bounds on variable (column generation) - mode=7 - do extra restores for column generation - mode=8 - make sure set is clean - mode=9 - adjust lower, upper on set by incoming - */ - virtual int synchronize(ClpSimplex * model, int mode); - /// Correct sequence in and out to give true value - virtual void correctSequence(const ClpSimplex * model, int & sequenceIn, int & sequenceOut) ; - //@} - - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpGubMatrix(); - /** Destructor */ - virtual ~ClpGubMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpGubMatrix(const ClpGubMatrix&); - /** The copy constructor from an CoinPackedMatrix. */ - ClpGubMatrix(const CoinPackedMatrix&); - /** Subset constructor (without gaps). Duplicates are allowed - and order is as given */ - ClpGubMatrix (const ClpGubMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - ClpGubMatrix (const CoinPackedMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - - /** This takes over ownership (for space reasons) */ - ClpGubMatrix(CoinPackedMatrix * matrix); - - /** This takes over ownership (for space reasons) and is the - real constructor*/ - ClpGubMatrix(ClpPackedMatrix * matrix, int numberSets, - const int * start, const int * end, - const double * lower, const double * upper, - const unsigned char * status = NULL); - - ClpGubMatrix& operator=(const ClpGubMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - /** Subset clone (without gaps). Duplicates are allowed - and order is as given */ - virtual ClpMatrixBase * subsetClone ( - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns) const ; - /** redoes next_ for a set. */ - void redoSet(ClpSimplex * model, int newKey, int oldKey, int iSet); - //@} - /**@name gets and sets */ - //@{ - /// Status - inline ClpSimplex::Status getStatus(int sequence) const { - return static_cast (status_[sequence] & 7); - } - inline void setStatus(int sequence, ClpSimplex::Status status) { - unsigned char & st_byte = status_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | status); - } - /// To flag a variable - inline void setFlagged( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 64); - } - inline void clearFlagged( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~64); - } - inline bool flagged(int sequence) const { - return ((status_[sequence] & 64) != 0); - } - /// To say key is above ub - inline void setAbove( int sequence) { - unsigned char iStat = status_[sequence]; - iStat = static_cast(iStat & ~24); - status_[sequence] = static_cast(iStat | 16); - } - /// To say key is feasible - inline void setFeasible( int sequence) { - unsigned char iStat = status_[sequence]; - iStat = static_cast(iStat & ~24); - status_[sequence] = static_cast(iStat | 8); - } - /// To say key is below lb - inline void setBelow( int sequence) { - unsigned char iStat = status_[sequence]; - iStat = static_cast(iStat & ~24); - status_[sequence] = iStat; - } - inline double weight( int sequence) const { - int iStat = status_[sequence] & 31; - iStat = iStat >> 3; - return static_cast (iStat - 1); - } - /// Starts - inline int * start() const { - return start_; - } - /// End - inline int * end() const { - return end_; - } - /// Lower bounds on sets - inline double * lower() const { - return lower_; - } - /// Upper bounds on sets - inline double * upper() const { - return upper_; - } - /// Key variable of set - inline int * keyVariable() const { - return keyVariable_; - } - /// Backward pointer to set number - inline int * backward() const { - return backward_; - } - /// Number of sets (gub rows) - inline int numberSets() const { - return numberSets_; - } - /// Switches off dj checking each factorization (for BIG models) - void switchOffCheck(); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Sum of dual infeasibilities - double sumDualInfeasibilities_; - /// Sum of primal infeasibilities - double sumPrimalInfeasibilities_; - /// Sum of Dual infeasibilities using tolerance based on error in duals - double sumOfRelaxedDualInfeasibilities_; - /// Sum of Primal infeasibilities using tolerance based on error in primals - double sumOfRelaxedPrimalInfeasibilities_; - /// Infeasibility weight when last full pass done - double infeasibilityWeight_; - /// Starts - int * start_; - /// End - int * end_; - /// Lower bounds on sets - double * lower_; - /// Upper bounds on sets - double * upper_; - /// Status of slacks - mutable unsigned char * status_; - /// Saved status of slacks - unsigned char * saveStatus_; - /// Saved key variables - int * savedKeyVariable_; - /// Backward pointer to set number - int * backward_; - /// Backward pointer to pivot row !!! - int * backToPivotRow_; - /// Change in costs for keys - double * changeCost_; - /// Key variable of set - mutable int * keyVariable_; - /** Next basic variable in set - starts at key and end with -(set+1). - Now changes to -(nonbasic+1). - next_ has extra space for 2* longest set */ - mutable int * next_; - /// Backward pointer to index in CoinIndexedVector - int * toIndex_; - // Reverse pointer from index to set - int * fromIndex_; - /// Pointer back to model - ClpSimplex * model_; - /// Number of dual infeasibilities - int numberDualInfeasibilities_; - /// Number of primal infeasibilities - int numberPrimalInfeasibilities_; - /** If pricing will declare victory (i.e. no check every factorization). - -1 - always check - 0 - don't check - 1 - in don't check mode but looks optimal - */ - int noCheck_; - /// Number of sets (gub rows) - int numberSets_; - /// Number in vector without gub extension - int saveNumber_; - /// Pivot row of possible next key - int possiblePivotKey_; - /// Gub slack in (set number or -1) - int gubSlackIn_; - /// First gub variables (same as start_[0] at present) - int firstGub_; - /// last gub variable (same as end_[numberSets_-1] at present) - int lastGub_; - /** type of gub - 0 not contiguous, 1 contiguous - add 8 bit to say no ubs on individual variables */ - int gubType_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpInterior.hpp b/thirdparty/linux/include/coin1/ClpInterior.hpp deleted file mode 100644 index 7f87e1e4..00000000 --- a/thirdparty/linux/include/coin1/ClpInterior.hpp +++ /dev/null @@ -1,570 +0,0 @@ -/* $Id: ClpInterior.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Tomlin (pdco) - John Forrest (standard predictor-corrector) - - Note JJF has added arrays - this takes more memory but makes - flow easier to understand and hopefully easier to extend - - */ -#ifndef ClpInterior_H -#define ClpInterior_H - -#include -#include -#include "ClpModel.hpp" -#include "ClpMatrixBase.hpp" -#include "ClpSolve.hpp" -#include "CoinDenseVector.hpp" -class ClpLsqr; -class ClpPdcoBase; -/// ******** DATA to be moved into protected section of ClpInterior -typedef struct { - double atolmin; - double r3norm; - double LSdamp; - double* deltay; -} Info; -/// ******** DATA to be moved into protected section of ClpInterior - -typedef struct { - double atolold; - double atolnew; - double r3ratio; - int istop; - int itncg; -} Outfo; -/// ******** DATA to be moved into protected section of ClpInterior - -typedef struct { - double gamma; - double delta; - int MaxIter; - double FeaTol; - double OptTol; - double StepTol; - double x0min; - double z0min; - double mu0; - int LSmethod; // 1=Cholesky 2=QR 3=LSQR - int LSproblem; // See below - int LSQRMaxIter; - double LSQRatol1; // Initial atol - double LSQRatol2; // Smallest atol (unless atol1 is smaller) - double LSQRconlim; - int wait; -} Options; -class Lsqr; -class ClpCholeskyBase; -// ***** END -/** This solves LPs using interior point methods - - It inherits from ClpModel and all its arrays are created at - algorithm time. - -*/ - -class ClpInterior : public ClpModel { - friend void ClpInteriorUnitTest(const std::string & mpsDir, - const std::string & netlibDir); - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - ClpInterior ( ); - - /// Copy constructor. - ClpInterior(const ClpInterior &); - /// Copy constructor from model. - ClpInterior(const ClpModel &); - /** Subproblem constructor. A subset of whole model is created from the - row and column lists given. The new order is given by list order and - duplicates are allowed. Name and integer information can be dropped - */ - ClpInterior (const ClpModel * wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns, - bool dropNames = true, bool dropIntegers = true); - /// Assignment operator. This copies the data - ClpInterior & operator=(const ClpInterior & rhs); - /// Destructor - ~ClpInterior ( ); - // Ones below are just ClpModel with some changes - /** Loads a problem (the constraints on the - rows are given by lower and upper bounds). If a pointer is 0 then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - void loadProblem ( const ClpMatrixBase& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - void loadProblem ( const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - - /** Just like the other loadProblem() method except that the matrix is - given in a standard column major ordered format (without gaps). */ - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /// This one is for after presolve to save memory - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, const int * length, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /// Read an mps file from the given filename - int readMps(const char *filename, - bool keepNames = false, - bool ignoreErrors = false); - /** Borrow model. This is so we dont have to copy large amounts - of data around. It assumes a derived class wants to overwrite - an empty model with a real one - while it does an algorithm. - This is same as ClpModel one. */ - void borrowModel(ClpModel & otherModel); - /** Return model - updates any scalars */ - void returnModel(ClpModel & otherModel); - //@} - - /**@name Functions most useful to user */ - //@{ - /** Pdco algorithm - see ClpPdco.hpp for method */ - int pdco(); - // ** Temporary version - int pdco( ClpPdcoBase * stuff, Options &options, Info &info, Outfo &outfo); - /// Primal-Dual Predictor-Corrector barrier - int primalDual(); - //@} - - /**@name most useful gets and sets */ - //@{ - /// If problem is primal feasible - inline bool primalFeasible() const { - return (sumPrimalInfeasibilities_ <= 1.0e-5); - } - /// If problem is dual feasible - inline bool dualFeasible() const { - return (sumDualInfeasibilities_ <= 1.0e-5); - } - /// Current (or last) algorithm - inline int algorithm() const { - return algorithm_; - } - /// Set algorithm - inline void setAlgorithm(int value) { - algorithm_ = value; - } - /// Sum of dual infeasibilities - inline CoinWorkDouble sumDualInfeasibilities() const { - return sumDualInfeasibilities_; - } - /// Sum of primal infeasibilities - inline CoinWorkDouble sumPrimalInfeasibilities() const { - return sumPrimalInfeasibilities_; - } - /// dualObjective. - inline CoinWorkDouble dualObjective() const { - return dualObjective_; - } - /// primalObjective. - inline CoinWorkDouble primalObjective() const { - return primalObjective_; - } - /// diagonalNorm - inline CoinWorkDouble diagonalNorm() const { - return diagonalNorm_; - } - /// linearPerturbation - inline CoinWorkDouble linearPerturbation() const { - return linearPerturbation_; - } - inline void setLinearPerturbation(CoinWorkDouble value) { - linearPerturbation_ = value; - } - /// projectionTolerance - inline CoinWorkDouble projectionTolerance() const { - return projectionTolerance_; - } - inline void setProjectionTolerance(CoinWorkDouble value) { - projectionTolerance_ = value; - } - /// diagonalPerturbation - inline CoinWorkDouble diagonalPerturbation() const { - return diagonalPerturbation_; - } - inline void setDiagonalPerturbation(CoinWorkDouble value) { - diagonalPerturbation_ = value; - } - /// gamma - inline CoinWorkDouble gamma() const { - return gamma_; - } - inline void setGamma(CoinWorkDouble value) { - gamma_ = value; - } - /// delta - inline CoinWorkDouble delta() const { - return delta_; - } - inline void setDelta(CoinWorkDouble value) { - delta_ = value; - } - /// ComplementarityGap - inline CoinWorkDouble complementarityGap() const { - return complementarityGap_; - } - //@} - - /**@name most useful gets and sets */ - //@{ - /// Largest error on Ax-b - inline CoinWorkDouble largestPrimalError() const { - return largestPrimalError_; - } - /// Largest error on basic duals - inline CoinWorkDouble largestDualError() const { - return largestDualError_; - } - /// Maximum iterations - inline int maximumBarrierIterations() const { - return maximumBarrierIterations_; - } - inline void setMaximumBarrierIterations(int value) { - maximumBarrierIterations_ = value; - } - /// Set cholesky (and delete present one) - void setCholesky(ClpCholeskyBase * cholesky); - /// Return number fixed to see if worth presolving - int numberFixed() const; - /** fix variables interior says should be. If reallyFix false then just - set values to exact bounds */ - void fixFixed(bool reallyFix = true); - /// Primal erturbation vector - inline CoinWorkDouble * primalR() const { - return primalR_; - } - /// Dual erturbation vector - inline CoinWorkDouble * dualR() const { - return dualR_; - } - //@} - -protected: - /**@name protected methods */ - //@{ - /// Does most of deletion - void gutsOfDelete(); - /// Does most of copying - void gutsOfCopy(const ClpInterior & rhs); - /// Returns true if data looks okay, false if not - bool createWorkingData(); - void deleteWorkingData(); - /// Sanity check on input rim data - bool sanityCheck(); - /// This does housekeeping - int housekeeping(); - //@} -public: - /**@name public methods */ - //@{ - /// Raw objective value (so always minimize) - inline CoinWorkDouble rawObjectiveValue() const { - return objectiveValue_; - } - /// Returns 1 if sequence indicates column - inline int isColumn(int sequence) const { - return sequence < numberColumns_ ? 1 : 0; - } - /// Returns sequence number within section - inline int sequenceWithin(int sequence) const { - return sequence < numberColumns_ ? sequence : sequence - numberColumns_; - } - /// Checks solution - void checkSolution(); - /** Modifies djs to allow for quadratic. - returns quadratic offset */ - CoinWorkDouble quadraticDjs(CoinWorkDouble * djRegion, const CoinWorkDouble * solution, - CoinWorkDouble scaleFactor); - - /// To say a variable is fixed - inline void setFixed( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 1) ; - } - inline void clearFixed( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~1) ; - } - inline bool fixed(int sequence) const { - return ((status_[sequence] & 1) != 0); - } - - /// To flag a variable - inline void setFlagged( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 2) ; - } - inline void clearFlagged( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~2) ; - } - inline bool flagged(int sequence) const { - return ((status_[sequence] & 2) != 0); - } - - /// To say a variable is fixed OR free - inline void setFixedOrFree( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 4) ; - } - inline void clearFixedOrFree( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~4) ; - } - inline bool fixedOrFree(int sequence) const { - return ((status_[sequence] & 4) != 0); - } - - /// To say a variable has lower bound - inline void setLowerBound( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 8) ; - } - inline void clearLowerBound( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~8) ; - } - inline bool lowerBound(int sequence) const { - return ((status_[sequence] & 8) != 0); - } - - /// To say a variable has upper bound - inline void setUpperBound( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 16) ; - } - inline void clearUpperBound( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~16) ; - } - inline bool upperBound(int sequence) const { - return ((status_[sequence] & 16) != 0); - } - - /// To say a variable has fake lower bound - inline void setFakeLower( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 32) ; - } - inline void clearFakeLower( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~32) ; - } - inline bool fakeLower(int sequence) const { - return ((status_[sequence] & 32) != 0); - } - - /// To say a variable has fake upper bound - inline void setFakeUpper( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 64) ; - } - inline void clearFakeUpper( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~64) ; - } - inline bool fakeUpper(int sequence) const { - return ((status_[sequence] & 64) != 0); - } - //@} - -////////////////// data ////////////////// -protected: - - /**@name data. Many arrays have a row part and a column part. - There is a single array with both - columns then rows and - then normally two arrays pointing to rows and columns. The - single array is the owner of memory - */ - //@{ - /// Largest error on Ax-b - CoinWorkDouble largestPrimalError_; - /// Largest error on basic duals - CoinWorkDouble largestDualError_; - /// Sum of dual infeasibilities - CoinWorkDouble sumDualInfeasibilities_; - /// Sum of primal infeasibilities - CoinWorkDouble sumPrimalInfeasibilities_; - /// Worst complementarity - CoinWorkDouble worstComplementarity_; - /// -public: - CoinWorkDouble xsize_; - CoinWorkDouble zsize_; -protected: - /// Working copy of lower bounds (Owner of arrays below) - CoinWorkDouble * lower_; - /// Row lower bounds - working copy - CoinWorkDouble * rowLowerWork_; - /// Column lower bounds - working copy - CoinWorkDouble * columnLowerWork_; - /// Working copy of upper bounds (Owner of arrays below) - CoinWorkDouble * upper_; - /// Row upper bounds - working copy - CoinWorkDouble * rowUpperWork_; - /// Column upper bounds - working copy - CoinWorkDouble * columnUpperWork_; - /// Working copy of objective - CoinWorkDouble * cost_; -public: - /// Rhs - CoinWorkDouble * rhs_; - CoinWorkDouble * x_; - CoinWorkDouble * y_; - CoinWorkDouble * dj_; -protected: - /// Pointer to Lsqr object - ClpLsqr * lsqrObject_; - /// Pointer to stuff - ClpPdcoBase * pdcoStuff_; - /// Below here is standard barrier stuff - /// mu. - CoinWorkDouble mu_; - /// objectiveNorm. - CoinWorkDouble objectiveNorm_; - /// rhsNorm. - CoinWorkDouble rhsNorm_; - /// solutionNorm. - CoinWorkDouble solutionNorm_; - /// dualObjective. - CoinWorkDouble dualObjective_; - /// primalObjective. - CoinWorkDouble primalObjective_; - /// diagonalNorm. - CoinWorkDouble diagonalNorm_; - /// stepLength - CoinWorkDouble stepLength_; - /// linearPerturbation - CoinWorkDouble linearPerturbation_; - /// diagonalPerturbation - CoinWorkDouble diagonalPerturbation_; - // gamma from Saunders and Tomlin regularized - CoinWorkDouble gamma_; - // delta from Saunders and Tomlin regularized - CoinWorkDouble delta_; - /// targetGap - CoinWorkDouble targetGap_; - /// projectionTolerance - CoinWorkDouble projectionTolerance_; - /// maximumRHSError. maximum Ax - CoinWorkDouble maximumRHSError_; - /// maximumBoundInfeasibility. - CoinWorkDouble maximumBoundInfeasibility_; - /// maximumDualError. - CoinWorkDouble maximumDualError_; - /// diagonalScaleFactor. - CoinWorkDouble diagonalScaleFactor_; - /// scaleFactor. For scaling objective - CoinWorkDouble scaleFactor_; - /// actualPrimalStep - CoinWorkDouble actualPrimalStep_; - /// actualDualStep - CoinWorkDouble actualDualStep_; - /// smallestInfeasibility - CoinWorkDouble smallestInfeasibility_; - /// historyInfeasibility. -#define LENGTH_HISTORY 5 - CoinWorkDouble historyInfeasibility_[LENGTH_HISTORY]; - /// complementarityGap. - CoinWorkDouble complementarityGap_; - /// baseObjectiveNorm - CoinWorkDouble baseObjectiveNorm_; - /// worstDirectionAccuracy - CoinWorkDouble worstDirectionAccuracy_; - /// maximumRHSChange - CoinWorkDouble maximumRHSChange_; - /// errorRegion. i.e. Ax - CoinWorkDouble * errorRegion_; - /// rhsFixRegion. - CoinWorkDouble * rhsFixRegion_; - /// upperSlack - CoinWorkDouble * upperSlack_; - /// lowerSlack - CoinWorkDouble * lowerSlack_; - /// diagonal - CoinWorkDouble * diagonal_; - /// solution - CoinWorkDouble * solution_; - /// work array - CoinWorkDouble * workArray_; - /// delta X - CoinWorkDouble * deltaX_; - /// delta Y - CoinWorkDouble * deltaY_; - /// deltaZ. - CoinWorkDouble * deltaZ_; - /// deltaW. - CoinWorkDouble * deltaW_; - /// deltaS. - CoinWorkDouble * deltaSU_; - CoinWorkDouble * deltaSL_; - /// Primal regularization array - CoinWorkDouble * primalR_; - /// Dual regularization array - CoinWorkDouble * dualR_; - /// rhs B - CoinWorkDouble * rhsB_; - /// rhsU. - CoinWorkDouble * rhsU_; - /// rhsL. - CoinWorkDouble * rhsL_; - /// rhsZ. - CoinWorkDouble * rhsZ_; - /// rhsW. - CoinWorkDouble * rhsW_; - /// rhs C - CoinWorkDouble * rhsC_; - /// zVec - CoinWorkDouble * zVec_; - /// wVec - CoinWorkDouble * wVec_; - /// cholesky. - ClpCholeskyBase * cholesky_; - /// numberComplementarityPairs i.e. ones with lower and/or upper bounds (not fixed) - int numberComplementarityPairs_; - /// numberComplementarityItems_ i.e. number of active bounds - int numberComplementarityItems_; - /// Maximum iterations - int maximumBarrierIterations_; - /// gonePrimalFeasible. - bool gonePrimalFeasible_; - /// goneDualFeasible. - bool goneDualFeasible_; - /// Which algorithm being used - int algorithm_; - //@} -}; -//############################################################################# -/** A function that tests the methods in the ClpInterior class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. - - It also does some testing of ClpFactorization class - */ -void -ClpInteriorUnitTest(const std::string & mpsDir, - const std::string & netlibDir); - - -#endif diff --git a/thirdparty/linux/include/coin1/ClpLinearObjective.hpp b/thirdparty/linux/include/coin1/ClpLinearObjective.hpp deleted file mode 100644 index ff035d47..00000000 --- a/thirdparty/linux/include/coin1/ClpLinearObjective.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/* $Id: ClpLinearObjective.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpLinearObjective_H -#define ClpLinearObjective_H - -#include "ClpObjective.hpp" - -//############################################################################# - -/** Linear Objective Class - -*/ - -class ClpLinearObjective : public ClpObjective { - -public: - - ///@name Stuff - //@{ - - /** Returns objective coefficients. - - Offset is always set to 0.0. All other parameters unused. - */ - virtual double * gradient(const ClpSimplex * model, - const double * solution, double & offset, bool refresh, - int includeLinear = 2); - /** Returns reduced gradient.Returns an offset (to be added to current one). - */ - virtual double reducedGradient(ClpSimplex * model, double * region, - bool useFeasibleCosts); - /** Returns step length which gives minimum of objective for - solution + theta * change vector up to maximum theta. - - arrays are numberColumns+numberRows - Also sets current objective, predicted and at maximumTheta - */ - virtual double stepLength(ClpSimplex * model, - const double * solution, - const double * change, - double maximumTheta, - double & currentObj, - double & predictedObj, - double & thetaObj); - /// Return objective value (without any ClpModel offset) (model may be NULL) - virtual double objectiveValue(const ClpSimplex * model, const double * solution) const ; - /// Resize objective - virtual void resize(int newNumberColumns) ; - /// Delete columns in objective - virtual void deleteSome(int numberToDelete, const int * which) ; - /// Scale objective - virtual void reallyScale(const double * columnScale) ; - - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpLinearObjective(); - - /// Constructor from objective - ClpLinearObjective(const double * objective, int numberColumns); - - /// Copy constructor - ClpLinearObjective(const ClpLinearObjective &); - /** Subset constructor. Duplicates are allowed - and order is as given. - */ - ClpLinearObjective (const ClpLinearObjective &rhs, int numberColumns, - const int * whichColumns) ; - - /// Assignment operator - ClpLinearObjective & operator=(const ClpLinearObjective& rhs); - - /// Destructor - virtual ~ClpLinearObjective (); - - /// Clone - virtual ClpObjective * clone() const; - /** Subset clone. Duplicates are allowed - and order is as given. - */ - virtual ClpObjective * subsetClone (int numberColumns, - const int * whichColumns) const; - - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - /// Objective - double * objective_; - /// number of columns - int numberColumns_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpMatrixBase.hpp b/thirdparty/linux/include/coin1/ClpMatrixBase.hpp deleted file mode 100644 index 06dc523b..00000000 --- a/thirdparty/linux/include/coin1/ClpMatrixBase.hpp +++ /dev/null @@ -1,524 +0,0 @@ -/* $Id: ClpMatrixBase.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpMatrixBase_H -#define ClpMatrixBase_H - -#include "CoinPragma.hpp" -#include "CoinTypes.hpp" - -#include "CoinPackedMatrix.hpp" -class CoinIndexedVector; -class ClpSimplex; -class ClpModel; -// Compilers can produce better code if they know about __restrict -#ifndef COIN_RESTRICT -#ifdef COIN_USE_RESTRICT -#define COIN_RESTRICT __restrict -#else -#define COIN_RESTRICT -#endif -#endif - -/** Abstract base class for Clp Matrices - -Since this class is abstract, no object of this type can be created. - -If a derived class provides all methods then all Clp algorithms -should work. Some can be very inefficient e.g. getElements etc is -only used for tightening bounds for dual and the copies are -deleted. Many methods can just be dummy i.e. abort(); if not -all features are being used. So if column generation was being done -then it makes no sense to do steepest edge so there would be -no point providing subsetTransposeTimes. -*/ - -class ClpMatrixBase { - -public: - /**@name Virtual methods that the derived classes must provide */ - //@{ - /// Return a complete CoinPackedMatrix - virtual CoinPackedMatrix * getPackedMatrix() const = 0; - /** Whether the packed matrix is column major ordered or not. */ - virtual bool isColOrdered() const = 0; - /** Number of entries in the packed matrix. */ - virtual CoinBigIndex getNumElements() const = 0; - /** Number of columns. */ - virtual int getNumCols() const = 0; - /** Number of rows. */ - virtual int getNumRows() const = 0; - - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with vectorStarts and vectorLengths. */ - virtual const double * getElements() const = 0; - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with vectorStarts and - vectorLengths. */ - virtual const int * getIndices() const = 0; - - virtual const CoinBigIndex * getVectorStarts() const = 0; - /** The lengths of the major-dimension vectors. */ - virtual const int * getVectorLengths() const = 0 ; - /** The length of a single major-dimension vector. */ - virtual int getVectorLength(int index) const ; - /** Delete the columns whose indices are listed in indDel. */ - virtual void deleteCols(const int numDel, const int * indDel) = 0; - /** Delete the rows whose indices are listed in indDel. */ - virtual void deleteRows(const int numDel, const int * indDel) = 0; -#ifndef CLP_NO_VECTOR - /// Append Columns - virtual void appendCols(int number, const CoinPackedVectorBase * const * columns); - /// Append Rows - virtual void appendRows(int number, const CoinPackedVectorBase * const * rows); -#endif - /** Modify one element of packed matrix. An element may be added. - This works for either ordering If the new element is zero it will be - deleted unless keepZero true */ - virtual void modifyCoefficient(int row, int column, double newElement, - bool keepZero = false); - /** Append a set of rows/columns to the end of the matrix. Returns number of errors - i.e. if any of the new rows/columns contain an index that's larger than the - number of columns-1/rows-1 (if numberOther>0) or duplicates - If 0 then rows, 1 if columns */ - virtual int appendMatrix(int number, int type, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther = -1); - - /** Returns a new matrix in reverse order without gaps - Is allowed to return NULL if doesn't want to have row copy */ - virtual ClpMatrixBase * reverseOrderedCopy() const { - return NULL; - } - - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis(const int * whichColumn, - int & numberColumnBasic) = 0; - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element) = 0; - /** Creates scales for column copy (rowCopy in model may be modified) - default does not allow scaling - returns non-zero if no scaling done */ - virtual int scale(ClpModel * , const ClpSimplex * = NULL) const { - return 1; - } - /** Scales rowCopy if column copy scaled - Only called if scales already exist */ - virtual void scaleRowCopy(ClpModel * ) const { } - /// Returns true if can create row copy - virtual bool canGetRowCopy() const { - return true; - } - /** Realy really scales column copy - Only called if scales already exist. - Up to user to delete */ - inline virtual ClpMatrixBase * scaledColumnCopy(ClpModel * ) const { - return this->clone(); - } - - /** Checks if all elements are in valid range. Can just - return true if you are not paranoid. For Clp I will - probably expect no zeros. Code can modify matrix to get rid of - small elements. - check bits (can be turned off to save time) : - 1 - check if matrix has gaps - 2 - check if zero elements - 4 - check and compress duplicates - 8 - report on large and small - */ - virtual bool allElementsInRange(ClpModel * , - double , double , - int = 15) { - return true; - } - /** Set the dimensions of the matrix. In effect, append new empty - columns/rows to the matrix. A negative number for either dimension - means that that dimension doesn't change. Otherwise the new dimensions - MUST be at least as large as the current ones otherwise an exception - is thrown. */ - virtual void setDimensions(int numrows, int numcols); - /** Returns largest and smallest elements of both signs. - Largest refers to largest absolute value. - If returns zeros then can't tell anything */ - virtual void rangeOfElements(double & smallestNegative, double & largestNegative, - double & smallestPositive, double & largestPositive); - - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const = 0; - /** Unpacks a column into an CoinIndexedvector - ** in packed format - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const = 0; - /** Purely for column generation and similar ideas. Allows - matrix and any bounds or costs to be updated (sensibly). - Returns non-zero if any changes. - */ - virtual int refresh(ClpSimplex * ) { - return 0; - } - - // Really scale matrix - virtual void reallyScale(const double * rowScale, const double * columnScale); - /** Given positive integer weights for each row fills in sum of weights - for each column (and slack). - Returns weights vector - Default returns vector of ones - */ - virtual CoinBigIndex * dubiousWeights(const ClpSimplex * model, int * inputWeights) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const = 0; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const = 0; - /// Allow any parts of a created CoinPackedMatrix to be deleted - virtual void releasePackedMatrix() const = 0; - /// Says whether it can do partial pricing - virtual bool canDoPartialPricing() const; - /// Returns number of hidden rows e.g. gub - virtual int hiddenRows() const; - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - /** expands an updated column to allow for extra rows which the main - solver does not know about and returns number added. - - This will normally be a no-op - it is in for GUB but may get extended to - general non-overlapping and embedded networks. - - mode 0 - extend - mode 1 - delete etc - */ - virtual int extendUpdated(ClpSimplex * model, CoinIndexedVector * update, int mode); - /** - utility primal function for dealing with dynamic constraints - mode=0 - Set up before "update" and "times" for primal solution using extended rows - mode=1 - Cleanup primal solution after "times" using extended rows. - mode=2 - Check (or report on) primal infeasibilities - */ - virtual void primalExpanded(ClpSimplex * model, int mode); - /** - utility dual function for dealing with dynamic constraints - mode=0 - Set up before "updateTranspose" and "transposeTimes" for duals using extended - updates array (and may use other if dual values pass) - mode=1 - Update dual solution after "transposeTimes" using extended rows. - mode=2 - Compute all djs and compute key dual infeasibilities - mode=3 - Report on key dual infeasibilities - mode=4 - Modify before updateTranspose in partial pricing - */ - virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array, - double * other, int mode); - /** - general utility function for dealing with dynamic constraints - mode=0 - Create list of non-key basics in pivotVariable_ using - number as numberBasic in and out - mode=1 - Set all key variables as basic - mode=2 - return number extra rows needed, number gives maximum number basic - mode=3 - before replaceColumn - mode=4 - return 1 if can do primal, 2 if dual, 3 if both - mode=5 - save any status stuff (when in good state) - mode=6 - restore status stuff - mode=7 - flag given variable (normally sequenceIn) - mode=8 - unflag all variables - mode=9 - synchronize costs and bounds - mode=10 - return 1 if there may be changing bounds on variable (column generation) - mode=11 - make sure set is clean (used when a variable rejected - but not flagged) - mode=12 - after factorize but before permute stuff - mode=13 - at end of simplex to delete stuff - - */ - virtual int generalExpanded(ClpSimplex * model, int mode, int & number); - /** - update information for a pivot (and effective rhs) - */ - virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue); - /** Creates a variable. This is called after partial pricing and may modify matrix. - May update bestSequence. - */ - virtual void createVariable(ClpSimplex * model, int & bestSequence); - /** Just for debug if odd type matrix. - Returns number of primal infeasibilities. */ - virtual int checkFeasible(ClpSimplex * model, double & sum) const ; - /// Returns reduced cost of a variable - double reducedCost(ClpSimplex * model, int sequence) const; - /// Correct sequence in and out to give true value (if both -1 maybe do whole matrix) - virtual void correctSequence(const ClpSimplex * model, int & sequenceIn, int & sequenceOut) ; - //@} - - //--------------------------------------------------------------------------- - /**@name Matrix times vector methods - They can be faster if scalar is +- 1 - Also for simplex I am not using basic/non-basic split */ - //@{ - /** Return y + A * x * scalar in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * COIN_RESTRICT x, double * COIN_RESTRICT y) const = 0; - /** And for scaling - default aborts for when scaling not supported - (unless pointers NULL when as normal) - */ - virtual void times(double scalar, - const double * COIN_RESTRICT x, double * COIN_RESTRICT y, - const double * COIN_RESTRICT rowScale, - const double * COIN_RESTRICT columnScale) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - virtual void transposeTimes(double scalar, - const double * COIN_RESTRICT x, double * COIN_RESTRICT y) const = 0; - /** And for scaling - default aborts for when scaling not supported - (unless pointers NULL when as normal) - */ - virtual void transposeTimes(double scalar, - const double * COIN_RESTRICT x, double * COIN_RESTRICT y, - const double * COIN_RESTRICT rowScale, - const double * COIN_RESTRICT columnScale, - double * COIN_RESTRICT spare = NULL) const; -#if COIN_LONG_WORK - // For long double versions (aborts if not supported) - virtual void times(CoinWorkDouble scalar, - const CoinWorkDouble * COIN_RESTRICT x, CoinWorkDouble * COIN_RESTRICT y) const ; - virtual void transposeTimes(CoinWorkDouble scalar, - const CoinWorkDouble * COIN_RESTRICT x, CoinWorkDouble * COIN_RESTRICT y) const ; -#endif - /** Return x * scalar *A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const = 0; - /** Return x *A in z but - just for indices in y. - This is only needed for primal steepest edge. - Note - z always packed mode */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const = 0; - /** Returns true if can combine transposeTimes and subsetTransposeTimes - and if it would be faster */ - virtual bool canCombine(const ClpSimplex * , - const CoinIndexedVector * ) const { - return false; - } - /// Updates two arrays for steepest and does devex weights (need not be coded) - virtual void transposeTimes2(const ClpSimplex * model, - const CoinIndexedVector * pi1, CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, - CoinIndexedVector * spare, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - /// Updates second array for steepest and does devex weights (need not be coded) - virtual void subsetTimes2(const ClpSimplex * model, - CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, CoinIndexedVector * dj2, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - /** Return x *A in z but - just for number indices in y. - Default cheats with fake CoinIndexedVector and - then calls subsetTransposeTimes */ - virtual void listTransposeTimes(const ClpSimplex * model, - double * x, - int * y, - int number, - double * z) const; - //@} - //@{ - ///@name Other - /// Clone - virtual ClpMatrixBase * clone() const = 0; - /** Subset clone (without gaps). Duplicates are allowed - and order is as given. - Derived classes need not provide this as it may not always make - sense */ - virtual ClpMatrixBase * subsetClone ( - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns) const; - /// Gets rid of any mutable by products - virtual void backToBasics() {} - /** Returns type. - The types which code may need to know about are: - 1 - ClpPackedMatrix - 11 - ClpNetworkMatrix - 12 - ClpPlusMinusOneMatrix - */ - inline int type() const { - return type_; - } - /// Sets type - void setType(int newtype) { - type_ = newtype; - } - /// Sets up an effective RHS - void useEffectiveRhs(ClpSimplex * model); - /** Returns effective RHS offset if it is being used. This is used for long problems - or big gub or anywhere where going through full columns is - expensive. This may re-compute */ - virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false, - bool check = false); - /// If rhsOffset used this is iteration last refreshed - inline int lastRefresh() const { - return lastRefresh_; - } - /// If rhsOffset used this is refresh frequency (0==off) - inline int refreshFrequency() const { - return refreshFrequency_; - } - inline void setRefreshFrequency(int value) { - refreshFrequency_ = value; - } - /// whether to skip dual checks most of time - inline bool skipDualCheck() const { - return skipDualCheck_; - } - inline void setSkipDualCheck(bool yes) { - skipDualCheck_ = yes; - } - /** Partial pricing tuning parameter - minimum number of "objects" to scan. - e.g. number of Gub sets but could be number of variables */ - inline int minimumObjectsScan() const { - return minimumObjectsScan_; - } - inline void setMinimumObjectsScan(int value) { - minimumObjectsScan_ = value; - } - /// Partial pricing tuning parameter - minimum number of negative reduced costs to get - inline int minimumGoodReducedCosts() const { - return minimumGoodReducedCosts_; - } - inline void setMinimumGoodReducedCosts(int value) { - minimumGoodReducedCosts_ = value; - } - /// Current start of search space in matrix (as fraction) - inline double startFraction() const { - return startFraction_; - } - inline void setStartFraction(double value) { - startFraction_ = value; - } - /// Current end of search space in matrix (as fraction) - inline double endFraction() const { - return endFraction_; - } - inline void setEndFraction(double value) { - endFraction_ = value; - } - /// Current best reduced cost - inline double savedBestDj() const { - return savedBestDj_; - } - inline void setSavedBestDj(double value) { - savedBestDj_ = value; - } - /// Initial number of negative reduced costs wanted - inline int originalWanted() const { - return originalWanted_; - } - inline void setOriginalWanted(int value) { - originalWanted_ = value; - } - /// Current number of negative reduced costs which we still need - inline int currentWanted() const { - return currentWanted_; - } - inline void setCurrentWanted(int value) { - currentWanted_ = value; - } - /// Current best sequence - inline int savedBestSequence() const { - return savedBestSequence_; - } - inline void setSavedBestSequence(int value) { - savedBestSequence_ = value; - } - //@} - - -protected: - - /**@name Constructors, destructor
      - NOTE: All constructors are protected. There's no need - to expose them, after all, this is an abstract class. */ - //@{ - /** Default constructor. */ - ClpMatrixBase(); - /** Destructor (has to be public) */ -public: - virtual ~ClpMatrixBase(); -protected: - // Copy - ClpMatrixBase(const ClpMatrixBase&); - // Assignment - ClpMatrixBase& operator=(const ClpMatrixBase&); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /** Effective RHS offset if it is being used. This is used for long problems - or big gub or anywhere where going through full columns is - expensive */ - double * rhsOffset_; - /// Current start of search space in matrix (as fraction) - double startFraction_; - /// Current end of search space in matrix (as fraction) - double endFraction_; - /// Best reduced cost so far - double savedBestDj_; - /// Initial number of negative reduced costs wanted - int originalWanted_; - /// Current number of negative reduced costs which we still need - int currentWanted_; - /// Saved best sequence in pricing - int savedBestSequence_; - /// type (may be useful) - int type_; - /// If rhsOffset used this is iteration last refreshed - int lastRefresh_; - /// If rhsOffset used this is refresh frequency (0==off) - int refreshFrequency_; - /// Partial pricing tuning parameter - minimum number of "objects" to scan - int minimumObjectsScan_; - /// Partial pricing tuning parameter - minimum number of negative reduced costs to get - int minimumGoodReducedCosts_; - /// True sequence in (i.e. from larger problem) - int trueSequenceIn_; - /// True sequence out (i.e. from larger problem) - int trueSequenceOut_; - /// whether to skip dual checks most of time - bool skipDualCheck_; - //@} -}; -// bias for free variables -#define FREE_BIAS 1.0e1 -// Acceptance criteria for free variables -#define FREE_ACCEPT 1.0e2 - -#endif diff --git a/thirdparty/linux/include/coin1/ClpMessage.hpp b/thirdparty/linux/include/coin1/ClpMessage.hpp deleted file mode 100644 index 5eb3653e..00000000 --- a/thirdparty/linux/include/coin1/ClpMessage.hpp +++ /dev/null @@ -1,131 +0,0 @@ -/* $Id: ClpMessage.hpp 1926 2013-03-26 15:23:38Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpMessage_H -#define ClpMessage_H - - -#include "CoinPragma.hpp" -#include - -// This deals with Clp messages (as against Osi messages etc) - -#include "CoinMessageHandler.hpp" -enum CLP_Message { - CLP_SIMPLEX_FINISHED, - CLP_SIMPLEX_INFEASIBLE, - CLP_SIMPLEX_UNBOUNDED, - CLP_SIMPLEX_STOPPED, - CLP_SIMPLEX_ERROR, - CLP_SIMPLEX_INTERRUPT, - CLP_SIMPLEX_STATUS, - CLP_DUAL_BOUNDS, - CLP_SIMPLEX_ACCURACY, - CLP_SIMPLEX_BADFACTOR, - CLP_SIMPLEX_BOUNDTIGHTEN, - CLP_SIMPLEX_INFEASIBILITIES, - CLP_SIMPLEX_FLAG, - CLP_SIMPLEX_GIVINGUP, - CLP_DUAL_CHECKB, - CLP_DUAL_ORIGINAL, - CLP_SIMPLEX_PERTURB, - CLP_PRIMAL_ORIGINAL, - CLP_PRIMAL_WEIGHT, - CLP_PRIMAL_OPTIMAL, - CLP_SINGULARITIES, - CLP_MODIFIEDBOUNDS, - CLP_RIMSTATISTICS1, - CLP_RIMSTATISTICS2, - CLP_RIMSTATISTICS3, - CLP_POSSIBLELOOP, - CLP_SMALLELEMENTS, - CLP_DUPLICATEELEMENTS, - CLP_SIMPLEX_HOUSE1, - CLP_SIMPLEX_HOUSE2, - CLP_SIMPLEX_NONLINEAR, - CLP_SIMPLEX_FREEIN, - CLP_SIMPLEX_PIVOTROW, - CLP_DUAL_CHECK, - CLP_PRIMAL_DJ, - CLP_PACKEDSCALE_INITIAL, - CLP_PACKEDSCALE_WHILE, - CLP_PACKEDSCALE_FINAL, - CLP_PACKEDSCALE_FORGET, - CLP_INITIALIZE_STEEP, - CLP_UNABLE_OPEN, - CLP_BAD_BOUNDS, - CLP_BAD_MATRIX, - CLP_LOOP, - CLP_IMPORT_RESULT, - CLP_IMPORT_ERRORS, - CLP_EMPTY_PROBLEM, - CLP_CRASH, - CLP_END_VALUES_PASS, - CLP_QUADRATIC_BOTH, - CLP_QUADRATIC_PRIMAL_DETAILS, - CLP_IDIOT_ITERATION, - CLP_INFEASIBLE, - CLP_MATRIX_CHANGE, - CLP_TIMING, - CLP_INTERVAL_TIMING, - CLP_SPRINT, - CLP_BARRIER_ITERATION, - CLP_BARRIER_OBJECTIVE_GAP, - CLP_BARRIER_GONE_INFEASIBLE, - CLP_BARRIER_CLOSE_TO_OPTIMAL, - CLP_BARRIER_COMPLEMENTARITY, - CLP_BARRIER_EXIT2, - CLP_BARRIER_STOPPING, - CLP_BARRIER_EXIT, - CLP_BARRIER_SCALING, - CLP_BARRIER_MU, - CLP_BARRIER_INFO, - CLP_BARRIER_END, - CLP_BARRIER_ACCURACY, - CLP_BARRIER_SAFE, - CLP_BARRIER_NEGATIVE_GAPS, - CLP_BARRIER_REDUCING, - CLP_BARRIER_DIAGONAL, - CLP_BARRIER_SLACKS, - CLP_BARRIER_DUALINF, - CLP_BARRIER_KILLED, - CLP_BARRIER_ABS_DROPPED, - CLP_BARRIER_ABS_ERROR, - CLP_BARRIER_FEASIBLE, - CLP_BARRIER_STEP, - CLP_BARRIER_KKT, - CLP_RIM_SCALE, - CLP_SLP_ITER, - CLP_COMPLICATED_MODEL, - CLP_BAD_STRING_VALUES, - CLP_CRUNCH_STATS, - CLP_PARAMETRICS_STATS, - CLP_PARAMETRICS_STATS2, -#ifndef NO_FATHOM_PRINT - CLP_FATHOM_STATUS, - CLP_FATHOM_SOLUTION, - CLP_FATHOM_FINISH, -#endif - CLP_GENERAL, - CLP_GENERAL2, - CLP_GENERAL_WARNING, - CLP_DUMMY_END -}; - -/** This deals with Clp messages (as against Osi messages etc) - */ -class ClpMessage : public CoinMessages { - -public: - - /**@name Constructors etc */ - //@{ - /** Constructor */ - ClpMessage(Language language = us_en); - //@} - -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpModel.hpp b/thirdparty/linux/include/coin1/ClpModel.hpp deleted file mode 100644 index 4a225396..00000000 --- a/thirdparty/linux/include/coin1/ClpModel.hpp +++ /dev/null @@ -1,1307 +0,0 @@ -/* $Id: ClpModel.hpp 2074 2014-12-10 09:43:54Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpModel_H -#define ClpModel_H - -#include "ClpConfig.h" - -#include -#include -#include -#include -#include -//#ifndef COIN_USE_CLP -//#define COIN_USE_CLP -//#endif -#include "ClpPackedMatrix.hpp" -#include "CoinMessageHandler.hpp" -#include "CoinHelperFunctions.hpp" -#include "CoinTypes.hpp" -#include "CoinFinite.hpp" -#include "ClpParameters.hpp" -#include "ClpObjective.hpp" -class ClpEventHandler; -/** This is the base class for Linear and quadratic Models - This knows nothing about the algorithm, but it seems to - have a reasonable amount of information - - I would welcome suggestions for what should be in this and - how it relates to OsiSolverInterface. Some methods look - very similar. - -*/ -class CoinBuild; -class CoinModel; -class ClpModel { - -public: - - /**@name Constructors and destructor - Note - copy methods copy ALL data so can chew up memory - until other copy is freed - */ - //@{ - /// Default constructor - ClpModel (bool emptyMessages = false ); - - /** Copy constructor. May scale depending on mode - -1 leave mode as is - 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 auto-but-as-initialSolve-in-bab - */ - ClpModel(const ClpModel & rhs, int scalingMode = -1); - /// Assignment operator. This copies the data - ClpModel & operator=(const ClpModel & rhs); - /** Subproblem constructor. A subset of whole model is created from the - row and column lists given. The new order is given by list order and - duplicates are allowed. Name and integer information can be dropped - */ - ClpModel (const ClpModel * wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns, - bool dropNames = true, bool dropIntegers = true); - /// Destructor - ~ClpModel ( ); - //@} - - /**@name Load model - loads some stuff and initializes others */ - //@{ - /** Loads a problem (the constraints on the - rows are given by lower and upper bounds). If a pointer is 0 then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - void loadProblem ( const ClpMatrixBase& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - void loadProblem ( const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - - /** Just like the other loadProblem() method except that the matrix is - given in a standard column major ordered format (without gaps). */ - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /** This loads a model from a coinModel object - returns number of errors. - - modelObject not const as may be changed as part of process - If tryPlusMinusOne then will try adding as +-1 matrix - */ - int loadProblem ( CoinModel & modelObject, bool tryPlusMinusOne = false); - /// This one is for after presolve to save memory - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, const int * length, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /** Load up quadratic objective. This is stored as a CoinPackedMatrix */ - void loadQuadraticObjective(const int numberColumns, - const CoinBigIndex * start, - const int * column, const double * element); - void loadQuadraticObjective ( const CoinPackedMatrix& matrix); - /// Get rid of quadratic objective - void deleteQuadraticObjective(); - /// This just loads up a row objective - void setRowObjective(const double * rowObjective); - /// Read an mps file from the given filename - int readMps(const char *filename, - bool keepNames = false, - bool ignoreErrors = false); - /// Read GMPL files from the given filenames - int readGMPL(const char *filename, const char * dataName, - bool keepNames = false); - /// Copy in integer informations - void copyInIntegerInformation(const char * information); - /// Drop integer informations - void deleteIntegerInformation(); - /** Set the index-th variable to be a continuous variable */ - void setContinuous(int index); - /** Set the index-th variable to be an integer variable */ - void setInteger(int index); - /** Return true if the index-th variable is an integer variable */ - bool isInteger(int index) const; - /// Resizes rim part of model - void resize (int newNumberRows, int newNumberColumns); - /// Deletes rows - void deleteRows(int number, const int * which); - /// Add one row - void addRow(int numberInRow, const int * columns, - const double * elements, double rowLower = -COIN_DBL_MAX, - double rowUpper = COIN_DBL_MAX); - /// Add rows - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinBigIndex * rowStarts, const int * columns, - const double * elements); - /// Add rows - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinBigIndex * rowStarts, const int * rowLengths, - const int * columns, - const double * elements); -#ifndef CLP_NO_VECTOR - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinPackedVectorBase * const * rows); -#endif - /** Add rows from a build object. - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - Returns number of errors e.g. duplicates - */ - int addRows(const CoinBuild & buildObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /** Add rows from a model object. returns - -1 if object in bad state (i.e. has column information) - otherwise number of errors. - - modelObject non const as can be regularized as part of build - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - */ - int addRows(CoinModel & modelObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - - /// Deletes columns - void deleteColumns(int number, const int * which); - /// Deletes rows AND columns (keeps old sizes) - void deleteRowsAndColumns(int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - /// Add one column - void addColumn(int numberInColumn, - const int * rows, - const double * elements, - double columnLower = 0.0, - double columnUpper = COIN_DBL_MAX, - double objective = 0.0); - /// Add columns - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinBigIndex * columnStarts, const int * rows, - const double * elements); - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinBigIndex * columnStarts, const int * columnLengths, - const int * rows, - const double * elements); -#ifndef CLP_NO_VECTOR - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinPackedVectorBase * const * columns); -#endif - /** Add columns from a build object - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - Returns number of errors e.g. duplicates - */ - int addColumns(const CoinBuild & buildObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /** Add columns from a model object. returns - -1 if object in bad state (i.e. has row information) - otherwise number of errors - modelObject non const as can be regularized as part of build - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - */ - int addColumns(CoinModel & modelObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /// Modify one element of a matrix - inline void modifyCoefficient(int row, int column, double newElement, - bool keepZero = false) { - matrix_->modifyCoefficient(row, column, newElement, keepZero); - } - /** Change row lower bounds */ - void chgRowLower(const double * rowLower); - /** Change row upper bounds */ - void chgRowUpper(const double * rowUpper); - /** Change column lower bounds */ - void chgColumnLower(const double * columnLower); - /** Change column upper bounds */ - void chgColumnUpper(const double * columnUpper); - /** Change objective coefficients */ - void chgObjCoefficients(const double * objIn); - /** Borrow model. This is so we don't have to copy large amounts - of data around. It assumes a derived class wants to overwrite - an empty model with a real one - while it does an algorithm */ - void borrowModel(ClpModel & otherModel); - /** Return model - nulls all arrays so can be deleted safely - also updates any scalars */ - void returnModel(ClpModel & otherModel); - - /// Create empty ClpPackedMatrix - void createEmptyMatrix(); - /** Really clean up matrix (if ClpPackedMatrix). - a) eliminate all duplicate AND small elements in matrix - b) remove all gaps and set extraGap_ and extraMajor_ to 0.0 - c) reallocate arrays and make max lengths equal to lengths - d) orders elements - returns number of elements eliminated or -1 if not ClpPackedMatrix - */ - int cleanMatrix(double threshold = 1.0e-20); - /// Copy contents - resizing if necessary - otherwise re-use memory - void copy(const ClpMatrixBase * from, ClpMatrixBase * & to); -#ifndef CLP_NO_STD - /// Drops names - makes lengthnames 0 and names empty - void dropNames(); - /// Copies in names - void copyNames(const std::vector & rowNames, - const std::vector & columnNames); - /// Copies in Row names - modifies names first .. last-1 - void copyRowNames(const std::vector & rowNames, int first, int last); - /// Copies in Column names - modifies names first .. last-1 - void copyColumnNames(const std::vector & columnNames, int first, int last); - /// Copies in Row names - modifies names first .. last-1 - void copyRowNames(const char * const * rowNames, int first, int last); - /// Copies in Column names - modifies names first .. last-1 - void copyColumnNames(const char * const * columnNames, int first, int last); - /// Set name of row - void setRowName(int rowIndex, std::string & name) ; - /// Set name of col - void setColumnName(int colIndex, std::string & name) ; -#endif - /** Find a network subset. - rotate array should be numberRows. On output - -1 not in network - 0 in network as is - 1 in network with signs swapped - Returns number of network rows - */ - int findNetwork(char * rotate, double fractionNeeded = 0.75); - /** This creates a coinModel object - */ - CoinModel * createCoinModel() const; - - /** Write the problem in MPS format to the specified file. - - Row and column names may be null. - formatType is -
        -
      • 0 - normal -
      • 1 - extra accuracy -
      • 2 - IEEE hex -
      - - Returns non-zero on I/O error - */ - int writeMps(const char *filename, - int formatType = 0, int numberAcross = 2, - double objSense = 0.0) const ; - //@} - /**@name gets and sets */ - //@{ - /// Number of rows - inline int numberRows() const { - return numberRows_; - } - inline int getNumRows() const { - return numberRows_; - } - /// Number of columns - inline int getNumCols() const { - return numberColumns_; - } - inline int numberColumns() const { - return numberColumns_; - } - /// Primal tolerance to use - inline double primalTolerance() const { - return dblParam_[ClpPrimalTolerance]; - } - void setPrimalTolerance( double value) ; - /// Dual tolerance to use - inline double dualTolerance() const { - return dblParam_[ClpDualTolerance]; - } - void setDualTolerance( double value) ; - /// Primal objective limit - inline double primalObjectiveLimit() const { - return dblParam_[ClpPrimalObjectiveLimit]; - } - void setPrimalObjectiveLimit(double value); - /// Dual objective limit - inline double dualObjectiveLimit() const { - return dblParam_[ClpDualObjectiveLimit]; - } - void setDualObjectiveLimit(double value); - /// Objective offset - inline double objectiveOffset() const { - return dblParam_[ClpObjOffset]; - } - void setObjectiveOffset(double value); - /// Presolve tolerance to use - inline double presolveTolerance() const { - return dblParam_[ClpPresolveTolerance]; - } -#ifndef CLP_NO_STD - inline const std::string & problemName() const { - return strParam_[ClpProbName]; - } -#endif - /// Number of iterations - inline int numberIterations() const { - return numberIterations_; - } - inline int getIterationCount() const { - return numberIterations_; - } - inline void setNumberIterations(int numberIterationsNew) { - numberIterations_ = numberIterationsNew; - } - /** Solve type - 1 simplex, 2 simplex interface, 3 Interior.*/ - inline int solveType() const { - return solveType_; - } - inline void setSolveType(int type) { - solveType_ = type; - } - /// Maximum number of iterations - inline int maximumIterations() const { - return intParam_[ClpMaxNumIteration]; - } - void setMaximumIterations(int value); - /// Maximum time in seconds (from when set called) - inline double maximumSeconds() const { - return dblParam_[ClpMaxSeconds]; - } - void setMaximumSeconds(double value); - void setMaximumWallSeconds(double value); - /// Returns true if hit maximum iterations (or time) - bool hitMaximumIterations() const; - /** Status of problem: - -1 - unknown e.g. before solve or if postSolve says not optimal - 0 - optimal - 1 - primal infeasible - 2 - dual infeasible - 3 - stopped on iterations or time - 4 - stopped due to errors - 5 - stopped by event handler (virtual int ClpEventHandler::event()) - */ - inline int status() const { - return problemStatus_; - } - inline int problemStatus() const { - return problemStatus_; - } - /// Set problem status - inline void setProblemStatus(int problemStatusNew) { - problemStatus_ = problemStatusNew; - } - /** Secondary status of problem - may get extended - 0 - none - 1 - primal infeasible because dual limit reached OR (probably primal - infeasible but can't prove it - main status was 4) - 2 - scaled problem optimal - unscaled problem has primal infeasibilities - 3 - scaled problem optimal - unscaled problem has dual infeasibilities - 4 - scaled problem optimal - unscaled problem has primal and dual infeasibilities - 5 - giving up in primal with flagged variables - 6 - failed due to empty problem check - 7 - postSolve says not optimal - 8 - failed due to bad element check - 9 - status was 3 and stopped on time - 10 - status was 3 but stopped as primal feasible - 100 up - translation of enum from ClpEventHandler - */ - inline int secondaryStatus() const { - return secondaryStatus_; - } - inline void setSecondaryStatus(int newstatus) { - secondaryStatus_ = newstatus; - } - /// Are there a numerical difficulties? - inline bool isAbandoned() const { - return problemStatus_ == 4; - } - /// Is optimality proven? - inline bool isProvenOptimal() const { - return problemStatus_ == 0; - } - /// Is primal infeasiblity proven? - inline bool isProvenPrimalInfeasible() const { - return problemStatus_ == 1; - } - /// Is dual infeasiblity proven? - inline bool isProvenDualInfeasible() const { - return problemStatus_ == 2; - } - /// Is the given primal objective limit reached? - bool isPrimalObjectiveLimitReached() const ; - /// Is the given dual objective limit reached? - bool isDualObjectiveLimitReached() const ; - /// Iteration limit reached? - inline bool isIterationLimitReached() const { - return problemStatus_ == 3; - } - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline double optimizationDirection() const { - return optimizationDirection_; - } - inline double getObjSense() const { - return optimizationDirection_; - } - void setOptimizationDirection(double value); - /// Primal row solution - inline double * primalRowSolution() const { - return rowActivity_; - } - inline const double * getRowActivity() const { - return rowActivity_; - } - /// Primal column solution - inline double * primalColumnSolution() const { - return columnActivity_; - } - inline const double * getColSolution() const { - return columnActivity_; - } - inline void setColSolution(const double * input) { - memcpy(columnActivity_, input, numberColumns_ * sizeof(double)); - } - /// Dual row solution - inline double * dualRowSolution() const { - return dual_; - } - inline const double * getRowPrice() const { - return dual_; - } - /// Reduced costs - inline double * dualColumnSolution() const { - return reducedCost_; - } - inline const double * getReducedCost() const { - return reducedCost_; - } - /// Row lower - inline double* rowLower() const { - return rowLower_; - } - inline const double* getRowLower() const { - return rowLower_; - } - /// Row upper - inline double* rowUpper() const { - return rowUpper_; - } - inline const double* getRowUpper() const { - return rowUpper_; - } - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - void setObjectiveCoefficient( int elementIndex, double elementValue ); - /** Set an objective function coefficient */ - inline void setObjCoeff( int elementIndex, double elementValue ) { - setObjectiveCoefficient( elementIndex, elementValue); - } - - /** Set a single column lower bound
      - Use -DBL_MAX for -infinity. */ - void setColumnLower( int elementIndex, double elementValue ); - - /** Set a single column upper bound
      - Use DBL_MAX for infinity. */ - void setColumnUpper( int elementIndex, double elementValue ); - - /** Set a single column lower and upper bound */ - void setColumnBounds( int elementIndex, - double lower, double upper ); - - /** Set the bounds on a number of columns simultaneously
      - The default implementation just invokes setColLower() and - setColUpper() over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - either bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - void setColumnSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set a single column lower bound
      - Use -DBL_MAX for -infinity. */ - inline void setColLower( int elementIndex, double elementValue ) { - setColumnLower(elementIndex, elementValue); - } - /** Set a single column upper bound
      - Use DBL_MAX for infinity. */ - inline void setColUpper( int elementIndex, double elementValue ) { - setColumnUpper(elementIndex, elementValue); - } - - /** Set a single column lower and upper bound */ - inline void setColBounds( int elementIndex, - double lower, double upper ) { - setColumnBounds(elementIndex, lower, upper); - } - - /** Set the bounds on a number of columns simultaneously
      - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - either bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - inline void setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) { - setColumnSetBounds(indexFirst, indexLast, boundList); - } - - /** Set a single row lower bound
      - Use -DBL_MAX for -infinity. */ - void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound
      - Use DBL_MAX for infinity. */ - void setRowUpper( int elementIndex, double elementValue ) ; - - /** Set a single row lower and upper bound */ - void setRowBounds( int elementIndex, - double lower, double upper ) ; - - /** Set the bounds on a number of rows simultaneously
      - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the constraints whose - either bound changes - @param boundList the new lower/upper bound pairs for the constraints - */ - void setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - //@} - /// Scaling - inline const double * rowScale() const { - return rowScale_; - } - inline const double * columnScale() const { - return columnScale_; - } - inline const double * inverseRowScale() const { - return inverseRowScale_; - } - inline const double * inverseColumnScale() const { - return inverseColumnScale_; - } - inline double * mutableRowScale() const { - return rowScale_; - } - inline double * mutableColumnScale() const { - return columnScale_; - } - inline double * mutableInverseRowScale() const { - return inverseRowScale_; - } - inline double * mutableInverseColumnScale() const { - return inverseColumnScale_; - } - inline double * swapRowScale(double * newScale) { - double * oldScale = rowScale_; - rowScale_ = newScale; - return oldScale; - } - void setRowScale(double * scale) ; - void setColumnScale(double * scale); - /// Scaling of objective - inline double objectiveScale() const { - return objectiveScale_; - } - inline void setObjectiveScale(double value) { - objectiveScale_ = value; - } - /// Scaling of rhs and bounds - inline double rhsScale() const { - return rhsScale_; - } - inline void setRhsScale(double value) { - rhsScale_ = value; - } - /// Sets or unsets scaling, 0 -off, 1 equilibrium, 2 geometric, 3 auto, 4 auto-but-as-initialSolve-in-bab - void scaling(int mode = 1); - /** If we constructed a "really" scaled model then this reverses the operation. - Quantities may not be exactly as they were before due to rounding errors */ - void unscale(); - /// Gets scalingFlag - inline int scalingFlag() const { - return scalingFlag_; - } - /// Objective - inline double * objective() const { - if (objective_) { - double offset; - return objective_->gradient(NULL, NULL, offset, false); - } else { - return NULL; - } - } - inline double * objective(const double * solution, double & offset, bool refresh = true) const { - offset = 0.0; - if (objective_) { - return objective_->gradient(NULL, solution, offset, refresh); - } else { - return NULL; - } - } - inline const double * getObjCoefficients() const { - if (objective_) { - double offset; - return objective_->gradient(NULL, NULL, offset, false); - } else { - return NULL; - } - } - /// Row Objective - inline double * rowObjective() const { - return rowObjective_; - } - inline const double * getRowObjCoefficients() const { - return rowObjective_; - } - /// Column Lower - inline double * columnLower() const { - return columnLower_; - } - inline const double * getColLower() const { - return columnLower_; - } - /// Column Upper - inline double * columnUpper() const { - return columnUpper_; - } - inline const double * getColUpper() const { - return columnUpper_; - } - /// Matrix (if not ClpPackedmatrix be careful about memory leak - inline CoinPackedMatrix * matrix() const { - if ( matrix_ == NULL ) return NULL; - else return matrix_->getPackedMatrix(); - } - /// Number of elements in matrix - inline int getNumElements() const { - return matrix_->getNumElements(); - } - /** Small element value - elements less than this set to zero, - default is 1.0e-20 */ - inline double getSmallElementValue() const { - return smallElement_; - } - inline void setSmallElementValue(double value) { - smallElement_ = value; - } - /// Row Matrix - inline ClpMatrixBase * rowCopy() const { - return rowCopy_; - } - /// Set new row matrix - void setNewRowCopy(ClpMatrixBase * newCopy); - /// Clp Matrix - inline ClpMatrixBase * clpMatrix() const { - return matrix_; - } - /// Scaled ClpPackedMatrix - inline ClpPackedMatrix * clpScaledMatrix() const { - return scaledMatrix_; - } - /// Sets pointer to scaled ClpPackedMatrix - inline void setClpScaledMatrix(ClpPackedMatrix * scaledMatrix) { - delete scaledMatrix_; - scaledMatrix_ = scaledMatrix; - } - /// Swaps pointer to scaled ClpPackedMatrix - inline ClpPackedMatrix * swapScaledMatrix(ClpPackedMatrix * scaledMatrix) { - ClpPackedMatrix * oldMatrix = scaledMatrix_; - scaledMatrix_ = scaledMatrix; - return oldMatrix; - } - /** Replace Clp Matrix (current is not deleted unless told to - and new is used) - So up to user to delete current. This was used where - matrices were being rotated. ClpModel takes ownership. - */ - void replaceMatrix(ClpMatrixBase * matrix, bool deleteCurrent = false); - /** Replace Clp Matrix (current is not deleted unless told to - and new is used) So up to user to delete current. This was used where - matrices were being rotated. This version changes CoinPackedMatrix - to ClpPackedMatrix. ClpModel takes ownership. - */ - inline void replaceMatrix(CoinPackedMatrix * newmatrix, - bool deleteCurrent = false) { - replaceMatrix(new ClpPackedMatrix(newmatrix), deleteCurrent); - } - /// Objective value - inline double objectiveValue() const { - return objectiveValue_ * optimizationDirection_ - dblParam_[ClpObjOffset]; - } - inline void setObjectiveValue(double value) { - objectiveValue_ = (value + dblParam_[ClpObjOffset]) / optimizationDirection_; - } - inline double getObjValue() const { - return objectiveValue_ * optimizationDirection_ - dblParam_[ClpObjOffset]; - } - /// Integer information - inline char * integerInformation() const { - return integerType_; - } - /** Infeasibility/unbounded ray (NULL returned if none/wrong) - Up to user to use delete [] on these arrays. */ - double * infeasibilityRay(bool fullRay=false) const; - double * unboundedRay() const; - /// For advanced users - no need to delete - sign not changed - inline double * ray() const - { return ray_;} - /// just test if infeasibility or unbounded Ray exists - inline bool rayExists() const { - return (ray_!=NULL); - } - /// just delete ray if exists - inline void deleteRay() { - delete [] ray_; - ray_=NULL; - } - /// Access internal ray storage. Users should call infeasibilityRay() or unboundedRay() instead. - inline const double * internalRay() const { - return ray_; - } - /// See if status (i.e. basis) array exists (partly for OsiClp) - inline bool statusExists() const { - return (status_ != NULL); - } - /// Return address of status (i.e. basis) array (char[numberRows+numberColumns]) - inline unsigned char * statusArray() const { - return status_; - } - /** Return copy of status (i.e. basis) array (char[numberRows+numberColumns]), - use delete [] */ - unsigned char * statusCopy() const; - /// Copy in status (basis) vector - void copyinStatus(const unsigned char * statusArray); - - /// User pointer for whatever reason - inline void setUserPointer (void * pointer) { - userPointer_ = pointer; - } - inline void * getUserPointer () const { - return userPointer_; - } - /// Trusted user pointer - inline void setTrustedUserPointer (ClpTrustedData * pointer) { - trustedUserPointer_ = pointer; - } - inline ClpTrustedData * getTrustedUserPointer () const { - return trustedUserPointer_; - } - /// What has changed in model (only for masochistic users) - inline int whatsChanged() const { - return whatsChanged_; - } - inline void setWhatsChanged(int value) { - whatsChanged_ = value; - } - /// Number of threads (not really being used) - inline int numberThreads() const { - return numberThreads_; - } - inline void setNumberThreads(int value) { - numberThreads_ = value; - } - //@} - /**@name Message handling */ - //@{ - /// Pass in Message handler (not deleted at end) - void passInMessageHandler(CoinMessageHandler * handler); - /// Pass in Message handler (not deleted at end) and return current - CoinMessageHandler * pushMessageHandler(CoinMessageHandler * handler, - bool & oldDefault); - /// back to previous message handler - void popMessageHandler(CoinMessageHandler * oldHandler, bool oldDefault); - /// Set language - void newLanguage(CoinMessages::Language language); - inline void setLanguage(CoinMessages::Language language) { - newLanguage(language); - } - /// Overrides message handler with a default one - void setDefaultMessageHandler(); - /// Return handler - inline CoinMessageHandler * messageHandler() const { - return handler_; - } - /// Return messages - inline CoinMessages messages() const { - return messages_; - } - /// Return pointer to messages - inline CoinMessages * messagesPointer() { - return & messages_; - } - /// Return Coin messages - inline CoinMessages coinMessages() const { - return coinMessages_; - } - /// Return pointer to Coin messages - inline CoinMessages * coinMessagesPointer() { - return & coinMessages_; - } - /** Amount of print out: - 0 - none - 1 - just final - 2 - just factorizations - 3 - as 2 plus a bit more - 4 - verbose - above that 8,16,32 etc just for selective debug - */ - inline void setLogLevel(int value) { - handler_->setLogLevel(value); - } - inline int logLevel() const { - return handler_->logLevel(); - } - /// Return true if default handler - inline bool defaultHandler() const { - return defaultHandler_; - } - /// Pass in Event handler (cloned and deleted at end) - void passInEventHandler(const ClpEventHandler * eventHandler); - /// Event handler - inline ClpEventHandler * eventHandler() const { - return eventHandler_; - } - /// Thread specific random number generator - inline CoinThreadRandom * randomNumberGenerator() { - return &randomNumberGenerator_; - } - /// Thread specific random number generator - inline CoinThreadRandom & mutableRandomNumberGenerator() { - return randomNumberGenerator_; - } - /// Set seed for thread specific random number generator - inline void setRandomSeed(int value) { - randomNumberGenerator_.setSeed(value); - } - /// length of names (0 means no names0 - inline int lengthNames() const { - return lengthNames_; - } -#ifndef CLP_NO_STD - /// length of names (0 means no names0 - inline void setLengthNames(int value) { - lengthNames_ = value; - } - /// Row names - inline const std::vector * rowNames() const { - return &rowNames_; - } - inline const std::string& rowName(int iRow) const { - return rowNames_[iRow]; - } - /// Return name or Rnnnnnnn - std::string getRowName(int iRow) const; - /// Column names - inline const std::vector * columnNames() const { - return &columnNames_; - } - inline const std::string& columnName(int iColumn) const { - return columnNames_[iColumn]; - } - /// Return name or Cnnnnnnn - std::string getColumnName(int iColumn) const; -#endif - /// Objective methods - inline ClpObjective * objectiveAsObject() const { - return objective_; - } - void setObjective(ClpObjective * objective); - inline void setObjectivePointer(ClpObjective * newobjective) { - objective_ = newobjective; - } - /** Solve a problem with no elements - return status and - dual and primal infeasibilites */ - int emptyProblem(int * infeasNumber = NULL, double * infeasSum = NULL, bool printMessage = true); - - //@} - - /**@name Matrix times vector methods - They can be faster if scalar is +- 1 - These are covers so user need not worry about scaling - Also for simplex I am not using basic/non-basic split */ - //@{ - /** Return y + A * x * scalar in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - void times(double scalar, - const double * x, double * y) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - void transposeTimes(double scalar, - const double * x, double * y) const ; - //@} - - - //--------------------------------------------------------------------------- - /**@name Parameter set/get methods - - The set methods return true if the parameter was set to the given value, - false otherwise. There can be various reasons for failure: the given - parameter is not applicable for the solver (e.g., refactorization - frequency for the volume algorithm), the parameter is not yet implemented - for the solver or simply the value of the parameter is out of the range - the solver accepts. If a parameter setting call returns false check the - details of your solver. - - The get methods return true if the given parameter is applicable for the - solver and is implemented. In this case the value of the parameter is - returned in the second argument. Otherwise they return false. - - ** once it has been decided where solver sits this may be redone - */ - //@{ - /// Set an integer parameter - bool setIntParam(ClpIntParam key, int value) ; - /// Set an double parameter - bool setDblParam(ClpDblParam key, double value) ; -#ifndef CLP_NO_STD - /// Set an string parameter - bool setStrParam(ClpStrParam key, const std::string & value); -#endif - // Get an integer parameter - inline bool getIntParam(ClpIntParam key, int& value) const { - if (key < ClpLastIntParam) { - value = intParam_[key]; - return true; - } else { - return false; - } - } - // Get an double parameter - inline bool getDblParam(ClpDblParam key, double& value) const { - if (key < ClpLastDblParam) { - value = dblParam_[key]; - return true; - } else { - return false; - } - } -#ifndef CLP_NO_STD - // Get a string parameter - inline bool getStrParam(ClpStrParam key, std::string& value) const { - if (key < ClpLastStrParam) { - value = strParam_[key]; - return true; - } else { - return false; - } - } -#endif - /// Create C++ lines to get to current state - void generateCpp( FILE * fp); - /** For advanced options - 1 - Don't keep changing infeasibility weight - 2 - Keep nonLinearCost round solves - 4 - Force outgoing variables to exact bound (primal) - 8 - Safe to use dense initial factorization - 16 -Just use basic variables for operation if column generation - 32 -Create ray even in BAB - 64 -Treat problem as feasible until last minute (i.e. minimize infeasibilities) - 128 - Switch off all matrix sanity checks - 256 - No row copy - 512 - If not in values pass, solution guaranteed, skip as much as possible - 1024 - In branch and bound - 2048 - Don't bother to re-factorize if < 20 iterations - 4096 - Skip some optimality checks - 8192 - Do Primal when cleaning up primal - 16384 - In fast dual (so we can switch off things) - 32768 - called from Osi - 65536 - keep arrays around as much as possible (also use maximumR/C) - 131072 - transposeTimes is -1.0 and can skip basic and fixed - 262144 - extra copy of scaled matrix - 524288 - Clp fast dual - 1048576 - don't need to finish dual (can return 3) - 2097152 - zero costs! - 4194304 - don't scale integer variables - 8388608 - Idiot when not really sure about it - NOTE - many applications can call Clp but there may be some short cuts - which are taken which are not guaranteed safe from all applications. - Vetted applications will have a bit set and the code may test this - At present I expect a few such applications - if too many I will - have to re-think. It is up to application owner to change the code - if she/he needs these short cuts. I will not debug unless in Coin - repository. See COIN_CLP_VETTED comments. - 0x01000000 is Cbc (and in branch and bound) - 0x02000000 is in a different branch and bound - */ - inline unsigned int specialOptions() const { - return specialOptions_; - } - void setSpecialOptions(unsigned int value); -#define COIN_CBC_USING_CLP 0x01000000 - inline bool inCbcBranchAndBound() const { - return (specialOptions_ & COIN_CBC_USING_CLP) != 0; - } - //@} - - /**@name private or protected methods */ - //@{ -protected: - /// Does most of deletion (0 = all, 1 = most) - void gutsOfDelete(int type); - /** Does most of copying - If trueCopy 0 then just points to arrays - If -1 leaves as much as possible */ - void gutsOfCopy(const ClpModel & rhs, int trueCopy = 1); - /// gets lower and upper bounds on rows - void getRowBound(int iRow, double& lower, double& upper) const; - /// puts in format I like - 4 array matrix - may make row copy - void gutsOfLoadModel ( int numberRows, int numberColumns, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /// Does much of scaling - void gutsOfScaling(); - /// Objective value - always minimize - inline double rawObjectiveValue() const { - return objectiveValue_; - } - /// If we are using maximumRows_ and Columns_ - inline bool permanentArrays() const { - return (specialOptions_ & 65536) != 0; - } - /// Start using maximumRows_ and Columns_ - void startPermanentArrays(); - /// Stop using maximumRows_ and Columns_ - void stopPermanentArrays(); - /// Create row names as char ** - const char * const * rowNamesAsChar() const; - /// Create column names as char ** - const char * const * columnNamesAsChar() const; - /// Delete char * version of names - void deleteNamesAsChar(const char * const * names, int number) const; - /// On stopped - sets secondary status - void onStopped(); - //@} - - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - double optimizationDirection_; - /// Array of double parameters - double dblParam_[ClpLastDblParam]; - /// Objective value - double objectiveValue_; - /// Small element value - double smallElement_; - /// Scaling of objective - double objectiveScale_; - /// Scaling of rhs and bounds - double rhsScale_; - /// Number of rows - int numberRows_; - /// Number of columns - int numberColumns_; - /// Row activities - double * rowActivity_; - /// Column activities - double * columnActivity_; - /// Duals - double * dual_; - /// Reduced costs - double * reducedCost_; - /// Row lower - double* rowLower_; - /// Row upper - double* rowUpper_; - /// Objective - ClpObjective * objective_; - /// Row Objective (? sign) - may be NULL - double * rowObjective_; - /// Column Lower - double * columnLower_; - /// Column Upper - double * columnUpper_; - /// Packed matrix - ClpMatrixBase * matrix_; - /// Row copy if wanted - ClpMatrixBase * rowCopy_; - /// Scaled packed matrix - ClpPackedMatrix * scaledMatrix_; - /// Infeasible/unbounded ray - double * ray_; - /// Row scale factors for matrix - double * rowScale_; - /// Column scale factors - double * columnScale_; - /// Inverse row scale factors for matrix (end of rowScale_) - double * inverseRowScale_; - /// Inverse column scale factors for matrix (end of columnScale_) - double * inverseColumnScale_; - /** Scale flag, 0 none, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic, - 5 geometric on rows */ - int scalingFlag_; - /** Status (i.e. basis) Region. I know that not all algorithms need a status - array, but it made sense for things like crossover and put - all permanent stuff in one place. No assumption is made - about what is in status array (although it might be good to reserve - bottom 3 bits (i.e. 0-7 numeric) for classic status). This - is number of columns + number of rows long (in that order). - */ - unsigned char * status_; - /// Integer information - char * integerType_; - /// User pointer for whatever reason - void * userPointer_; - /// Trusted user pointer e.g. for heuristics - ClpTrustedData * trustedUserPointer_; - /// Array of integer parameters - int intParam_[ClpLastIntParam]; - /// Number of iterations - int numberIterations_; - /** Solve type - 1 simplex, 2 simplex interface, 3 Interior.*/ - int solveType_; - /** Whats changed since last solve. This is a work in progress - It is designed so careful people can make go faster. - It is only used when startFinishOptions used in dual or primal. - Bit 1 - number of rows/columns has not changed (so work arrays valid) - 2 - matrix has not changed - 4 - if matrix has changed only by adding rows - 8 - if matrix has changed only by adding columns - 16 - row lbs not changed - 32 - row ubs not changed - 64 - column objective not changed - 128 - column lbs not changed - 256 - column ubs not changed - 512 - basis not changed (up to user to set this to 0) - top bits may be used internally - shift by 65336 is 3 all same, 1 all except col bounds - */ -#define ROW_COLUMN_COUNTS_SAME 1 -#define MATRIX_SAME 2 -#define MATRIX_JUST_ROWS_ADDED 4 -#define MATRIX_JUST_COLUMNS_ADDED 8 -#define ROW_LOWER_SAME 16 -#define ROW_UPPER_SAME 32 -#define OBJECTIVE_SAME 64 -#define COLUMN_LOWER_SAME 128 -#define COLUMN_UPPER_SAME 256 -#define BASIS_SAME 512 -#define ALL_SAME 65339 -#define ALL_SAME_EXCEPT_COLUMN_BOUNDS 65337 - unsigned int whatsChanged_; - /// Status of problem - int problemStatus_; - /// Secondary status of problem - int secondaryStatus_; - /// length of names (0 means no names) - int lengthNames_; - /// Number of threads (not very operational) - int numberThreads_; - /** For advanced options - See get and set for meaning - */ - unsigned int specialOptions_; - /// Message handler - CoinMessageHandler * handler_; - /// Flag to say if default handler (so delete) - bool defaultHandler_; - /// Thread specific random number generator - CoinThreadRandom randomNumberGenerator_; - /// Event handler - ClpEventHandler * eventHandler_; -#ifndef CLP_NO_STD - /// Row names - std::vector rowNames_; - /// Column names - std::vector columnNames_; -#endif - /// Messages - CoinMessages messages_; - /// Coin messages - CoinMessages coinMessages_; - /// Maximum number of columns in model - int maximumColumns_; - /// Maximum number of rows in model - int maximumRows_; - /// Maximum number of columns (internal arrays) in model - int maximumInternalColumns_; - /// Maximum number of rows (internal arrays) in model - int maximumInternalRows_; - /// Base packed matrix - CoinPackedMatrix baseMatrix_; - /// Base row copy - CoinPackedMatrix baseRowCopy_; - /// Saved row scale factors for matrix - double * savedRowScale_; - /// Saved column scale factors - double * savedColumnScale_; -#ifndef CLP_NO_STD - /// Array of string parameters - std::string strParam_[ClpLastStrParam]; -#endif - //@} -}; -/** This is a tiny class where data can be saved round calls. - */ -class ClpDataSave { - -public: - /**@name Constructors and destructor - */ - //@{ - /// Default constructor - ClpDataSave ( ); - - /// Copy constructor. - ClpDataSave(const ClpDataSave &); - /// Assignment operator. This copies the data - ClpDataSave & operator=(const ClpDataSave & rhs); - /// Destructor - ~ClpDataSave ( ); - - //@} - -////////////////// data ////////////////// -public: - - /**@name data - with same names as in other classes*/ - //@{ - double dualBound_; - double infeasibilityCost_; - double pivotTolerance_; - double zeroFactorizationTolerance_; - double zeroSimplexTolerance_; - double acceptablePivot_; - double objectiveScale_; - int sparseThreshold_; - int perturbation_; - int forceFactorization_; - int scalingFlag_; - unsigned int specialOptions_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpNetworkMatrix.hpp b/thirdparty/linux/include/coin1/ClpNetworkMatrix.hpp deleted file mode 100644 index ec650a43..00000000 --- a/thirdparty/linux/include/coin1/ClpNetworkMatrix.hpp +++ /dev/null @@ -1,229 +0,0 @@ -/* $Id: ClpNetworkMatrix.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpNetworkMatrix_H -#define ClpNetworkMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpMatrixBase.hpp" - -/** This implements a simple network matrix as derived from ClpMatrixBase. - -If you want more sophisticated version then you could inherit from this. -Also you might want to allow networks with gain */ - -class ClpNetworkMatrix : public ClpMatrixBase { - -public: - /**@name Useful methods */ - //@{ - /// Return a complete CoinPackedMatrix - virtual CoinPackedMatrix * getPackedMatrix() const; - /** Whether the packed matrix is column major ordered or not. */ - virtual bool isColOrdered() const { - return true; - } - /** Number of entries in the packed matrix. */ - virtual CoinBigIndex getNumElements() const { - return 2 * numberColumns_; - } - /** Number of columns. */ - virtual int getNumCols() const { - return numberColumns_; - } - /** Number of rows. */ - virtual int getNumRows() const { - return numberRows_; - } - - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with vectorStarts and vectorLengths. */ - virtual const double * getElements() const; - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with vectorStarts and - vectorLengths. */ - virtual const int * getIndices() const { - return indices_; - } - - virtual const CoinBigIndex * getVectorStarts() const; - /** The lengths of the major-dimension vectors. */ - virtual const int * getVectorLengths() const; - - /** Delete the columns whose indices are listed in indDel. */ - virtual void deleteCols(const int numDel, const int * indDel); - /** Delete the rows whose indices are listed in indDel. */ - virtual void deleteRows(const int numDel, const int * indDel); - /// Append Columns - virtual void appendCols(int number, const CoinPackedVectorBase * const * columns); - /// Append Rows - virtual void appendRows(int number, const CoinPackedVectorBase * const * rows); -#ifndef SLIM_CLP - /** Append a set of rows/columns to the end of the matrix. Returns number of errors - i.e. if any of the new rows/columns contain an index that's larger than the - number of columns-1/rows-1 (if numberOther>0) or duplicates - If 0 then rows, 1 if columns */ - virtual int appendMatrix(int number, int type, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther = -1); -#endif - /** Returns a new matrix in reverse order without gaps */ - virtual ClpMatrixBase * reverseOrderedCopy() const; - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis( - const int * whichColumn, - int & numberColumnBasic); - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element); - /** Given positive integer weights for each row fills in sum of weights - for each column (and slack). - Returns weights vector - */ - virtual CoinBigIndex * dubiousWeights(const ClpSimplex * model, int * inputWeights) const; - /** Returns largest and smallest elements of both signs. - Largest refers to largest absolute value. - */ - virtual void rangeOfElements(double & smallestNegative, double & largestNegative, - double & smallestPositive, double & largestPositive); - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const ; - /** Unpacks a column into an CoinIndexedvector - ** in packed format - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const ; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const; - /// Allow any parts of a created CoinMatrix to be deleted - virtual void releasePackedMatrix() const ; - /// Says whether it can do partial pricing - virtual bool canDoPartialPricing() const; - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - //@} - - /**@name Matrix times vector methods */ - //@{ - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void times(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - virtual void transposeTimes(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void transposeTimes(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale, double * spare = NULL) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x *A in z but - just for indices in y. - Note - z always packed mode */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const; - //@} - - /**@name Other */ - //@{ - /// Return true if really network, false if has slacks - inline bool trueNetwork() const { - return trueNetwork_; - } - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpNetworkMatrix(); - /** Constructor from two arrays */ - ClpNetworkMatrix(int numberColumns, const int * head, - const int * tail); - /** Destructor */ - virtual ~ClpNetworkMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpNetworkMatrix(const ClpNetworkMatrix&); - /** The copy constructor from an CoinNetworkMatrix. */ - ClpNetworkMatrix(const CoinPackedMatrix&); - - ClpNetworkMatrix& operator=(const ClpNetworkMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - /** Subset constructor (without gaps). Duplicates are allowed - and order is as given */ - ClpNetworkMatrix (const ClpNetworkMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - /** Subset clone (without gaps). Duplicates are allowed - and order is as given */ - virtual ClpMatrixBase * subsetClone ( - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns) const ; - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// For fake CoinPackedMatrix - mutable CoinPackedMatrix * matrix_; - mutable int * lengths_; - /// Data -1, then +1 rows in pairs (row==-1 if one entry) - int * indices_; - /// Number of rows - int numberRows_; - /// Number of columns - int numberColumns_; - /// True if all entries have two elements - bool trueNetwork_; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpNode.hpp b/thirdparty/linux/include/coin1/ClpNode.hpp deleted file mode 100644 index 671d62f8..00000000 --- a/thirdparty/linux/include/coin1/ClpNode.hpp +++ /dev/null @@ -1,349 +0,0 @@ -/* $Id: ClpNode.hpp 1910 2013-01-27 02:00:13Z stefan $ */ -// Copyright (C) 2008, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpNode_H -#define ClpNode_H - -#include "CoinPragma.hpp" - -// This implements all stuff for Clp fathom -/** This contains what is in a Clp "node" - - */ - -class ClpFactorization; -class ClpDualRowSteepest; -class ClpNodeStuff; -class ClpNode { - -public: - /**@name Useful methods */ - //@{ - /** Applies node to model - 0 - just tree bounds - 1 - tree bounds and basis etc - 2 - saved bounds and basis etc - */ - void applyNode(ClpSimplex * model, int doBoundsEtc ); - /// Choose a new variable - void chooseVariable(ClpSimplex * model, ClpNodeStuff * info); - /// Fix on reduced costs - int fixOnReducedCosts(ClpSimplex * model); - /// Create odd arrays - void createArrays(ClpSimplex * model); - /// Clean up as crunch is different model - void cleanUpForCrunch(); - //@} - - /**@name Gets and sets */ - //@{ - /// Objective value - inline double objectiveValue() const { - return objectiveValue_; - } - /// Set objective value - inline void setObjectiveValue(double value) { - objectiveValue_ = value; - } - /// Primal solution - inline const double * primalSolution() const { - return primalSolution_; - } - /// Dual solution - inline const double * dualSolution() const { - return dualSolution_; - } - /// Initial value of integer variable - inline double branchingValue() const { - return branchingValue_; - } - /// Sum infeasibilities - inline double sumInfeasibilities() const { - return sumInfeasibilities_; - } - /// Number infeasibilities - inline int numberInfeasibilities() const { - return numberInfeasibilities_; - } - /// Relative depth - inline int depth() const { - return depth_; - } - /// Estimated solution value - inline double estimatedSolution() const { - return estimatedSolution_; - } - /** Way for integer variable -1 down , +1 up */ - int way() const; - /// Return true if branch exhausted - bool fathomed() const; - /// Change state of variable i.e. go other way - void changeState(); - /// Sequence number of integer variable (-1 if none) - inline int sequence() const { - return sequence_; - } - /// If odd arrays exist - inline bool oddArraysExist() const { - return lower_ != NULL; - } - /// Status array - inline const unsigned char * statusArray() const { - return status_; - } - //@} - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpNode(); - /// Constructor from model - ClpNode (ClpSimplex * model, const ClpNodeStuff * stuff, int depth); - /// Does work of constructor (partly so gdb will work) - void gutsOfConstructor(ClpSimplex * model, const ClpNodeStuff * stuff, - int arraysExist, int depth); - /** Destructor */ - virtual ~ClpNode(); - //@} - - /**@name Copy methods (at present illegal - will abort) */ - //@{ - /** The copy constructor. */ - ClpNode(const ClpNode&); - /// Operator = - ClpNode& operator=(const ClpNode&); - //@} - -protected: -// For state of branch - typedef struct { - unsigned int firstBranch: 1; // nonzero if first branch on variable is up - unsigned int branch: 2; // 0 means do first branch next, 1 second, 2 finished - unsigned int spare: 29; - } branchState; - /**@name Data */ - //@{ - /// Initial value of integer variable - double branchingValue_; - /// Value of objective - double objectiveValue_; - /// Sum of infeasibilities - double sumInfeasibilities_; - /// Estimated solution value - double estimatedSolution_; - /// Factorization - ClpFactorization * factorization_; - /// Steepest edge weights - ClpDualRowSteepest * weights_; - /// Status vector - unsigned char * status_; - /// Primal solution - double * primalSolution_; - /// Dual solution - double * dualSolution_; - /// Integer lower bounds (only used in fathomMany) - int * lower_; - /// Integer upper bounds (only used in fathomMany) - int * upper_; - /// Pivot variables for factorization - int * pivotVariables_; - /// Variables fixed by reduced costs (at end of branch) 0x10000000 added if fixed to UB - int * fixed_; - /// State of branch - branchState branchState_; - /// Sequence number of integer variable (-1 if none) - int sequence_; - /// Number of infeasibilities - int numberInfeasibilities_; - /// Relative depth - int depth_; - /// Number fixed by reduced cost - int numberFixed_; - /// Flags - 1 duals scaled - int flags_; - /// Maximum number fixed by reduced cost - int maximumFixed_; - /// Maximum rows so far - int maximumRows_; - /// Maximum columns so far - int maximumColumns_; - /// Maximum Integers so far - int maximumIntegers_; - //@} -}; -class ClpNodeStuff { - -public: - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpNodeStuff(); - /** Destructor */ - virtual ~ClpNodeStuff(); - //@} - - /**@name Copy methods (only copies ints etc, nulls arrays) */ - //@{ - /** The copy constructor. */ - ClpNodeStuff(const ClpNodeStuff&); - /// Operator = - ClpNodeStuff& operator=(const ClpNodeStuff&); - /// Zaps stuff 1 - arrays, 2 ints, 3 both - void zap(int type); - //@} - - - /**@name Fill methods */ - //@{ - /** Fill with pseudocosts */ - void fillPseudoCosts(const double * down, const double * up, - const int * priority, - const int * numberDown, const int * numberUp, - const int * numberDownInfeasible, const int * numberUpInfeasible, - int number); - /// Update pseudo costs - void update(int way, int sequence, double change, bool feasible); - /// Return maximum number of nodes - int maximumNodes() const; - /// Return maximum space for nodes - int maximumSpace() const; - //@} - -public: - /**@name Data */ - //@{ - /// Integer tolerance - double integerTolerance_; - /// Integer increment - double integerIncrement_; - /// Small change in branch - double smallChange_; - /// Down pseudo costs - double * downPseudo_; - /// Up pseudo costs - double * upPseudo_; - /// Priority - int * priority_; - /// Number of times down - int * numberDown_; - /// Number of times up - int * numberUp_; - /// Number of times down infeasible - int * numberDownInfeasible_; - /// Number of times up infeasible - int * numberUpInfeasible_; - /// Copy of costs (local) - double * saveCosts_; - /// Array of ClpNodes - ClpNode ** nodeInfo_; - /// Large model if crunched - ClpSimplex * large_; - /// Which rows in large model - int * whichRow_; - /// Which columns in large model - int * whichColumn_; -#ifndef NO_FATHOM_PRINT - /// Cbc's message handler - CoinMessageHandler * handler_; -#endif - /// Number bounds in large model - int nBound_; - /// Save of specialOptions_ (local) - int saveOptions_; - /** Options to pass to solver - 1 - create external reduced costs for columns - 2 - create external reduced costs for rows - 4 - create external row activity (columns always done) - Above only done if feasible - 32 - just create up to nDepth_+1 nodes - 65536 - set if activated - */ - int solverOptions_; - /// Maximum number of nodes to do - int maximumNodes_; - /// Number before trust from CbcModel - int numberBeforeTrust_; - /// State of search from CbcModel - int stateOfSearch_; - /// Number deep - int nDepth_; - /// Number nodes returned (-1 if fathom aborted) - int nNodes_; - /// Number of nodes explored - int numberNodesExplored_; - /// Number of iterations - int numberIterations_; - /// Type of presolve - 0 none, 1 crunch - int presolveType_; -#ifndef NO_FATHOM_PRINT - /// Depth passed in - int startingDepth_; - /// Node at which called - int nodeCalled_; -#endif - //@} -}; -class ClpHashValue { - -public: - /**@name Useful methods */ - //@{ - /// Return index or -1 if not found - int index(double value) const; - /// Add value to list and return index - int addValue(double value) ; - /// Number of different entries - inline int numberEntries() const { - return numberHash_; - } - //@} - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpHashValue(); - /** Useful constructor. */ - ClpHashValue(ClpSimplex * model); - /** Destructor */ - virtual ~ClpHashValue(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpHashValue(const ClpHashValue&); - /// = - ClpHashValue& operator=(const ClpHashValue&); - //@} -private: - /**@name private stuff */ - //@{ - /** returns hash */ - int hash(double value) const; - /// Resizes - void resize(bool increaseMax); - //@} - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Data - // for hashing - typedef struct { - double value; - int index, next; - } CoinHashLink; - /// Hash table - mutable CoinHashLink *hash_; - /// Number of entries in hash table - int numberHash_; - /// Maximum number of entries in hash table i.e. size - int maxHash_; - /// Last used space - int lastUsed_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/ClpNonLinearCost.hpp b/thirdparty/linux/include/coin1/ClpNonLinearCost.hpp deleted file mode 100644 index 10078651..00000000 --- a/thirdparty/linux/include/coin1/ClpNonLinearCost.hpp +++ /dev/null @@ -1,401 +0,0 @@ -/* $Id: ClpNonLinearCost.hpp 1769 2011-07-26 09:31:51Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpNonLinearCost_H -#define ClpNonLinearCost_H - - -#include "CoinPragma.hpp" - -class ClpSimplex; -class CoinIndexedVector; - -/** Trivial class to deal with non linear costs - - I don't make any explicit assumptions about convexity but I am - sure I do make implicit ones. - - One interesting idea for normal LP's will be to allow non-basic - variables to come into basis as infeasible i.e. if variable at - lower bound has very large positive reduced cost (when problem - is infeasible) could it reduce overall problem infeasibility more - by bringing it into basis below its lower bound. - - Another feature would be to automatically discover when problems - are convex piecewise linear and re-formulate to use non-linear. - I did some work on this many years ago on "grade" problems, but - while it improved primal interior point algorithms were much better - for that particular problem. -*/ -/* status has original status and current status - 0 - below lower so stored is upper - 1 - in range - 2 - above upper so stored is lower - 4 - (for current) - same as original -*/ -#define CLP_BELOW_LOWER 0 -#define CLP_FEASIBLE 1 -#define CLP_ABOVE_UPPER 2 -#define CLP_SAME 4 -inline int originalStatus(unsigned char status) -{ - return (status & 15); -} -inline int currentStatus(unsigned char status) -{ - return (status >> 4); -} -inline void setOriginalStatus(unsigned char & status, int value) -{ - status = static_cast(status & ~15); - status = static_cast(status | value); -} -inline void setCurrentStatus(unsigned char &status, int value) -{ - status = static_cast(status & ~(15 << 4)); - status = static_cast(status | (value << 4)); -} -inline void setInitialStatus(unsigned char &status) -{ - status = static_cast(CLP_FEASIBLE | (CLP_SAME << 4)); -} -inline void setSameStatus(unsigned char &status) -{ - status = static_cast(status & ~(15 << 4)); - status = static_cast(status | (CLP_SAME << 4)); -} -// Use second version to get more speed -//#define FAST_CLPNON -#ifndef FAST_CLPNON -#define CLP_METHOD1 ((method_&1)!=0) -#define CLP_METHOD2 ((method_&2)!=0) -#else -#define CLP_METHOD1 (false) -#define CLP_METHOD2 (true) -#endif -class ClpNonLinearCost { - -public: - -public: - - /**@name Constructors, destructor */ - //@{ - /// Default constructor. - ClpNonLinearCost(); - /** Constructor from simplex. - This will just set up wasteful arrays for linear, but - later may do dual analysis and even finding duplicate columns . - */ - ClpNonLinearCost(ClpSimplex * model, int method = 1); - /** Constructor from simplex and list of non-linearities (columns only) - First lower of each column has to match real lower - Last lower has to be <= upper (if == then cost ignored) - This could obviously be changed to make more user friendly - */ - ClpNonLinearCost(ClpSimplex * model, const int * starts, - const double * lower, const double * cost); - /// Destructor - ~ClpNonLinearCost(); - // Copy - ClpNonLinearCost(const ClpNonLinearCost&); - // Assignment - ClpNonLinearCost& operator=(const ClpNonLinearCost&); - //@} - - - /**@name Actual work in primal */ - //@{ - /** Changes infeasible costs and computes number and cost of infeas - Puts all non-basic (non free) variables to bounds - and all free variables to zero if oldTolerance is non-zero - - but does not move those <= oldTolerance away*/ - void checkInfeasibilities(double oldTolerance = 0.0); - /** Changes infeasible costs for each variable - The indices are row indices and need converting to sequences - */ - void checkInfeasibilities(int numberInArray, const int * index); - /** Puts back correct infeasible costs for each variable - The input indices are row indices and need converting to sequences - for costs. - On input array is empty (but indices exist). On exit just - changed costs will be stored as normal CoinIndexedVector - */ - void checkChanged(int numberInArray, CoinIndexedVector * update); - /** Goes through one bound for each variable. - If multiplier*work[iRow]>0 goes down, otherwise up. - The indices are row indices and need converting to sequences - Temporary offsets may be set - Rhs entries are increased - */ - void goThru(int numberInArray, double multiplier, - const int * index, const double * work, - double * rhs); - /** Takes off last iteration (i.e. offsets closer to 0) - */ - void goBack(int numberInArray, const int * index, - double * rhs); - /** Puts back correct infeasible costs for each variable - The input indices are row indices and need converting to sequences - for costs. - At the end of this all temporary offsets are zero - */ - void goBackAll(const CoinIndexedVector * update); - /// Temporary zeroing of feasible costs - void zapCosts(); - /// Refreshes costs always makes row costs zero - void refreshCosts(const double * columnCosts); - /// Puts feasible bounds into lower and upper - void feasibleBounds(); - /// Refresh - assuming regions OK - void refresh(); - /** Sets bounds and cost for one variable - Returns change in cost - May need to be inline for speed */ - double setOne(int sequence, double solutionValue); - /** Sets bounds and infeasible cost and true cost for one variable - This is for gub and column generation etc */ - void setOne(int sequence, double solutionValue, double lowerValue, double upperValue, - double costValue = 0.0); - /** Sets bounds and cost for outgoing variable - may change value - Returns direction */ - int setOneOutgoing(int sequence, double &solutionValue); - /// Returns nearest bound - double nearest(int sequence, double solutionValue); - /** Returns change in cost - one down if alpha >0.0, up if <0.0 - Value is current - new - */ - inline double changeInCost(int sequence, double alpha) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (alpha > 0.0) - returnValue = cost_[iRange] - cost_[iRange-1]; - else - returnValue = cost_[iRange] - cost_[iRange+1]; - } - if (CLP_METHOD2) { - returnValue = (alpha > 0.0) ? infeasibilityWeight_ : -infeasibilityWeight_; - } - return returnValue; - } - inline double changeUpInCost(int sequence) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (iRange + 1 != start_[sequence+1] && !infeasible(iRange + 1)) - returnValue = cost_[iRange] - cost_[iRange+1]; - else - returnValue = -1.0e100; - } - if (CLP_METHOD2) { - returnValue = -infeasibilityWeight_; - } - return returnValue; - } - inline double changeDownInCost(int sequence) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (iRange != start_[sequence] && !infeasible(iRange - 1)) - returnValue = cost_[iRange] - cost_[iRange-1]; - else - returnValue = 1.0e100; - } - if (CLP_METHOD2) { - returnValue = infeasibilityWeight_; - } - return returnValue; - } - /// This also updates next bound - inline double changeInCost(int sequence, double alpha, double &rhs) { - double returnValue = 0.0; -#ifdef NONLIN_DEBUG - double saveRhs = rhs; -#endif - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (alpha > 0.0) { - assert(iRange - 1 >= start_[sequence]); - offset_[sequence]--; - rhs += lower_[iRange] - lower_[iRange-1]; - returnValue = alpha * (cost_[iRange] - cost_[iRange-1]); - } else { - assert(iRange + 1 < start_[sequence+1] - 1); - offset_[sequence]++; - rhs += lower_[iRange+2] - lower_[iRange+1]; - returnValue = alpha * (cost_[iRange] - cost_[iRange+1]); - } - } - if (CLP_METHOD2) { -#ifdef NONLIN_DEBUG - double saveRhs1 = rhs; - rhs = saveRhs; -#endif - unsigned char iStatus = status_[sequence]; - int iWhere = currentStatus(iStatus); - if (iWhere == CLP_SAME) - iWhere = originalStatus(iStatus); - // rhs always increases - if (iWhere == CLP_FEASIBLE) { - if (alpha > 0.0) { - // going below - iWhere = CLP_BELOW_LOWER; - rhs = COIN_DBL_MAX; - } else { - // going above - iWhere = CLP_ABOVE_UPPER; - rhs = COIN_DBL_MAX; - } - } else if (iWhere == CLP_BELOW_LOWER) { - assert (alpha < 0); - // going feasible - iWhere = CLP_FEASIBLE; - rhs += bound_[sequence] - model_->upperRegion()[sequence]; - } else { - assert (iWhere == CLP_ABOVE_UPPER); - // going feasible - iWhere = CLP_FEASIBLE; - rhs += model_->lowerRegion()[sequence] - bound_[sequence]; - } - setCurrentStatus(status_[sequence], iWhere); -#ifdef NONLIN_DEBUG - assert(saveRhs1 == rhs); -#endif - returnValue = fabs(alpha) * infeasibilityWeight_; - } - return returnValue; - } - /// Returns current lower bound - inline double lower(int sequence) const { - return lower_[whichRange_[sequence] + offset_[sequence]]; - } - /// Returns current upper bound - inline double upper(int sequence) const { - return lower_[whichRange_[sequence] + offset_[sequence] + 1]; - } - /// Returns current cost - inline double cost(int sequence) const { - return cost_[whichRange_[sequence] + offset_[sequence]]; - } - //@} - - - /**@name Gets and sets */ - //@{ - /// Number of infeasibilities - inline int numberInfeasibilities() const { - return numberInfeasibilities_; - } - /// Change in cost - inline double changeInCost() const { - return changeCost_; - } - /// Feasible cost - inline double feasibleCost() const { - return feasibleCost_; - } - /// Feasible cost with offset and direction (i.e. for reporting) - double feasibleReportCost() const; - /// Sum of infeasibilities - inline double sumInfeasibilities() const { - return sumInfeasibilities_; - } - /// Largest infeasibility - inline double largestInfeasibility() const { - return largestInfeasibility_; - } - /// Average theta - inline double averageTheta() const { - return averageTheta_; - } - inline void setAverageTheta(double value) { - averageTheta_ = value; - } - inline void setChangeInCost(double value) { - changeCost_ = value; - } - inline void setMethod(int value) { - method_ = value; - } - /// See if may want to look both ways - inline bool lookBothWays() const { - return bothWays_; - } - //@} - ///@name Private functions to deal with infeasible regions - inline bool infeasible(int i) const { - return ((infeasible_[i>>5] >> (i & 31)) & 1) != 0; - } - inline void setInfeasible(int i, bool trueFalse) { - unsigned int & value = infeasible_[i>>5]; - int bit = i & 31; - if (trueFalse) - value |= (1 << bit); - else - value &= ~(1 << bit); - } - inline unsigned char * statusArray() const { - return status_; - } - /// For debug - void validate(); - //@} - -private: - /**@name Data members */ - //@{ - /// Change in cost because of infeasibilities - double changeCost_; - /// Feasible cost - double feasibleCost_; - /// Current infeasibility weight - double infeasibilityWeight_; - /// Largest infeasibility - double largestInfeasibility_; - /// Sum of infeasibilities - double sumInfeasibilities_; - /// Average theta - kept here as only for primal - double averageTheta_; - /// Number of rows (mainly for checking and copy) - int numberRows_; - /// Number of columns (mainly for checking and copy) - int numberColumns_; - /// Starts for each entry (columns then rows) - int * start_; - /// Range for each entry (columns then rows) - int * whichRange_; - /// Temporary range offset for each entry (columns then rows) - int * offset_; - /** Lower bound for each range (upper bound is next lower). - For various reasons there is always an infeasible range - at bottom - even if lower bound is - infinity */ - double * lower_; - /// Cost for each range - double * cost_; - /// Model - ClpSimplex * model_; - // Array to say which regions are infeasible - unsigned int * infeasible_; - /// Number of infeasibilities found - int numberInfeasibilities_; - // new stuff - /// Contains status at beginning and current - unsigned char * status_; - /// Bound which has been replaced in lower_ or upper_ - double * bound_; - /// Feasible cost array - double * cost2_; - /// Method 1 old, 2 new, 3 both! - int method_; - /// If all non-linear costs convex - bool convex_; - /// If we should look both ways for djs - bool bothWays_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpObjective.hpp b/thirdparty/linux/include/coin1/ClpObjective.hpp deleted file mode 100644 index f98903a6..00000000 --- a/thirdparty/linux/include/coin1/ClpObjective.hpp +++ /dev/null @@ -1,134 +0,0 @@ -/* $Id: ClpObjective.hpp 1825 2011-11-20 16:02:57Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpObjective_H -#define ClpObjective_H - - -//############################################################################# -class ClpSimplex; -class ClpModel; - -/** Objective Abstract Base Class - -Abstract Base Class for describing an objective function - -*/ -class ClpObjective { - -public: - - ///@name Stuff - //@{ - - /** Returns gradient. If Linear then solution may be NULL, - also returns an offset (to be added to current one) - If refresh is false then uses last solution - Uses model for scaling - includeLinear 0 - no, 1 as is, 2 as feasible - */ - virtual double * gradient(const ClpSimplex * model, - const double * solution, - double & offset, bool refresh, - int includeLinear = 2) = 0; - /** Returns reduced gradient.Returns an offset (to be added to current one). - */ - virtual double reducedGradient(ClpSimplex * model, double * region, - bool useFeasibleCosts) = 0; - /** Returns step length which gives minimum of objective for - solution + theta * change vector up to maximum theta. - - arrays are numberColumns+numberRows - Also sets current objective, predicted and at maximumTheta - */ - virtual double stepLength(ClpSimplex * model, - const double * solution, - const double * change, - double maximumTheta, - double & currentObj, - double & predictedObj, - double & thetaObj) = 0; - /// Return objective value (without any ClpModel offset) (model may be NULL) - virtual double objectiveValue(const ClpSimplex * model, const double * solution) const = 0; - /// Resize objective - virtual void resize(int newNumberColumns) = 0; - /// Delete columns in objective - virtual void deleteSome(int numberToDelete, const int * which) = 0; - /// Scale objective - virtual void reallyScale(const double * columnScale) = 0; - /** Given a zeroed array sets nonlinear columns to 1. - Returns number of nonlinear columns - */ - virtual int markNonlinear(char * which); - /// Say we have new primal solution - so may need to recompute - virtual void newXValues() {} - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpObjective(); - - /// Copy constructor - ClpObjective(const ClpObjective &); - - /// Assignment operator - ClpObjective & operator=(const ClpObjective& rhs); - - /// Destructor - virtual ~ClpObjective (); - - /// Clone - virtual ClpObjective * clone() const = 0; - /** Subset clone. Duplicates are allowed - and order is as given. - Derived classes need not provide this as it may not always make - sense */ - virtual ClpObjective * subsetClone (int numberColumns, - const int * whichColumns) const; - - //@} - - ///@name Other - //@{ - /// Returns type (above 63 is extra information) - inline int type() const { - return type_; - } - /// Sets type (above 63 is extra information) - inline void setType(int value) { - type_ = value; - } - /// Whether activated - inline int activated() const { - return activated_; - } - /// Set whether activated - inline void setActivated(int value) { - activated_ = value; - } - - /// Objective offset - inline double nonlinearOffset () const { - return offset_; - } - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected member data - //@{ - /// Value of non-linear part of objective - double offset_; - /// Type of objective - linear is 1 - int type_; - /// Whether activated - int activated_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpPackedMatrix.hpp b/thirdparty/linux/include/coin1/ClpPackedMatrix.hpp deleted file mode 100644 index ec0c0b90..00000000 --- a/thirdparty/linux/include/coin1/ClpPackedMatrix.hpp +++ /dev/null @@ -1,638 +0,0 @@ -/* $Id: ClpPackedMatrix.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPackedMatrix_H -#define ClpPackedMatrix_H - -#include "CoinPragma.hpp" - -#include "ClpMatrixBase.hpp" - -/** This implements CoinPackedMatrix as derived from ClpMatrixBase. - - It adds a few methods that know about model as well as matrix - - For details see CoinPackedMatrix */ - -class ClpPackedMatrix2; -class ClpPackedMatrix3; -class ClpPackedMatrix : public ClpMatrixBase { - -public: - /**@name Useful methods */ - //@{ - /// Return a complete CoinPackedMatrix - virtual CoinPackedMatrix * getPackedMatrix() const { - return matrix_; - } - /** Whether the packed matrix is column major ordered or not. */ - virtual bool isColOrdered() const { - return matrix_->isColOrdered(); - } - /** Number of entries in the packed matrix. */ - virtual CoinBigIndex getNumElements() const { - return matrix_->getNumElements(); - } - /** Number of columns. */ - virtual int getNumCols() const { - return matrix_->getNumCols(); - } - /** Number of rows. */ - virtual int getNumRows() const { - return matrix_->getNumRows(); - } - - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with vectorStarts and vectorLengths. */ - virtual const double * getElements() const { - return matrix_->getElements(); - } - /// Mutable elements - inline double * getMutableElements() const { - return matrix_->getMutableElements(); - } - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with vectorStarts and - vectorLengths. */ - virtual const int * getIndices() const { - return matrix_->getIndices(); - } - - virtual const CoinBigIndex * getVectorStarts() const { - return matrix_->getVectorStarts(); - } - /** The lengths of the major-dimension vectors. */ - virtual const int * getVectorLengths() const { - return matrix_->getVectorLengths(); - } - /** The length of a single major-dimension vector. */ - virtual int getVectorLength(int index) const { - return matrix_->getVectorSize(index); - } - - /** Delete the columns whose indices are listed in indDel. */ - virtual void deleteCols(const int numDel, const int * indDel); - /** Delete the rows whose indices are listed in indDel. */ - virtual void deleteRows(const int numDel, const int * indDel); -#ifndef CLP_NO_VECTOR - /// Append Columns - virtual void appendCols(int number, const CoinPackedVectorBase * const * columns); - /// Append Rows - virtual void appendRows(int number, const CoinPackedVectorBase * const * rows); -#endif - /** Append a set of rows/columns to the end of the matrix. Returns number of errors - i.e. if any of the new rows/columns contain an index that's larger than the - number of columns-1/rows-1 (if numberOther>0) or duplicates - If 0 then rows, 1 if columns */ - virtual int appendMatrix(int number, int type, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther = -1); - /** Replace the elements of a vector. The indices remain the same. - This is only needed if scaling and a row copy is used. - At most the number specified will be replaced. - The index is between 0 and major dimension of matrix */ - virtual void replaceVector(const int index, - const int numReplace, const double * newElements) { - matrix_->replaceVector(index, numReplace, newElements); - } - /** Modify one element of packed matrix. An element may be added. - This works for either ordering If the new element is zero it will be - deleted unless keepZero true */ - virtual void modifyCoefficient(int row, int column, double newElement, - bool keepZero = false) { - matrix_->modifyCoefficient(row, column, newElement, keepZero); - } - /** Returns a new matrix in reverse order without gaps */ - virtual ClpMatrixBase * reverseOrderedCopy() const; - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis(const int * whichColumn, - int & numberColumnBasic); - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element); - /** Creates scales for column copy (rowCopy in model may be modified) - returns non-zero if no scaling done */ - virtual int scale(ClpModel * model, const ClpSimplex * baseModel = NULL) const ; - /** Scales rowCopy if column copy scaled - Only called if scales already exist */ - virtual void scaleRowCopy(ClpModel * model) const ; - /// Creates scaled column copy if scales exist - void createScaledMatrix(ClpSimplex * model) const; - /** Realy really scales column copy - Only called if scales already exist. - Up to user ro delete */ - virtual ClpMatrixBase * scaledColumnCopy(ClpModel * model) const ; - /** Checks if all elements are in valid range. Can just - return true if you are not paranoid. For Clp I will - probably expect no zeros. Code can modify matrix to get rid of - small elements. - check bits (can be turned off to save time) : - 1 - check if matrix has gaps - 2 - check if zero elements - 4 - check and compress duplicates - 8 - report on large and small - */ - virtual bool allElementsInRange(ClpModel * model, - double smallest, double largest, - int check = 15); - /** Returns largest and smallest elements of both signs. - Largest refers to largest absolute value. - */ - virtual void rangeOfElements(double & smallestNegative, double & largestNegative, - double & smallestPositive, double & largestPositive); - - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const ; - /** Unpacks a column into an CoinIndexedvector - ** in packed foramt - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const ; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const; - /// Allow any parts of a created CoinPackedMatrix to be deleted - virtual void releasePackedMatrix() const { } - /** Given positive integer weights for each row fills in sum of weights - for each column (and slack). - Returns weights vector - */ - virtual CoinBigIndex * dubiousWeights(const ClpSimplex * model, int * inputWeights) const; - /// Says whether it can do partial pricing - virtual bool canDoPartialPricing() const; - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - /// makes sure active columns correct - virtual int refresh(ClpSimplex * model); - // Really scale matrix - virtual void reallyScale(const double * rowScale, const double * columnScale); - /** Set the dimensions of the matrix. In effect, append new empty - columns/rows to the matrix. A negative number for either dimension - means that that dimension doesn't change. Otherwise the new dimensions - MUST be at least as large as the current ones otherwise an exception - is thrown. */ - virtual void setDimensions(int numrows, int numcols); - //@} - - /**@name Matrix times vector methods */ - //@{ - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void times(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - virtual void transposeTimes(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void transposeTimes(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale, - double * spare = NULL) const; - /** Return y - pi * A in y. - @pre pi must be of size numRows() - @pre y must be of size numColumns() - This just does subset (but puts in correct place in y) */ - void transposeTimesSubset( int number, - const int * which, - const double * pi, double * y, - const double * rowScale, - const double * columnScale, - double * spare = NULL) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x * scalar * A + y in z. - Note - If x packed mode - then z packed mode - This does by column and knows no gaps - Squashes small elements and knows about ClpSimplex */ - void transposeTimesByColumn(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex. - This version uses row copy*/ - virtual void transposeTimesByRow(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x *A in z but - just for indices in y. - Note - z always packed mode */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Returns true if can combine transposeTimes and subsetTransposeTimes - and if it would be faster */ - virtual bool canCombine(const ClpSimplex * model, - const CoinIndexedVector * pi) const; - /// Updates two arrays for steepest - virtual void transposeTimes2(const ClpSimplex * model, - const CoinIndexedVector * pi1, CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, - CoinIndexedVector * spare, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - /// Updates second array for steepest and does devex weights - virtual void subsetTimes2(const ClpSimplex * model, - CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, CoinIndexedVector * dj2, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - /// Sets up an effective RHS - void useEffectiveRhs(ClpSimplex * model); -#if COIN_LONG_WORK - // For long double versions - virtual void times(CoinWorkDouble scalar, - const CoinWorkDouble * x, CoinWorkDouble * y) const ; - virtual void transposeTimes(CoinWorkDouble scalar, - const CoinWorkDouble * x, CoinWorkDouble * y) const ; -#endif -//@} - - /**@name Other */ - //@{ - /// Returns CoinPackedMatrix (non const) - inline CoinPackedMatrix * matrix() const { - return matrix_; - } - /** Just sets matrix_ to NULL so it can be used elsewhere. - used in GUB - */ - inline void setMatrixNull() { - matrix_ = NULL; - } - /// Say we want special column copy - inline void makeSpecialColumnCopy() { - flags_ |= 16; - } - /// Say we don't want special column copy - void releaseSpecialColumnCopy(); - /// Are there zeros? - inline bool zeros() const { - return ((flags_ & 1) != 0); - } - /// Do we want special column copy - inline bool wantsSpecialColumnCopy() const { - return ((flags_ & 16) != 0); - } - /// Flags - inline int flags() const { - return flags_; - } - /// Sets flags_ correctly - inline void checkGaps() { - flags_ = (matrix_->hasGaps()) ? (flags_ | 2) : (flags_ & (~2)); - } - /// number of active columns (normally same as number of columns) - inline int numberActiveColumns() const - { return numberActiveColumns_;} - /// Set number of active columns (normally same as number of columns) - inline void setNumberActiveColumns(int value) - { numberActiveColumns_ = value;} - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpPackedMatrix(); - /** Destructor */ - virtual ~ClpPackedMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpPackedMatrix(const ClpPackedMatrix&); - /** The copy constructor from an CoinPackedMatrix. */ - ClpPackedMatrix(const CoinPackedMatrix&); - /** Subset constructor (without gaps). Duplicates are allowed - and order is as given */ - ClpPackedMatrix (const ClpPackedMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - ClpPackedMatrix (const CoinPackedMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - - /** This takes over ownership (for space reasons) */ - ClpPackedMatrix(CoinPackedMatrix * matrix); - - ClpPackedMatrix& operator=(const ClpPackedMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - /// Copy contents - resizing if necessary - otherwise re-use memory - virtual void copy(const ClpPackedMatrix * from); - /** Subset clone (without gaps). Duplicates are allowed - and order is as given */ - virtual ClpMatrixBase * subsetClone ( - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns) const ; - /// make special row copy - void specialRowCopy(ClpSimplex * model, const ClpMatrixBase * rowCopy); - /// make special column copy - void specialColumnCopy(ClpSimplex * model); - /// Correct sequence in and out to give true value - virtual void correctSequence(const ClpSimplex * model, int & sequenceIn, int & sequenceOut) ; - //@} -private: - /// Meat of transposeTimes by column when not scaled - int gutsOfTransposeTimesUnscaled(const double * COIN_RESTRICT pi, - int * COIN_RESTRICT index, - double * COIN_RESTRICT array, - const double tolerance) const; - /// Meat of transposeTimes by column when scaled - int gutsOfTransposeTimesScaled(const double * COIN_RESTRICT pi, - const double * COIN_RESTRICT columnScale, - int * COIN_RESTRICT index, - double * COIN_RESTRICT array, - const double tolerance) const; - /// Meat of transposeTimes by column when not scaled and skipping - int gutsOfTransposeTimesUnscaled(const double * COIN_RESTRICT pi, - int * COIN_RESTRICT index, - double * COIN_RESTRICT array, - const unsigned char * status, - const double tolerance) const; - /** Meat of transposeTimes by column when not scaled and skipping - and doing part of dualColumn */ - int gutsOfTransposeTimesUnscaled(const double * COIN_RESTRICT pi, - int * COIN_RESTRICT index, - double * COIN_RESTRICT array, - const unsigned char * status, - int * COIN_RESTRICT spareIndex, - double * COIN_RESTRICT spareArray, - const double * COIN_RESTRICT reducedCost, - double & upperTheta, - double & bestPossible, - double acceptablePivot, - double dualTolerance, - int & numberRemaining, - const double zeroTolerance) const; - /// Meat of transposeTimes by column when scaled and skipping - int gutsOfTransposeTimesScaled(const double * COIN_RESTRICT pi, - const double * COIN_RESTRICT columnScale, - int * COIN_RESTRICT index, - double * COIN_RESTRICT array, - const unsigned char * status, - const double tolerance) const; - /// Meat of transposeTimes by row n > K if packed - returns number nonzero - int gutsOfTransposeTimesByRowGEK(const CoinIndexedVector * COIN_RESTRICT piVector, - int * COIN_RESTRICT index, - double * COIN_RESTRICT output, - int numberColumns, - const double tolerance, - const double scalar) const; - /// Meat of transposeTimes by row n > 2 if packed - returns number nonzero - int gutsOfTransposeTimesByRowGE3(const CoinIndexedVector * COIN_RESTRICT piVector, - int * COIN_RESTRICT index, - double * COIN_RESTRICT output, - double * COIN_RESTRICT array2, - const double tolerance, - const double scalar) const; - /// Meat of transposeTimes by row n > 2 if packed - returns number nonzero - int gutsOfTransposeTimesByRowGE3a(const CoinIndexedVector * COIN_RESTRICT piVector, - int * COIN_RESTRICT index, - double * COIN_RESTRICT output, - int * COIN_RESTRICT lookup, - char * COIN_RESTRICT marked, - const double tolerance, - const double scalar) const; - /// Meat of transposeTimes by row n == 2 if packed - void gutsOfTransposeTimesByRowEQ2(const CoinIndexedVector * piVector, CoinIndexedVector * output, - CoinIndexedVector * spareVector, const double tolerance, const double scalar) const; - /// Meat of transposeTimes by row n == 1 if packed - void gutsOfTransposeTimesByRowEQ1(const CoinIndexedVector * piVector, CoinIndexedVector * output, - const double tolerance, const double scalar) const; - /// Gets rid of special copies - void clearCopies(); - - -protected: - /// Check validity - void checkFlags(int type) const; - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Data - CoinPackedMatrix * matrix_; - /// number of active columns (normally same as number of columns) - int numberActiveColumns_; - /** Flags - - 1 - has zero elements - 2 - has gaps - 4 - has special row copy - 8 - has special column copy - 16 - wants special column copy - */ - mutable int flags_; - /// Special row copy - ClpPackedMatrix2 * rowCopy_; - /// Special column copy - ClpPackedMatrix3 * columnCopy_; - //@} -}; -#ifdef THREAD -#include -typedef struct { - double acceptablePivot; - const ClpSimplex * model; - double * spare; - int * spareIndex; - double * arrayTemp; - int * indexTemp; - int * numberInPtr; - double * bestPossiblePtr; - double * upperThetaPtr; - int * posFreePtr; - double * freePivotPtr; - int * numberOutPtr; - const unsigned short * count; - const double * pi; - const CoinBigIndex * rowStart; - const double * element; - const unsigned short * column; - int offset; - int numberInRowArray; - int numberLook; -} dualColumn0Struct; -#endif -class ClpPackedMatrix2 { - -public: - /**@name Useful methods */ - //@{ - /** Return x * -1 * A in z. - Note - x packed and z will be packed mode - Squashes small elements and knows about ClpSimplex */ - void transposeTimes(const ClpSimplex * model, - const CoinPackedMatrix * rowCopy, - const CoinIndexedVector * x, - CoinIndexedVector * spareArray, - CoinIndexedVector * z) const; - /// Returns true if copy has useful information - inline bool usefulInfo() const { - return rowStart_ != NULL; - } - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpPackedMatrix2(); - /** Constructor from copy. */ - ClpPackedMatrix2(ClpSimplex * model, const CoinPackedMatrix * rowCopy); - /** Destructor */ - virtual ~ClpPackedMatrix2(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpPackedMatrix2(const ClpPackedMatrix2&); - ClpPackedMatrix2& operator=(const ClpPackedMatrix2&); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Number of blocks - int numberBlocks_; - /// Number of rows - int numberRows_; - /// Column offset for each block (plus one at end) - int * offset_; - /// Counts of elements in each part of row - mutable unsigned short * count_; - /// Row starts - mutable CoinBigIndex * rowStart_; - /// columns within block - unsigned short * column_; - /// work arrays - double * work_; -#ifdef THREAD - pthread_t * threadId_; - dualColumn0Struct * info_; -#endif - //@} -}; -typedef struct { - CoinBigIndex startElements_; // point to data - int startIndices_; // point to column_ - int numberInBlock_; - int numberPrice_; // at beginning - int numberElements_; // number elements per column -} blockStruct; -class ClpPackedMatrix3 { - -public: - /**@name Useful methods */ - //@{ - /** Return x * -1 * A in z. - Note - x packed and z will be packed mode - Squashes small elements and knows about ClpSimplex */ - void transposeTimes(const ClpSimplex * model, - const double * pi, - CoinIndexedVector * output) const; - /// Updates two arrays for steepest - void transposeTimes2(const ClpSimplex * model, - const double * pi, CoinIndexedVector * dj1, - const double * piWeight, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpPackedMatrix3(); - /** Constructor from copy. */ - ClpPackedMatrix3(ClpSimplex * model, const CoinPackedMatrix * columnCopy); - /** Destructor */ - virtual ~ClpPackedMatrix3(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpPackedMatrix3(const ClpPackedMatrix3&); - ClpPackedMatrix3& operator=(const ClpPackedMatrix3&); - //@} - /**@name Sort methods */ - //@{ - /** Sort blocks */ - void sortBlocks(const ClpSimplex * model); - /// Swap one variable - void swapOne(const ClpSimplex * model, const ClpPackedMatrix * matrix, - int iColumn); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Number of blocks - int numberBlocks_; - /// Number of columns - int numberColumns_; - /// Column indices and reverse lookup (within block) - int * column_; - /// Starts for odd/long vectors - CoinBigIndex * start_; - /// Rows - int * row_; - /// Elements - double * element_; - /// Blocks (ordinary start at 0 and go to first block) - blockStruct * block_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpParameters.hpp b/thirdparty/linux/include/coin1/ClpParameters.hpp deleted file mode 100644 index 7252d2bb..00000000 --- a/thirdparty/linux/include/coin1/ClpParameters.hpp +++ /dev/null @@ -1,126 +0,0 @@ -/* $Id: ClpParameters.hpp 2046 2014-08-14 04:13:10Z tkr $ */ -// Copyright (C) 2000, 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef _ClpParameters_H -#define _ClpParameters_H - -/** This is where to put any useful stuff. - -*/ -enum ClpIntParam { - /** The maximum number of iterations Clp can execute in the simplex methods - */ - ClpMaxNumIteration = 0, - /** The maximum number of iterations Clp can execute in hotstart before - terminating */ - ClpMaxNumIterationHotStart, - /** The name discipline; specifies how the solver will handle row and - column names. - - 0: Auto names: Names cannot be set by the client. Names of the form - Rnnnnnnn or Cnnnnnnn are generated on demand when a name for a - specific row or column is requested; nnnnnnn is derived from the row - or column index. Requests for a vector of names return a vector with - zero entries. - - 1: Lazy names: Names supplied by the client are retained. Names of the - form Rnnnnnnn or Cnnnnnnn are generated on demand if no name has been - supplied by the client. Requests for a vector of names return a - vector sized to the largest index of a name supplied by the client; - some entries in the vector may be null strings. - - 2: Full names: Names supplied by the client are retained. Names of the - form Rnnnnnnn or Cnnnnnnn are generated on demand if no name has been - supplied by the client. Requests for a vector of names return a - vector sized to match the constraint system, and all entries will - contain either the name specified by the client or a generated name. - */ - ClpNameDiscipline, - /** Just a marker, so that we can allocate a static sized array to store - parameters. */ - ClpLastIntParam -}; - -enum ClpDblParam { - /** Set Dual objective limit. This is to be used as a termination criteria - in methods where the dual objective monotonically changes (dual - simplex). */ - ClpDualObjectiveLimit, - /** Primal objective limit. This is to be used as a termination - criteria in methods where the primal objective monotonically changes - (e.g., primal simplex) */ - ClpPrimalObjectiveLimit, - /** The maximum amount the dual constraints can be violated and still be - considered feasible. */ - ClpDualTolerance, - /** The maximum amount the primal constraints can be violated and still be - considered feasible. */ - ClpPrimalTolerance, - /** Objective function constant. This the value of the constant term in - the objective function. */ - ClpObjOffset, - /// Maximum time in seconds - after, this action is as max iterations - ClpMaxSeconds, - /// Maximum wallclock running time in seconds - after, this action is as max iterations - ClpMaxWallSeconds, - /// Tolerance to use in presolve - ClpPresolveTolerance, - /** Just a marker, so that we can allocate a static sized array to store - parameters. */ - ClpLastDblParam -}; - - -enum ClpStrParam { - /** Name of the problem. This is the found on the Name card of - an mps file. */ - ClpProbName = 0, - /** Just a marker, so that we can allocate a static sized array to store - parameters. */ - ClpLastStrParam -}; - -/// Copy (I don't like complexity of Coin version) -template inline void -ClpDisjointCopyN( const T * array, const int size, T * newArray) -{ - memcpy(reinterpret_cast (newArray), array, size * sizeof(T)); -} -/// And set -template inline void -ClpFillN( T * array, const int size, T value) -{ - int i; - for (i = 0; i < size; i++) - array[i] = value; -} -/// This returns a non const array filled with input from scalar or actual array -template inline T* -ClpCopyOfArray( const T * array, const int size, T value) -{ - T * arrayNew = new T[size]; - if (array) - ClpDisjointCopyN(array, size, arrayNew); - else - ClpFillN ( arrayNew, size, value); - return arrayNew; -} - -/// This returns a non const array filled with actual array (or NULL) -template inline T* -ClpCopyOfArray( const T * array, const int size) -{ - if (array) { - T * arrayNew = new T[size]; - ClpDisjointCopyN(array, size, arrayNew); - return arrayNew; - } else { - return NULL; - } -} -/// For a structure to be used by trusted code -typedef struct { - int typeStruct; // allocated as 1,2 etc - int typeCall; - void * data; -} ClpTrustedData; -#endif diff --git a/thirdparty/linux/include/coin1/ClpPdcoBase.hpp b/thirdparty/linux/include/coin1/ClpPdcoBase.hpp deleted file mode 100644 index cb8fd8fd..00000000 --- a/thirdparty/linux/include/coin1/ClpPdcoBase.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/* $Id: ClpPdcoBase.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPdcoBase_H -#define ClpPdcoBase_H - -#include "CoinPragma.hpp" - -#include "CoinPackedMatrix.hpp" -#include "CoinDenseVector.hpp" -class ClpInterior; - -/** Abstract base class for tailoring everything for Pcdo - - Since this class is abstract, no object of this type can be created. - - If a derived class provides all methods then all ClpPcdo algorithms - should work. - - Eventually we should be able to use ClpObjective and ClpMatrixBase. -*/ - -class ClpPdcoBase { - -public: - /**@name Virtual methods that the derived classes must provide */ - //@{ - virtual void matVecMult(ClpInterior * model, int mode, double * x, double * y) const = 0; - - virtual void getGrad(ClpInterior * model, CoinDenseVector &x, CoinDenseVector &grad) const = 0; - - virtual void getHessian(ClpInterior * model, CoinDenseVector &x, CoinDenseVector &H) const = 0; - - virtual double getObj(ClpInterior * model, CoinDenseVector &x) const = 0; - - virtual void matPrecon(ClpInterior * model, double delta, double * x, double * y) const = 0; - - //@} - //@{ - ///@name Other - /// Clone - virtual ClpPdcoBase * clone() const = 0; - /// Returns type - inline int type() const { - return type_; - }; - /// Sets type - inline void setType(int type) { - type_ = type; - }; - /// Returns size of d1 - inline int sizeD1() const { - return 1; - }; - /// Returns d1 as scalar - inline double getD1() const { - return d1_; - }; - /// Returns size of d2 - inline int sizeD2() const { - return 1; - }; - /// Returns d2 as scalar - inline double getD2() const { - return d2_; - }; - //@} - - -protected: - - /**@name Constructors, destructor
      - NOTE: All constructors are protected. There's no need - to expose them, after all, this is an abstract class. */ - //@{ - /** Default constructor. */ - ClpPdcoBase(); - /** Destructor (has to be public) */ -public: - virtual ~ClpPdcoBase(); -protected: - // Copy - ClpPdcoBase(const ClpPdcoBase&); - // Assignment - ClpPdcoBase& operator=(const ClpPdcoBase&); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Should be dense vectors - double d1_; - double d2_; - /// type (may be useful) - int type_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpPlusMinusOneMatrix.hpp b/thirdparty/linux/include/coin1/ClpPlusMinusOneMatrix.hpp deleted file mode 100644 index 0cf27a49..00000000 --- a/thirdparty/linux/include/coin1/ClpPlusMinusOneMatrix.hpp +++ /dev/null @@ -1,290 +0,0 @@ -/* $Id: ClpPlusMinusOneMatrix.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPlusMinusOneMatrix_H -#define ClpPlusMinusOneMatrix_H - - -#include "CoinPragma.hpp" - -#include "ClpMatrixBase.hpp" - -/** This implements a simple +- one matrix as derived from ClpMatrixBase. - -*/ - -class ClpPlusMinusOneMatrix : public ClpMatrixBase { - -public: - /**@name Useful methods */ - //@{ - /// Return a complete CoinPackedMatrix - virtual CoinPackedMatrix * getPackedMatrix() const; - /** Whether the packed matrix is column major ordered or not. */ - virtual bool isColOrdered() const ; - /** Number of entries in the packed matrix. */ - virtual CoinBigIndex getNumElements() const; - /** Number of columns. */ - virtual int getNumCols() const { - return numberColumns_; - } - /** Number of rows. */ - virtual int getNumRows() const { - return numberRows_; - } - - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with vectorStarts and vectorLengths. */ - virtual const double * getElements() const; - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with vectorStarts and - vectorLengths. */ - virtual const int * getIndices() const { - return indices_; - } - // and for advanced use - int * getMutableIndices() const { - return indices_; - } - - virtual const CoinBigIndex * getVectorStarts() const; - /** The lengths of the major-dimension vectors. */ - virtual const int * getVectorLengths() const; - - /** Delete the columns whose indices are listed in indDel. */ - virtual void deleteCols(const int numDel, const int * indDel); - /** Delete the rows whose indices are listed in indDel. */ - virtual void deleteRows(const int numDel, const int * indDel); - /// Append Columns - virtual void appendCols(int number, const CoinPackedVectorBase * const * columns); - /// Append Rows - virtual void appendRows(int number, const CoinPackedVectorBase * const * rows); -#ifndef SLIM_CLP - /** Append a set of rows/columns to the end of the matrix. Returns number of errors - i.e. if any of the new rows/columns contain an index that's larger than the - number of columns-1/rows-1 (if numberOther>0) or duplicates - If 0 then rows, 1 if columns */ - virtual int appendMatrix(int number, int type, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther = -1); -#endif - /** Returns a new matrix in reverse order without gaps */ - virtual ClpMatrixBase * reverseOrderedCopy() const; - /// Returns number of elements in column part of basis - virtual CoinBigIndex countBasis( - const int * whichColumn, - int & numberColumnBasic); - /// Fills in column part of basis - virtual void fillBasis(ClpSimplex * model, - const int * whichColumn, - int & numberColumnBasic, - int * row, int * start, - int * rowCount, int * columnCount, - CoinFactorizationDouble * element); - /** Given positive integer weights for each row fills in sum of weights - for each column (and slack). - Returns weights vector - */ - virtual CoinBigIndex * dubiousWeights(const ClpSimplex * model, int * inputWeights) const; - /** Returns largest and smallest elements of both signs. - Largest refers to largest absolute value. - */ - virtual void rangeOfElements(double & smallestNegative, double & largestNegative, - double & smallestPositive, double & largestPositive); - /** Unpacks a column into an CoinIndexedvector - */ - virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column) const ; - /** Unpacks a column into an CoinIndexedvector - ** in packed foramt - Note that model is NOT const. Bounds and objective could - be modified if doing column generation (just for this variable) */ - virtual void unpackPacked(ClpSimplex * model, - CoinIndexedVector * rowArray, - int column) const; - /** Adds multiple of a column into an CoinIndexedvector - You can use quickAdd to add to vector */ - virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray, - int column, double multiplier) const ; - /** Adds multiple of a column into an array */ - virtual void add(const ClpSimplex * model, double * array, - int column, double multiplier) const; - /// Allow any parts of a created CoinMatrix to be deleted - virtual void releasePackedMatrix() const; - /** Set the dimensions of the matrix. In effect, append new empty - columns/rows to the matrix. A negative number for either dimension - means that that dimension doesn't change. Otherwise the new dimensions - MUST be at least as large as the current ones otherwise an exception - is thrown. */ - virtual void setDimensions(int numrows, int numcols); - /// Just checks matrix valid - will say if dimensions not quite right if detail - void checkValid(bool detail) const; - //@} - - /**@name Matrix times vector methods */ - //@{ - /** Return y + A * scalar *x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - virtual void times(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void times(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale) const; - /** Return y + x * scalar * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - virtual void transposeTimes(double scalar, - const double * x, double * y) const; - /// And for scaling - virtual void transposeTimes(double scalar, - const double * x, double * y, - const double * rowScale, - const double * columnScale, double * spare = NULL) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex */ - virtual void transposeTimes(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x * scalar * A + y in z. - Can use y as temporary array (will be empty at end) - Note - If x packed mode - then z packed mode - Squashes small elements and knows about ClpSimplex. - This version uses row copy*/ - virtual void transposeTimesByRow(const ClpSimplex * model, double scalar, - const CoinIndexedVector * x, - CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Return x *A in z but - just for indices in y. - Note - z always packed mode */ - virtual void subsetTransposeTimes(const ClpSimplex * model, - const CoinIndexedVector * x, - const CoinIndexedVector * y, - CoinIndexedVector * z) const; - /** Returns true if can combine transposeTimes and subsetTransposeTimes - and if it would be faster */ - virtual bool canCombine(const ClpSimplex * model, - const CoinIndexedVector * pi) const; - /// Updates two arrays for steepest - virtual void transposeTimes2(const ClpSimplex * model, - const CoinIndexedVector * pi1, CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, - CoinIndexedVector * spare, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - /// Updates second array for steepest and does devex weights - virtual void subsetTimes2(const ClpSimplex * model, - CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, CoinIndexedVector * dj2, - double referenceIn, double devex, - // Array for exact devex to say what is in reference framework - unsigned int * reference, - double * weights, double scaleFactor); - //@} - - /**@name Other */ - //@{ - /// Return starts of +1s - inline CoinBigIndex * startPositive() const { - return startPositive_; - } - /// Return starts of -1s - inline CoinBigIndex * startNegative() const { - return startNegative_; - } - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - ClpPlusMinusOneMatrix(); - /** Destructor */ - virtual ~ClpPlusMinusOneMatrix(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - ClpPlusMinusOneMatrix(const ClpPlusMinusOneMatrix&); - /** The copy constructor from an CoinPlusMinusOneMatrix. - If not a valid matrix then getIndices will be NULL and - startPositive[0] will have number of +1, - startPositive[1] will have number of -1, - startPositive[2] will have number of others, - */ - ClpPlusMinusOneMatrix(const CoinPackedMatrix&); - /// Constructor from arrays - ClpPlusMinusOneMatrix(int numberRows, int numberColumns, - bool columnOrdered, const int * indices, - const CoinBigIndex * startPositive, const CoinBigIndex * startNegative); - /** Subset constructor (without gaps). Duplicates are allowed - and order is as given */ - ClpPlusMinusOneMatrix (const ClpPlusMinusOneMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - - ClpPlusMinusOneMatrix& operator=(const ClpPlusMinusOneMatrix&); - /// Clone - virtual ClpMatrixBase * clone() const ; - /** Subset clone (without gaps). Duplicates are allowed - and order is as given */ - virtual ClpMatrixBase * subsetClone ( - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns) const ; - /// pass in copy (object takes ownership) - void passInCopy(int numberRows, int numberColumns, - bool columnOrdered, int * indices, - CoinBigIndex * startPositive, CoinBigIndex * startNegative); - /// Says whether it can do partial pricing - virtual bool canDoPartialPricing() const; - /// Partial pricing - virtual void partialPricing(ClpSimplex * model, double start, double end, - int & bestSequence, int & numberWanted); - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// For fake CoinPackedMatrix - mutable CoinPackedMatrix * matrix_; - mutable int * lengths_; - /// Start of +1's for each - CoinBigIndex * COIN_RESTRICT startPositive_; - /// Start of -1's for each - CoinBigIndex * COIN_RESTRICT startNegative_; - /// Data -1, then +1 rows in pairs (row==-1 if one entry) - int * COIN_RESTRICT indices_; - /// Number of rows - int numberRows_; - /// Number of columns - int numberColumns_; -#ifdef CLP_PLUS_ONE_MATRIX - /** Other flags (could have columnOrdered_?) - 1 bit - says just +1 - */ - mutable int otherFlags_; -#endif - /// True if column ordered - bool columnOrdered_; - - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpPresolve.hpp b/thirdparty/linux/include/coin1/ClpPresolve.hpp deleted file mode 100644 index 5e28289b..00000000 --- a/thirdparty/linux/include/coin1/ClpPresolve.hpp +++ /dev/null @@ -1,299 +0,0 @@ -/* $Id: ClpPresolve.hpp 2134 2015-03-22 16:40:43Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPresolve_H -#define ClpPresolve_H -#include "ClpSimplex.hpp" - -class CoinPresolveAction; -#include "CoinPresolveMatrix.hpp" -/** This is the Clp interface to CoinPresolve - -*/ -class ClpPresolve { -public: - /**@name Main Constructor, destructor */ - //@{ - /// Default constructor - ClpPresolve(); - - /// Virtual destructor - virtual ~ClpPresolve(); - //@} - /**@name presolve - presolves a model, transforming the model - * and saving information in the ClpPresolve object needed for postsolving. - * This underlying (protected) method is virtual; the idea is that in the future, - * one could override this method to customize how the various - * presolve techniques are applied. - - This version of presolve returns a pointer to a new presolved - model. NULL if infeasible or unbounded. - This should be paired with postsolve - below. The advantage of going back to original model is that it - will be exactly as it was i.e. 0.0 will not become 1.0e-19. - If keepIntegers is true then bounds may be tightened in - original. Bounds will be moved by up to feasibilityTolerance - to try and stay feasible. - Names will be dropped in presolved model if asked - */ - ClpSimplex * presolvedModel(ClpSimplex & si, - double feasibilityTolerance = 0.0, - bool keepIntegers = true, - int numberPasses = 5, - bool dropNames = false, - bool doRowObjective = false, - const char * prohibitedRows=NULL, - const char * prohibitedColumns=NULL); -#ifndef CLP_NO_STD - /** This version saves data in a file. The passed in model - is updated to be presolved model. - Returns non-zero if infeasible*/ - int presolvedModelToFile(ClpSimplex &si, std::string fileName, - double feasibilityTolerance = 0.0, - bool keepIntegers = true, - int numberPasses = 5, - bool dropNames = false, - bool doRowObjective = false); -#endif - /** Return pointer to presolved model, - Up to user to destroy */ - ClpSimplex * model() const; - /// Return pointer to original model - ClpSimplex * originalModel() const; - /// Set pointer to original model - void setOriginalModel(ClpSimplex * model); - - /// return pointer to original columns - const int * originalColumns() const; - /// return pointer to original rows - const int * originalRows() const; - /** "Magic" number. If this is non-zero then any elements with this value - may change and so presolve is very limited in what can be done - to the row and column. This is for non-linear problems. - */ - inline void setNonLinearValue(double value) { - nonLinearValue_ = value; - } - inline double nonLinearValue() const { - return nonLinearValue_; - } - /// Whether we want to do dual part of presolve - inline bool doDual() const { - return (presolveActions_ & 1) == 0; - } - inline void setDoDual(bool doDual) { - if (doDual) presolveActions_ &= ~1; - else presolveActions_ |= 1; - } - /// Whether we want to do singleton part of presolve - inline bool doSingleton() const { - return (presolveActions_ & 2) == 0; - } - inline void setDoSingleton(bool doSingleton) { - if (doSingleton) presolveActions_ &= ~2; - else presolveActions_ |= 2; - } - /// Whether we want to do doubleton part of presolve - inline bool doDoubleton() const { - return (presolveActions_ & 4) == 0; - } - inline void setDoDoubleton(bool doDoubleton) { - if (doDoubleton) presolveActions_ &= ~4; - else presolveActions_ |= 4; - } - /// Whether we want to do tripleton part of presolve - inline bool doTripleton() const { - return (presolveActions_ & 8) == 0; - } - inline void setDoTripleton(bool doTripleton) { - if (doTripleton) presolveActions_ &= ~8; - else presolveActions_ |= 8; - } - /// Whether we want to do tighten part of presolve - inline bool doTighten() const { - return (presolveActions_ & 16) == 0; - } - inline void setDoTighten(bool doTighten) { - if (doTighten) presolveActions_ &= ~16; - else presolveActions_ |= 16; - } - /// Whether we want to do forcing part of presolve - inline bool doForcing() const { - return (presolveActions_ & 32) == 0; - } - inline void setDoForcing(bool doForcing) { - if (doForcing) presolveActions_ &= ~32; - else presolveActions_ |= 32; - } - /// Whether we want to do impliedfree part of presolve - inline bool doImpliedFree() const { - return (presolveActions_ & 64) == 0; - } - inline void setDoImpliedFree(bool doImpliedfree) { - if (doImpliedfree) presolveActions_ &= ~64; - else presolveActions_ |= 64; - } - /// Whether we want to do dupcol part of presolve - inline bool doDupcol() const { - return (presolveActions_ & 128) == 0; - } - inline void setDoDupcol(bool doDupcol) { - if (doDupcol) presolveActions_ &= ~128; - else presolveActions_ |= 128; - } - /// Whether we want to do duprow part of presolve - inline bool doDuprow() const { - return (presolveActions_ & 256) == 0; - } - inline void setDoDuprow(bool doDuprow) { - if (doDuprow) presolveActions_ &= ~256; - else presolveActions_ |= 256; - } - /// Whether we want to do dependency part of presolve - inline bool doDependency() const { - return (presolveActions_ & 32768) != 0; - } - inline void setDoDependency(bool doDependency) { - if (doDependency) presolveActions_ |= 32768; - else presolveActions_ &= ~32768; - } - /// Whether we want to do singleton column part of presolve - inline bool doSingletonColumn() const { - return (presolveActions_ & 512) == 0; - } - inline void setDoSingletonColumn(bool doSingleton) { - if (doSingleton) presolveActions_ &= ~512; - else presolveActions_ |= 512; - } - /// Whether we want to do gubrow part of presolve - inline bool doGubrow() const { - return (presolveActions_ & 1024) == 0; - } - inline void setDoGubrow(bool doGubrow) { - if (doGubrow) presolveActions_ &= ~1024; - else presolveActions_ |= 1024; - } - /// Whether we want to do twoxtwo part of presolve - inline bool doTwoxTwo() const { - return (presolveActions_ & 2048) != 0; - } - inline void setDoTwoxtwo(bool doTwoxTwo) { - if (!doTwoxTwo) presolveActions_ &= ~2048; - else presolveActions_ |= 2048; - } - /// Whether we want to allow duplicate intersections - inline bool doIntersection() const { - return (presolveActions_ & 4096) != 0; - } - inline void setDoIntersection(bool doIntersection) { - if (doIntersection) presolveActions_ &= ~4096; - else presolveActions_ |= 4096; - } - /** How much we want to zero small values from aggregation - ratio - 0 - 1.0e-12, 1 1.0e-11, 2 1.0e-10, 3 1.0e-9 */ - inline int zeroSmall() const { - return (presolveActions_&(8192|16384))>>13; - } - inline void setZeroSmall(int value) { - presolveActions_ &= ~(8192|16384); - presolveActions_ |= value<<13; - } - /// Set whole group - inline int presolveActions() const { - return presolveActions_ & 0xffff; - } - inline void setPresolveActions(int action) { - presolveActions_ = (presolveActions_ & 0xffff0000) | (action & 0xffff); - } - /// Substitution level - inline void setSubstitution(int value) { - substitution_ = value; - } - /// Asks for statistics - inline void statistics() { - presolveActions_ |= 0x80000000; - } - /// Return presolve status (0,1,2) - int presolveStatus() const; - - /**@name postsolve - postsolve the problem. If the problem - has not been solved to optimality, there are no guarantees. - If you are using an algorithm like simplex that has a concept - of "basic" rows/cols, then set updateStatus - - Note that if you modified the original problem after presolving, - then you must ``undo'' these modifications before calling postsolve. - This version updates original*/ - virtual void postsolve(bool updateStatus = true); - - /// Gets rid of presolve actions (e.g.when infeasible) - void destroyPresolve(); - - /**@name private or protected data */ -private: - /// Original model - must not be destroyed before postsolve - ClpSimplex * originalModel_; - - /// ClpPresolved model - up to user to destroy by deleteClpPresolvedModel - ClpSimplex * presolvedModel_; - /** "Magic" number. If this is non-zero then any elements with this value - may change and so presolve is very limited in what can be done - to the row and column. This is for non-linear problems. - One could also allow for cases where sign of coefficient is known. - */ - double nonLinearValue_; - /// Original column numbers - int * originalColumn_; - /// Original row numbers - int * originalRow_; - /// Row objective - double * rowObjective_; - /// The list of transformations applied. - const CoinPresolveAction *paction_; - - /// The postsolved problem will expand back to its former size - /// as postsolve transformations are applied. - /// It is efficient to allocate data structures for the final size - /// of the problem rather than expand them as needed. - /// These fields give the size of the original problem. - int ncols_; - int nrows_; - CoinBigIndex nelems_; - /// Number of major passes - int numberPasses_; - /// Substitution level - int substitution_; -#ifndef CLP_NO_STD - /// Name of saved model file - std::string saveFile_; -#endif - /** Whether we want to skip dual part of presolve etc. - 512 bit allows duplicate column processing on integer columns - and dual stuff on integers - */ - int presolveActions_; -protected: - /// If you want to apply the individual presolve routines differently, - /// or perhaps add your own to the mix, - /// define a derived class and override this method - virtual const CoinPresolveAction *presolve(CoinPresolveMatrix *prob); - - /// Postsolving is pretty generic; just apply the transformations - /// in reverse order. - /// You will probably only be interested in overriding this method - /// if you want to add code to test for consistency - /// while debugging new presolve techniques. - virtual void postsolve(CoinPostsolveMatrix &prob); - /** This is main part of Presolve */ - virtual ClpSimplex * gutsOfPresolvedModel(ClpSimplex * originalModel, - double feasibilityTolerance, - bool keepIntegers, - int numberPasses, - bool dropNames, - bool doRowObjective, - const char * prohibitedRows=NULL, - const char * prohibitedColumns=NULL); -}; -#endif diff --git a/thirdparty/linux/include/coin1/ClpPrimalColumnDantzig.hpp b/thirdparty/linux/include/coin1/ClpPrimalColumnDantzig.hpp deleted file mode 100644 index 7289ead1..00000000 --- a/thirdparty/linux/include/coin1/ClpPrimalColumnDantzig.hpp +++ /dev/null @@ -1,72 +0,0 @@ -/* $Id: ClpPrimalColumnDantzig.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPrimalColumnDantzig_H -#define ClpPrimalColumnDantzig_H - -#include "ClpPrimalColumnPivot.hpp" - -//############################################################################# - -/** Primal Column Pivot Dantzig Algorithm Class - -This is simplest choice - choose largest infeasibility - -*/ - -class ClpPrimalColumnDantzig : public ClpPrimalColumnPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /** Returns pivot column, -1 if none. - Lumbers over all columns - slow - The Packed CoinIndexedVector updates has cost updates - for normal LP - that is just +-weight where a feasibility changed. It also has - reduced cost from last iteration in pivot row - Can just do full price if you really want to be slow - */ - virtual int pivotColumn(CoinIndexedVector * updates, - CoinIndexedVector * spareRow1, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - - /// Just sets model - virtual void saveWeights(ClpSimplex * model, int) { - model_ = model; - } - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpPrimalColumnDantzig(); - - /// Copy constructor - ClpPrimalColumnDantzig(const ClpPrimalColumnDantzig &); - - /// Assignment operator - ClpPrimalColumnDantzig & operator=(const ClpPrimalColumnDantzig& rhs); - - /// Destructor - virtual ~ClpPrimalColumnDantzig (); - - /// Clone - virtual ClpPrimalColumnPivot * clone(bool copyData = true) const; - - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpPrimalColumnPivot.hpp b/thirdparty/linux/include/coin1/ClpPrimalColumnPivot.hpp deleted file mode 100644 index 678da303..00000000 --- a/thirdparty/linux/include/coin1/ClpPrimalColumnPivot.hpp +++ /dev/null @@ -1,155 +0,0 @@ -/* $Id: ClpPrimalColumnPivot.hpp 1732 2011-05-31 08:09:41Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPrimalcolumnPivot_H -#define ClpPrimalcolumnPivot_H - -class ClpSimplex; -class CoinIndexedVector; - -//############################################################################# - -/** Primal Column Pivot Abstract Base Class - -Abstract Base Class for describing an interface to an algorithm -to choose column pivot in primal simplex algorithm. For some algorithms -e.g. Dantzig choice then some functions may be null. For Dantzig -the only one of any importance is pivotColumn. - -If you wish to inherit from this look at ClpPrimalColumnDantzig.cpp -as that is simplest version. -*/ - -class ClpPrimalColumnPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /** Returns pivot column, -1 if none - - Normally updates reduced costs using result of last iteration - before selecting incoming column. - - The Packed CoinIndexedVector updates has cost updates - for normal LP - that is just +-weight where a feasibility changed. It also has - reduced cost from last iteration in pivot row - - Inside pivotColumn the pivotRow_ and reduced cost from last iteration - are also used. - - So in the simplest case i.e. feasible we compute the row of the - tableau corresponding to last pivot and add a multiple of this - to current reduced costs. - - We can use other arrays to help updates - */ - virtual int pivotColumn(CoinIndexedVector * updates, - CoinIndexedVector * spareRow1, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2) = 0; - - /// Updates weights - part 1 (may be empty) - virtual void updateWeights(CoinIndexedVector * input); - - /** Saves any weights round factorization as pivot rows may change - Will be empty unless steepest edge (will save model) - May also recompute infeasibility stuff - 1) before factorization - 2) after good factorization (if weights empty may initialize) - 3) after something happened but no factorization - (e.g. check for infeasible) - 4) as 2 but restore weights from previous snapshot - 5) forces some initialization e.g. weights - Also sets model - */ - virtual void saveWeights(ClpSimplex * model, int mode) = 0; - /** Signals pivot row choice: - -2 (default) - use normal pivot row choice - -1 to numberRows-1 - use this (will be checked) - way should be -1 to go to lower bound, +1 to upper bound - */ - virtual int pivotRow(double & way) { - way = 0; - return -2; - } - /// Gets rid of all arrays (may be empty) - virtual void clearArrays(); - /// Returns true if would not find any column - virtual bool looksOptimal() const { - return looksOptimal_; - } - /// Sets optimality flag (for advanced use) - virtual void setLooksOptimal(bool flag) { - looksOptimal_ = flag; - } - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpPrimalColumnPivot(); - - /// Copy constructor - ClpPrimalColumnPivot(const ClpPrimalColumnPivot &); - - /// Assignment operator - ClpPrimalColumnPivot & operator=(const ClpPrimalColumnPivot& rhs); - - /// Destructor - virtual ~ClpPrimalColumnPivot (); - - /// Clone - virtual ClpPrimalColumnPivot * clone(bool copyData = true) const = 0; - - //@} - - ///@name Other - //@{ - /// Returns model - inline ClpSimplex * model() { - return model_; - } - /// Sets model - inline void setModel(ClpSimplex * newmodel) { - model_ = newmodel; - } - - /// Returns type (above 63 is extra information) - inline int type() { - return type_; - } - - /** Returns number of extra columns for sprint algorithm - 0 means off. - Also number of iterations before recompute - */ - virtual int numberSprintColumns(int & numberIterations) const; - /// Switch off sprint idea - virtual void switchOffSprint(); - /// Called when maximum pivots changes - virtual void maximumPivotsChanged() {} - - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected member data - //@{ - /// Pointer to model - ClpSimplex * model_; - /// Type of column pivot algorithm - int type_; - /// Says if looks optimal (normally computed) - bool looksOptimal_; - //@} -}; -#ifndef CLP_PRIMAL_SLACK_MULTIPLIER -#define CLP_PRIMAL_SLACK_MULTIPLIER 1.01 -#endif -#endif diff --git a/thirdparty/linux/include/coin1/ClpPrimalColumnSteepest.hpp b/thirdparty/linux/include/coin1/ClpPrimalColumnSteepest.hpp deleted file mode 100644 index 2da7542c..00000000 --- a/thirdparty/linux/include/coin1/ClpPrimalColumnSteepest.hpp +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: ClpPrimalColumnSteepest.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpPrimalColumnSteepest_H -#define ClpPrimalColumnSteepest_H - -#include "ClpPrimalColumnPivot.hpp" -#include - -//############################################################################# -class CoinIndexedVector; - - -/** Primal Column Pivot Steepest Edge Algorithm Class - -See Forrest-Goldfarb paper for algorithm - -*/ - - -class ClpPrimalColumnSteepest : public ClpPrimalColumnPivot { - -public: - - ///@name Algorithmic methods - //@{ - - /** Returns pivot column, -1 if none. - The Packed CoinIndexedVector updates has cost updates - for normal LP - that is just +-weight where a feasibility changed. It also has - reduced cost from last iteration in pivot row - Parts of operation split out into separate functions for - profiling and speed - */ - virtual int pivotColumn(CoinIndexedVector * updates, - CoinIndexedVector * spareRow1, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// For quadratic or funny nonlinearities - int pivotColumnOldMethod(CoinIndexedVector * updates, - CoinIndexedVector * spareRow1, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Just update djs - void justDjs(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update djs doing partial pricing (dantzig) - int partialPricing(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - int numberWanted, - int numberLook); - /// Update djs, weights for Devex using djs - void djsAndDevex(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update djs, weights for Steepest using djs - void djsAndSteepest(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update djs, weights for Devex using pivot row - void djsAndDevex2(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update djs, weights for Steepest using pivot row - void djsAndSteepest2(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update weights for Devex - void justDevex(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Update weights for Steepest - void justSteepest(CoinIndexedVector * updates, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - /// Updates two arrays for steepest - void transposeTimes2(const CoinIndexedVector * pi1, CoinIndexedVector * dj1, - const CoinIndexedVector * pi2, CoinIndexedVector * dj2, - CoinIndexedVector * spare, double scaleFactor); - - /// Updates weights - part 1 - also checks accuracy - virtual void updateWeights(CoinIndexedVector * input); - - /// Checks accuracy - just for debug - void checkAccuracy(int sequence, double relativeTolerance, - CoinIndexedVector * rowArray1, - CoinIndexedVector * rowArray2); - - /// Initialize weights - void initializeWeights(); - - /** Save weights - this may initialize weights as well - mode is - - 1) before factorization - 2) after factorization - 3) just redo infeasibilities - 4) restore weights - 5) at end of values pass (so need initialization) - */ - virtual void saveWeights(ClpSimplex * model, int mode); - /// Gets rid of last update - virtual void unrollWeights(); - /// Gets rid of all arrays - virtual void clearArrays(); - /// Returns true if would not find any column - virtual bool looksOptimal() const; - /// Called when maximum pivots changes - virtual void maximumPivotsChanged(); - //@} - - /**@name gets and sets */ - //@{ - /// Mode - inline int mode() const { - return mode_; - } - /** Returns number of extra columns for sprint algorithm - 0 means off. - Also number of iterations before recompute - */ - virtual int numberSprintColumns(int & numberIterations) const; - /// Switch off sprint idea - virtual void switchOffSprint(); - -//@} - - /** enums for persistence - */ - enum Persistence { - normal = 0x00, // create (if necessary) and destroy - keep = 0x01 // create (if necessary) and leave - }; - - ///@name Constructors and destructors - //@{ - /** Default Constructor - 0 is exact devex, 1 full steepest, 2 is partial exact devex - 3 switches between 0 and 2 depending on factorization - 4 starts as partial dantzig/devex but then may switch between 0 and 2. - By partial exact devex is meant that the weights are updated as normal - but only part of the nonbasic variables are scanned. - This can be faster on very easy problems. - */ - ClpPrimalColumnSteepest(int mode = 3); - - /// Copy constructor - ClpPrimalColumnSteepest(const ClpPrimalColumnSteepest & rhs); - - /// Assignment operator - ClpPrimalColumnSteepest & operator=(const ClpPrimalColumnSteepest& rhs); - - /// Destructor - virtual ~ClpPrimalColumnSteepest (); - - /// Clone - virtual ClpPrimalColumnPivot * clone(bool copyData = true) const; - - //@} - - ///@name Private functions to deal with devex - /** reference would be faster using ClpSimplex's status_, - but I prefer to keep modularity. - */ - inline bool reference(int i) const { - return ((reference_[i>>5] >> (i & 31)) & 1) != 0; - } - inline void setReference(int i, bool trueFalse) { - unsigned int & value = reference_[i>>5]; - int bit = i & 31; - if (trueFalse) - value |= (1 << bit); - else - value &= ~(1 << bit); - } - /// Set/ get persistence - inline void setPersistence(Persistence life) { - persistence_ = life; - } - inline Persistence persistence() const { - return persistence_ ; - } - - //@} - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - // Update weight - double devex_; - /// weight array - double * weights_; - /// square of infeasibility array (just for infeasible columns) - CoinIndexedVector * infeasible_; - /// alternate weight array (so we can unroll) - CoinIndexedVector * alternateWeights_; - /// save weight array (so we can use checkpoint) - double * savedWeights_; - // Array for exact devex to say what is in reference framework - unsigned int * reference_; - /** Status - 0) Normal - -1) Needs initialization - 1) Weights are stored by sequence number - */ - int state_; - /** - 0 is exact devex, 1 full steepest, 2 is partial exact devex - 3 switches between 0 and 2 depending on factorization - 4 starts as partial dantzig/devex but then may switch between 0 and 2. - 5 is always partial dantzig - By partial exact devex is meant that the weights are updated as normal - but only part of the nonbasic variables are scanned. - This can be faster on very easy problems. - - New dubious option is >=10 which does mini-sprint - - */ - int mode_; - /// Life of weights - Persistence persistence_; - /// Number of times switched from partial dantzig to 0/2 - int numberSwitched_; - // This is pivot row (or pivot sequence round re-factorization) - int pivotSequence_; - // This is saved pivot sequence - int savedPivotSequence_; - // This is saved outgoing variable - int savedSequenceOut_; - // Iteration when last rectified - int lastRectified_; - // Size of factorization at invert (used to decide algorithm) - int sizeFactorization_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpQuadraticObjective.hpp b/thirdparty/linux/include/coin1/ClpQuadraticObjective.hpp deleted file mode 100644 index a52b0975..00000000 --- a/thirdparty/linux/include/coin1/ClpQuadraticObjective.hpp +++ /dev/null @@ -1,155 +0,0 @@ -/* $Id: ClpQuadraticObjective.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpQuadraticObjective_H -#define ClpQuadraticObjective_H - -#include "ClpObjective.hpp" -#include "CoinPackedMatrix.hpp" - -//############################################################################# - -/** Quadratic Objective Class - -*/ - -class ClpQuadraticObjective : public ClpObjective { - -public: - - ///@name Stuff - //@{ - - /** Returns gradient. If Quadratic then solution may be NULL, - also returns an offset (to be added to current one) - If refresh is false then uses last solution - Uses model for scaling - includeLinear 0 - no, 1 as is, 2 as feasible - */ - virtual double * gradient(const ClpSimplex * model, - const double * solution, double & offset, bool refresh, - int includeLinear = 2); - /// Resize objective - /** Returns reduced gradient.Returns an offset (to be added to current one). - */ - virtual double reducedGradient(ClpSimplex * model, double * region, - bool useFeasibleCosts); - /** Returns step length which gives minimum of objective for - solution + theta * change vector up to maximum theta. - - arrays are numberColumns+numberRows - Also sets current objective, predicted and at maximumTheta - */ - virtual double stepLength(ClpSimplex * model, - const double * solution, - const double * change, - double maximumTheta, - double & currentObj, - double & predictedObj, - double & thetaObj); - /// Return objective value (without any ClpModel offset) (model may be NULL) - virtual double objectiveValue(const ClpSimplex * model, const double * solution) const ; - virtual void resize(int newNumberColumns) ; - /// Delete columns in objective - virtual void deleteSome(int numberToDelete, const int * which) ; - /// Scale objective - virtual void reallyScale(const double * columnScale) ; - /** Given a zeroed array sets nonlinear columns to 1. - Returns number of nonlinear columns - */ - virtual int markNonlinear(char * which); - - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - ClpQuadraticObjective(); - - /// Constructor from objective - ClpQuadraticObjective(const double * linearObjective, int numberColumns, - const CoinBigIndex * start, - const int * column, const double * element, - int numberExtendedColumns_ = -1); - - /** Copy constructor . - If type is -1 then make sure half symmetric, - if +1 then make sure full - */ - ClpQuadraticObjective(const ClpQuadraticObjective & rhs, int type = 0); - /** Subset constructor. Duplicates are allowed - and order is as given. - */ - ClpQuadraticObjective (const ClpQuadraticObjective &rhs, int numberColumns, - const int * whichColumns) ; - - /// Assignment operator - ClpQuadraticObjective & operator=(const ClpQuadraticObjective& rhs); - - /// Destructor - virtual ~ClpQuadraticObjective (); - - /// Clone - virtual ClpObjective * clone() const; - /** Subset clone. Duplicates are allowed - and order is as given. - */ - virtual ClpObjective * subsetClone (int numberColumns, - const int * whichColumns) const; - - /** Load up quadratic objective. This is stored as a CoinPackedMatrix */ - void loadQuadraticObjective(const int numberColumns, - const CoinBigIndex * start, - const int * column, const double * element, - int numberExtendedColumns = -1); - void loadQuadraticObjective ( const CoinPackedMatrix& matrix); - /// Get rid of quadratic objective - void deleteQuadraticObjective(); - //@} - ///@name Gets and sets - //@{ - /// Quadratic objective - inline CoinPackedMatrix * quadraticObjective() const { - return quadraticObjective_; - } - /// Linear objective - inline double * linearObjective() const { - return objective_; - } - /// Length of linear objective which could be bigger - inline int numberExtendedColumns() const { - return numberExtendedColumns_; - } - /// Number of columns in quadratic objective - inline int numberColumns() const { - return numberColumns_; - } - /// If a full or half matrix - inline bool fullMatrix() const { - return fullMatrix_; - } - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - /// Quadratic objective - CoinPackedMatrix * quadraticObjective_; - /// Objective - double * objective_; - /// Gradient - double * gradient_; - /// Useful to have number of columns about - int numberColumns_; - /// Also length of linear objective which could be bigger - int numberExtendedColumns_; - /// True if full symmetric matrix, false if half - bool fullMatrix_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ClpSimplex.hpp b/thirdparty/linux/include/coin1/ClpSimplex.hpp deleted file mode 100644 index bab45064..00000000 --- a/thirdparty/linux/include/coin1/ClpSimplex.hpp +++ /dev/null @@ -1,1797 +0,0 @@ -/* $Id: ClpSimplex.hpp 2114 2015-02-10 12:12:46Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSimplex_H -#define ClpSimplex_H - -#include -#include -#include "ClpModel.hpp" -#include "ClpMatrixBase.hpp" -#include "ClpSolve.hpp" -#include "ClpConfig.h" -class ClpDualRowPivot; -class ClpPrimalColumnPivot; -class ClpFactorization; -class CoinIndexedVector; -class ClpNonLinearCost; -class ClpNodeStuff; -class CoinStructuredModel; -class OsiClpSolverInterface; -class CoinWarmStartBasis; -class ClpDisasterHandler; -class ClpConstraint; -/* - May want to use Clp defaults so that with ABC defined but not used - it behaves as Clp (and ABC used will be different than if not defined) - */ -#ifdef ABC_INHERIT -#ifndef CLP_INHERIT_MODE -#define CLP_INHERIT_MODE 1 -#endif -#ifndef ABC_CLP_DEFAULTS -#define ABC_CLP_DEFAULTS 0 -#endif -#else -#undef ABC_CLP_DEFAULTS -#define ABC_CLP_DEFAULTS 1 -#endif -#ifdef CLP_HAS_ABC -#include "AbcCommon.hpp" -class AbcTolerancesEtc; -class AbcSimplex; -#include "CoinAbcCommon.hpp" -#endif -/** This solves LPs using the simplex method - - It inherits from ClpModel and all its arrays are created at - algorithm time. Originally I tried to work with model arrays - but for simplicity of coding I changed to single arrays with - structural variables then row variables. Some coding is still - based on old style and needs cleaning up. - - For a description of algorithms: - - for dual see ClpSimplexDual.hpp and at top of ClpSimplexDual.cpp - for primal see ClpSimplexPrimal.hpp and at top of ClpSimplexPrimal.cpp - - There is an algorithm data member. + for primal variations - and - for dual variations - -*/ - -class ClpSimplex : public ClpModel { - friend void ClpSimplexUnitTest(const std::string & mpsDir); - -public: - /** enums for status of various sorts. - First 4 match CoinWarmStartBasis, - isFixed means fixed at lower bound and out of basis - */ - enum Status { - isFree = 0x00, - basic = 0x01, - atUpperBound = 0x02, - atLowerBound = 0x03, - superBasic = 0x04, - isFixed = 0x05 - }; - // For Dual - enum FakeBound { - noFake = 0x00, - lowerFake = 0x01, - upperFake = 0x02, - bothFake = 0x03 - }; - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - ClpSimplex (bool emptyMessages = false ); - - /** Copy constructor. May scale depending on mode - -1 leave mode as is - 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic(later) - */ - ClpSimplex(const ClpSimplex & rhs, int scalingMode = -1); - /** Copy constructor from model. May scale depending on mode - -1 leave mode as is - 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic(later) - */ - ClpSimplex(const ClpModel & rhs, int scalingMode = -1); - /** Subproblem constructor. A subset of whole model is created from the - row and column lists given. The new order is given by list order and - duplicates are allowed. Name and integer information can be dropped - Can optionally modify rhs to take into account variables NOT in list - in this case duplicates are not allowed (also see getbackSolution) - */ - ClpSimplex (const ClpModel * wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns, - bool dropNames = true, bool dropIntegers = true, - bool fixOthers = false); - /** Subproblem constructor. A subset of whole model is created from the - row and column lists given. The new order is given by list order and - duplicates are allowed. Name and integer information can be dropped - Can optionally modify rhs to take into account variables NOT in list - in this case duplicates are not allowed (also see getbackSolution) - */ - ClpSimplex (const ClpSimplex * wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns, - bool dropNames = true, bool dropIntegers = true, - bool fixOthers = false); - /** This constructor modifies original ClpSimplex and stores - original stuff in created ClpSimplex. It is only to be used in - conjunction with originalModel */ - ClpSimplex (ClpSimplex * wholeModel, - int numberColumns, const int * whichColumns); - /** This copies back stuff from miniModel and then deletes miniModel. - Only to be used with mini constructor */ - void originalModel(ClpSimplex * miniModel); - inline int abcState() const - { return abcState_;} - inline void setAbcState(int state) - { abcState_=state;} -#ifdef ABC_INHERIT - inline AbcSimplex * abcSimplex() const - { return abcSimplex_;} - inline void setAbcSimplex(AbcSimplex * simplex) - { abcSimplex_=simplex;} - /// Returns 0 if dual can be skipped - int doAbcDual(); - /// Returns 0 if primal can be skipped - int doAbcPrimal(int ifValuesPass); -#endif - /** Array persistence flag - If 0 then as now (delete/new) - 1 then only do arrays if bigger needed - 2 as 1 but give a bit extra if bigger needed - */ - void setPersistenceFlag(int value); - /// Save a copy of model with certain state - normally without cuts - void makeBaseModel(); - /// Switch off base model - void deleteBaseModel(); - /// See if we have base model - inline ClpSimplex * baseModel() const { - return baseModel_; - } - /** Reset to base model (just size and arrays needed) - If model NULL use internal copy - */ - void setToBaseModel(ClpSimplex * model = NULL); - /// Assignment operator. This copies the data - ClpSimplex & operator=(const ClpSimplex & rhs); - /// Destructor - ~ClpSimplex ( ); - // Ones below are just ClpModel with some changes - /** Loads a problem (the constraints on the - rows are given by lower and upper bounds). If a pointer is 0 then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - void loadProblem ( const ClpMatrixBase& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - void loadProblem ( const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - - /** Just like the other loadProblem() method except that the matrix is - given in a standard column major ordered format (without gaps). */ - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /// This one is for after presolve to save memory - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, const int * length, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /** This loads a model from a coinModel object - returns number of errors. - If keepSolution true and size is same as current then - keeps current status and solution - */ - int loadProblem ( CoinModel & modelObject, bool keepSolution = false); - /// Read an mps file from the given filename - int readMps(const char *filename, - bool keepNames = false, - bool ignoreErrors = false); - /// Read GMPL files from the given filenames - int readGMPL(const char *filename, const char * dataName, - bool keepNames = false); - /// Read file in LP format from file with name filename. - /// See class CoinLpIO for description of this format. - int readLp(const char *filename, const double epsilon = 1e-5); - /** Borrow model. This is so we dont have to copy large amounts - of data around. It assumes a derived class wants to overwrite - an empty model with a real one - while it does an algorithm. - This is same as ClpModel one, but sets scaling on etc. */ - void borrowModel(ClpModel & otherModel); - void borrowModel(ClpSimplex & otherModel); - /// Pass in Event handler (cloned and deleted at end) - void passInEventHandler(const ClpEventHandler * eventHandler); - /// Puts solution back into small model - void getbackSolution(const ClpSimplex & smallModel, const int * whichRow, const int * whichColumn); - /** Load nonlinear part of problem from AMPL info - Returns 0 if linear - 1 if quadratic objective - 2 if quadratic constraints - 3 if nonlinear objective - 4 if nonlinear constraints - -1 on failure - */ - int loadNonLinear(void * info, int & numberConstraints, - ClpConstraint ** & constraints); -#ifdef ABC_INHERIT - /// Loads tolerances etc - void loadTolerancesEtc(const AbcTolerancesEtc & data); - /// Unloads tolerances etc - void unloadTolerancesEtc(AbcTolerancesEtc & data); -#endif - //@} - - /**@name Functions most useful to user */ - //@{ - /** General solve algorithm which can do presolve. - See ClpSolve.hpp for options - */ - int initialSolve(ClpSolve & options); - /// Default initial solve - int initialSolve(); - /// Dual initial solve - int initialDualSolve(); - /// Primal initial solve - int initialPrimalSolve(); - /// Barrier initial solve - int initialBarrierSolve(); - /// Barrier initial solve, not to be followed by crossover - int initialBarrierNoCrossSolve(); - /** Dual algorithm - see ClpSimplexDual.hpp for method. - ifValuesPass==2 just does values pass and then stops. - - startFinishOptions - bits - 1 - do not delete work areas and factorization at end - 2 - use old factorization if same number of rows - 4 - skip as much initialization of work areas as possible - (based on whatsChanged in clpmodel.hpp) ** work in progress - maybe other bits later - */ - int dual(int ifValuesPass = 0, int startFinishOptions = 0); - // If using Debug - int dualDebug(int ifValuesPass = 0, int startFinishOptions = 0); - /** Primal algorithm - see ClpSimplexPrimal.hpp for method. - ifValuesPass==2 just does values pass and then stops. - - startFinishOptions - bits - 1 - do not delete work areas and factorization at end - 2 - use old factorization if same number of rows - 4 - skip as much initialization of work areas as possible - (based on whatsChanged in clpmodel.hpp) ** work in progress - maybe other bits later - */ - int primal(int ifValuesPass = 0, int startFinishOptions = 0); - /** Solves nonlinear problem using SLP - may be used as crash - for other algorithms when number of iterations small. - Also exits if all problematical variables are changing - less than deltaTolerance - */ - int nonlinearSLP(int numberPasses, double deltaTolerance); - /** Solves problem with nonlinear constraints using SLP - may be used as crash - for other algorithms when number of iterations small. - Also exits if all problematical variables are changing - less than deltaTolerance - */ - int nonlinearSLP(int numberConstraints, ClpConstraint ** constraints, - int numberPasses, double deltaTolerance); - /** Solves using barrier (assumes you have good cholesky factor code). - Does crossover to simplex if asked*/ - int barrier(bool crossover = true); - /** Solves non-linear using reduced gradient. Phase = 0 get feasible, - =1 use solution */ - int reducedGradient(int phase = 0); - /// Solve using structure of model and maybe in parallel - int solve(CoinStructuredModel * model); -#ifdef ABC_INHERIT - /** solvetype 0 for dual, 1 for primal - startup 1 for values pass - interrupt whether to pass across interrupt handler - add 10 to return AbcSimplex - */ - AbcSimplex * dealWithAbc(int solveType,int startUp,bool interrupt=false); - //void dealWithAbc(int solveType,int startUp,bool interrupt=false); -#endif - /** This loads a model from a CoinStructuredModel object - returns number of errors. - If originalOrder then keep to order stored in blocks, - otherwise first column/rows correspond to first block - etc. - If keepSolution true and size is same as current then - keeps current status and solution - */ - int loadProblem ( CoinStructuredModel & modelObject, - bool originalOrder = true, bool keepSolution = false); - /** - When scaling is on it is possible that the scaled problem - is feasible but the unscaled is not. Clp returns a secondary - status code to that effect. This option allows for a cleanup. - If you use it I would suggest 1. - This only affects actions when scaled optimal - 0 - no action - 1 - clean up using dual if primal infeasibility - 2 - clean up using dual if dual infeasibility - 3 - clean up using dual if primal or dual infeasibility - 11,12,13 - as 1,2,3 but use primal - - return code as dual/primal - */ - int cleanup(int cleanupScaling); - /** Dual ranging. - This computes increase/decrease in cost for each given variable and corresponding - sequence numbers which would change basis. Sequence numbers are 0..numberColumns - and numberColumns.. for artificials/slacks. - For non-basic variables the information is trivial to compute and the change in cost is just minus the - reduced cost and the sequence number will be that of the non-basic variables. - For basic variables a ratio test is between the reduced costs for non-basic variables - and the row of the tableau corresponding to the basic variable. - The increase/decrease value is always >= 0.0 - - Up to user to provide correct length arrays where each array is of length numberCheck. - which contains list of variables for which information is desired. All other - arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays - will be information for variable 7. - - If valueIncrease/Decrease not NULL (both must be NULL or both non NULL) then these are filled with - the value of variable if such a change in cost were made (the existing bounds are ignored) - - Returns non-zero if infeasible unbounded etc - */ - int dualRanging(int numberCheck, const int * which, - double * costIncrease, int * sequenceIncrease, - double * costDecrease, int * sequenceDecrease, - double * valueIncrease = NULL, double * valueDecrease = NULL); - /** Primal ranging. - This computes increase/decrease in value for each given variable and corresponding - sequence numbers which would change basis. Sequence numbers are 0..numberColumns - and numberColumns.. for artificials/slacks. - This should only be used for non-basic variabls as otherwise information is pretty useless - For basic variables the sequence number will be that of the basic variables. - - Up to user to provide correct length arrays where each array is of length numberCheck. - which contains list of variables for which information is desired. All other - arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays - will be information for variable 7. - - Returns non-zero if infeasible unbounded etc - */ - int primalRanging(int numberCheck, const int * which, - double * valueIncrease, int * sequenceIncrease, - double * valueDecrease, int * sequenceDecrease); - /** - Modifies coefficients etc and if necessary pivots in and out. - All at same status will be done (basis may go singular). - User can tell which others have been done (i.e. if status matches). - If called from outside will change status and return 0. - If called from event handler returns non-zero if user has to take action. - indices>=numberColumns are slacks (obviously no coefficients) - status array is (char) Status enum - */ - int modifyCoefficientsAndPivot(int number, - const int * which, - const CoinBigIndex * start, - const int * row, - const double * newCoefficient, - const unsigned char * newStatus=NULL, - const double * newLower=NULL, - const double * newUpper=NULL, - const double * newObjective=NULL); - /** Take out duplicate rows (includes scaled rows and intersections). - On exit whichRows has rows to delete - return code is number can be deleted - or -1 if would be infeasible. - If tolerance is -1.0 use primalTolerance for equality rows and infeasibility - If cleanUp not zero then spend more time trying to leave more stable row - and make row bounds exact multiple of cleanUp if close enough - */ - int outDuplicateRows(int numberLook,int * whichRows, bool noOverlaps=false, double tolerance=-1.0, - double cleanUp=0.0); - /** Try simple crash like techniques to get closer to primal feasibility - returns final sum of infeasibilities */ - double moveTowardsPrimalFeasible(); - /** Try simple crash like techniques to remove super basic slacks - but only if > threshold */ - void removeSuperBasicSlacks(int threshold=0); - /** Mini presolve (faster) - Char arrays must be numberRows and numberColumns long - on entry second part must be filled in as follows - - 0 - possible - >0 - take out and do something (depending on value - TBD) - -1 row/column can't vanish but can have entries removed/changed - -2 don't touch at all - on exit <=0 ones will be in presolved problem - struct will be created and will be long enough - (information on length etc in first entry) - user must delete struct - */ - ClpSimplex * miniPresolve(char * rowType, char * columnType,void ** info); - /// After mini presolve - void miniPostsolve(const ClpSimplex * presolvedModel,void * info); - /// mini presolve and solve - void miniSolve(char * rowType, char *columnType,int algorithm, int startUp); - /** Write the basis in MPS format to the specified file. - If writeValues true writes values of structurals - (and adds VALUES to end of NAME card) - - Row and column names may be null. - formatType is -
        -
      • 0 - normal -
      • 1 - extra accuracy -
      • 2 - IEEE hex (later) -
      - - Returns non-zero on I/O error - */ - int writeBasis(const char *filename, - bool writeValues = false, - int formatType = 0) const; - /** Read a basis from the given filename, - returns -1 on file error, 0 if no values, 1 if values */ - int readBasis(const char *filename); - /// Returns a basis (to be deleted by user) - CoinWarmStartBasis * getBasis() const; - /// Passes in factorization - void setFactorization( ClpFactorization & factorization); - // Swaps factorization - ClpFactorization * swapFactorization( ClpFactorization * factorization); - /// Copies in factorization to existing one - void copyFactorization( ClpFactorization & factorization); - /** Tightens primal bounds to make dual faster. Unless - fixed or doTight>10, bounds are slightly looser than they could be. - This is to make dual go faster and is probably not needed - with a presolve. Returns non-zero if problem infeasible. - - Fudge for branch and bound - put bounds on columns of factor * - largest value (at continuous) - should improve stability - in branch and bound on infeasible branches (0.0 is off) - */ - int tightenPrimalBounds(double factor = 0.0, int doTight = 0, bool tightIntegers = false); - /** Crash - at present just aimed at dual, returns - -2 if dual preferred and crash basis created - -1 if dual preferred and all slack basis preferred - 0 if basis going in was not all slack - 1 if primal preferred and all slack basis preferred - 2 if primal preferred and crash basis created. - - if gap between bounds <="gap" variables can be flipped - ( If pivot -1 then can be made super basic!) - - If "pivot" is - -1 No pivoting - always primal - 0 No pivoting (so will just be choice of algorithm) - 1 Simple pivoting e.g. gub - 2 Mini iterations - */ - int crash(double gap, int pivot); - /// Sets row pivot choice algorithm in dual - void setDualRowPivotAlgorithm(ClpDualRowPivot & choice); - /// Sets column pivot choice algorithm in primal - void setPrimalColumnPivotAlgorithm(ClpPrimalColumnPivot & choice); - /// Create a hotstart point of the optimization process - void markHotStart(void * & saveStuff); - /// Optimize starting from the hotstart - void solveFromHotStart(void * saveStuff); - /// Delete the snapshot - void unmarkHotStart(void * saveStuff); - /** For strong branching. On input lower and upper are new bounds - while on output they are change in objective function values - (>1.0e50 infeasible). - Return code is 0 if nothing interesting, -1 if infeasible both - ways and +1 if infeasible one way (check values to see which one(s)) - Solutions are filled in as well - even down, odd up - also - status and number of iterations - */ - int strongBranching(int numberVariables, const int * variables, - double * newLower, double * newUpper, - double ** outputSolution, - int * outputStatus, int * outputIterations, - bool stopOnFirstInfeasible = true, - bool alwaysFinish = false, - int startFinishOptions = 0); - /// Fathom - 1 if solution - int fathom(void * stuff); - /** Do up to N deep - returns - -1 - no solution nNodes_ valid nodes - >= if solution and that node gives solution - ClpNode array is 2**N long. Values for N and - array are in stuff (nNodes_ also in stuff) */ - int fathomMany(void * stuff); - /// Double checks OK - double doubleCheck(); - /// Starts Fast dual2 - int startFastDual2(ClpNodeStuff * stuff); - /// Like Fast dual - int fastDual2(ClpNodeStuff * stuff); - /// Stops Fast dual2 - void stopFastDual2(ClpNodeStuff * stuff); - /** Deals with crunch aspects - mode 0 - in - 1 - out with solution - 2 - out without solution - returns small model or NULL - */ - ClpSimplex * fastCrunch(ClpNodeStuff * stuff, int mode); - //@} - - /**@name Needed for functionality of OsiSimplexInterface */ - //@{ - /** Pivot in a variable and out a variable. Returns 0 if okay, - 1 if inaccuracy forced re-factorization, -1 if would be singular. - Also updates primal/dual infeasibilities. - Assumes sequenceIn_ and pivotRow_ set and also directionIn and Out. - */ - int pivot(); - - /** Pivot in a variable and choose an outgoing one. Assumes primal - feasible - will not go through a bound. Returns step length in theta - Returns ray in ray_ (or NULL if no pivot) - Return codes as before but -1 means no acceptable pivot - */ - int primalPivotResult(); - - /** Pivot out a variable and choose an incoing one. Assumes dual - feasible - will not go through a reduced cost. - Returns step length in theta - Return codes as before but -1 means no acceptable pivot - */ - int dualPivotResultPart1(); - /** Do actual pivot - state is 0 if need tableau column, 1 if in rowArray_[1] - */ - int pivotResultPart2(int algorithm,int state); - - /** Common bits of coding for dual and primal. Return 0 if okay, - 1 if bad matrix, 2 if very bad factorization - - startFinishOptions - bits - 1 - do not delete work areas and factorization at end - 2 - use old factorization if same number of rows - 4 - skip as much initialization of work areas as possible - (based on whatsChanged in clpmodel.hpp) ** work in progress - maybe other bits later - - */ - int startup(int ifValuesPass, int startFinishOptions = 0); - void finish(int startFinishOptions = 0); - - /** Factorizes and returns true if optimal. Used by user */ - bool statusOfProblem(bool initial = false); - /// If user left factorization frequency then compute - void defaultFactorizationFrequency(); - /// Copy across enabled stuff from one solver to another - void copyEnabledStuff(const ClpSimplex * rhs); - //@} - - /**@name most useful gets and sets */ - //@{ - /// If problem is primal feasible - inline bool primalFeasible() const { - return (numberPrimalInfeasibilities_ == 0); - } - /// If problem is dual feasible - inline bool dualFeasible() const { - return (numberDualInfeasibilities_ == 0); - } - /// factorization - inline ClpFactorization * factorization() const { - return factorization_; - } - /// Sparsity on or off - bool sparseFactorization() const; - void setSparseFactorization(bool value); - /// Factorization frequency - int factorizationFrequency() const; - void setFactorizationFrequency(int value); - /// Dual bound - inline double dualBound() const { - return dualBound_; - } - void setDualBound(double value); - /// Infeasibility cost - inline double infeasibilityCost() const { - return infeasibilityCost_; - } - void setInfeasibilityCost(double value); - /** Amount of print out: - 0 - none - 1 - just final - 2 - just factorizations - 3 - as 2 plus a bit more - 4 - verbose - above that 8,16,32 etc just for selective debug - */ - /** Perturbation: - 50 - switch on perturbation - 100 - auto perturb if takes too long (1.0e-6 largest nonzero) - 101 - we are perturbed - 102 - don't try perturbing again - default is 100 - others are for playing - */ - inline int perturbation() const { - return perturbation_; - } - void setPerturbation(int value); - /// Current (or last) algorithm - inline int algorithm() const { - return algorithm_; - } - /// Set algorithm - inline void setAlgorithm(int value) { - algorithm_ = value; - } - /// Return true if the objective limit test can be relied upon - bool isObjectiveLimitTestValid() const ; - /// Sum of dual infeasibilities - inline double sumDualInfeasibilities() const { - return sumDualInfeasibilities_; - } - inline void setSumDualInfeasibilities(double value) { - sumDualInfeasibilities_ = value; - } - /// Sum of relaxed dual infeasibilities - inline double sumOfRelaxedDualInfeasibilities() const { - return sumOfRelaxedDualInfeasibilities_; - } - inline void setSumOfRelaxedDualInfeasibilities(double value) { - sumOfRelaxedDualInfeasibilities_ = value; - } - /// Number of dual infeasibilities - inline int numberDualInfeasibilities() const { - return numberDualInfeasibilities_; - } - inline void setNumberDualInfeasibilities(int value) { - numberDualInfeasibilities_ = value; - } - /// Number of dual infeasibilities (without free) - inline int numberDualInfeasibilitiesWithoutFree() const { - return numberDualInfeasibilitiesWithoutFree_; - } - /// Sum of primal infeasibilities - inline double sumPrimalInfeasibilities() const { - return sumPrimalInfeasibilities_; - } - inline void setSumPrimalInfeasibilities(double value) { - sumPrimalInfeasibilities_ = value; - } - /// Sum of relaxed primal infeasibilities - inline double sumOfRelaxedPrimalInfeasibilities() const { - return sumOfRelaxedPrimalInfeasibilities_; - } - inline void setSumOfRelaxedPrimalInfeasibilities(double value) { - sumOfRelaxedPrimalInfeasibilities_ = value; - } - /// Number of primal infeasibilities - inline int numberPrimalInfeasibilities() const { - return numberPrimalInfeasibilities_; - } - inline void setNumberPrimalInfeasibilities(int value) { - numberPrimalInfeasibilities_ = value; - } - /** Save model to file, returns 0 if success. This is designed for - use outside algorithms so does not save iterating arrays etc. - It does not save any messaging information. - Does not save scaling values. - It does not know about all types of virtual functions. - */ - int saveModel(const char * fileName); - /** Restore model from file, returns 0 if success, - deletes current model */ - int restoreModel(const char * fileName); - - /** Just check solution (for external use) - sets sum of - infeasibilities etc. - If setToBounds 0 then primal column values not changed - and used to compute primal row activity values. If 1 or 2 - then status used - so all nonbasic variables set to - indicated bound and if any values changed (or ==2) basic values re-computed. - */ - void checkSolution(int setToBounds = 0); - /** Just check solution (for internal use) - sets sum of - infeasibilities etc. */ - void checkSolutionInternal(); - /// Check unscaled primal solution but allow for rounding error - void checkUnscaledSolution(); - /// Useful row length arrays (0,1,2,3,4,5) - inline CoinIndexedVector * rowArray(int index) const { - return rowArray_[index]; - } - /// Useful column length arrays (0,1,2,3,4,5) - inline CoinIndexedVector * columnArray(int index) const { - return columnArray_[index]; - } - //@} - - /******************** End of most useful part **************/ - /**@name Functions less likely to be useful to casual user */ - //@{ - /** Given an existing factorization computes and checks - primal and dual solutions. Uses input arrays for variables at - bounds. Returns feasibility states */ - int getSolution ( const double * rowActivities, - const double * columnActivities); - /** Given an existing factorization computes and checks - primal and dual solutions. Uses current problem arrays for - bounds. Returns feasibility states */ - int getSolution (); - /** Constructs a non linear cost from list of non-linearities (columns only) - First lower of each column is taken as real lower - Last lower is taken as real upper and cost ignored - - Returns nonzero if bad data e.g. lowers not monotonic - */ - int createPiecewiseLinearCosts(const int * starts, - const double * lower, const double * gradient); - /// dual row pivot choice - inline ClpDualRowPivot * dualRowPivot() const { - return dualRowPivot_; - } - /// primal column pivot choice - inline ClpPrimalColumnPivot * primalColumnPivot() const { - return primalColumnPivot_; - } - /// Returns true if model looks OK - inline bool goodAccuracy() const { - return (largestPrimalError_ < 1.0e-7 && largestDualError_ < 1.0e-7); - } - /** Return model - updates any scalars */ - void returnModel(ClpSimplex & otherModel); - /** Factorizes using current basis. - solveType - 1 iterating, 0 initial, -1 external - If 10 added then in primal values pass - Return codes are as from ClpFactorization unless initial factorization - when total number of singularities is returned. - Special case is numberRows_+1 -> all slack basis. - */ - int internalFactorize(int solveType); - /// Save data - ClpDataSave saveData() ; - /// Restore data - void restoreData(ClpDataSave saved); - /// Clean up status - void cleanStatus(); - /// Factorizes using current basis. For external use - int factorize(); - /** Computes duals from scratch. If givenDjs then - allows for nonzero basic djs */ - void computeDuals(double * givenDjs); - /// Computes primals from scratch - void computePrimals ( const double * rowActivities, - const double * columnActivities); - /** Adds multiple of a column into an array */ - void add(double * array, - int column, double multiplier) const; - /** - Unpacks one column of the matrix into indexed array - Uses sequenceIn_ - Also applies scaling if needed - */ - void unpack(CoinIndexedVector * rowArray) const ; - /** - Unpacks one column of the matrix into indexed array - Slack if sequence>= numberColumns - Also applies scaling if needed - */ - void unpack(CoinIndexedVector * rowArray, int sequence) const; - /** - Unpacks one column of the matrix into indexed array - ** as packed vector - Uses sequenceIn_ - Also applies scaling if needed - */ - void unpackPacked(CoinIndexedVector * rowArray) ; - /** - Unpacks one column of the matrix into indexed array - ** as packed vector - Slack if sequence>= numberColumns - Also applies scaling if needed - */ - void unpackPacked(CoinIndexedVector * rowArray, int sequence); -#ifndef CLP_USER_DRIVEN -protected: -#endif - /** - This does basis housekeeping and does values for in/out variables. - Can also decide to re-factorize - */ - int housekeeping(double objectiveChange); - /** This sets largest infeasibility and most infeasible and sum - and number of infeasibilities (Primal) */ - void checkPrimalSolution(const double * rowActivities = NULL, - const double * columnActivies = NULL); - /** This sets largest infeasibility and most infeasible and sum - and number of infeasibilities (Dual) */ - void checkDualSolution(); - /** This sets sum and number of infeasibilities (Dual and Primal) */ - void checkBothSolutions(); - /** If input negative scales objective so maximum <= -value - and returns scale factor used. If positive unscales and also - redoes dual stuff - */ - double scaleObjective(double value); - /// Solve using Dantzig-Wolfe decomposition and maybe in parallel - int solveDW(CoinStructuredModel * model, ClpSolve & options); - /// Solve using Benders decomposition and maybe in parallel - int solveBenders(CoinStructuredModel * model, ClpSolve & options); -public: - /** For advanced use. When doing iterative solves things can get - nasty so on values pass if incoming solution has largest - infeasibility < incomingInfeasibility throw out variables - from basis until largest infeasibility < allowedInfeasibility - or incoming largest infeasibility. - If allowedInfeasibility>= incomingInfeasibility this is - always possible altough you may end up with an all slack basis. - - Defaults are 1.0,10.0 - */ - void setValuesPassAction(double incomingInfeasibility, - double allowedInfeasibility); - /** Get a clean factorization - i.e. throw out singularities - may do more later */ - int cleanFactorization(int ifValuesPass); - //@} - /**@name most useful gets and sets */ - //@{ -public: - /// Initial value for alpha accuracy calculation (-1.0 off) - inline double alphaAccuracy() const { - return alphaAccuracy_; - } - inline void setAlphaAccuracy(double value) { - alphaAccuracy_ = value; - } -public: - /// Objective value - //inline double objectiveValue() const { - //return (objectiveValue_-bestPossibleImprovement_)*optimizationDirection_ - dblParam_[ClpObjOffset]; - //} - /// Set disaster handler - inline void setDisasterHandler(ClpDisasterHandler * handler) { - disasterArea_ = handler; - } - /// Get disaster handler - inline ClpDisasterHandler * disasterHandler() const { - return disasterArea_; - } - /// Large bound value (for complementarity etc) - inline double largeValue() const { - return largeValue_; - } - void setLargeValue( double value) ; - /// Largest error on Ax-b - inline double largestPrimalError() const { - return largestPrimalError_; - } - /// Largest error on basic duals - inline double largestDualError() const { - return largestDualError_; - } - /// Largest error on Ax-b - inline void setLargestPrimalError(double value) { - largestPrimalError_ = value; - } - /// Largest error on basic duals - inline void setLargestDualError(double value) { - largestDualError_ = value; - } - /// Get zero tolerance - inline double zeroTolerance() const { - return zeroTolerance_;/*factorization_->zeroTolerance();*/ - } - /// Set zero tolerance - inline void setZeroTolerance( double value) { - zeroTolerance_ = value; - } - /// Basic variables pivoting on which rows - inline int * pivotVariable() const { - return pivotVariable_; - } - /// If automatic scaling on - inline bool automaticScaling() const { - return automaticScale_ != 0; - } - inline void setAutomaticScaling(bool onOff) { - automaticScale_ = onOff ? 1 : 0; - } - /// Current dual tolerance - inline double currentDualTolerance() const { - return dualTolerance_; - } - inline void setCurrentDualTolerance(double value) { - dualTolerance_ = value; - } - /// Current primal tolerance - inline double currentPrimalTolerance() const { - return primalTolerance_; - } - inline void setCurrentPrimalTolerance(double value) { - primalTolerance_ = value; - } - /// How many iterative refinements to do - inline int numberRefinements() const { - return numberRefinements_; - } - void setNumberRefinements( int value) ; - /// Alpha (pivot element) for use by classes e.g. steepestedge - inline double alpha() const { - return alpha_; - } - inline void setAlpha(double value) { - alpha_ = value; - } - /// Reduced cost of last incoming for use by classes e.g. steepestedge - inline double dualIn() const { - return dualIn_; - } - /// Set reduced cost of last incoming to force error - inline void setDualIn(double value) { - dualIn_ = value; - } - /// Pivot Row for use by classes e.g. steepestedge - inline int pivotRow() const { - return pivotRow_; - } - inline void setPivotRow(int value) { - pivotRow_ = value; - } - /// value of incoming variable (in Dual) - double valueIncomingDual() const; - //@} - -#ifndef CLP_USER_DRIVEN -protected: -#endif - /**@name protected methods */ - //@{ - /** May change basis and then returns number changed. - Computation of solutions may be overriden by given pi and solution - */ - int gutsOfSolution ( double * givenDuals, - const double * givenPrimals, - bool valuesPass = false); - /// Does most of deletion (0 = all, 1 = most, 2 most + factorization) - void gutsOfDelete(int type); - /// Does most of copying - void gutsOfCopy(const ClpSimplex & rhs); - /** puts in format I like (rowLower,rowUpper) also see StandardMatrix - 1 bit does rows (now and columns), (2 bit does column bounds), 4 bit does objective(s). - 8 bit does solution scaling in - 16 bit does rowArray and columnArray indexed vectors - and makes row copy if wanted, also sets columnStart_ etc - Also creates scaling arrays if needed. It does scaling if needed. - 16 also moves solutions etc in to work arrays - On 16 returns false if problem "bad" i.e. matrix or bounds bad - If startFinishOptions is -1 then called by user in getSolution - so do arrays but keep pivotVariable_ - */ - bool createRim(int what, bool makeRowCopy = false, int startFinishOptions = 0); - /// Does rows and columns - void createRim1(bool initial); - /// Does objective - void createRim4(bool initial); - /// Does rows and columns and objective - void createRim5(bool initial); - /** releases above arrays and does solution scaling out. May also - get rid of factorization data - - 0 get rid of nothing, 1 get rid of arrays, 2 also factorization - */ - void deleteRim(int getRidOfFactorizationData = 2); - /// Sanity check on input rim data (after scaling) - returns true if okay - bool sanityCheck(); - //@} -public: - /**@name public methods */ - //@{ - /** Return row or column sections - not as much needed as it - once was. These just map into single arrays */ - inline double * solutionRegion(int section) const { - if (!section) return rowActivityWork_; - else return columnActivityWork_; - } - inline double * djRegion(int section) const { - if (!section) return rowReducedCost_; - else return reducedCostWork_; - } - inline double * lowerRegion(int section) const { - if (!section) return rowLowerWork_; - else return columnLowerWork_; - } - inline double * upperRegion(int section) const { - if (!section) return rowUpperWork_; - else return columnUpperWork_; - } - inline double * costRegion(int section) const { - if (!section) return rowObjectiveWork_; - else return objectiveWork_; - } - /// Return region as single array - inline double * solutionRegion() const { - return solution_; - } - inline double * djRegion() const { - return dj_; - } - inline double * lowerRegion() const { - return lower_; - } - inline double * upperRegion() const { - return upper_; - } - inline double * costRegion() const { - return cost_; - } - inline Status getStatus(int sequence) const { - return static_cast (status_[sequence] & 7); - } - inline void setStatus(int sequence, Status newstatus) { - unsigned char & st_byte = status_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | newstatus); - } - /// Start or reset using maximumRows_ and Columns_ - true if change - bool startPermanentArrays(); - /** Normally the first factorization does sparse coding because - the factorization could be singular. This allows initial dense - factorization when it is known to be safe - */ - void setInitialDenseFactorization(bool onOff); - bool initialDenseFactorization() const; - /** Return sequence In or Out */ - inline int sequenceIn() const { - return sequenceIn_; - } - inline int sequenceOut() const { - return sequenceOut_; - } - /** Set sequenceIn or Out */ - inline void setSequenceIn(int sequence) { - sequenceIn_ = sequence; - } - inline void setSequenceOut(int sequence) { - sequenceOut_ = sequence; - } - /** Return direction In or Out */ - inline int directionIn() const { - return directionIn_; - } - inline int directionOut() const { - return directionOut_; - } - /** Set directionIn or Out */ - inline void setDirectionIn(int direction) { - directionIn_ = direction; - } - inline void setDirectionOut(int direction) { - directionOut_ = direction; - } - /// Value of Out variable - inline double valueOut() const { - return valueOut_; - } - /// Set value of out variable - inline void setValueOut(double value) { - valueOut_ = value; - } - /// Dual value of Out variable - inline double dualOut() const { - return dualOut_; - } - /// Set dual value of out variable - inline void setDualOut(double value) { - dualOut_ = value; - } - /// Set lower of out variable - inline void setLowerOut(double value) { - lowerOut_ = value; - } - /// Set upper of out variable - inline void setUpperOut(double value) { - upperOut_ = value; - } - /// Set theta of out variable - inline void setTheta(double value) { - theta_ = value; - } - /// Returns 1 if sequence indicates column - inline int isColumn(int sequence) const { - return sequence < numberColumns_ ? 1 : 0; - } - /// Returns sequence number within section - inline int sequenceWithin(int sequence) const { - return sequence < numberColumns_ ? sequence : sequence - numberColumns_; - } - /// Return row or column values - inline double solution(int sequence) { - return solution_[sequence]; - } - /// Return address of row or column values - inline double & solutionAddress(int sequence) { - return solution_[sequence]; - } - inline double reducedCost(int sequence) { - return dj_[sequence]; - } - inline double & reducedCostAddress(int sequence) { - return dj_[sequence]; - } - inline double lower(int sequence) { - return lower_[sequence]; - } - /// Return address of row or column lower bound - inline double & lowerAddress(int sequence) { - return lower_[sequence]; - } - inline double upper(int sequence) { - return upper_[sequence]; - } - /// Return address of row or column upper bound - inline double & upperAddress(int sequence) { - return upper_[sequence]; - } - inline double cost(int sequence) { - return cost_[sequence]; - } - /// Return address of row or column cost - inline double & costAddress(int sequence) { - return cost_[sequence]; - } - /// Return original lower bound - inline double originalLower(int iSequence) const { - if (iSequence < numberColumns_) return columnLower_[iSequence]; - else - return rowLower_[iSequence-numberColumns_]; - } - /// Return original lower bound - inline double originalUpper(int iSequence) const { - if (iSequence < numberColumns_) return columnUpper_[iSequence]; - else - return rowUpper_[iSequence-numberColumns_]; - } - /// Theta (pivot change) - inline double theta() const { - return theta_; - } - /** Best possible improvement using djs (primal) or - obj change by flipping bounds to make dual feasible (dual) */ - inline double bestPossibleImprovement() const { - return bestPossibleImprovement_; - } - /// Return pointer to details of costs - inline ClpNonLinearCost * nonLinearCost() const { - return nonLinearCost_; - } - /** Return more special options - 1 bit - if presolve says infeasible in ClpSolve return - 2 bit - if presolved problem infeasible return - 4 bit - keep arrays like upper_ around - 8 bit - if factorization kept can still declare optimal at once - 16 bit - if checking replaceColumn accuracy before updating - 32 bit - say optimal if primal feasible! - 64 bit - give up easily in dual (and say infeasible) - 128 bit - no objective, 0-1 and in B&B - 256 bit - in primal from dual or vice versa - 512 bit - alternative use of solveType_ - 1024 bit - don't do row copy of factorization - 2048 bit - perturb in complete fathoming - 4096 bit - try more for complete fathoming - 8192 bit - don't even think of using primal if user asks for dual (and vv) - 16384 bit - in initialSolve so be more flexible - 32768 bit - don't swap algorithms from dual if small infeasibility - 65536 bit - perturb in postsolve cleanup (even if < 10000 rows) - 131072 bit (*3) initial stateDualColumn - 524288 bit - stop when primal feasible - */ - inline int moreSpecialOptions() const { - return moreSpecialOptions_; - } - /** Set more special options - 1 bit - if presolve says infeasible in ClpSolve return - 2 bit - if presolved problem infeasible return - 4 bit - keep arrays like upper_ around - 8 bit - no free or superBasic variables - 16 bit - if checking replaceColumn accuracy before updating - 32 bit - say optimal if primal feasible! - 64 bit - give up easily in dual (and say infeasible) - 128 bit - no objective, 0-1 and in B&B - 256 bit - in primal from dual or vice versa - 512 bit - alternative use of solveType_ - 1024 bit - don't do row copy of factorization - 2048 bit - perturb in complete fathoming - 4096 bit - try more for complete fathoming - 8192 bit - don't even think of using primal if user asks for dual (and vv) - 16384 bit - in initialSolve so be more flexible - 32768 bit - don't swap algorithms from dual if small infeasibility - 65536 bit - perturb in postsolve cleanup (even if < 10000 rows) - 131072 bit (*3) initial stateDualColumn - 524288 bit - stop when primal feasible - 1048576 bit - don't perturb even if long time - 2097152 bit - no primal in fastDual2 if feasible - 4194304 bit - tolerances have been changed by code - 8388608 bit - tolerances are dynamic (at first) - */ - inline void setMoreSpecialOptions(int value) { - moreSpecialOptions_ = value; - } - //@} - /**@name status methods */ - //@{ - inline void setFakeBound(int sequence, FakeBound fakeBound) { - unsigned char & st_byte = status_[sequence]; - st_byte = static_cast(st_byte & ~24); - st_byte = static_cast(st_byte | (fakeBound << 3)); - } - inline FakeBound getFakeBound(int sequence) const { - return static_cast ((status_[sequence] >> 3) & 3); - } - inline void setRowStatus(int sequence, Status newstatus) { - unsigned char & st_byte = status_[sequence+numberColumns_]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | newstatus); - } - inline Status getRowStatus(int sequence) const { - return static_cast (status_[sequence+numberColumns_] & 7); - } - inline void setColumnStatus(int sequence, Status newstatus) { - unsigned char & st_byte = status_[sequence]; - st_byte = static_cast(st_byte & ~7); - st_byte = static_cast(st_byte | newstatus); - } - inline Status getColumnStatus(int sequence) const { - return static_cast (status_[sequence] & 7); - } - inline void setPivoted( int sequence) { - status_[sequence] = static_cast(status_[sequence] | 32); - } - inline void clearPivoted( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~32); - } - inline bool pivoted(int sequence) const { - return (((status_[sequence] >> 5) & 1) != 0); - } - /// To flag a variable (not inline to allow for column generation) - void setFlagged( int sequence); - inline void clearFlagged( int sequence) { - status_[sequence] = static_cast(status_[sequence] & ~64); - } - inline bool flagged(int sequence) const { - return ((status_[sequence] & 64) != 0); - } - /// To say row active in primal pivot row choice - inline void setActive( int iRow) { - status_[iRow] = static_cast(status_[iRow] | 128); - } - inline void clearActive( int iRow) { - status_[iRow] = static_cast(status_[iRow] & ~128); - } - inline bool active(int iRow) const { - return ((status_[iRow] & 128) != 0); - } - /// To say perturbed - inline void setPerturbed( int iSequence) { - status_[iSequence] = static_cast(status_[iSequence] | 128); - } - inline void clearPerturbed( int iSequence) { - status_[iSequence] = static_cast(status_[iSequence] & ~128); - } - inline bool perturbed(int iSequence) const { - return ((status_[iSequence] & 128) != 0); - } - /** Set up status array (can be used by OsiClp). - Also can be used to set up all slack basis */ - void createStatus() ; - /** Sets up all slack basis and resets solution to - as it was after initial load or readMps */ - void allSlackBasis(bool resetSolution = false); - - /// So we know when to be cautious - inline int lastBadIteration() const { - return lastBadIteration_; - } - /// Set so we know when to be cautious - inline void setLastBadIteration(int value) { - lastBadIteration_=value; - } - /// Progress flag - at present 0 bit says artificials out - inline int progressFlag() const { - return (progressFlag_ & 3); - } - /// For dealing with all issues of cycling etc - inline ClpSimplexProgress * progress() - { return &progress_;} - /// Force re-factorization early value - inline int forceFactorization() const { - return forceFactorization_ ; - } - /// Force re-factorization early - inline void forceFactorization(int value) { - forceFactorization_ = value; - } - /// Raw objective value (so always minimize in primal) - inline double rawObjectiveValue() const { - return objectiveValue_; - } - /// Compute objective value from solution and put in objectiveValue_ - void computeObjectiveValue(bool useWorkingSolution = false); - /// Compute minimization objective value from internal solution without perturbation - double computeInternalObjectiveValue(); - /** Infeasibility/unbounded ray (NULL returned if none/wrong) - Up to user to use delete [] on these arrays. */ - double * infeasibilityRay(bool fullRay=false) const; - /** Number of extra rows. These are ones which will be dynamically created - each iteration. This is for GUB but may have other uses. - */ - inline int numberExtraRows() const { - return numberExtraRows_; - } - /** Maximum number of basic variables - can be more than number of rows if GUB - */ - inline int maximumBasic() const { - return maximumBasic_; - } - /// Iteration when we entered dual or primal - inline int baseIteration() const { - return baseIteration_; - } - /// Create C++ lines to get to current state - void generateCpp( FILE * fp, bool defaultFactor = false); - /// Gets clean and emptyish factorization - ClpFactorization * getEmptyFactorization(); - /// May delete or may make clean and emptyish factorization - void setEmptyFactorization(); - /// Move status and solution across - void moveInfo(const ClpSimplex & rhs, bool justStatus = false); - //@} - - ///@name Basis handling - // These are only to be used using startFinishOptions (ClpSimplexDual, ClpSimplexPrimal) - // *** At present only without scaling - // *** Slacks havve -1.0 element (so == row activity) - take care - ///Get a row of the tableau (slack part in slack if not NULL) - void getBInvARow(int row, double* z, double * slack = NULL); - - ///Get a row of the basis inverse - void getBInvRow(int row, double* z); - - ///Get a column of the tableau - void getBInvACol(int col, double* vec); - - ///Get a column of the basis inverse - void getBInvCol(int col, double* vec); - - /** Get basic indices (order of indices corresponds to the - order of elements in a vector retured by getBInvACol() and - getBInvCol()). - */ - void getBasics(int* index); - - //@} - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - void setObjectiveCoefficient( int elementIndex, double elementValue ); - /** Set an objective function coefficient */ - inline void setObjCoeff( int elementIndex, double elementValue ) { - setObjectiveCoefficient( elementIndex, elementValue); - } - - /** Set a single column lower bound
      - Use -DBL_MAX for -infinity. */ - void setColumnLower( int elementIndex, double elementValue ); - - /** Set a single column upper bound
      - Use DBL_MAX for infinity. */ - void setColumnUpper( int elementIndex, double elementValue ); - - /** Set a single column lower and upper bound */ - void setColumnBounds( int elementIndex, - double lower, double upper ); - - /** Set the bounds on a number of columns simultaneously
      - The default implementation just invokes setColLower() and - setColUpper() over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - either bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - void setColumnSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set a single column lower bound
      - Use -DBL_MAX for -infinity. */ - inline void setColLower( int elementIndex, double elementValue ) { - setColumnLower(elementIndex, elementValue); - } - /** Set a single column upper bound
      - Use DBL_MAX for infinity. */ - inline void setColUpper( int elementIndex, double elementValue ) { - setColumnUpper(elementIndex, elementValue); - } - - /** Set a single column lower and upper bound */ - inline void setColBounds( int elementIndex, - double newlower, double newupper ) { - setColumnBounds(elementIndex, newlower, newupper); - } - - /** Set the bounds on a number of columns simultaneously
      - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - either bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - inline void setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) { - setColumnSetBounds(indexFirst, indexLast, boundList); - } - - /** Set a single row lower bound
      - Use -DBL_MAX for -infinity. */ - void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound
      - Use DBL_MAX for infinity. */ - void setRowUpper( int elementIndex, double elementValue ) ; - - /** Set a single row lower and upper bound */ - void setRowBounds( int elementIndex, - double lower, double upper ) ; - - /** Set the bounds on a number of rows simultaneously
      - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the constraints whose - either bound changes - @param boundList the new lower/upper bound pairs for the constraints - */ - void setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - /// Resizes rim part of model - void resize (int newNumberRows, int newNumberColumns); - - //@} - -////////////////// data ////////////////// -protected: - - /**@name data. Many arrays have a row part and a column part. - There is a single array with both - columns then rows and - then normally two arrays pointing to rows and columns. The - single array is the owner of memory - */ - //@{ - /** Best possible improvement using djs (primal) or - obj change by flipping bounds to make dual feasible (dual) */ - double bestPossibleImprovement_; - /// Zero tolerance - double zeroTolerance_; - /// Sequence of worst (-1 if feasible) - int columnPrimalSequence_; - /// Sequence of worst (-1 if feasible) - int rowPrimalSequence_; - /// "Best" objective value - double bestObjectiveValue_; - /// More special options - see set for details - int moreSpecialOptions_; - /// Iteration when we entered dual or primal - int baseIteration_; - /// Primal tolerance needed to make dual feasible (0 == Primal, <0 == Dual - int algorithm_; - /** Now for some reliability aids - This forces re-factorization early */ - int forceFactorization_; - /** Perturbation: - -50 to +50 - perturb by this power of ten (-6 sounds good) - 100 - auto perturb if takes too long (1.0e-6 largest nonzero) - 101 - we are perturbed - 102 - don't try perturbing again - default is 100 - */ - int perturbation_; - /// Saved status regions - unsigned char * saveStatus_; - /** Very wasteful way of dealing with infeasibilities in primal. - However it will allow non-linearities and use of dual - analysis. If it doesn't work it can easily be replaced. - */ - ClpNonLinearCost * nonLinearCost_; - /// So we know when to be cautious - int lastBadIteration_; - /// So we know when to open up again - int lastFlaggedIteration_; - /// Can be used for count of fake bounds (dual) or fake costs (primal) - int numberFake_; - /// Can be used for count of changed costs (dual) or changed bounds (primal) - int numberChanged_; - /// Progress flag - at present 0 bit says artificials out, 1 free in - int progressFlag_; - /// First free/super-basic variable (-1 if none) - int firstFree_; - /** Number of extra rows. These are ones which will be dynamically created - each iteration. This is for GUB but may have other uses. - */ - int numberExtraRows_; - /** Maximum number of basic variables - can be more than number of rows if GUB - */ - int maximumBasic_; - /// If may skip final factorize then allow up to this pivots (default 20) - int dontFactorizePivots_; - /** For advanced use. When doing iterative solves things can get - nasty so on values pass if incoming solution has largest - infeasibility < incomingInfeasibility throw out variables - from basis until largest infeasibility < allowedInfeasibility. - if allowedInfeasibility>= incomingInfeasibility this is - always possible altough you may end up with an all slack basis. - - Defaults are 1.0,10.0 - */ - double incomingInfeasibility_; - double allowedInfeasibility_; - /// Automatic scaling of objective and rhs and bounds - int automaticScale_; - /// Maximum perturbation array size (take out when code rewritten) - int maximumPerturbationSize_; - /// Perturbation array (maximumPerturbationSize_) - double * perturbationArray_; - /// A copy of model with certain state - normally without cuts - ClpSimplex * baseModel_; - /// For dealing with all issues of cycling etc - ClpSimplexProgress progress_; -#ifdef ABC_INHERIT - AbcSimplex * abcSimplex_; -#define CLP_ABC_WANTED 1 -#define CLP_ABC_WANTED_PARALLEL 2 -#define CLP_ABC_FULL_DONE 8 - // bits 256,512,1024 for crash -#endif -#define CLP_ABC_BEEN_FEASIBLE 65536 - int abcState_; - /// Number of degenerate pivots since last perturbed - int numberDegeneratePivots_; -public: - /// Spare int array for passing information [0]!=0 switches on - mutable int spareIntArray_[4]; - /// Spare double array for passing information [0]!=0 switches on - mutable double spareDoubleArray_[4]; -protected: - /// Allow OsiClp certain perks - friend class OsiClpSolverInterface; - /// And OsiCLP - friend class OsiCLPSolverInterface; - //@} -}; -//############################################################################# -/** A function that tests the methods in the ClpSimplex class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. - - It also does some testing of ClpFactorization class - */ -void -ClpSimplexUnitTest(const std::string & mpsDir); - -// For Devex stuff -#define DEVEX_TRY_NORM 1.0e-4 -#define DEVEX_ADD_ONE 1.0 -#if defined(ABC_INHERIT) || defined(CBC_THREAD) || defined(THREADS_IN_ANALYZE) -// Use pthreads -#include -typedef struct { - double result; - //const CoinIndexedVector * constVector; // can get rid of - //CoinIndexedVector * vectors[2]; // can get rid of - void * extraInfo; - void * extraInfo2; - int status; - int stuff[4]; -} CoinThreadInfo; -class CoinPthreadStuff { -public: - /**@name Constructors and destructor and copy */ - //@{ - /** Main constructor - */ - CoinPthreadStuff (int numberThreads=0, - void * parallelManager(void * stuff)=NULL); - /// Assignment operator. This copies the data - CoinPthreadStuff & operator=(const CoinPthreadStuff & rhs); - /// Destructor - ~CoinPthreadStuff ( ); - /// set stop start - inline void setStopStart(int value) - { stopStart_=value;} -#ifndef NUMBER_THREADS -#define NUMBER_THREADS 8 -#endif - // For waking up thread - inline pthread_mutex_t * mutexPointer(int which,int thread=0) - { return mutex_+which+3*thread;} -#ifdef PTHREAD_BARRIER_SERIAL_THREAD - inline pthread_barrier_t * barrierPointer() - { return &barrier_;} -#endif - inline int whichLocked(int thread=0) const - { return locked_[thread];} - inline CoinThreadInfo * threadInfoPointer(int thread=0) - { return threadInfo_+thread;} - void startParallelTask(int type,int iThread,void * info=NULL); - int waitParallelTask(int type, int & iThread,bool allowIdle); - void waitAllTasks(); - /// so thread can find out which one it is - int whichThread() const; - void sayIdle(int iThread); - //void startThreads(int numberThreads); - //void stopThreads(); - // For waking up thread - pthread_mutex_t mutex_[3*(NUMBER_THREADS+1)]; -#ifdef PTHREAD_BARRIER_SERIAL_THREAD - pthread_barrier_t barrier_; -#endif - CoinThreadInfo threadInfo_[NUMBER_THREADS+1]; - pthread_t abcThread_[NUMBER_THREADS+1]; - int locked_[NUMBER_THREADS+1]; - int stopStart_; - int numberThreads_; -}; -void * clp_parallelManager(void * stuff); -#endif -#endif diff --git a/thirdparty/linux/include/coin1/ClpSimplexDual.hpp b/thirdparty/linux/include/coin1/ClpSimplexDual.hpp deleted file mode 100644 index 77cc577a..00000000 --- a/thirdparty/linux/include/coin1/ClpSimplexDual.hpp +++ /dev/null @@ -1,300 +0,0 @@ -/* $Id: ClpSimplexDual.hpp 1761 2011-07-06 16:06:24Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSimplexDual_H -#define ClpSimplexDual_H - -#include "ClpSimplex.hpp" - -/** This solves LPs using the dual simplex method - - It inherits from ClpSimplex. It has no data of its own and - is never created - only cast from a ClpSimplex object at algorithm time. - -*/ - -class ClpSimplexDual : public ClpSimplex { - -public: - - /**@name Description of algorithm */ - //@{ - /** Dual algorithm - - Method - - It tries to be a single phase approach with a weight of 1.0 being - given to getting optimal and a weight of updatedDualBound_ being - given to getting dual feasible. In this version I have used the - idea that this weight can be thought of as a fake bound. If the - distance between the lower and upper bounds on a variable is less - than the feasibility weight then we are always better off flipping - to other bound to make dual feasible. If the distance is greater - then we make up a fake bound updatedDualBound_ away from one bound. - If we end up optimal or primal infeasible, we check to see if - bounds okay. If so we have finished, if not we increase updatedDualBound_ - and continue (after checking if unbounded). I am undecided about - free variables - there is coding but I am not sure about it. At - present I put them in basis anyway. - - The code is designed to take advantage of sparsity so arrays are - seldom zeroed out from scratch or gone over in their entirety. - The only exception is a full scan to find outgoing variable for - Dantzig row choice. For steepest edge we keep an updated list - of infeasibilities (actually squares). - On easy problems we don't need full scan - just - pick first reasonable. - - One problem is how to tackle degeneracy and accuracy. At present - I am using the modification of costs which I put in OSL and some - of what I think is the dual analog of Gill et al. - I am still not sure of the exact details. - - The flow of dual is three while loops as follows: - - while (not finished) { - - while (not clean solution) { - - Factorize and/or clean up solution by flipping variables so - dual feasible. If looks finished check fake dual bounds. - Repeat until status is iterating (-1) or finished (0,1,2) - - } - - while (status==-1) { - - Iterate until no pivot in or out or time to re-factorize. - - Flow is: - - choose pivot row (outgoing variable). if none then - we are primal feasible so looks as if done but we need to - break and check bounds etc. - - Get pivot row in tableau - - Choose incoming column. If we don't find one then we look - primal infeasible so break and check bounds etc. (Also the - pivot tolerance is larger after any iterations so that may be - reason) - - If we do find incoming column, we may have to adjust costs to - keep going forwards (anti-degeneracy). Check pivot will be stable - and if unstable throw away iteration and break to re-factorize. - If minor error re-factorize after iteration. - - Update everything (this may involve flipping variables to stay - dual feasible. - - } - - } - - TODO's (or maybe not) - - At present we never check we are going forwards. I overdid that in - OSL so will try and make a last resort. - - Needs partial scan pivot out option. - - May need other anti-degeneracy measures, especially if we try and use - loose tolerances as a way to solve in fewer iterations. - - I like idea of dynamic scaling. This gives opportunity to decouple - different implications of scaling for accuracy, iteration count and - feasibility tolerance. - - for use of exotic parameter startFinishoptions see Clpsimplex.hpp - */ - - int dual(int ifValuesPass, int startFinishOptions = 0); - /** For strong branching. On input lower and upper are new bounds - while on output they are change in objective function values - (>1.0e50 infeasible). - Return code is 0 if nothing interesting, -1 if infeasible both - ways and +1 if infeasible one way (check values to see which one(s)) - Solutions are filled in as well - even down, odd up - also - status and number of iterations - */ - int strongBranching(int numberVariables, const int * variables, - double * newLower, double * newUpper, - double ** outputSolution, - int * outputStatus, int * outputIterations, - bool stopOnFirstInfeasible = true, - bool alwaysFinish = false, - int startFinishOptions = 0); - /// This does first part of StrongBranching - ClpFactorization * setupForStrongBranching(char * arrays, int numberRows, - int numberColumns, bool solveLp = false); - /// This cleans up after strong branching - void cleanupAfterStrongBranching(ClpFactorization * factorization); - //@} - - /**@name Functions used in dual */ - //@{ - /** This has the flow between re-factorizations - Broken out for clarity and will be used by strong branching - - Reasons to come out: - -1 iterations etc - -2 inaccuracy - -3 slight inaccuracy (and done iterations) - +0 looks optimal (might be unbounded - but we will investigate) - +1 looks infeasible - +3 max iterations - - If givenPi not NULL then in values pass - */ - int whileIterating(double * & givenPi, int ifValuesPass); - /** The duals are updated by the given arrays. - Returns number of infeasibilities. - After rowArray and columnArray will just have those which - have been flipped. - Variables may be flipped between bounds to stay dual feasible. - The output vector has movement of primal - solution (row length array) */ - int updateDualsInDual(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - CoinIndexedVector * outputArray, - double theta, - double & objectiveChange, - bool fullRecompute); - /** The duals are updated by the given arrays. - This is in values pass - so no changes to primal is made - */ - void updateDualsInValuesPass(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - double theta); - /** While updateDualsInDual sees what effect is of flip - this does actual flipping. - */ - void flipBounds(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray); - /** - Row array has row part of pivot row - Column array has column part. - This chooses pivot column. - Spare arrays are used to save pivots which will go infeasible - We will check for basic so spare array will never overflow. - If necessary will modify costs - For speed, we may need to go to a bucket approach when many - variables are being flipped. - Returns best possible pivot value - */ - double dualColumn(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - CoinIndexedVector * spareArray, - CoinIndexedVector * spareArray2, - double accpetablePivot, - CoinBigIndex * dubiousWeights); - /// Does first bit of dualColumn - int dualColumn0(const CoinIndexedVector * rowArray, - const CoinIndexedVector * columnArray, - CoinIndexedVector * spareArray, - double acceptablePivot, - double & upperReturn, double &bestReturn, double & badFree); - /** - Row array has row part of pivot row - Column array has column part. - This sees what is best thing to do in dual values pass - if sequenceIn==sequenceOut can change dual on chosen row and leave variable in basis - */ - void checkPossibleValuesMove(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - double acceptablePivot); - /** - Row array has row part of pivot row - Column array has column part. - This sees what is best thing to do in branch and bound cleanup - If sequenceIn_ < 0 then can't do anything - */ - void checkPossibleCleanup(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - double acceptablePivot); - /** - This sees if we can move duals in dual values pass. - This is done before any pivoting - */ - void doEasyOnesInValuesPass(double * givenReducedCosts); - /** - Chooses dual pivot row - Would be faster with separate region to scan - and will have this (with square of infeasibility) when steepest - For easy problems we can just choose one of the first rows we look at - - If alreadyChosen >=0 then in values pass and that row has been - selected - */ - void dualRow(int alreadyChosen); - /** Checks if any fake bounds active - if so returns number and modifies - updatedDualBound_ and everything. - Free variables will be left as free - Returns number of bounds changed if >=0 - Returns -1 if not initialize and no effect - Fills in changeVector which can be used to see if unbounded - and cost of change vector - If 2 sets to original (just changed) - */ - int changeBounds(int initialize, CoinIndexedVector * outputArray, - double & changeCost); - /** As changeBounds but just changes new bounds for a single variable. - Returns true if change */ - bool changeBound( int iSequence); - /// Restores bound to original bound - void originalBound(int iSequence); - /** Checks if tentative optimal actually means unbounded in dual - Returns -3 if not, 2 if is unbounded */ - int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare, - double changeCost); - /** Refactorizes if necessary - Checks if finished. Updates status. - lastCleaned refers to iteration at which some objective/feasibility - cleaning too place. - - type - 0 initial so set up save arrays etc - - 1 normal -if good update save - - 2 restoring from saved - */ - void statusOfProblemInDual(int & lastCleaned, int type, - double * givenDjs, ClpDataSave & saveData, - int ifValuesPass); - /** Perturbs problem (method depends on perturbation()) - returns nonzero if should go to dual */ - int perturb(); - /** Fast iterations. Misses out a lot of initialization. - Normally stops on maximum iterations, first re-factorization - or tentative optimum. If looks interesting then continues as - normal. Returns 0 if finished properly, 1 otherwise. - */ - int fastDual(bool alwaysFinish = false); - /** Checks number of variables at fake bounds. This is used by fastDual - so can exit gracefully before end */ - int numberAtFakeBound(); - - /** Pivot in a variable and choose an outgoing one. Assumes dual - feasible - will not go through a reduced cost. Returns step length in theta - Return codes as before but -1 means no acceptable pivot - */ - int pivotResultPart1(); - /** Get next free , -1 if none */ - int nextSuperBasic(); - /** Startup part of dual (may be extended to other algorithms) - returns 0 if good, 1 if bad */ - int startupSolve(int ifValuesPass, double * saveDuals, int startFinishOptions); - void finishSolve(int startFinishOptions); - void gutsOfDual(int ifValuesPass, double * & saveDuals, int initialStatus, - ClpDataSave & saveData); - //int dual2(int ifValuesPass,int startFinishOptions=0); - void resetFakeBounds(int type); - - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/ClpSimplexNonlinear.hpp b/thirdparty/linux/include/coin1/ClpSimplexNonlinear.hpp deleted file mode 100644 index 6c1088bb..00000000 --- a/thirdparty/linux/include/coin1/ClpSimplexNonlinear.hpp +++ /dev/null @@ -1,117 +0,0 @@ -/* $Id: ClpSimplexNonlinear.hpp 2025 2014-03-19 12:49:55Z forrest $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSimplexNonlinear_H -#define ClpSimplexNonlinear_H - -class ClpNonlinearInfo; -class ClpQuadraticObjective; -class ClpConstraint; - -#include "ClpSimplexPrimal.hpp" - -/** This solves non-linear LPs using the primal simplex method - - It inherits from ClpSimplexPrimal. It has no data of its own and - is never created - only cast from a ClpSimplexPrimal object at algorithm time. - If needed create new class and pass around - -*/ - -class ClpSimplexNonlinear : public ClpSimplexPrimal { - -public: - - /**@name Description of algorithm */ - //@{ - /** Primal algorithms for reduced gradient - At present we have two algorithms: - - */ - /// A reduced gradient method. - int primal(); - /** Primal algorithm for quadratic - Using a semi-trust region approach as for pooling problem - This is in because I have it lying around - */ - int primalSLP(int numberPasses, double deltaTolerance, - int otherOptions=0); - /// May use a cut approach for solving any LP - int primalDualCuts(char * rowsIn, int startUp, int algorithm); - /** Primal algorithm for nonlinear constraints - Using a semi-trust region approach as for pooling problem - This is in because I have it lying around - - */ - int primalSLP(int numberConstraints, ClpConstraint ** constraints, - int numberPasses, double deltaTolerance); - - /** Creates direction vector. note longArray is long enough - for rows and columns. If numberNonBasic 0 then is updated - otherwise mode is ignored and those are used. - Norms are only for those > 1.0e3*dualTolerance - If mode is nonzero then just largest dj */ - void directionVector (CoinIndexedVector * longArray, - CoinIndexedVector * spare1, CoinIndexedVector * spare2, - int mode, - double & normFlagged, double & normUnflagged, - int & numberNonBasic); - /// Main part. - int whileIterating (int & pivotMode); - /** - longArray has direction - pivotMode - - 0 - use all dual infeasible variables - 1 - largest dj - while >= 10 trying startup phase - Returns 0 - can do normal iteration (basis change) - 1 - no basis change - 2 - if wants singleton - 3 - if time to re-factorize - If sequenceIn_ >=0 then that will be incoming variable - */ - int pivotColumn(CoinIndexedVector * longArray, - CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - CoinIndexedVector * spare, - int & pivotMode, - double & solutionError, - double * array1); - /** Refactorizes if necessary - Checks if finished. Updates status. - lastCleaned refers to iteration at which some objective/feasibility - cleaning too place. - - type - 0 initial so set up save arrays etc - - 1 normal -if good update save - - 2 restoring from saved - */ - void statusOfProblemInPrimal(int & lastCleaned, int type, - ClpSimplexProgress * progress, - bool doFactorization, - double & bestObjectiveWhenFlagged); - /** Do last half of an iteration. - Return codes - Reasons to come out normal mode - -1 normal - -2 factorize now - good iteration - -3 slight inaccuracy - refactorize - iteration done - -4 inaccuracy - refactorize - no iteration - -5 something flagged - go round again - +2 looks unbounded - +3 max iterations (iteration done) - - */ - int pivotNonlinearResult(); - //@} - -}; -#endif - diff --git a/thirdparty/linux/include/coin1/ClpSimplexOther.hpp b/thirdparty/linux/include/coin1/ClpSimplexOther.hpp deleted file mode 100644 index c5014ec2..00000000 --- a/thirdparty/linux/include/coin1/ClpSimplexOther.hpp +++ /dev/null @@ -1,277 +0,0 @@ -/* $Id: ClpSimplexOther.hpp 2070 2014-11-18 11:12:54Z forrest $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSimplexOther_H -#define ClpSimplexOther_H - -#include "ClpSimplex.hpp" - -/** This is for Simplex stuff which is neither dual nor primal - - It inherits from ClpSimplex. It has no data of its own and - is never created - only cast from a ClpSimplex object at algorithm time. - -*/ - -class ClpSimplexOther : public ClpSimplex { - -public: - - /**@name Methods */ - //@{ - /** Dual ranging. - This computes increase/decrease in cost for each given variable and corresponding - sequence numbers which would change basis. Sequence numbers are 0..numberColumns - and numberColumns.. for artificials/slacks. - For non-basic variables the information is trivial to compute and the change in cost is just minus the - reduced cost and the sequence number will be that of the non-basic variables. - For basic variables a ratio test is between the reduced costs for non-basic variables - and the row of the tableau corresponding to the basic variable. - The increase/decrease value is always >= 0.0 - - Up to user to provide correct length arrays where each array is of length numberCheck. - which contains list of variables for which information is desired. All other - arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays - will be information for variable 7. - - If valueIncrease/Decrease not NULL (both must be NULL or both non NULL) then these are filled with - the value of variable if such a change in cost were made (the existing bounds are ignored) - - When here - guaranteed optimal - */ - void dualRanging(int numberCheck, const int * which, - double * costIncrease, int * sequenceIncrease, - double * costDecrease, int * sequenceDecrease, - double * valueIncrease = NULL, double * valueDecrease = NULL); - /** Primal ranging. - This computes increase/decrease in value for each given variable and corresponding - sequence numbers which would change basis. Sequence numbers are 0..numberColumns - and numberColumns.. for artificials/slacks. - This should only be used for non-basic variabls as otherwise information is pretty useless - For basic variables the sequence number will be that of the basic variables. - - Up to user to provide correct length arrays where each array is of length numberCheck. - which contains list of variables for which information is desired. All other - arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays - will be information for variable 7. - - When here - guaranteed optimal - */ - void primalRanging(int numberCheck, const int * which, - double * valueIncrease, int * sequenceIncrease, - double * valueDecrease, int * sequenceDecrease); - /** Parametrics - This is an initial slow version. - The code uses current bounds + theta * change (if change array not NULL) - and similarly for objective. - It starts at startingTheta and returns ending theta in endingTheta. - If reportIncrement 0.0 it will report on any movement - If reportIncrement >0.0 it will report at startingTheta+k*reportIncrement. - If it can not reach input endingTheta return code will be 1 for infeasible, - 2 for unbounded, if error on ranges -1, otherwise 0. - Normal report is just theta and objective but - if event handler exists it may do more - On exit endingTheta is maximum reached (can be used for next startingTheta) - */ - int parametrics(double startingTheta, double & endingTheta, double reportIncrement, - const double * changeLowerBound, const double * changeUpperBound, - const double * changeLowerRhs, const double * changeUpperRhs, - const double * changeObjective); - /** Version of parametrics which reads from file - See CbcClpParam.cpp for details of format - Returns -2 if unable to open file */ - int parametrics(const char * dataFile); - /** Parametrics - This is an initial slow version. - The code uses current bounds + theta * change (if change array not NULL) - It starts at startingTheta and returns ending theta in endingTheta. - If it can not reach input endingTheta return code will be 1 for infeasible, - 2 for unbounded, if error on ranges -1, otherwise 0. - Event handler may do more - On exit endingTheta is maximum reached (can be used for next startingTheta) - */ - int parametrics(double startingTheta, double & endingTheta, - const double * changeLowerBound, const double * changeUpperBound, - const double * changeLowerRhs, const double * changeUpperRhs); - int parametricsObj(double startingTheta, double & endingTheta, - const double * changeObjective); - /// Finds best possible pivot - double bestPivot(bool justColumns=false); - typedef struct { - double startingTheta; - double endingTheta; - double maxTheta; - double acceptableMaxTheta; // if this far then within tolerances - double * lowerChange; // full array of lower bound changes - int * lowerList; // list of lower bound changes - double * upperChange; // full array of upper bound changes - int * upperList; // list of upper bound changes - char * markDone; // mark which ones looked at - int * backwardBasic; // from sequence to pivot row - int * lowerActive; - double * lowerGap; - double * lowerCoefficient; - int * upperActive; - double * upperGap; - double * upperCoefficient; - int unscaledChangesOffset; - bool firstIteration; // so can update rhs for accuracy - } parametricsData; - -private: - /** Parametrics - inner loop - This first attempt is when reportIncrement non zero and may - not report endingTheta correctly - If it can not reach input endingTheta return code will be 1 for infeasible, - 2 for unbounded, otherwise 0. - Normal report is just theta and objective but - if event handler exists it may do more - */ - int parametricsLoop(parametricsData & paramData, double reportIncrement, - const double * changeLower, const double * changeUpper, - const double * changeObjective, ClpDataSave & data, - bool canTryQuick); - int parametricsLoop(parametricsData & paramData, - ClpDataSave & data,bool canSkipFactorization=false); - int parametricsObjLoop(parametricsData & paramData, - ClpDataSave & data,bool canSkipFactorization=false); - /** Refactorizes if necessary - Checks if finished. Updates status. - - type - 0 initial so set up save arrays etc - - 1 normal -if good update save - - 2 restoring from saved - */ - void statusOfProblemInParametrics(int type, ClpDataSave & saveData); - void statusOfProblemInParametricsObj(int type, ClpDataSave & saveData); - /** This has the flow between re-factorizations - - Reasons to come out: - -1 iterations etc - -2 inaccuracy - -3 slight inaccuracy (and done iterations) - +0 looks optimal (might be unbounded - but we will investigate) - +1 looks infeasible - +3 max iterations - */ - int whileIterating(parametricsData & paramData, double reportIncrement, - const double * changeObjective); - /** Computes next theta and says if objective or bounds (0= bounds, 1 objective, -1 none). - theta is in theta_. - type 1 bounds, 2 objective, 3 both. - */ - int nextTheta(int type, double maxTheta, parametricsData & paramData, - const double * changeObjective); - int whileIteratingObj(parametricsData & paramData); - int nextThetaObj(double maxTheta, parametricsData & paramData); - /// Restores bound to original bound - void originalBound(int iSequence, double theta, const double * changeLower, - const double * changeUpper); - /// Compute new rowLower_ etc (return negative if infeasible - otherwise largest change) - double computeRhsEtc(parametricsData & paramData); - /// Redo lower_ from rowLower_ etc - void redoInternalArrays(); - /** - Row array has row part of pivot row - Column array has column part. - This is used in dual ranging - */ - void checkDualRatios(CoinIndexedVector * rowArray, - CoinIndexedVector * columnArray, - double & costIncrease, int & sequenceIncrease, double & alphaIncrease, - double & costDecrease, int & sequenceDecrease, double & alphaDecrease); - /** - Row array has pivot column - This is used in primal ranging - */ - void checkPrimalRatios(CoinIndexedVector * rowArray, - int direction); - /// Returns new value of whichOther when whichIn enters basis - double primalRanging1(int whichIn, int whichOther); - -public: - /** Write the basis in MPS format to the specified file. - If writeValues true writes values of structurals - (and adds VALUES to end of NAME card) - - Row and column names may be null. - formatType is -
        -
      • 0 - normal -
      • 1 - extra accuracy -
      • 2 - IEEE hex (later) -
      - - Returns non-zero on I/O error - */ - int writeBasis(const char *filename, - bool writeValues = false, - int formatType = 0) const; - /// Read a basis from the given filename - int readBasis(const char *filename); - /** Creates dual of a problem if looks plausible - (defaults will always create model) - fractionRowRanges is fraction of rows allowed to have ranges - fractionColumnRanges is fraction of columns allowed to have ranges - */ - ClpSimplex * dualOfModel(double fractionRowRanges = 1.0, double fractionColumnRanges = 1.0) const; - /** Restores solution from dualized problem - non-zero return code indicates minor problems - */ - int restoreFromDual(const ClpSimplex * dualProblem, - bool checkAccuracy=false); - /** Sets solution in dualized problem - non-zero return code indicates minor problems - */ - int setInDual(ClpSimplex * dualProblem); - /** Does very cursory presolve. - rhs is numberRows, whichRows is 3*numberRows and whichColumns is 2*numberColumns. - */ - ClpSimplex * crunch(double * rhs, int * whichRows, int * whichColumns, - int & nBound, bool moreBounds = false, bool tightenBounds = false); - /** After very cursory presolve. - rhs is numberRows, whichRows is 3*numberRows and whichColumns is 2*numberColumns. - */ - void afterCrunch(const ClpSimplex & small, - const int * whichRows, const int * whichColumns, - int nBound); - /** Returns gub version of model or NULL - whichRows has to be numberRows - whichColumns has to be numberRows+numberColumns */ - ClpSimplex * gubVersion(int * whichRows, int * whichColumns, - int neededGub, - int factorizationFrequency=50); - /// Sets basis from original - void setGubBasis(ClpSimplex &original,const int * whichRows, - const int * whichColumns); - /// Restores basis to original - void getGubBasis(ClpSimplex &original,const int * whichRows, - const int * whichColumns) const; - /// Quick try at cleaning up duals if postsolve gets wrong - void cleanupAfterPostsolve(); - /** Tightens integer bounds - returns number tightened or -1 if infeasible - */ - int tightenIntegerBounds(double * rhsSpace); - /** Expands out all possible combinations for a knapsack - If buildObj NULL then just computes space needed - returns number elements - On entry numberOutput is maximum allowed, on exit it is number needed or - -1 (as will be number elements) if maximum exceeded. numberOutput will have at - least space to return values which reconstruct input. - Rows returned will be original rows but no entries will be returned for - any rows all of whose entries are in knapsack. So up to user to allow for this. - If reConstruct >=0 then returns number of entrie which make up item "reConstruct" - in expanded knapsack. Values in buildRow and buildElement; - */ - int expandKnapsack(int knapsackRow, int & numberOutput, - double * buildObj, CoinBigIndex * buildStart, - int * buildRow, double * buildElement, int reConstruct = -1) const; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/ClpSimplexPrimal.hpp b/thirdparty/linux/include/coin1/ClpSimplexPrimal.hpp deleted file mode 100644 index d78e54ee..00000000 --- a/thirdparty/linux/include/coin1/ClpSimplexPrimal.hpp +++ /dev/null @@ -1,244 +0,0 @@ -/* $Id: ClpSimplexPrimal.hpp 1665 2011-01-04 17:55:54Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSimplexPrimal_H -#define ClpSimplexPrimal_H - -#include "ClpSimplex.hpp" - -/** This solves LPs using the primal simplex method - - It inherits from ClpSimplex. It has no data of its own and - is never created - only cast from a ClpSimplex object at algorithm time. - -*/ - -class ClpSimplexPrimal : public ClpSimplex { - -public: - - /**@name Description of algorithm */ - //@{ - /** Primal algorithm - - Method - - It tries to be a single phase approach with a weight of 1.0 being - given to getting optimal and a weight of infeasibilityCost_ being - given to getting primal feasible. In this version I have tried to - be clever in a stupid way. The idea of fake bounds in dual - seems to work so the primal analogue would be that of getting - bounds on reduced costs (by a presolve approach) and using - these for being above or below feasible region. I decided to waste - memory and keep these explicitly. This allows for non-linear - costs! I have not tested non-linear costs but will be glad - to do something if a reasonable example is provided. - - The code is designed to take advantage of sparsity so arrays are - seldom zeroed out from scratch or gone over in their entirety. - The only exception is a full scan to find incoming variable for - Dantzig row choice. For steepest edge we keep an updated list - of dual infeasibilities (actually squares). - On easy problems we don't need full scan - just - pick first reasonable. This method has not been coded. - - One problem is how to tackle degeneracy and accuracy. At present - I am using the modification of costs which I put in OSL and which was - extended by Gill et al. I am still not sure whether we will also - need explicit perturbation. - - The flow of primal is three while loops as follows: - - while (not finished) { - - while (not clean solution) { - - Factorize and/or clean up solution by changing bounds so - primal feasible. If looks finished check fake primal bounds. - Repeat until status is iterating (-1) or finished (0,1,2) - - } - - while (status==-1) { - - Iterate until no pivot in or out or time to re-factorize. - - Flow is: - - choose pivot column (incoming variable). if none then - we are primal feasible so looks as if done but we need to - break and check bounds etc. - - Get pivot column in tableau - - Choose outgoing row. If we don't find one then we look - primal unbounded so break and check bounds etc. (Also the - pivot tolerance is larger after any iterations so that may be - reason) - - If we do find outgoing row, we may have to adjust costs to - keep going forwards (anti-degeneracy). Check pivot will be stable - and if unstable throw away iteration and break to re-factorize. - If minor error re-factorize after iteration. - - Update everything (this may involve changing bounds on - variables to stay primal feasible. - - } - - } - - TODO's (or maybe not) - - At present we never check we are going forwards. I overdid that in - OSL so will try and make a last resort. - - Needs partial scan pivot in option. - - May need other anti-degeneracy measures, especially if we try and use - loose tolerances as a way to solve in fewer iterations. - - I like idea of dynamic scaling. This gives opportunity to decouple - different implications of scaling for accuracy, iteration count and - feasibility tolerance. - - for use of exotic parameter startFinishoptions see Clpsimplex.hpp - */ - - int primal(int ifValuesPass = 0, int startFinishOptions = 0); - //@} - - /**@name For advanced users */ - //@{ - /// Do not change infeasibility cost and always say optimal - void alwaysOptimal(bool onOff); - bool alwaysOptimal() const; - /** Normally outgoing variables can go out to slightly negative - values (but within tolerance) - this is to help stability and - and degeneracy. This can be switched off - */ - void exactOutgoing(bool onOff); - bool exactOutgoing() const; - //@} - - /**@name Functions used in primal */ - //@{ - /** This has the flow between re-factorizations - - Returns a code to say where decision to exit was made - Problem status set to: - - -2 re-factorize - -4 Looks optimal/infeasible - -5 Looks unbounded - +3 max iterations - - valuesOption has original value of valuesPass - */ - int whileIterating(int valuesOption); - - /** Do last half of an iteration. This is split out so people can - force incoming variable. If solveType_ is 2 then this may - re-factorize while normally it would exit to re-factorize. - Return codes - Reasons to come out (normal mode/user mode): - -1 normal - -2 factorize now - good iteration/ NA - -3 slight inaccuracy - refactorize - iteration done/ same but factor done - -4 inaccuracy - refactorize - no iteration/ NA - -5 something flagged - go round again/ pivot not possible - +2 looks unbounded - +3 max iterations (iteration done) - - With solveType_ ==2 this should - Pivot in a variable and choose an outgoing one. Assumes primal - feasible - will not go through a bound. Returns step length in theta - Returns ray in ray_ - */ - int pivotResult(int ifValuesPass = 0); - - - /** The primals are updated by the given array. - Returns number of infeasibilities. - After rowArray will have cost changes for use next iteration - */ - int updatePrimalsInPrimal(CoinIndexedVector * rowArray, - double theta, - double & objectiveChange, - int valuesPass); - /** - Row array has pivot column - This chooses pivot row. - Rhs array is used for distance to next bound (for speed) - For speed, we may need to go to a bucket approach when many - variables go through bounds - If valuesPass non-zero then compute dj for direction - */ - void primalRow(CoinIndexedVector * rowArray, - CoinIndexedVector * rhsArray, - CoinIndexedVector * spareArray, - int valuesPass); - /** - Chooses primal pivot column - updateArray has cost updates (also use pivotRow_ from last iteration) - Would be faster with separate region to scan - and will have this (with square of infeasibility) when steepest - For easy problems we can just choose one of the first columns we look at - */ - void primalColumn(CoinIndexedVector * updateArray, - CoinIndexedVector * spareRow1, - CoinIndexedVector * spareRow2, - CoinIndexedVector * spareColumn1, - CoinIndexedVector * spareColumn2); - - /** Checks if tentative optimal actually means unbounded in primal - Returns -3 if not, 2 if is unbounded */ - int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare, - double changeCost); - /** Refactorizes if necessary - Checks if finished. Updates status. - lastCleaned refers to iteration at which some objective/feasibility - cleaning too place. - - type - 0 initial so set up save arrays etc - - 1 normal -if good update save - - 2 restoring from saved - saveModel is normally NULL but may not be if doing Sprint - */ - void statusOfProblemInPrimal(int & lastCleaned, int type, - ClpSimplexProgress * progress, - bool doFactorization, - int ifValuesPass, - ClpSimplex * saveModel = NULL); - /// Perturbs problem (method depends on perturbation()) - void perturb(int type); - /// Take off effect of perturbation and say whether to try dual - bool unPerturb(); - /// Unflag all variables and return number unflagged - int unflag(); - /** Get next superbasic -1 if none, - Normal type is 1 - If type is 3 then initializes sorted list - if 2 uses list. - */ - int nextSuperBasic(int superBasicType, CoinIndexedVector * columnArray); - - /// Create primal ray - void primalRay(CoinIndexedVector * rowArray); - /// Clears all bits and clears rowArray[1] etc - void clearAll(); - - /// Sort of lexicographic resolve - int lexSolve(); - - //@} -}; -#endif - diff --git a/thirdparty/linux/include/coin1/ClpSolve.hpp b/thirdparty/linux/include/coin1/ClpSolve.hpp deleted file mode 100644 index 280e33dc..00000000 --- a/thirdparty/linux/include/coin1/ClpSolve.hpp +++ /dev/null @@ -1,446 +0,0 @@ -/* $Id: ClpSolve.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). -/* - Authors - - John Forrest - - */ -#ifndef ClpSolve_H -#define ClpSolve_H - -/** - This is a very simple class to guide algorithms. It is used to tidy up - passing parameters to initialSolve and maybe for output from that - -*/ - -class ClpSolve { - -public: - - /** enums for solve function */ - enum SolveType { - useDual = 0, - usePrimal, - usePrimalorSprint, - useBarrier, - useBarrierNoCross, - automatic, - tryDantzigWolfe, - tryBenders, - notImplemented - }; - enum PresolveType { - presolveOn = 0, - presolveOff, - presolveNumber, - presolveNumberCost - }; - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - ClpSolve ( ); - /// Constructor when you really know what you are doing - ClpSolve ( SolveType method, PresolveType presolveType, - int numberPasses, int options[6], - int extraInfo[6], int independentOptions[3]); - /// Generates code for above constructor - void generateCpp(FILE * fp); - /// Copy constructor. - ClpSolve(const ClpSolve &); - /// Assignment operator. This copies the data - ClpSolve & operator=(const ClpSolve & rhs); - /// Destructor - ~ClpSolve ( ); - //@} - - /**@name Functions most useful to user */ - //@{ - /** Special options - bits - 0 4 - use crash (default allslack in dual, idiot in primal) - 8 - all slack basis in primal - 2 16 - switch off interrupt handling - 3 32 - do not try and make plus minus one matrix - 64 - do not use sprint even if problem looks good - */ - /** which translation is: - which: - 0 - startup in Dual (nothing if basis exists).: - 0 - no basis - 1 - crash - 2 - use initiative about idiot! but no crash - 1 - startup in Primal (nothing if basis exists): - 0 - use initiative - 1 - use crash - 2 - use idiot and look at further info - 3 - use sprint and look at further info - 4 - use all slack - 5 - use initiative but no idiot - 6 - use initiative but no sprint - 7 - use initiative but no crash - 8 - do allslack or idiot - 9 - do allslack or sprint - 10 - slp before - 11 - no nothing and primal(0) - 2 - interrupt handling - 0 yes, 1 no (for threadsafe) - 3 - whether to make +- 1matrix - 0 yes, 1 no - 4 - for barrier - 0 - dense cholesky - 1 - Wssmp allowing some long columns - 2 - Wssmp not allowing long columns - 3 - Wssmp using KKT - 4 - Using Florida ordering - 8 - bit set to do scaling - 16 - set to be aggressive with gamma/delta? - 32 - Use KKT - 5 - for presolve - 1 - switch off dual stuff - 6 - extra switches - - */ - void setSpecialOption(int which, int value, int extraInfo = -1); - int getSpecialOption(int which) const; - - /// Solve types - void setSolveType(SolveType method, int extraInfo = -1); - SolveType getSolveType(); - - // Presolve types - void setPresolveType(PresolveType amount, int extraInfo = -1); - PresolveType getPresolveType(); - int getPresolvePasses() const; - /// Extra info for idiot (or sprint) - int getExtraInfo(int which) const; - /** Say to return at once if infeasible, - default is to solve */ - void setInfeasibleReturn(bool trueFalse); - inline bool infeasibleReturn() const { - return independentOptions_[0] != 0; - } - /// Whether we want to do dual part of presolve - inline bool doDual() const { - return (independentOptions_[1] & 1) == 0; - } - inline void setDoDual(bool doDual_) { - if (doDual_) independentOptions_[1] &= ~1; - else independentOptions_[1] |= 1; - } - /// Whether we want to do singleton part of presolve - inline bool doSingleton() const { - return (independentOptions_[1] & 2) == 0; - } - inline void setDoSingleton(bool doSingleton_) { - if (doSingleton_) independentOptions_[1] &= ~2; - else independentOptions_[1] |= 2; - } - /// Whether we want to do doubleton part of presolve - inline bool doDoubleton() const { - return (independentOptions_[1] & 4) == 0; - } - inline void setDoDoubleton(bool doDoubleton_) { - if (doDoubleton_) independentOptions_[1] &= ~4; - else independentOptions_[1] |= 4; - } - /// Whether we want to do tripleton part of presolve - inline bool doTripleton() const { - return (independentOptions_[1] & 8) == 0; - } - inline void setDoTripleton(bool doTripleton_) { - if (doTripleton_) independentOptions_[1] &= ~8; - else independentOptions_[1] |= 8; - } - /// Whether we want to do tighten part of presolve - inline bool doTighten() const { - return (independentOptions_[1] & 16) == 0; - } - inline void setDoTighten(bool doTighten_) { - if (doTighten_) independentOptions_[1] &= ~16; - else independentOptions_[1] |= 16; - } - /// Whether we want to do forcing part of presolve - inline bool doForcing() const { - return (independentOptions_[1] & 32) == 0; - } - inline void setDoForcing(bool doForcing_) { - if (doForcing_) independentOptions_[1] &= ~32; - else independentOptions_[1] |= 32; - } - /// Whether we want to do impliedfree part of presolve - inline bool doImpliedFree() const { - return (independentOptions_[1] & 64) == 0; - } - inline void setDoImpliedFree(bool doImpliedfree) { - if (doImpliedfree) independentOptions_[1] &= ~64; - else independentOptions_[1] |= 64; - } - /// Whether we want to do dupcol part of presolve - inline bool doDupcol() const { - return (independentOptions_[1] & 128) == 0; - } - inline void setDoDupcol(bool doDupcol_) { - if (doDupcol_) independentOptions_[1] &= ~128; - else independentOptions_[1] |= 128; - } - /// Whether we want to do duprow part of presolve - inline bool doDuprow() const { - return (independentOptions_[1] & 256) == 0; - } - inline void setDoDuprow(bool doDuprow_) { - if (doDuprow_) independentOptions_[1] &= ~256; - else independentOptions_[1] |= 256; - } - /// Whether we want to do singleton column part of presolve - inline bool doSingletonColumn() const { - return (independentOptions_[1] & 512) == 0; - } - inline void setDoSingletonColumn(bool doSingleton_) { - if (doSingleton_) independentOptions_[1] &= ~512; - else independentOptions_[1] |= 512; - } - /// Whether we want to kill small substitutions - inline bool doKillSmall() const { - return (independentOptions_[1] & 8192) == 0; - } - inline void setDoKillSmall(bool doKill) { - if (doKill) independentOptions_[1] &= ~8192; - else independentOptions_[1] |= 8192; - } - /// Set whole group - inline int presolveActions() const { - return independentOptions_[1] & 0xffff; - } - inline void setPresolveActions(int action) { - independentOptions_[1] = (independentOptions_[1] & 0xffff0000) | (action & 0xffff); - } - /// Largest column for substitution (normally 3) - inline int substitution() const { - return independentOptions_[2]; - } - inline void setSubstitution(int value) { - independentOptions_[2] = value; - } - inline void setIndependentOption(int type,int value) { - independentOptions_[type] = value; - } - inline int independentOption(int type) const { - return independentOptions_[type]; - } - //@} - -////////////////// data ////////////////// -private: - - /**@name data. - */ - //@{ - /// Solve type - SolveType method_; - /// Presolve type - PresolveType presolveType_; - /// Amount of presolve - int numberPasses_; - /// Options - last is switch for OsiClp - int options_[7]; - /// Extra information - int extraInfo_[7]; - /** Extra algorithm dependent options - 0 - if set return from clpsolve if infeasible - 1 - To be copied over to presolve options - 2 - max substitution level - If Dantzig Wolfe/benders 0 is number blocks, 2 is #passes (notional) - */ - int independentOptions_[3]; - //@} -}; - -/// For saving extra information to see if looping. -class ClpSimplexProgress { - -public: - - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - ClpSimplexProgress ( ); - - /// Constructor from model - ClpSimplexProgress ( ClpSimplex * model ); - - /// Copy constructor. - ClpSimplexProgress(const ClpSimplexProgress &); - - /// Assignment operator. This copies the data - ClpSimplexProgress & operator=(const ClpSimplexProgress & rhs); - /// Destructor - ~ClpSimplexProgress ( ); - /// Resets as much as possible - void reset(); - /// Fill from model - void fillFromModel ( ClpSimplex * model ); - - //@} - - /**@name Check progress */ - //@{ - /** Returns -1 if okay, -n+1 (n number of times bad) if bad but action taken, - >=0 if give up and use as problem status - */ - int looping ( ); - /// Start check at beginning of whileIterating - void startCheck(); - /// Returns cycle length in whileIterating - int cycle(int in, int out, int wayIn, int wayOut); - - /// Returns previous objective (if -1) - current if (0) - double lastObjective(int back = 1) const; - /// Set real primal infeasibility and move back - void setInfeasibility(double value); - /// Returns real primal infeasibility (if -1) - current if (0) - double lastInfeasibility(int back = 1) const; - /// Returns number of primal infeasibilities (if -1) - current if (0) - int numberInfeasibilities(int back = 1) const; - /// Modify objective e.g. if dual infeasible in dual - void modifyObjective(double value); - /// Returns previous iteration number (if -1) - current if (0) - int lastIterationNumber(int back = 1) const; - /// clears all iteration numbers (to switch off panic) - void clearIterationNumbers(); - /// Odd state - inline void newOddState() { - oddState_ = - oddState_ - 1; - } - inline void endOddState() { - oddState_ = abs(oddState_); - } - inline void clearOddState() { - oddState_ = 0; - } - inline int oddState() const { - return oddState_; - } - /// number of bad times - inline int badTimes() const { - return numberBadTimes_; - } - inline void clearBadTimes() { - numberBadTimes_ = 0; - } - /// number of really bad times - inline int reallyBadTimes() const { - return numberReallyBadTimes_; - } - inline void incrementReallyBadTimes() { - numberReallyBadTimes_++; - } - /// number of times flagged - inline int timesFlagged() const { - return numberTimesFlagged_; - } - inline void clearTimesFlagged() { - numberTimesFlagged_ = 0; - } - inline void incrementTimesFlagged() { - numberTimesFlagged_++; - } - - //@} - /**@name Data */ -#define CLP_PROGRESS 5 - //#define CLP_PROGRESS_WEIGHT 10 - //@{ - /// Objective values - double objective_[CLP_PROGRESS]; - /// Sum of infeasibilities for algorithm - double infeasibility_[CLP_PROGRESS]; - /// Sum of real primal infeasibilities for primal - double realInfeasibility_[CLP_PROGRESS]; -#ifdef CLP_PROGRESS_WEIGHT - /// Objective values for weights - double objectiveWeight_[CLP_PROGRESS_WEIGHT]; - /// Sum of infeasibilities for algorithm for weights - double infeasibilityWeight_[CLP_PROGRESS_WEIGHT]; - /// Sum of real primal infeasibilities for primal for weights - double realInfeasibilityWeight_[CLP_PROGRESS_WEIGHT]; - /// Drop for weights - double drop_; - /// Best? for weights - double best_; -#endif - /// Initial weight for weights - double initialWeight_; -#define CLP_CYCLE 12 - /// For cycle checking - //double obj_[CLP_CYCLE]; - int in_[CLP_CYCLE]; - int out_[CLP_CYCLE]; - char way_[CLP_CYCLE]; - /// Pointer back to model so we can get information - ClpSimplex * model_; - /// Number of infeasibilities - int numberInfeasibilities_[CLP_PROGRESS]; - /// Iteration number at which occurred - int iterationNumber_[CLP_PROGRESS]; -#ifdef CLP_PROGRESS_WEIGHT - /// Number of infeasibilities for weights - int numberInfeasibilitiesWeight_[CLP_PROGRESS_WEIGHT]; - /// Iteration number at which occurred for weights - int iterationNumberWeight_[CLP_PROGRESS_WEIGHT]; -#endif - /// Number of times checked (so won't stop too early) - int numberTimes_; - /// Number of times it looked like loop - int numberBadTimes_; - /// Number really bad times - int numberReallyBadTimes_; - /// Number of times no iterations as flagged - int numberTimesFlagged_; - /// If things are in an odd state - int oddState_; - //@} -}; - -#include "ClpConfig.h" -#if CLP_HAS_ABC -#include "AbcCommon.hpp" -/// For saving extra information to see if looping. -class AbcSimplexProgress : public ClpSimplexProgress { - -public: - - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - AbcSimplexProgress ( ); - - /// Constructor from model - AbcSimplexProgress ( ClpSimplex * model ); - - /// Copy constructor. - AbcSimplexProgress(const AbcSimplexProgress &); - - /// Assignment operator. This copies the data - AbcSimplexProgress & operator=(const AbcSimplexProgress & rhs); - /// Destructor - ~AbcSimplexProgress ( ); - - //@} - - /**@name Check progress */ - //@{ - /** Returns -1 if okay, -n+1 (n number of times bad) if bad but action taken, - >=0 if give up and use as problem status - */ - int looping ( ); - - //@} - /**@name Data */ - //@} -}; -#endif -#endif diff --git a/thirdparty/linux/include/coin1/Clp_C_Interface.h b/thirdparty/linux/include/coin1/Clp_C_Interface.h deleted file mode 100644 index b91b2d24..00000000 --- a/thirdparty/linux/include/coin1/Clp_C_Interface.h +++ /dev/null @@ -1,525 +0,0 @@ -/* $Id: Clp_C_Interface.h 2019 2014-01-31 05:18:01Z stefan $ */ -/* - Copyright (C) 2002, 2003 International Business Machines Corporation - and others. All Rights Reserved. - - This code is licensed under the terms of the Eclipse Public License (EPL). -*/ -#ifndef ClpSimplexC_H -#define ClpSimplexC_H - -/* include all defines and ugly stuff */ -#include "Coin_C_defines.h" - -#if defined (CLP_EXTERN_C) -typedef struct { - ClpSolve options; -} Clp_Solve; -#else -typedef void Clp_Solve; -#endif - -/** This is a first "C" interface to Clp. - It has similarities to the OSL V3 interface - and only has most common functions -*/ - -#ifdef __cplusplus -extern "C" { -#endif - - /**@name Version info - * - * A Clp library has a version number of the form .., - * where each of major, minor, and release are nonnegative integers. - * For a checkout of the Clp stable branch, release is 9999. - * For a checkout of the Clp development branch, major, minor, and release are 9999. - */ - /*@{*/ - /** Clp library version number as string. */ - COINLIBAPI const char* COINLINKAGE Clp_Version(void); - /** Major number of Clp library version. */ - COINLIBAPI int COINLINKAGE Clp_VersionMajor(void); - /** Minor number of Clp library version. */ - COINLIBAPI int COINLINKAGE Clp_VersionMinor(void); - /** Release number of Clp library version. */ - COINLIBAPI int COINLINKAGE Clp_VersionRelease(void); - /*@}*/ - - /**@name Constructors and destructor - These do not have an exact analogue in C++. - The user does not need to know structure of Clp_Simplex or Clp_Solve. - - For (almost) all Clp_* functions outside this group there is an exact C++ - analogue created by taking the first parameter out, removing the Clp_ - from name and applying the method to an object of type ClpSimplex. - - Similarly, for all ClpSolve_* functions there is an exact C++ - analogue created by taking the first parameter out, removing the ClpSolve_ - from name and applying the method to an object of type ClpSolve. - */ - /*@{*/ - - /** Default constructor */ - COINLIBAPI Clp_Simplex * COINLINKAGE Clp_newModel(void); - /** Destructor */ - COINLIBAPI void COINLINKAGE Clp_deleteModel(Clp_Simplex * model); - /** Default constructor */ - COINLIBAPI Clp_Solve * COINLINKAGE ClpSolve_new(); - /** Destructor */ - COINLIBAPI void COINLINKAGE ClpSolve_delete(Clp_Solve * solve); - /*@}*/ - - /**@name Load model - loads some stuff and initializes others */ - /*@{*/ - /** Loads a problem (the constraints on the - rows are given by lower and upper bounds). If a pointer is NULL then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - /** Just like the other loadProblem() method except that the matrix is - given in a standard column major ordered format (without gaps). */ - COINLIBAPI void COINLINKAGE Clp_loadProblem (Clp_Simplex * model, const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub); - - /* read quadratic part of the objective (the matrix part) */ - COINLIBAPI void COINLINKAGE - Clp_loadQuadraticObjective(Clp_Simplex * model, - const int numberColumns, - const CoinBigIndex * start, - const int * column, - const double * element); - /** Read an mps file from the given filename */ - COINLIBAPI int COINLINKAGE Clp_readMps(Clp_Simplex * model, const char *filename, - int keepNames, - int ignoreErrors); - /** Copy in integer informations */ - COINLIBAPI void COINLINKAGE Clp_copyInIntegerInformation(Clp_Simplex * model, const char * information); - /** Drop integer informations */ - COINLIBAPI void COINLINKAGE Clp_deleteIntegerInformation(Clp_Simplex * model); - /** Resizes rim part of model */ - COINLIBAPI void COINLINKAGE Clp_resize (Clp_Simplex * model, int newNumberRows, int newNumberColumns); - /** Deletes rows */ - COINLIBAPI void COINLINKAGE Clp_deleteRows(Clp_Simplex * model, int number, const int * which); - /** Add rows */ - COINLIBAPI void COINLINKAGE Clp_addRows(Clp_Simplex * model, int number, const double * rowLower, - const double * rowUpper, - const int * rowStarts, const int * columns, - const double * elements); - - /** Deletes columns */ - COINLIBAPI void COINLINKAGE Clp_deleteColumns(Clp_Simplex * model, int number, const int * which); - /** Add columns */ - COINLIBAPI void COINLINKAGE Clp_addColumns(Clp_Simplex * model, int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const int * columnStarts, const int * rows, - const double * elements); - /** Change row lower bounds */ - COINLIBAPI void COINLINKAGE Clp_chgRowLower(Clp_Simplex * model, const double * rowLower); - /** Change row upper bounds */ - COINLIBAPI void COINLINKAGE Clp_chgRowUpper(Clp_Simplex * model, const double * rowUpper); - /** Change column lower bounds */ - COINLIBAPI void COINLINKAGE Clp_chgColumnLower(Clp_Simplex * model, const double * columnLower); - /** Change column upper bounds */ - COINLIBAPI void COINLINKAGE Clp_chgColumnUpper(Clp_Simplex * model, const double * columnUpper); - /** Change objective coefficients */ - COINLIBAPI void COINLINKAGE Clp_chgObjCoefficients(Clp_Simplex * model, const double * objIn); - /** Drops names - makes lengthnames 0 and names empty */ - COINLIBAPI void COINLINKAGE Clp_dropNames(Clp_Simplex * model); - /** Copies in names */ - COINLIBAPI void COINLINKAGE Clp_copyNames(Clp_Simplex * model, const char * const * rowNames, - const char * const * columnNames); - - /*@}*/ - /**@name gets and sets - you will find some synonyms at the end of this file */ - /*@{*/ - /** Number of rows */ - COINLIBAPI int COINLINKAGE Clp_numberRows(Clp_Simplex * model); - /** Number of columns */ - COINLIBAPI int COINLINKAGE Clp_numberColumns(Clp_Simplex * model); - /** Primal tolerance to use */ - COINLIBAPI double COINLINKAGE Clp_primalTolerance(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setPrimalTolerance(Clp_Simplex * model, double value) ; - /** Dual tolerance to use */ - COINLIBAPI double COINLINKAGE Clp_dualTolerance(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setDualTolerance(Clp_Simplex * model, double value) ; - /** Dual objective limit */ - COINLIBAPI double COINLINKAGE Clp_dualObjectiveLimit(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setDualObjectiveLimit(Clp_Simplex * model, double value); - /** Objective offset */ - COINLIBAPI double COINLINKAGE Clp_objectiveOffset(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setObjectiveOffset(Clp_Simplex * model, double value); - /** Fills in array with problem name */ - COINLIBAPI void COINLINKAGE Clp_problemName(Clp_Simplex * model, int maxNumberCharacters, char * array); - /* Sets problem name. Must have \0 at end. */ - COINLIBAPI int COINLINKAGE - Clp_setProblemName(Clp_Simplex * model, int maxNumberCharacters, char * array); - /** Number of iterations */ - COINLIBAPI int COINLINKAGE Clp_numberIterations(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setNumberIterations(Clp_Simplex * model, int numberIterations); - /** Maximum number of iterations */ - COINLIBAPI int maximumIterations(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setMaximumIterations(Clp_Simplex * model, int value); - /** Maximum time in seconds (from when set called) */ - COINLIBAPI double COINLINKAGE Clp_maximumSeconds(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setMaximumSeconds(Clp_Simplex * model, double value); - /** Returns true if hit maximum iterations (or time) */ - COINLIBAPI int COINLINKAGE Clp_hitMaximumIterations(Clp_Simplex * model); - /** Status of problem: - 0 - optimal - 1 - primal infeasible - 2 - dual infeasible - 3 - stopped on iterations etc - 4 - stopped due to errors - */ - COINLIBAPI int COINLINKAGE Clp_status(Clp_Simplex * model); - /** Set problem status */ - COINLIBAPI void COINLINKAGE Clp_setProblemStatus(Clp_Simplex * model, int problemStatus); - /** Secondary status of problem - may get extended - 0 - none - 1 - primal infeasible because dual limit reached - 2 - scaled problem optimal - unscaled has primal infeasibilities - 3 - scaled problem optimal - unscaled has dual infeasibilities - 4 - scaled problem optimal - unscaled has both dual and primal infeasibilities - */ - COINLIBAPI int COINLINKAGE Clp_secondaryStatus(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setSecondaryStatus(Clp_Simplex * model, int status); - /** Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */ - COINLIBAPI double COINLINKAGE Clp_optimizationDirection(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setOptimizationDirection(Clp_Simplex * model, double value); - /** Primal row solution */ - COINLIBAPI double * COINLINKAGE Clp_primalRowSolution(Clp_Simplex * model); - /** Primal column solution */ - COINLIBAPI double * COINLINKAGE Clp_primalColumnSolution(Clp_Simplex * model); - /** Dual row solution */ - COINLIBAPI double * COINLINKAGE Clp_dualRowSolution(Clp_Simplex * model); - /** Reduced costs */ - COINLIBAPI double * COINLINKAGE Clp_dualColumnSolution(Clp_Simplex * model); - /** Row lower */ - COINLIBAPI double* COINLINKAGE Clp_rowLower(Clp_Simplex * model); - /** Row upper */ - COINLIBAPI double* COINLINKAGE Clp_rowUpper(Clp_Simplex * model); - /** Objective */ - COINLIBAPI double * COINLINKAGE Clp_objective(Clp_Simplex * model); - /** Column Lower */ - COINLIBAPI double * COINLINKAGE Clp_columnLower(Clp_Simplex * model); - /** Column Upper */ - COINLIBAPI double * COINLINKAGE Clp_columnUpper(Clp_Simplex * model); - /** Number of elements in matrix */ - COINLIBAPI int COINLINKAGE Clp_getNumElements(Clp_Simplex * model); - /* Column starts in matrix */ - COINLIBAPI const CoinBigIndex * COINLINKAGE Clp_getVectorStarts(Clp_Simplex * model); - /* Row indices in matrix */ - COINLIBAPI const int * COINLINKAGE Clp_getIndices(Clp_Simplex * model); - /* Column vector lengths in matrix */ - COINLIBAPI const int * COINLINKAGE Clp_getVectorLengths(Clp_Simplex * model); - /* Element values in matrix */ - COINLIBAPI const double * COINLINKAGE Clp_getElements(Clp_Simplex * model); - /** Objective value */ - COINLIBAPI double COINLINKAGE Clp_objectiveValue(Clp_Simplex * model); - /** Integer information */ - COINLIBAPI char * COINLINKAGE Clp_integerInformation(Clp_Simplex * model); - /** Gives Infeasibility ray. - * - * Use Clp_freeRay to free the returned array. - * - * @return infeasibility ray, or NULL returned if none/wrong. - */ - COINLIBAPI double * COINLINKAGE Clp_infeasibilityRay(Clp_Simplex * model); - /** Gives ray in which the problem is unbounded. - * - * Use Clp_freeRay to free the returned array. - * - * @return unbounded ray, or NULL returned if none/wrong. - */ - COINLIBAPI double * COINLINKAGE Clp_unboundedRay(Clp_Simplex * model); - /** Frees a infeasibility or unbounded ray. */ - COINLIBAPI void COINLINKAGE Clp_freeRay(Clp_Simplex * model, double * ray); - /** See if status array exists (partly for OsiClp) */ - COINLIBAPI int COINLINKAGE Clp_statusExists(Clp_Simplex * model); - /** Return address of status array (char[numberRows+numberColumns]) */ - COINLIBAPI unsigned char * COINLINKAGE Clp_statusArray(Clp_Simplex * model); - /** Copy in status vector */ - COINLIBAPI void COINLINKAGE Clp_copyinStatus(Clp_Simplex * model, const unsigned char * statusArray); - /* status values are as in ClpSimplex.hpp i.e. 0 - free, 1 basic, 2 at upper, - 3 at lower, 4 superbasic, (5 fixed) */ - /* Get variable basis info */ - COINLIBAPI int COINLINKAGE Clp_getColumnStatus(Clp_Simplex * model, int sequence); - /* Get row basis info */ - COINLIBAPI int COINLINKAGE Clp_getRowStatus(Clp_Simplex * model, int sequence); - /* Set variable basis info (and value if at bound) */ - COINLIBAPI void COINLINKAGE Clp_setColumnStatus(Clp_Simplex * model, - int sequence, int value); - /* Set row basis info (and value if at bound) */ - COINLIBAPI void COINLINKAGE Clp_setRowStatus(Clp_Simplex * model, - int sequence, int value); - - /** User pointer for whatever reason */ - COINLIBAPI void COINLINKAGE Clp_setUserPointer (Clp_Simplex * model, void * pointer); - COINLIBAPI void * COINLINKAGE Clp_getUserPointer (Clp_Simplex * model); - /*@}*/ - /**@name Message handling. Call backs are handled by ONE function */ - /*@{*/ - /** Pass in Callback function. - Message numbers up to 1000000 are Clp, Coin ones have 1000000 added */ - COINLIBAPI void COINLINKAGE Clp_registerCallBack(Clp_Simplex * model, - clp_callback userCallBack); - /** Unset Callback function */ - COINLIBAPI void COINLINKAGE Clp_clearCallBack(Clp_Simplex * model); - /** Amount of print out: - 0 - none - 1 - just final - 2 - just factorizations - 3 - as 2 plus a bit more - 4 - verbose - above that 8,16,32 etc just for selective debug - */ - COINLIBAPI void COINLINKAGE Clp_setLogLevel(Clp_Simplex * model, int value); - COINLIBAPI int COINLINKAGE Clp_logLevel(Clp_Simplex * model); - /** length of names (0 means no names0 */ - COINLIBAPI int COINLINKAGE Clp_lengthNames(Clp_Simplex * model); - /** Fill in array (at least lengthNames+1 long) with a row name */ - COINLIBAPI void COINLINKAGE Clp_rowName(Clp_Simplex * model, int iRow, char * name); - /** Fill in array (at least lengthNames+1 long) with a column name */ - COINLIBAPI void COINLINKAGE Clp_columnName(Clp_Simplex * model, int iColumn, char * name); - - /*@}*/ - - - /**@name Functions most useful to user */ - /*@{*/ - /** General solve algorithm which can do presolve. - See ClpSolve.hpp for options - */ - COINLIBAPI int COINLINKAGE Clp_initialSolve(Clp_Simplex * model); - /** Pass solve options. (Exception to direct analogue rule) */ - COINLIBAPI int COINLINKAGE Clp_initialSolveWithOptions(Clp_Simplex * model, Clp_Solve *); - /** Dual initial solve */ - COINLIBAPI int COINLINKAGE Clp_initialDualSolve(Clp_Simplex * model); - /** Primal initial solve */ - COINLIBAPI int COINLINKAGE Clp_initialPrimalSolve(Clp_Simplex * model); - /** Barrier initial solve */ - COINLIBAPI int COINLINKAGE Clp_initialBarrierSolve(Clp_Simplex * model); - /** Barrier initial solve, no crossover */ - COINLIBAPI int COINLINKAGE Clp_initialBarrierNoCrossSolve(Clp_Simplex * model); - /** Dual algorithm - see ClpSimplexDual.hpp for method */ - COINLIBAPI int COINLINKAGE Clp_dual(Clp_Simplex * model, int ifValuesPass); - /** Primal algorithm - see ClpSimplexPrimal.hpp for method */ - COINLIBAPI int COINLINKAGE Clp_primal(Clp_Simplex * model, int ifValuesPass); -#ifndef SLIM_CLP - /** Solve the problem with the idiot code */ - COINLIBAPI void COINLINKAGE Clp_idiot(Clp_Simplex * model, int tryhard); -#endif - /** Sets or unsets scaling, 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic(later) */ - COINLIBAPI void COINLINKAGE Clp_scaling(Clp_Simplex * model, int mode); - /** Gets scalingFlag */ - COINLIBAPI int COINLINKAGE Clp_scalingFlag(Clp_Simplex * model); - /** Crash - at present just aimed at dual, returns - -2 if dual preferred and crash basis created - -1 if dual preferred and all slack basis preferred - 0 if basis going in was not all slack - 1 if primal preferred and all slack basis preferred - 2 if primal preferred and crash basis created. - - if gap between bounds <="gap" variables can be flipped - - If "pivot" is - 0 No pivoting (so will just be choice of algorithm) - 1 Simple pivoting e.g. gub - 2 Mini iterations - */ - COINLIBAPI int COINLINKAGE Clp_crash(Clp_Simplex * model, double gap, int pivot); - /*@}*/ - - - /**@name most useful gets and sets */ - /*@{*/ - /** If problem is primal feasible */ - COINLIBAPI int COINLINKAGE Clp_primalFeasible(Clp_Simplex * model); - /** If problem is dual feasible */ - COINLIBAPI int COINLINKAGE Clp_dualFeasible(Clp_Simplex * model); - /** Dual bound */ - COINLIBAPI double COINLINKAGE Clp_dualBound(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setDualBound(Clp_Simplex * model, double value); - /** Infeasibility cost */ - COINLIBAPI double COINLINKAGE Clp_infeasibilityCost(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setInfeasibilityCost(Clp_Simplex * model, double value); - /** Perturbation: - 50 - switch on perturbation - 100 - auto perturb if takes too long (1.0e-6 largest nonzero) - 101 - we are perturbed - 102 - don't try perturbing again - default is 100 - others are for playing - */ - COINLIBAPI int COINLINKAGE Clp_perturbation(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setPerturbation(Clp_Simplex * model, int value); - /** Current (or last) algorithm */ - COINLIBAPI int COINLINKAGE Clp_algorithm(Clp_Simplex * model); - /** Set algorithm */ - COINLIBAPI void COINLINKAGE Clp_setAlgorithm(Clp_Simplex * model, int value); - /** Sum of dual infeasibilities */ - COINLIBAPI double COINLINKAGE Clp_sumDualInfeasibilities(Clp_Simplex * model); - /** Number of dual infeasibilities */ - COINLIBAPI int COINLINKAGE Clp_numberDualInfeasibilities(Clp_Simplex * model); - /** Sum of primal infeasibilities */ - COINLIBAPI double COINLINKAGE Clp_sumPrimalInfeasibilities(Clp_Simplex * model); - /** Number of primal infeasibilities */ - COINLIBAPI int COINLINKAGE Clp_numberPrimalInfeasibilities(Clp_Simplex * model); - /** Save model to file, returns 0 if success. This is designed for - use outside algorithms so does not save iterating arrays etc. - It does not save any messaging information. - Does not save scaling values. - It does not know about all types of virtual functions. - */ - COINLIBAPI int COINLINKAGE Clp_saveModel(Clp_Simplex * model, const char * fileName); - /** Restore model from file, returns 0 if success, - deletes current model */ - COINLIBAPI int COINLINKAGE Clp_restoreModel(Clp_Simplex * model, const char * fileName); - - /** Just check solution (for external use) - sets sum of - infeasibilities etc */ - COINLIBAPI void COINLINKAGE Clp_checkSolution(Clp_Simplex * model); - /*@}*/ - - /******************** End of most useful part **************/ - /**@name gets and sets - some synonyms */ - /*@{*/ - /** Number of rows */ - COINLIBAPI int COINLINKAGE Clp_getNumRows(Clp_Simplex * model); - /** Number of columns */ - COINLIBAPI int COINLINKAGE Clp_getNumCols(Clp_Simplex * model); - /** Number of iterations */ - COINLIBAPI int COINLINKAGE Clp_getIterationCount(Clp_Simplex * model); - /** Are there a numerical difficulties? */ - COINLIBAPI int COINLINKAGE Clp_isAbandoned(Clp_Simplex * model); - /** Is optimality proven? */ - COINLIBAPI int COINLINKAGE Clp_isProvenOptimal(Clp_Simplex * model); - /** Is primal infeasiblity proven? */ - COINLIBAPI int COINLINKAGE Clp_isProvenPrimalInfeasible(Clp_Simplex * model); - /** Is dual infeasiblity proven? */ - COINLIBAPI int COINLINKAGE Clp_isProvenDualInfeasible(Clp_Simplex * model); - /** Is the given primal objective limit reached? */ - COINLIBAPI int COINLINKAGE Clp_isPrimalObjectiveLimitReached(Clp_Simplex * model) ; - /** Is the given dual objective limit reached? */ - COINLIBAPI int COINLINKAGE Clp_isDualObjectiveLimitReached(Clp_Simplex * model) ; - /** Iteration limit reached? */ - COINLIBAPI int COINLINKAGE Clp_isIterationLimitReached(Clp_Simplex * model); - /** Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */ - COINLIBAPI double COINLINKAGE Clp_getObjSense(Clp_Simplex * model); - /** Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore */ - COINLIBAPI void COINLINKAGE Clp_setObjSense(Clp_Simplex * model, double objsen); - /** Primal row solution */ - COINLIBAPI const double * COINLINKAGE Clp_getRowActivity(Clp_Simplex * model); - /** Primal column solution */ - COINLIBAPI const double * COINLINKAGE Clp_getColSolution(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setColSolution(Clp_Simplex * model, const double * input); - /** Dual row solution */ - COINLIBAPI const double * COINLINKAGE Clp_getRowPrice(Clp_Simplex * model); - /** Reduced costs */ - COINLIBAPI const double * COINLINKAGE Clp_getReducedCost(Clp_Simplex * model); - /** Row lower */ - COINLIBAPI const double* COINLINKAGE Clp_getRowLower(Clp_Simplex * model); - /** Row upper */ - COINLIBAPI const double* COINLINKAGE Clp_getRowUpper(Clp_Simplex * model); - /** Objective */ - COINLIBAPI const double * COINLINKAGE Clp_getObjCoefficients(Clp_Simplex * model); - /** Column Lower */ - COINLIBAPI const double * COINLINKAGE Clp_getColLower(Clp_Simplex * model); - /** Column Upper */ - COINLIBAPI const double * COINLINKAGE Clp_getColUpper(Clp_Simplex * model); - /** Objective value */ - COINLIBAPI double COINLINKAGE Clp_getObjValue(Clp_Simplex * model); - /** Print model for debugging purposes */ - COINLIBAPI void COINLINKAGE Clp_printModel(Clp_Simplex * model, const char * prefix); - /* Small element value - elements less than this set to zero, - default is 1.0e-20 */ - COINLIBAPI double COINLINKAGE Clp_getSmallElementValue(Clp_Simplex * model); - COINLIBAPI void COINLINKAGE Clp_setSmallElementValue(Clp_Simplex * model, double value); - /*@}*/ - - - /**@name Get and set ClpSolve options - */ - /*@{*/ - COINLIBAPI void COINLINKAGE ClpSolve_setSpecialOption(Clp_Solve *, int which, int value, int extraInfo); - COINLIBAPI int COINLINKAGE ClpSolve_getSpecialOption(Clp_Solve *, int which); - - /** method: (see ClpSolve::SolveType) - 0 - dual simplex - 1 - primal simplex - 2 - primal or sprint - 3 - barrier - 4 - barrier no crossover - 5 - automatic - 6 - not implemented - -- pass extraInfo == -1 for default behavior */ - COINLIBAPI void COINLINKAGE ClpSolve_setSolveType(Clp_Solve *, int method, int extraInfo); - COINLIBAPI int COINLINKAGE ClpSolve_getSolveType(Clp_Solve *); - - /** amount: (see ClpSolve::PresolveType) - 0 - presolve on - 1 - presolve off - 2 - presolve number - 3 - presolve number cost - -- pass extraInfo == -1 for default behavior */ - COINLIBAPI void COINLINKAGE ClpSolve_setPresolveType(Clp_Solve *, int amount, int extraInfo); - COINLIBAPI int COINLINKAGE ClpSolve_getPresolveType(Clp_Solve *); - - COINLIBAPI int COINLINKAGE ClpSolve_getPresolvePasses(Clp_Solve *); - COINLIBAPI int COINLINKAGE ClpSolve_getExtraInfo(Clp_Solve *, int which); - COINLIBAPI void COINLINKAGE ClpSolve_setInfeasibleReturn(Clp_Solve *, int trueFalse); - COINLIBAPI int COINLINKAGE ClpSolve_infeasibleReturn(Clp_Solve *); - - COINLIBAPI int COINLINKAGE ClpSolve_doDual(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoDual(Clp_Solve *, int doDual); - - COINLIBAPI int COINLINKAGE ClpSolve_doSingleton(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoSingleton(Clp_Solve *, int doSingleton); - - COINLIBAPI int COINLINKAGE ClpSolve_doDoubleton(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoDoubleton(Clp_Solve *, int doDoubleton); - - COINLIBAPI int COINLINKAGE ClpSolve_doTripleton(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoTripleton(Clp_Solve *, int doTripleton); - - COINLIBAPI int COINLINKAGE ClpSolve_doTighten(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoTighten(Clp_Solve *, int doTighten); - - COINLIBAPI int COINLINKAGE ClpSolve_doForcing(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoForcing(Clp_Solve *, int doForcing); - - COINLIBAPI int COINLINKAGE ClpSolve_doImpliedFree(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoImpliedFree(Clp_Solve *, int doImpliedFree); - - COINLIBAPI int COINLINKAGE ClpSolve_doDupcol(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoDupcol(Clp_Solve *, int doDupcol); - - COINLIBAPI int COINLINKAGE ClpSolve_doDuprow(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoDuprow(Clp_Solve *, int doDuprow); - - COINLIBAPI int COINLINKAGE ClpSolve_doSingletonColumn(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setDoSingletonColumn(Clp_Solve *, int doSingleton); - - COINLIBAPI int COINLINKAGE ClpSolve_presolveActions(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setPresolveActions(Clp_Solve *, int action); - - COINLIBAPI int COINLINKAGE ClpSolve_substitution(Clp_Solve *); - COINLIBAPI void COINLINKAGE ClpSolve_setSubstitution(Clp_Solve *, int value); - - /*@}*/ -#ifdef __cplusplus -} -#endif -#endif diff --git a/thirdparty/linux/include/coin1/CoinAlloc.hpp b/thirdparty/linux/include/coin1/CoinAlloc.hpp deleted file mode 100644 index 8f6b08c4..00000000 --- a/thirdparty/linux/include/coin1/CoinAlloc.hpp +++ /dev/null @@ -1,176 +0,0 @@ -/* $Id: CoinAlloc.hpp 1438 2011-06-09 18:14:12Z stefan $ */ -// Copyright (C) 2007, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinAlloc_hpp -#define CoinAlloc_hpp - -#include "CoinUtilsConfig.h" -#include - -#if !defined(COINUTILS_MEMPOOL_MAXPOOLED) -# define COINUTILS_MEMPOOL_MAXPOOLED -1 -#endif - -#if (COINUTILS_MEMPOOL_MAXPOOLED >= 0) - -#ifndef COINUTILS_MEMPOOL_ALIGNMENT -#define COINUTILS_MEMPOOL_ALIGNMENT 16 -#endif - -/* Note: - This memory pool implementation assumes that sizeof(size_t) and - sizeof(void*) are both <= COINUTILS_MEMPOOL_ALIGNMENT. - Choosing an alignment of 4 will cause segfault on 64-bit platforms and may - lead to bad performance on 32-bit platforms. So 8 is a mnimum recommended - alignment. Probably 16 does not waste too much space either and may be even - better for performance. One must play with it. -*/ - -//############################################################################# - -#if (COINUTILS_MEMPOOL_ALIGNMENT == 16) -static const std::size_t CoinAllocPtrShift = 4; -static const std::size_t CoinAllocRoundMask = ~((std::size_t)15); -#elif (COINUTILS_MEMPOOL_ALIGNMENT == 8) -static const std::size_t CoinAllocPtrShift = 3; -static const std::size_t CoinAllocRoundMask = ~((std::size_t)7); -#else -#error "COINUTILS_MEMPOOL_ALIGNMENT must be defined as 8 or 16 (or this code needs to be changed :-)" -#endif - -//############################################################################# - -#ifndef COIN_MEMPOOL_SAVE_BLOCKHEADS -# define COIN_MEMPOOL_SAVE_BLOCKHEADS 0 -#endif - -//############################################################################# - -class CoinMempool -{ -private: -#if (COIN_MEMPOOL_SAVE_BLOCKHEADS == 1) - char** block_heads; - std::size_t block_num; - std::size_t max_block_num; -#endif -#if defined(COINUTILS_PTHREADS) && (COINUTILS_PTHREAD == 1) - pthread_mutex_t mutex_; -#endif - int last_block_size_; - char* first_free_; - const std::size_t entry_size_; - -private: - CoinMempool(const CoinMempool&); - CoinMempool& operator=(const CoinMempool&); - -private: - char* allocate_new_block(); - inline void lock_mutex() { -#if defined(COINUTILS_PTHREADS) && (COINUTILS_PTHREAD == 1) - pthread_mutex_lock(&mutex_); -#endif - } - inline void unlock_mutex() { -#if defined(COINUTILS_PTHREADS) && (COINUTILS_PTHREAD == 1) - pthread_mutex_unlock(&mutex_); -#endif - } - -public: - CoinMempool(std::size_t size = 0); - ~CoinMempool(); - - char* alloc(); - inline void dealloc(char *p) - { - char** pp = (char**)p; - lock_mutex(); - *pp = first_free_; - first_free_ = p; - unlock_mutex(); - } -}; - -//############################################################################# - -/** A memory pool allocator. - - If a request arrives for allocating \c n bytes then it is first - rounded up to the nearest multiple of \c sizeof(void*) (this is \c - n_roundup), then one more \c sizeof(void*) is added to this - number. If the result is no more than maxpooled_ then - the appropriate pool is used to get a chunk of memory, if not, - then malloc is used. In either case, the size of the allocated - chunk is written into the first \c sizeof(void*) bytes and a - pointer pointing afterwards is returned. -*/ - -class CoinAlloc -{ -private: - CoinMempool* pool_; - int maxpooled_; -public: - CoinAlloc(); - ~CoinAlloc() {} - - inline void* alloc(const std::size_t n) - { - if (maxpooled_ <= 0) { - return std::malloc(n); - } - char *p = NULL; - const std::size_t to_alloc = - ((n+COINUTILS_MEMPOOL_ALIGNMENT-1) & CoinAllocRoundMask) + - COINUTILS_MEMPOOL_ALIGNMENT; - CoinMempool* pool = NULL; - if (maxpooled_ > 0 && to_alloc >= (size_t)maxpooled_) { - p = static_cast(std::malloc(to_alloc)); - if (p == NULL) throw std::bad_alloc(); - } else { - pool = pool_ + (to_alloc >> CoinAllocPtrShift); - p = pool->alloc(); - } - *((CoinMempool**)p) = pool; - return static_cast(p+COINUTILS_MEMPOOL_ALIGNMENT); - } - - inline void dealloc(void* p) - { - if (maxpooled_ <= 0) { - std::free(p); - return; - } - if (p) { - char* base = static_cast(p)-COINUTILS_MEMPOOL_ALIGNMENT; - CoinMempool* pool = *((CoinMempool**)base); - if (!pool) { - std::free(base); - } else { - pool->dealloc(base); - } - } - } -}; - -extern CoinAlloc CoinAllocator; - -//############################################################################# - -#if defined(COINUTILS_MEMPOOL_OVERRIDE_NEW) && (COINUTILS_MEMPOOL_OVERRIDE_NEW == 1) -void* operator new(std::size_t size) throw (std::bad_alloc); -void* operator new[](std::size_t) throw (std::bad_alloc); -void operator delete(void*) throw(); -void operator delete[](void*) throw(); -void* operator new(std::size_t, const std::nothrow_t&) throw(); -void* operator new[](std::size_t, const std::nothrow_t&) throw(); -void operator delete(void*, const std::nothrow_t&) throw(); -void operator delete[](void*, const std::nothrow_t&) throw(); -#endif - -#endif /*(COINUTILS_MEMPOOL_MAXPOOLED >= 0)*/ -#endif diff --git a/thirdparty/linux/include/coin1/CoinBuild.hpp b/thirdparty/linux/include/coin1/CoinBuild.hpp deleted file mode 100644 index 770c269e..00000000 --- a/thirdparty/linux/include/coin1/CoinBuild.hpp +++ /dev/null @@ -1,149 +0,0 @@ -/* $Id: CoinBuild.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinBuild_H -#define CoinBuild_H - - -#include "CoinPragma.hpp" -#include "CoinTypes.hpp" -#include "CoinFinite.hpp" - - -/** - In many cases it is natural to build a model by adding one row at a time. In Coin this - is inefficient so this class gives some help. An instance of CoinBuild can be built up - more efficiently and then added to the Clp/OsiModel in one go. - - It may be more efficient to have fewer arrays and re-allocate them but this should - give a large gain over addRow. - - I have now extended it to columns. - -*/ - -class CoinBuild { - -public: - /**@name Useful methods */ - //@{ - /// add a row - void addRow(int numberInRow, const int * columns, - const double * elements, double rowLower=-COIN_DBL_MAX, - double rowUpper=COIN_DBL_MAX); - /// add a column - void addColumn(int numberInColumn, const int * rows, - const double * elements, - double columnLower=0.0, - double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0); - /// add a column - inline void addCol(int numberInColumn, const int * rows, - const double * elements, - double columnLower=0.0, - double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0) - { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue);} - /// Return number of rows or maximum found so far - inline int numberRows() const - { return (type_==0) ? numberItems_ : numberOther_;} - /// Return number of columns or maximum found so far - inline int numberColumns() const - { return (type_==1) ? numberItems_ : numberOther_;} - /// Return number of elements - inline CoinBigIndex numberElements() const - { return numberElements_;} - /** Returns number of elements in a row and information in row - */ - int row(int whichRow, double & rowLower, double & rowUpper, - const int * & indices, const double * & elements) const; - /** Returns number of elements in current row and information in row - Used as rows may be stored in a chain - */ - int currentRow(double & rowLower, double & rowUpper, - const int * & indices, const double * & elements) const; - /// Set current row - void setCurrentRow(int whichRow); - /// Returns current row number - int currentRow() const; - /** Returns number of elements in a column and information in column - */ - int column(int whichColumn, - double & columnLower, double & columnUpper,double & objectiveValue, - const int * & indices, const double * & elements) const; - /** Returns number of elements in current column and information in column - Used as columns may be stored in a chain - */ - int currentColumn( double & columnLower, double & columnUpper,double & objectiveValue, - const int * & indices, const double * & elements) const; - /// Set current column - void setCurrentColumn(int whichColumn); - /// Returns current column number - int currentColumn() const; - /// Returns type - inline int type() const - { return type_;} - //@} - - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinBuild(); - /** Constructor with type 0==for addRow, 1== for addColumn. */ - CoinBuild(int type); - /** Destructor */ - ~CoinBuild(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinBuild(const CoinBuild&); - /// = - CoinBuild& operator=(const CoinBuild&); - //@} -private: - /// Set current - void setMutableCurrent(int which) const; - /// add a item - void addItem(int numberInItem, const int * indices, - const double * elements, - double itemLower, - double itemUpper, double objectiveValue); - /** Returns number of elements in a item and information in item - */ - int item(int whichItem, - double & itemLower, double & itemUpper,double & objectiveValue, - const int * & indices, const double * & elements) const; - /** Returns number of elements in current item and information in item - Used as items may be stored in a chain - */ - int currentItem( double & itemLower, double & itemUpper,double & objectiveValue, - const int * & indices, const double * & elements) const; - /// Set current item - void setCurrentItem(int whichItem); - /// Returns current item number - int currentItem() const; - -private: - /**@name Data members */ - //@{ - /// Current number of items - int numberItems_; - /// Current number of other dimension i.e. Columns if addRow (i.e. max) - int numberOther_; - /// Current number of elements - CoinBigIndex numberElements_; - /// Current item pointer - mutable double * currentItem_; - /// First item pointer - double * firstItem_; - /// Last item pointer - double * lastItem_; - /// Type of build - 0 for row, 1 for column, -1 unset - int type_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinDenseFactorization.hpp b/thirdparty/linux/include/coin1/CoinDenseFactorization.hpp deleted file mode 100644 index 3ba7528b..00000000 --- a/thirdparty/linux/include/coin1/CoinDenseFactorization.hpp +++ /dev/null @@ -1,419 +0,0 @@ -/* $Id: CoinDenseFactorization.hpp 1759 2014-11-18 11:07:23Z forrest $ */ -// Copyright (C) 2008, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - - -/* - Authors - - John Forrest - - */ -#ifndef CoinDenseFactorization_H -#define CoinDenseFactorization_H - -#include -#include -#include -#include "CoinTypes.hpp" -#include "CoinIndexedVector.hpp" -#include "CoinFactorization.hpp" -#if COIN_FACTORIZATION_DENSE_CODE == 2 -#undef COIN_FACTORIZATION_DENSE_CODE -#endif -class CoinPackedMatrix; -/// Abstract base class which also has some scalars so can be used from Dense or Simp -class CoinOtherFactorization { - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - CoinOtherFactorization ( ); - /// Copy constructor - CoinOtherFactorization ( const CoinOtherFactorization &other); - - /// Destructor - virtual ~CoinOtherFactorization ( ); - /// = copy - CoinOtherFactorization & operator = ( const CoinOtherFactorization & other ); - - /// Clone - virtual CoinOtherFactorization * clone() const = 0; - //@} - - /**@name general stuff such as status */ - //@{ - /// Returns status - inline int status ( ) const { - return status_; - } - /// Sets status - inline void setStatus ( int value) - { status_=value; } - /// Returns number of pivots since factorization - inline int pivots ( ) const { - return numberPivots_; - } - /// Sets number of pivots since factorization - inline void setPivots ( int value ) - { numberPivots_=value; } - /// Set number of Rows after factorization - inline void setNumberRows(int value) - { numberRows_ = value; } - /// Number of Rows after factorization - inline int numberRows ( ) const { - return numberRows_; - } - /// Total number of columns in factorization - inline int numberColumns ( ) const { - return numberColumns_; - } - /// Number of good columns in factorization - inline int numberGoodColumns ( ) const { - return numberGoodU_; - } - /// Allows change of pivot accuracy check 1.0 == none >1.0 relaxed - inline void relaxAccuracyCheck(double value) - { relaxCheck_ = value;} - inline double getAccuracyCheck() const - { return relaxCheck_;} - /// Maximum number of pivots between factorizations - inline int maximumPivots ( ) const { - return maximumPivots_ ; - } - /// Set maximum pivots - virtual void maximumPivots ( int value ); - - /// Pivot tolerance - inline double pivotTolerance ( ) const { - return pivotTolerance_ ; - } - void pivotTolerance ( double value ); - /// Zero tolerance - inline double zeroTolerance ( ) const { - return zeroTolerance_ ; - } - void zeroTolerance ( double value ); -#ifndef COIN_FAST_CODE - /// Whether slack value is +1 or -1 - inline double slackValue ( ) const { - return slackValue_ ; - } - void slackValue ( double value ); -#endif - /// Returns array to put basis elements in - virtual CoinFactorizationDouble * elements() const; - /// Returns pivot row - virtual int * pivotRow() const; - /// Returns work area - virtual CoinFactorizationDouble * workArea() const; - /// Returns int work area - virtual int * intWorkArea() const; - /// Number of entries in each row - virtual int * numberInRow() const; - /// Number of entries in each column - virtual int * numberInColumn() const; - /// Returns array to put basis starts in - virtual CoinBigIndex * starts() const; - /// Returns permute back - virtual int * permuteBack() const; - /** Get solve mode e.g. 0 C++ code, 1 Lapack, 2 choose - If 4 set then values pass - if 8 set then has iterated - */ - inline int solveMode() const - { return solveMode_ ;} - /** Set solve mode e.g. 0 C++ code, 1 Lapack, 2 choose - If 4 set then values pass - if 8 set then has iterated - */ - inline void setSolveMode(int value) - { solveMode_ = value;} - /// Returns true if wants tableauColumn in replaceColumn - virtual bool wantsTableauColumn() const; - /** Useful information for factorization - 0 - iteration number - whereFrom is 0 for factorize and 1 for replaceColumn - */ - virtual void setUsefulInformation(const int * info,int whereFrom); - /// Get rid of all memory - virtual void clearArrays() {} - //@} - /**@name virtual general stuff such as permutation */ - //@{ - /// Returns array to put basis indices in - virtual int * indices() const = 0; - /// Returns permute in - virtual int * permute() const = 0; - /// Total number of elements in factorization - virtual int numberElements ( ) const = 0; - //@} - /**@name Do factorization - public */ - //@{ - /// Gets space for a factorization - virtual void getAreas ( int numberRows, - int numberColumns, - CoinBigIndex maximumL, - CoinBigIndex maximumU ) = 0; - - /// PreProcesses column ordered copy of basis - virtual void preProcess ( ) = 0; - /** Does most of factorization returning status - 0 - OK - -99 - needs more memory - -1 - singular - use numberGoodColumns and redo - */ - virtual int factor ( ) = 0; - /// Does post processing on valid factorization - putting variables on correct rows - virtual void postProcess(const int * sequence, int * pivotVariable) = 0; - /// Makes a non-singular basis by replacing variables - virtual void makeNonSingular(int * sequence, int numberColumns) = 0; - //@} - - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - virtual int replaceColumn ( CoinIndexedVector * regionSparse, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying=false, - double acceptablePivot=1.0e-8)=0; - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) = 0; - /** This version has same effect as above with FTUpdate==false - so number returned is always >=0 */ - virtual int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) const = 0; - /// does FTRAN on two columns - virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermute=false) = 0; - /** Updates one column (BTRAN) from regionSparse2 - regionSparse starts as zero and is zero at end - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const = 0; - //@} - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Pivot tolerance - double pivotTolerance_; - /// Zero tolerance - double zeroTolerance_; -#ifndef COIN_FAST_CODE - /// Whether slack value is +1 or -1 - double slackValue_; -#else -#ifndef slackValue_ -#define slackValue_ -1.0 -#endif -#endif - /// Relax check on accuracy in replaceColumn - double relaxCheck_; - /// Number of elements after factorization - CoinBigIndex factorElements_; - /// Number of Rows in factorization - int numberRows_; - /// Number of Columns in factorization - int numberColumns_; - /// Number factorized in U (not row singletons) - int numberGoodU_; - /// Maximum number of pivots before factorization - int maximumPivots_; - /// Number pivots since last factorization - int numberPivots_; - /// Status of factorization - int status_; - /// Maximum rows ever (i.e. use to copy arrays etc) - int maximumRows_; - /// Maximum length of iterating area - CoinBigIndex maximumSpace_; - /// Pivot row - int * pivotRow_; - /** Elements of factorization and updates - length is maxR*maxR+maxSpace - will always be long enough so can have nR*nR ints in maxSpace - */ - CoinFactorizationDouble * elements_; - /// Work area of numberRows_ - CoinFactorizationDouble * workArea_; - /** Solve mode e.g. 0 C++ code, 1 Lapack, 2 choose - If 4 set then values pass - if 8 set then has iterated - */ - int solveMode_; - //@} -}; -/** This deals with Factorization and Updates - This is a simple dense version so other people can write a better one - - I am assuming that 32 bits is enough for number of rows or columns, but CoinBigIndex - may be redefined to get 64 bits. - */ - - - -class CoinDenseFactorization : public CoinOtherFactorization { - friend void CoinDenseFactorizationUnitTest( const std::string & mpsDir ); - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - CoinDenseFactorization ( ); - /// Copy constructor - CoinDenseFactorization ( const CoinDenseFactorization &other); - - /// Destructor - virtual ~CoinDenseFactorization ( ); - /// = copy - CoinDenseFactorization & operator = ( const CoinDenseFactorization & other ); - /// Clone - virtual CoinOtherFactorization * clone() const ; - //@} - - /**@name Do factorization - public */ - //@{ - /// Gets space for a factorization - virtual void getAreas ( int numberRows, - int numberColumns, - CoinBigIndex maximumL, - CoinBigIndex maximumU ); - - /// PreProcesses column ordered copy of basis - virtual void preProcess ( ); - /** Does most of factorization returning status - 0 - OK - -99 - needs more memory - -1 - singular - use numberGoodColumns and redo - */ - virtual int factor ( ); - /// Does post processing on valid factorization - putting variables on correct rows - virtual void postProcess(const int * sequence, int * pivotVariable); - /// Makes a non-singular basis by replacing variables - virtual void makeNonSingular(int * sequence, int numberColumns); - //@} - - /**@name general stuff such as number of elements */ - //@{ - /// Total number of elements in factorization - virtual inline int numberElements ( ) const { - return numberRows_*(numberColumns_+numberPivots_); - } - /// Returns maximum absolute value in factorization - double maximumCoefficient() const; - //@} - - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - virtual int replaceColumn ( CoinIndexedVector * regionSparse, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying=false, - double acceptablePivot=1.0e-8); - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual inline int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool = false) - { return updateColumn(regionSparse,regionSparse2);} - /** This version has same effect as above with FTUpdate==false - so number returned is always >=0 */ - virtual int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) const; - /// does FTRAN on two columns - virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermute=false); - /** Updates one column (BTRAN) from regionSparse2 - regionSparse starts as zero and is zero at end - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - //@} - /// *** Below this user may not want to know about - - /**@name various uses of factorization - which user may not want to know about (left over from my LP code) */ - //@{ - /// Get rid of all memory - inline void clearArrays() - { gutsOfDestructor();} - /// Returns array to put basis indices in - virtual inline int * indices() const - { return reinterpret_cast (elements_+numberRows_*numberRows_);} - /// Returns permute in - virtual inline int * permute() const - { return NULL;/*pivotRow_*/;} - //@} - - /// The real work of desstructor - void gutsOfDestructor(); - /// The real work of constructor - void gutsOfInitialize(); - /// The real work of copy - void gutsOfCopy(const CoinDenseFactorization &other); - - //@} -protected: - /** Returns accuracy status of replaceColumn - returns 0=OK, 1=Probably OK, 2=singular */ - int checkPivot(double saveFromU, double oldPivot) const; -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinDenseVector.hpp b/thirdparty/linux/include/coin1/CoinDenseVector.hpp deleted file mode 100644 index 77ff9af5..00000000 --- a/thirdparty/linux/include/coin1/CoinDenseVector.hpp +++ /dev/null @@ -1,383 +0,0 @@ -/* $Id: CoinDenseVector.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinDenseVector_H -#define CoinDenseVector_H - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#endif - -#include -#include -#include -#include "CoinHelperFunctions.hpp" - -//############################################################################# -/** A function that tests the methods in the CoinDenseVector class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ - template void - CoinDenseVectorUnitTest(T dummy); - -//############################################################################# -/** Dense Vector - -Stores a dense (or expanded) vector of floating point values. -Type of vector elements is controlled by templating. -(Some working quantities such as accumulated sums -are explicitly declared of type double). This allows the -components of the vector integer, single or double precision. - -Here is a sample usage: -@verbatim - const int ne = 4; - double el[ne] = { 10., 40., 1., 50. } - - // Create vector and set its value - CoinDenseVector r(ne,el); - - // access each element - assert( r.getElements()[0]==10. ); - assert( r.getElements()[1]==40. ); - assert( r.getElements()[2]== 1. ); - assert( r.getElements()[3]==50. ); - - // Test for equality - CoinDenseVector r1; - r1=r; - - // Add dense vectors. - // Similarly for subtraction, multiplication, - // and division. - CoinDenseVector add = r + r1; - assert( add[0] == 10.+10. ); - assert( add[1] == 40.+40. ); - assert( add[2] == 1.+ 1. ); - assert( add[3] == 50.+50. ); - - assert( r.sum() == 10.+40.+1.+50. ); -@endverbatim -*/ -template class CoinDenseVector { -private: - /**@name Private member data */ - //@{ - /// Size of element vector - int nElements_; - ///Vector elements - T * elements_; - //@} - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getNumElements() const { return nElements_; } - inline int size() const { return nElements_; } - /// Get element values - inline const T * getElements() const { return elements_; } - /// Get element values - inline T * getElements() { return elements_; } - //@} - - //------------------------------------------------------------------- - // Set indices and elements - //------------------------------------------------------------------- - /**@name Set methods */ - //@{ - /// Reset the vector (i.e. set all elemenets to zero) - void clear(); - /** Assignment operator */ - CoinDenseVector & operator=(const CoinDenseVector &); - /** Member of array operator */ - T & operator[](int index) const; - - /** Set vector size, and elements. - Size is the length of the elements vector. - The element vector is copied into this class instance's - member data. */ - void setVector(int size, const T * elems); - - - /** Elements set to have the same scalar value */ - void setConstant(int size, T elems); - - - /** Set an existing element in the dense vector - The first argument is the "index" into the elements() array - */ - void setElement(int index, T element); - /** Resize the dense vector to be the first newSize elements. - If length is decreased, vector is truncated. If increased - new entries, set to new default element */ - void resize(int newSize, T fill=T()); - - /** Append a dense vector to this dense vector */ - void append(const CoinDenseVector &); - //@} - - /**@name norms, sum and scale */ - //@{ - /// 1-norm of vector - inline T oneNorm() const { - T norm = 0; - for (int i=0; ivalue
      to every entry - void operator+=(T value); - /// subtract value from every entry - void operator-=(T value); - /// multiply every entry by value - void operator*=(T value); - /// divide every entry by value - void operator/=(T value); - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor */ - CoinDenseVector(); - /** Alternate Constructors - set elements to vector of Ts */ - CoinDenseVector(int size, const T * elems); - /** Alternate Constructors - set elements to same scalar value */ - CoinDenseVector(int size, T element=T()); - /** Copy constructors */ - CoinDenseVector(const CoinDenseVector &); - - /** Destructor */ - ~CoinDenseVector (); - //@} - -private: - /**@name Private methods */ - //@{ - /// Copy internal data - void gutsOfSetVector(int size, const T * elems); - /// Set all elements to a given value - void gutsOfSetConstant(int size, T value); - //@} -}; - -//############################################################################# - -/**@name Arithmetic operators on dense vectors. - - NOTE: Because these methods return an object (they can't - return a reference, though they could return a pointer...) they are - very inefficient... - */ -//@{ -/// Return the sum of two dense vectors -template inline -CoinDenseVector operator+(const CoinDenseVector& op1, - const CoinDenseVector& op2){ - assert(op1.size() == op2.size()); - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - const T *elements2 = op2.getElements(); - T *elements3 = op3.getElements(); - for(int i=0; i inline -CoinDenseVector operator-(const CoinDenseVector& op1, - const CoinDenseVector& op2){ - assert(op1.size() == op2.size()); - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - const T *elements2 = op2.getElements(); - T *elements3 = op3.getElements(); - for(int i=0; i inline -CoinDenseVector operator*(const CoinDenseVector& op1, - const CoinDenseVector& op2){ - assert(op1.size() == op2.size()); - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - const T *elements2 = op2.getElements(); - T *elements3 = op3.getElements(); - for(int i=0; i inline -CoinDenseVector operator/(const CoinDenseVector& op1, - const CoinDenseVector& op2){ - assert(op1.size() == op2.size()); - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - const T *elements2 = op2.getElements(); - T *elements3 = op3.getElements(); - for(int i=0; iop1
      and the specified operation is - done entry-wise with the given value. */ -//@{ -/// Return the sum of a dense vector and a constant -template inline -CoinDenseVector operator+(const CoinDenseVector& op1, T value){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator-(const CoinDenseVector& op1, T value){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator*(const CoinDenseVector& op1, T value){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator/(const CoinDenseVector& op1, T value){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator+(T value, const CoinDenseVector& op1){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator-(T value, const CoinDenseVector& op1){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator*(T value, const CoinDenseVector& op1){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i inline -CoinDenseVector operator/(T value, const CoinDenseVector& op1){ - int size = op1.size(); - CoinDenseVector op3(size); - const T *elements1 = op1.getElements(); - T *elements3 = op3.getElements(); - double dvalue = value; - for(int i=0; i - -//------------------------------------------------------------------- -// -// Attempt to provide an std::distance function -// that will work on multiple platforms -// -//------------------------------------------------------------------- - -/** CoinDistance - -This is the Coin implementation of the std::function that is -designed to work on multiple platforms. -*/ -template -void coinDistance(ForwardIterator first, ForwardIterator last, - Distance& n) -{ -#if defined(__SUNPRO_CC) - n = 0; - std::distance(first,last,n); -#else - n = std::distance(first,last); -#endif -} - -template -size_t coinDistance(ForwardIterator first, ForwardIterator last) -{ - size_t retVal; -#if defined(__SUNPRO_CC) - retVal = 0; - std::distance(first,last,retVal); -#else - retVal = std::distance(first,last); -#endif - return retVal; -} - -#endif diff --git a/thirdparty/linux/include/coin1/CoinError.hpp b/thirdparty/linux/include/coin1/CoinError.hpp deleted file mode 100644 index 704cfea2..00000000 --- a/thirdparty/linux/include/coin1/CoinError.hpp +++ /dev/null @@ -1,257 +0,0 @@ -/* $Id: CoinError.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinError_H -#define CoinError_H - -#include -#include -#include -#include - -#include "CoinUtilsConfig.h" -#include "CoinPragma.hpp" - -/** A function to block the popup windows that windows creates when the code - crashes */ -void WindowsErrorPopupBlocker(); - -//------------------------------------------------------------------- -// -// Error class used to throw exceptions -// -// Errors contain: -// -//------------------------------------------------------------------- - -/** Error Class thrown by an exception - -This class is used when exceptions are thrown. -It contains: -
        -
      • message text -
      • name of method throwing exception -
      • name of class throwing exception or hint -
      • name of file if assert -
      • line number -
      - For asserts class=> optional hint -*/ -class CoinError { - friend void CoinErrorUnitTest(); - -private: - CoinError() - : - message_(), - method_(), - class_(), - file_(), - lineNumber_() - { - // nothing to do here - } - -public: - - //------------------------------------------------------------------- - // Get methods - //------------------------------------------------------------------- - /**@name Get error attributes */ - //@{ - /// get message text - inline const std::string & message() const - { return message_; } - /// get name of method instantiating error - inline const std::string & methodName() const - { return method_; } - /// get name of class instantiating error (or hint for assert) - inline const std::string & className() const - { return class_; } - /// get name of file for assert - inline const std::string & fileName() const - { return file_; } - /// get line number of assert (-1 if not assert) - inline int lineNumber() const - { return lineNumber_; } - /// Just print (for asserts) - inline void print(bool doPrint = true) const - { - if (! doPrint) - return; - if (lineNumber_<0) { - std::cout< -#include -#include -#include -#include -#include "CoinTypes.hpp" -#include "CoinIndexedVector.hpp" - -class CoinPackedMatrix; -/** This deals with Factorization and Updates - - This class started with a parallel simplex code I was writing in the - mid 90's. The need for parallelism led to many complications and - I have simplified as much as I could to get back to this. - - I was aiming at problems where I might get speed-up so I was looking at dense - problems or ones with structure. This led to permuting input and output - vectors and to increasing the number of rows each rank-one update. This is - still in as a minor overhead. - - I have also put in handling for hyper-sparsity. I have taken out - all outer loop unrolling, dense matrix handling and most of the - book-keeping for slacks. Also I always use FTRAN approach to updating - even if factorization fairly dense. All these could improve performance. - - I blame some of the coding peculiarities on the history of the code - but mostly it is just because I can't do elegant code (or useful - comments). - - I am assuming that 32 bits is enough for number of rows or columns, but CoinBigIndex - may be redefined to get 64 bits. - */ - - -class CoinFactorization { - friend void CoinFactorizationUnitTest( const std::string & mpsDir ); - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - CoinFactorization ( ); - /// Copy constructor - CoinFactorization ( const CoinFactorization &other); - - /// Destructor - ~CoinFactorization ( ); - /// Delete all stuff (leaves as after CoinFactorization()) - void almostDestructor(); - /// Debug show object (shows one representation) - void show_self ( ) const; - /// Debug - save on file - 0 if no error - int saveFactorization (const char * file ) const; - /** Debug - restore from file - 0 if no error on file. - If factor true then factorizes as if called from ClpFactorization - */ - int restoreFactorization (const char * file , bool factor=false) ; - /// Debug - sort so can compare - void sort ( ) const; - /// = copy - CoinFactorization & operator = ( const CoinFactorization & other ); - //@} - - /**@name Do factorization */ - //@{ - /** When part of LP - given by basic variables. - Actually does factorization. - Arrays passed in have non negative value to say basic. - If status is okay, basic variables have pivot row - this is only needed - If status is singular, then basic variables have pivot row - and ones thrown out have -1 - returns 0 -okay, -1 singular, -2 too many in basis, -99 memory */ - int factorize ( const CoinPackedMatrix & matrix, - int rowIsBasic[], int columnIsBasic[] , - double areaFactor = 0.0 ); - /** When given as triplets. - Actually does factorization. maximumL is guessed maximum size of L part of - final factorization, maximumU of U part. These are multiplied by - areaFactor which can be computed by user or internally. - Arrays are copied in. I could add flag to delete arrays to save a - bit of memory. - If status okay, permutation has pivot rows - this is only needed - If status is singular, then basic variables have pivot row - and ones thrown out have -1 - returns 0 -okay, -1 singular, -99 memory */ - int factorize ( int numberRows, - int numberColumns, - CoinBigIndex numberElements, - CoinBigIndex maximumL, - CoinBigIndex maximumU, - const int indicesRow[], - const int indicesColumn[], const double elements[] , - int permutation[], - double areaFactor = 0.0); - /** Two part version for maximum flexibility - This part creates arrays for user to fill. - estimateNumberElements is safe estimate of number - returns 0 -okay, -99 memory */ - int factorizePart1 ( int numberRows, - int numberColumns, - CoinBigIndex estimateNumberElements, - int * indicesRow[], - int * indicesColumn[], - CoinFactorizationDouble * elements[], - double areaFactor = 0.0); - /** This is part two of factorization - Arrays belong to factorization and were returned by part 1 - If status okay, permutation has pivot rows - this is only needed - If status is singular, then basic variables have pivot row - and ones thrown out have -1 - returns 0 -okay, -1 singular, -99 memory */ - int factorizePart2 (int permutation[],int exactNumberElements); - /// Condition number - product of pivots after factorization - double conditionNumber() const; - - //@} - - /**@name general stuff such as permutation or status */ - //@{ - /// Returns status - inline int status ( ) const { - return status_; - } - /// Sets status - inline void setStatus ( int value) - { status_=value; } - /// Returns number of pivots since factorization - inline int pivots ( ) const { - return numberPivots_; - } - /// Sets number of pivots since factorization - inline void setPivots ( int value ) - { numberPivots_=value; } - /// Returns address of permute region - inline int *permute ( ) const { - return permute_.array(); - } - /// Returns address of pivotColumn region (also used for permuting) - inline int *pivotColumn ( ) const { - return pivotColumn_.array(); - } - /// Returns address of pivot region - inline CoinFactorizationDouble *pivotRegion ( ) const { - return pivotRegion_.array(); - } - /// Returns address of permuteBack region - inline int *permuteBack ( ) const { - return permuteBack_.array(); - } - /// Returns address of lastRow region - inline int *lastRow ( ) const { - return lastRow_.array(); - } - /** Returns address of pivotColumnBack region (also used for permuting) - Now uses firstCount to save memory allocation */ - inline int *pivotColumnBack ( ) const { - //return firstCount_.array(); - return pivotColumnBack_.array(); - } - /// Start of each row in L - inline CoinBigIndex * startRowL() const - { return startRowL_.array();} - - /// Start of each column in L - inline CoinBigIndex * startColumnL() const - { return startColumnL_.array();} - - /// Index of column in row for L - inline int * indexColumnL() const - { return indexColumnL_.array();} - - /// Row indices of L - inline int * indexRowL() const - { return indexRowL_.array();} - - /// Elements in L (row copy) - inline CoinFactorizationDouble * elementByRowL() const - { return elementByRowL_.array();} - - /// Number of Rows after iterating - inline int numberRowsExtra ( ) const { - return numberRowsExtra_; - } - /// Set number of Rows after factorization - inline void setNumberRows(int value) - { numberRows_ = value; } - /// Number of Rows after factorization - inline int numberRows ( ) const { - return numberRows_; - } - /// Number in L - inline CoinBigIndex numberL() const - { return numberL_;} - - /// Base of L - inline CoinBigIndex baseL() const - { return baseL_;} - /// Maximum of Rows after iterating - inline int maximumRowsExtra ( ) const { - return maximumRowsExtra_; - } - /// Total number of columns in factorization - inline int numberColumns ( ) const { - return numberColumns_; - } - /// Total number of elements in factorization - inline int numberElements ( ) const { - return totalElements_; - } - /// Length of FT vector - inline int numberForrestTomlin ( ) const { - return numberInColumn_.array()[numberColumnsExtra_]; - } - /// Number of good columns in factorization - inline int numberGoodColumns ( ) const { - return numberGoodU_; - } - /// Whether larger areas needed - inline double areaFactor ( ) const { - return areaFactor_; - } - inline void areaFactor ( double value ) { - areaFactor_=value; - } - /// Returns areaFactor but adjusted for dense - double adjustedAreaFactor() const; - /// Allows change of pivot accuracy check 1.0 == none >1.0 relaxed - inline void relaxAccuracyCheck(double value) - { relaxCheck_ = value;} - inline double getAccuracyCheck() const - { return relaxCheck_;} - /// Level of detail of messages - inline int messageLevel ( ) const { - return messageLevel_ ; - } - void messageLevel ( int value ); - /// Maximum number of pivots between factorizations - inline int maximumPivots ( ) const { - return maximumPivots_ ; - } - void maximumPivots ( int value ); - - /// Gets dense threshold - inline int denseThreshold() const - { return denseThreshold_;} - /// Sets dense threshold - inline void setDenseThreshold(int value) - { denseThreshold_ = value;} - /// Pivot tolerance - inline double pivotTolerance ( ) const { - return pivotTolerance_ ; - } - void pivotTolerance ( double value ); - /// Zero tolerance - inline double zeroTolerance ( ) const { - return zeroTolerance_ ; - } - void zeroTolerance ( double value ); -#ifndef COIN_FAST_CODE - /// Whether slack value is +1 or -1 - inline double slackValue ( ) const { - return slackValue_ ; - } - void slackValue ( double value ); -#endif - /// Returns maximum absolute value in factorization - double maximumCoefficient() const; - /// true if Forrest Tomlin update, false if PFI - inline bool forrestTomlin() const - { return doForrestTomlin_;} - inline void setForrestTomlin(bool value) - { doForrestTomlin_=value;} - /// True if FT update and space - inline bool spaceForForrestTomlin() const - { - CoinBigIndex start = startColumnU_.array()[maximumColumnsExtra_]; - CoinBigIndex space = lengthAreaU_ - ( start + numberRowsExtra_ ); - return (space>=0)&&doForrestTomlin_; - } - //@} - - /**@name some simple stuff */ - //@{ - - /// Returns number of dense rows - inline int numberDense() const - { return numberDense_;} - - /// Returns number in U area - inline CoinBigIndex numberElementsU ( ) const { - return lengthU_; - } - /// Setss number in U area - inline void setNumberElementsU(CoinBigIndex value) - { lengthU_ = value; } - /// Returns length of U area - inline CoinBigIndex lengthAreaU ( ) const { - return lengthAreaU_; - } - /// Returns number in L area - inline CoinBigIndex numberElementsL ( ) const { - return lengthL_; - } - /// Returns length of L area - inline CoinBigIndex lengthAreaL ( ) const { - return lengthAreaL_; - } - /// Returns number in R area - inline CoinBigIndex numberElementsR ( ) const { - return lengthR_; - } - /// Number of compressions done - inline CoinBigIndex numberCompressions() const - { return numberCompressions_;} - /// Number of entries in each row - inline int * numberInRow() const - { return numberInRow_.array();} - /// Number of entries in each column - inline int * numberInColumn() const - { return numberInColumn_.array();} - /// Elements of U - inline CoinFactorizationDouble * elementU() const - { return elementU_.array();} - /// Row indices of U - inline int * indexRowU() const - { return indexRowU_.array();} - /// Start of each column in U - inline CoinBigIndex * startColumnU() const - { return startColumnU_.array();} - /// Maximum number of Columns after iterating - inline int maximumColumnsExtra() - { return maximumColumnsExtra_;} - /** L to U bias - 0 - U bias, 1 - some U bias, 2 some L bias, 3 L bias - */ - inline int biasLU() const - { return biasLU_;} - inline void setBiasLU(int value) - { biasLU_=value;} - /** Array persistence flag - If 0 then as now (delete/new) - 1 then only do arrays if bigger needed - 2 as 1 but give a bit extra if bigger needed - */ - inline int persistenceFlag() const - { return persistenceFlag_;} - void setPersistenceFlag(int value); - //@} - - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - int replaceColumn ( CoinIndexedVector * regionSparse, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying=false, - double acceptablePivot=1.0e-8); - /** Combines BtranU and delete elements - If deleted is NULL then delete elements - otherwise store where elements are - */ - void replaceColumnU ( CoinIndexedVector * regionSparse, - CoinBigIndex * deleted, - int internalPivotRow); -#ifdef ABC_USE_COIN_FACTORIZATION - /** returns empty fake vector carved out of existing - later - maybe use associated arrays */ - CoinIndexedVector * fakeVector(CoinIndexedVector * vector, - int already=0) const; - void deleteFakeVector(CoinIndexedVector * vector, - CoinIndexedVector * fakeVector) const; - /** Checks if can replace one Column to basis, - returns update alpha - Fills in region for use later - partial update already in U */ - double checkReplacePart1 ( CoinIndexedVector * regionSparse, - int pivotRow); - /** Checks if can replace one Column to basis, - returns update alpha - Fills in region for use later - partial update in vector */ - double checkReplacePart1 ( CoinIndexedVector * regionSparse, - CoinIndexedVector * partialUpdate, - int pivotRow); - /** Checks if can replace one Column in basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room, 5 max pivots */ - int checkReplacePart2 ( int pivotRow, - double btranAlpha, - double ftranAlpha, - double ftAlpha, - double acceptablePivot = 1.0e-8); - /** Replaces one Column to basis, - partial update already in U */ - void replaceColumnPart3 ( CoinIndexedVector * regionSparse, - int pivotRow, - double alpha ); - /** Replaces one Column to basis, - partial update in vector */ - void replaceColumnPart3 ( CoinIndexedVector * regionSparse, - CoinIndexedVector * partialUpdate, - int pivotRow, - double alpha ); - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - long regions - */ - int updateColumnFT ( CoinIndexedVector & regionSparse); - int updateColumnFTPart1 ( CoinIndexedVector & regionSparse) ; - void updateColumnFTPart2 ( CoinIndexedVector & regionSparse) ; - /** Updates one column (FTRAN) - long region - Tries to do FT update - puts partial update in vector */ - void updateColumnFT ( CoinIndexedVector & regionSparseFT, - CoinIndexedVector & partialUpdate, - int which); - /** Updates one column (FTRAN) long region */ - int updateColumn ( CoinIndexedVector & regionSparse) const; - /** Updates one column (FTRAN) from regionFT - Tries to do FT update - number returned is negative if no room. - Also updates regionOther - long region*/ - int updateTwoColumnsFT ( CoinIndexedVector & regionSparseFT, - CoinIndexedVector & regionSparseOther); - /** Updates one column (BTRAN) - long region*/ - int updateColumnTranspose ( CoinIndexedVector & regionSparse) const; - /** Updates one column (FTRAN) - long region */ - void updateColumnCpu ( CoinIndexedVector & regionSparse,int whichCpu) const; - /** Updates one column (BTRAN) - long region */ - void updateColumnTransposeCpu ( CoinIndexedVector & regionSparse,int whichCpu) const; - /** Updates one full column (FTRAN) - long region */ - void updateFullColumn ( CoinIndexedVector & regionSparse) const; - /** Updates one full column (BTRAN) - long region */ - void updateFullColumnTranspose ( CoinIndexedVector & regionSparse) const; - /** Updates one column for dual steepest edge weights (FTRAN) - long region */ - void updateWeights ( CoinIndexedVector & regionSparse) const; - /// Returns true if wants tableauColumn in replaceColumn - inline bool wantsTableauColumn() const - {return false;} - /// Pivot tolerance - inline double minimumPivotTolerance ( ) const { - return pivotTolerance_ ; - } - inline void minimumPivotTolerance ( double value ) - { pivotTolerance(value);} - /// Says parallel - inline void setParallelMode(int value) - { parallelMode_=value;} - /// Sets solve mode - inline void setSolveMode(int value) - { parallelMode_ &= 3;parallelMode_ |= (value<<2);} - /// Sets solve mode - inline int solveMode() const - { return parallelMode_ >> 2;} - /// Update partial Ftran by R update - void updatePartialUpdate(CoinIndexedVector & partialUpdate); - /// Makes a non-singular basis by replacing variables - void makeNonSingular(int * COIN_RESTRICT sequence); -#endif - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - */ - int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2); - /** This version has same effect as above with FTUpdate==false - so number returned is always >=0 */ - int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) const; - /** Updates one column (FTRAN) from region2 - Tries to do FT update - number returned is negative if no room. - Also updates region3 - region1 starts as zero and is zero at end */ - int updateTwoColumnsFT ( CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermuteRegion3=false) ; - /** Updates one column (BTRAN) from regionSparse2 - regionSparse starts as zero and is zero at end - Note - if regionSparse2 packed on input - will be packed on output - */ - int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - /** makes a row copy of L for speed and to allow very sparse problems */ - void goSparse(); - /** get sparse threshold */ - inline int sparseThreshold ( ) const - { return sparseThreshold_;} - /** set sparse threshold */ - void sparseThreshold ( int value ); - //@} - /// *** Below this user may not want to know about - - /**@name various uses of factorization (return code number elements) - which user may not want to know about (left over from my LP code) */ - //@{ - /// Get rid of all memory - inline void clearArrays() - { gutsOfDestructor();} - //@} - - /**@name various updates - none of which have been written! */ - //@{ - - /** Adds given elements to Basis and updates factorization, - can increase size of basis. Returns rank */ - int add ( CoinBigIndex numberElements, - int indicesRow[], - int indicesColumn[], double elements[] ); - - /** Adds one Column to basis, - can increase size of basis. Returns rank */ - int addColumn ( CoinBigIndex numberElements, - int indicesRow[], double elements[] ); - - /** Adds one Row to basis, - can increase size of basis. Returns rank */ - int addRow ( CoinBigIndex numberElements, - int indicesColumn[], double elements[] ); - - /// Deletes one Column from basis, returns rank - int deleteColumn ( int Row ); - /// Deletes one Row from basis, returns rank - int deleteRow ( int Row ); - - /** Replaces one Row in basis, - At present assumes just a singleton on row is in basis - returns 0=OK, 1=Probably OK, 2=singular, 3 no space */ - int replaceRow ( int whichRow, int numberElements, - const int indicesColumn[], const double elements[] ); - /// Takes out all entries for given rows - void emptyRows(int numberToEmpty, const int which[]); - //@} - /**@name used by ClpFactorization */ - /// See if worth going sparse - void checkSparse(); - /// For statistics -#if 0 //def CLP_FACTORIZATION_INSTRUMENT - inline bool collectStatistics() const - { return collectStatistics_;} - /// For statistics - inline void setCollectStatistics(bool onOff) const - { collectStatistics_ = onOff;} -#else - inline bool collectStatistics() const - { return true;} - /// For statistics - inline void setCollectStatistics(bool onOff) const - { } -#endif - /// The real work of constructors etc 0 just scalars, 1 bit normal - void gutsOfDestructor(int type=1); - /// 1 bit - tolerances etc, 2 more, 4 dummy arrays - void gutsOfInitialize(int type); - void gutsOfCopy(const CoinFactorization &other); - - /// Reset all sparsity etc statistics - void resetStatistics(); - - - //@} - - /**@name used by factorization */ - /// Gets space for a factorization, called by constructors - void getAreas ( int numberRows, - int numberColumns, - CoinBigIndex maximumL, - CoinBigIndex maximumU ); - - /** PreProcesses raw triplet data. - state is 0 - triplets, 1 - some counts etc , 2 - .. */ - void preProcess ( int state, - int possibleDuplicates = -1 ); - /// Does most of factorization - int factor ( ); -protected: - /** Does sparse phase of factorization - return code is <0 error, 0= finished */ - int factorSparse ( ); - /** Does sparse phase of factorization (for smaller problems) - return code is <0 error, 0= finished */ - int factorSparseSmall ( ); - /** Does sparse phase of factorization (for larger problems) - return code is <0 error, 0= finished */ - int factorSparseLarge ( ); - /** Does dense phase of factorization - return code is <0 error, 0= finished */ - int factorDense ( ); - - /// Pivots when just one other row so faster? - bool pivotOneOtherRow ( int pivotRow, - int pivotColumn ); - /// Does one pivot on Row Singleton in factorization - bool pivotRowSingleton ( int pivotRow, - int pivotColumn ); - /// Does one pivot on Column Singleton in factorization - bool pivotColumnSingleton ( int pivotRow, - int pivotColumn ); - - /** Gets space for one Column with given length, - may have to do compression (returns True if successful), - also moves existing vector, - extraNeeded is over and above present */ - bool getColumnSpace ( int iColumn, - int extraNeeded ); - - /** Reorders U so contiguous and in order (if there is space) - Returns true if it could */ - bool reorderU(); - /** getColumnSpaceIterateR. Gets space for one extra R element in Column - may have to do compression (returns true) - also moves existing vector */ - bool getColumnSpaceIterateR ( int iColumn, double value, - int iRow); - /** getColumnSpaceIterate. Gets space for one extra U element in Column - may have to do compression (returns true) - also moves existing vector. - Returns -1 if no memory or where element was put - Used by replaceRow (turns off R version) */ - CoinBigIndex getColumnSpaceIterate ( int iColumn, double value, - int iRow); - /** Gets space for one Row with given length, - may have to do compression (returns True if successful), - also moves existing vector */ - bool getRowSpace ( int iRow, int extraNeeded ); - - /** Gets space for one Row with given length while iterating, - may have to do compression (returns True if successful), - also moves existing vector */ - bool getRowSpaceIterate ( int iRow, - int extraNeeded ); - /// Checks that row and column copies look OK - void checkConsistency ( ); - /// Adds a link in chain of equal counts - inline void addLink ( int index, int count ) { - int *nextCount = nextCount_.array(); - int *firstCount = firstCount_.array(); - int *lastCount = lastCount_.array(); - int next = firstCount[count]; - lastCount[index] = -2 - count; - if ( next < 0 ) { - //first with that count - firstCount[count] = index; - nextCount[index] = -1; - } else { - firstCount[count] = index; - nextCount[index] = next; - lastCount[next] = index; - }} - /// Deletes a link in chain of equal counts - inline void deleteLink ( int index ) { - int *nextCount = nextCount_.array(); - int *firstCount = firstCount_.array(); - int *lastCount = lastCount_.array(); - int next = nextCount[index]; - int last = lastCount[index]; - if ( last >= 0 ) { - nextCount[last] = next; - } else { - int count = -last - 2; - - firstCount[count] = next; - } - if ( next >= 0 ) { - lastCount[next] = last; - } - nextCount[index] = -2; - lastCount[index] = -2; - return; - } - /// Separate out links with same row/column count - void separateLinks(int count,bool rowsFirst); - /// Cleans up at end of factorization - void cleanup ( ); - - /// Updates part of column (FTRANL) - void updateColumnL ( CoinIndexedVector * region, int * indexIn ) const; - /// Updates part of column (FTRANL) when densish - void updateColumnLDensish ( CoinIndexedVector * region, int * indexIn ) const; - /// Updates part of column (FTRANL) when sparse - void updateColumnLSparse ( CoinIndexedVector * region, int * indexIn ) const; - /// Updates part of column (FTRANL) when sparsish - void updateColumnLSparsish ( CoinIndexedVector * region, int * indexIn ) const; - - /// Updates part of column (FTRANR) without FT update - void updateColumnR ( CoinIndexedVector * region ) const; - /** Updates part of column (FTRANR) with FT update. - Also stores update after L and R */ - void updateColumnRFT ( CoinIndexedVector * region, int * indexIn ); - - /// Updates part of column (FTRANU) - void updateColumnU ( CoinIndexedVector * region, int * indexIn) const; - - /// Updates part of column (FTRANU) when sparse - void updateColumnUSparse ( CoinIndexedVector * regionSparse, - int * indexIn) const; - /// Updates part of column (FTRANU) when sparsish - void updateColumnUSparsish ( CoinIndexedVector * regionSparse, - int * indexIn) const; - /// Updates part of column (FTRANU) - int updateColumnUDensish ( double * COIN_RESTRICT region, - int * COIN_RESTRICT regionIndex) const; - /// Updates part of 2 columns (FTRANU) real work - void updateTwoColumnsUDensish ( - int & numberNonZero1, - double * COIN_RESTRICT region1, - int * COIN_RESTRICT index1, - int & numberNonZero2, - double * COIN_RESTRICT region2, - int * COIN_RESTRICT index2) const; - /// Updates part of column PFI (FTRAN) (after rest) - void updateColumnPFI ( CoinIndexedVector * regionSparse) const; - /// Permutes back at end of updateColumn - void permuteBack ( CoinIndexedVector * regionSparse, - CoinIndexedVector * outVector) const; - - /// Updates part of column transpose PFI (BTRAN) (before rest) - void updateColumnTransposePFI ( CoinIndexedVector * region) const; - /** Updates part of column transpose (BTRANU), - assumes index is sorted i.e. region is correct */ - void updateColumnTransposeU ( CoinIndexedVector * region, - int smallestIndex) const; - /** Updates part of column transpose (BTRANU) when sparsish, - assumes index is sorted i.e. region is correct */ - void updateColumnTransposeUSparsish ( CoinIndexedVector * region, - int smallestIndex) const; - /** Updates part of column transpose (BTRANU) when densish, - assumes index is sorted i.e. region is correct */ - void updateColumnTransposeUDensish ( CoinIndexedVector * region, - int smallestIndex) const; - /** Updates part of column transpose (BTRANU) when sparse, - assumes index is sorted i.e. region is correct */ - void updateColumnTransposeUSparse ( CoinIndexedVector * region) const; - /** Updates part of column transpose (BTRANU) by column - assumes index is sorted i.e. region is correct */ - void updateColumnTransposeUByColumn ( CoinIndexedVector * region, - int smallestIndex) const; - - /// Updates part of column transpose (BTRANR) - void updateColumnTransposeR ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANR) when dense - void updateColumnTransposeRDensish ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANR) when sparse - void updateColumnTransposeRSparse ( CoinIndexedVector * region ) const; - - /// Updates part of column transpose (BTRANL) - void updateColumnTransposeL ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANL) when densish by column - void updateColumnTransposeLDensish ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANL) when densish by row - void updateColumnTransposeLByRow ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANL) when sparsish by row - void updateColumnTransposeLSparsish ( CoinIndexedVector * region ) const; - /// Updates part of column transpose (BTRANL) when sparse (by Row) - void updateColumnTransposeLSparse ( CoinIndexedVector * region ) const; -public: - /** Replaces one Column to basis for PFI - returns 0=OK, 1=Probably OK, 2=singular, 3=no room. - In this case region is not empty - it is incoming variable (updated) - */ - int replaceColumnPFI ( CoinIndexedVector * regionSparse, - int pivotRow, double alpha); -protected: - /** Returns accuracy status of replaceColumn - returns 0=OK, 1=Probably OK, 2=singular */ - int checkPivot(double saveFromU, double oldPivot) const; - /********************************* START LARGE TEMPLATE ********/ -#ifdef INT_IS_8 -#define COINFACTORIZATION_BITS_PER_INT 64 -#define COINFACTORIZATION_SHIFT_PER_INT 6 -#define COINFACTORIZATION_MASK_PER_INT 0x3f -#else -#define COINFACTORIZATION_BITS_PER_INT 32 -#define COINFACTORIZATION_SHIFT_PER_INT 5 -#define COINFACTORIZATION_MASK_PER_INT 0x1f -#endif - template inline bool - pivot ( int pivotRow, - int pivotColumn, - CoinBigIndex pivotRowPosition, - CoinBigIndex pivotColumnPosition, - CoinFactorizationDouble work[], - unsigned int workArea2[], - int increment2, - T markRow[] , - int largeInteger) -{ - int *indexColumnU = indexColumnU_.array(); - CoinBigIndex *startColumnU = startColumnU_.array(); - int *numberInColumn = numberInColumn_.array(); - CoinFactorizationDouble *elementU = elementU_.array(); - int *indexRowU = indexRowU_.array(); - CoinBigIndex *startRowU = startRowU_.array(); - int *numberInRow = numberInRow_.array(); - CoinFactorizationDouble *elementL = elementL_.array(); - int *indexRowL = indexRowL_.array(); - int *saveColumn = saveColumn_.array(); - int *nextRow = nextRow_.array(); - int *lastRow = lastRow_.array() ; - - //store pivot columns (so can easily compress) - int numberInPivotRow = numberInRow[pivotRow] - 1; - CoinBigIndex startColumn = startColumnU[pivotColumn]; - int numberInPivotColumn = numberInColumn[pivotColumn] - 1; - CoinBigIndex endColumn = startColumn + numberInPivotColumn + 1; - int put = 0; - CoinBigIndex startRow = startRowU[pivotRow]; - CoinBigIndex endRow = startRow + numberInPivotRow + 1; - - if ( pivotColumnPosition < 0 ) { - for ( pivotColumnPosition = startRow; pivotColumnPosition < endRow; pivotColumnPosition++ ) { - int iColumn = indexColumnU[pivotColumnPosition]; - if ( iColumn != pivotColumn ) { - saveColumn[put++] = iColumn; - } else { - break; - } - } - } else { - for (CoinBigIndex i = startRow ; i < pivotColumnPosition ; i++ ) { - saveColumn[put++] = indexColumnU[i]; - } - } - assert (pivotColumnPosition lengthAreaL_ ) { - //need more memory - if ((messageLevel_&4)!=0) - printf("more memory needed in middle of invert\n"); - return false; - } - //l+=currentAreaL_->elementByColumn-elementL; - CoinBigIndex lSave = l; - - CoinBigIndex * startColumnL = startColumnL_.array(); - startColumnL[numberGoodL_] = l; //for luck and first time - numberGoodL_++; - startColumnL[numberGoodL_] = l + numberInPivotColumn; - lengthL_ += numberInPivotColumn; - if ( pivotRowPosition < 0 ) { - for ( pivotRowPosition = startColumn; pivotRowPosition < endColumn; pivotRowPosition++ ) { - int iRow = indexRowU[pivotRowPosition]; - if ( iRow != pivotRow ) { - indexRowL[l] = iRow; - elementL[l] = elementU[pivotRowPosition]; - markRow[iRow] = static_cast(l - lSave); - l++; - //take out of row list - CoinBigIndex start = startRowU[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumnU[where] != pivotColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumnU[where] = indexColumnU[end - 1]; - numberInRow[iRow]--; - } else { - break; - } - } - } else { - CoinBigIndex i; - - for ( i = startColumn; i < pivotRowPosition; i++ ) { - int iRow = indexRowU[i]; - - markRow[iRow] = static_cast(l - lSave); - indexRowL[l] = iRow; - elementL[l] = elementU[i]; - l++; - //take out of row list - CoinBigIndex start = startRowU[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumnU[where] != pivotColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumnU[where] = indexColumnU[end - 1]; - numberInRow[iRow]--; - assert (numberInRow[iRow]>=0); - } - } - assert (pivotRowPosition(l - lSave); - indexRowL[l] = iRow; - elementL[l] = elementU[pivotRowPosition]; - l++; - //take out of row list - CoinBigIndex start = startRowU[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumnU[where] != pivotColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumnU[where] = indexColumnU[end - 1]; - numberInRow[iRow]--; - assert (numberInRow[iRow]>=0); - } - markRow[pivotRow] = static_cast(largeInteger); - //compress pivot column (move pivot to front including saved) - numberInColumn[pivotColumn] = 0; - //use end of L for temporary space - int *indexL = &indexRowL[lSave]; - CoinFactorizationDouble *multipliersL = &elementL[lSave]; - - //adjust - int j; - - for ( j = 0; j < numberInPivotColumn; j++ ) { - multipliersL[j] *= pivotMultiplier; - } - //zero out fill - CoinBigIndex iErase; - for ( iErase = 0; iErase < increment2 * numberInPivotRow; - iErase++ ) { - workArea2[iErase] = 0; - } - CoinBigIndex added = numberInPivotRow * numberInPivotColumn; - unsigned int *temp2 = workArea2; - int * nextColumn = nextColumn_.array(); - - //pack down and move to work - int jColumn; - for ( jColumn = 0; jColumn < numberInPivotRow; jColumn++ ) { - int iColumn = saveColumn[jColumn]; - CoinBigIndex startColumn = startColumnU[iColumn]; - CoinBigIndex endColumn = startColumn + numberInColumn[iColumn]; - int iRow = indexRowU[startColumn]; - CoinFactorizationDouble value = elementU[startColumn]; - double largest; - CoinBigIndex put = startColumn; - CoinBigIndex positionLargest = -1; - CoinFactorizationDouble thisPivotValue = 0.0; - - //compress column and find largest not updated - bool checkLargest; - int mark = markRow[iRow]; - - if ( mark == largeInteger+1 ) { - largest = fabs ( value ); - positionLargest = put; - put++; - checkLargest = false; - } else { - //need to find largest - largest = 0.0; - checkLargest = true; - if ( mark != largeInteger ) { - //will be updated - work[mark] = value; - int word = mark >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = mark & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - added--; - } else { - thisPivotValue = value; - } - } - CoinBigIndex i; - for ( i = startColumn + 1; i < endColumn; i++ ) { - iRow = indexRowU[i]; - value = elementU[i]; - int mark = markRow[iRow]; - - if ( mark == largeInteger+1 ) { - //keep - indexRowU[put] = iRow; - elementU[put] = value; - if ( checkLargest ) { - double absValue = fabs ( value ); - - if ( absValue > largest ) { - largest = absValue; - positionLargest = put; - } - } - put++; - } else if ( mark != largeInteger ) { - //will be updated - work[mark] = value; - int word = mark >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = mark & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - added--; - } else { - thisPivotValue = value; - } - } - //slot in pivot - elementU[put] = elementU[startColumn]; - indexRowU[put] = indexRowU[startColumn]; - if ( positionLargest == startColumn ) { - positionLargest = put; //follow if was largest - } - put++; - elementU[startColumn] = thisPivotValue; - indexRowU[startColumn] = pivotRow; - //clean up counts - startColumn++; - numberInColumn[iColumn] = put - startColumn; - int * numberInColumnPlus = numberInColumnPlus_.array(); - numberInColumnPlus[iColumn]++; - startColumnU[iColumn]++; - //how much space have we got - int next = nextColumn[iColumn]; - CoinBigIndex space; - - space = startColumnU[next] - put - numberInColumnPlus[next]; - //assume no zero elements - if ( numberInPivotColumn > space ) { - //getColumnSpace also moves fixed part - if ( !getColumnSpace ( iColumn, numberInPivotColumn ) ) { - return false; - } - //redo starts - if (positionLargest >= 0) - positionLargest = positionLargest + startColumnU[iColumn] - startColumn; - startColumn = startColumnU[iColumn]; - put = startColumn + numberInColumn[iColumn]; - } - double tolerance = zeroTolerance_; - - int *nextCount = nextCount_.array(); - for ( j = 0; j < numberInPivotColumn; j++ ) { - value = work[j] - thisPivotValue * multipliersL[j]; - double absValue = fabs ( value ); - - if ( absValue > tolerance ) { - work[j] = 0.0; - assert (put largest ) { - largest = absValue; - positionLargest = put; - } - put++; - } else { - work[j] = 0.0; - added--; - int word = j >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = j & COINFACTORIZATION_MASK_PER_INT; - - if ( temp2[word] & ( 1 << bit ) ) { - //take out of row list - iRow = indexL[j]; - CoinBigIndex start = startRowU[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumnU[where] != iColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumnU[where] = indexColumnU[end - 1]; - numberInRow[iRow]--; - } else { - //make sure won't be added - int word = j >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = j & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - } - } - } - numberInColumn[iColumn] = put - startColumn; - //move largest - if ( positionLargest >= 0 ) { - value = elementU[positionLargest]; - iRow = indexRowU[positionLargest]; - elementU[positionLargest] = elementU[startColumn]; - indexRowU[positionLargest] = indexRowU[startColumn]; - elementU[startColumn] = value; - indexRowU[startColumn] = iRow; - } - //linked list for column - if ( nextCount[iColumn + numberRows_] != -2 ) { - //modify linked list - deleteLink ( iColumn + numberRows_ ); - addLink ( iColumn + numberRows_, numberInColumn[iColumn] ); - } - temp2 += increment2; - } - //get space for row list - unsigned int *putBase = workArea2; - int bigLoops = numberInPivotColumn >> COINFACTORIZATION_SHIFT_PER_INT; - int i = 0; - - // do linked lists and update counts - while ( bigLoops ) { - bigLoops--; - int bit; - for ( bit = 0; bit < COINFACTORIZATION_BITS_PER_INT; i++, bit++ ) { - unsigned int *putThis = putBase; - int iRow = indexL[i]; - - //get space - int number = 0; - int jColumn; - - for ( jColumn = 0; jColumn < numberInPivotRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - number += test; - } - int next = nextRow[iRow]; - CoinBigIndex space; - - space = startRowU[next] - startRowU[iRow]; - number += numberInRow[iRow]; - if ( space < number ) { - if ( !getRowSpace ( iRow, number ) ) { - return false; - } - } - // now do - putThis = putBase; - next = nextRow[iRow]; - number = numberInRow[iRow]; - CoinBigIndex end = startRowU[iRow] + number; - int saveIndex = indexColumnU[startRowU[next]]; - - //add in - for ( jColumn = 0; jColumn < numberInPivotRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - indexColumnU[end] = saveColumn[jColumn]; - end += test; - } - //put back next one in case zapped - indexColumnU[startRowU[next]] = saveIndex; - markRow[iRow] = static_cast(largeInteger+1); - number = end - startRowU[iRow]; - numberInRow[iRow] = number; - deleteLink ( iRow ); - addLink ( iRow, number ); - } - putBase++; - } /* endwhile */ - int bit; - - for ( bit = 0; i < numberInPivotColumn; i++, bit++ ) { - unsigned int *putThis = putBase; - int iRow = indexL[i]; - - //get space - int number = 0; - int jColumn; - - for ( jColumn = 0; jColumn < numberInPivotRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - number += test; - } - int next = nextRow[iRow]; - CoinBigIndex space; - - space = startRowU[next] - startRowU[iRow]; - number += numberInRow[iRow]; - if ( space < number ) { - if ( !getRowSpace ( iRow, number ) ) { - return false; - } - } - // now do - putThis = putBase; - next = nextRow[iRow]; - number = numberInRow[iRow]; - CoinBigIndex end = startRowU[iRow] + number; - int saveIndex; - - saveIndex = indexColumnU[startRowU[next]]; - - //add in - for ( jColumn = 0; jColumn < numberInPivotRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - - indexColumnU[end] = saveColumn[jColumn]; - end += test; - } - indexColumnU[startRowU[next]] = saveIndex; - markRow[iRow] = static_cast(largeInteger+1); - number = end - startRowU[iRow]; - numberInRow[iRow] = number; - deleteLink ( iRow ); - addLink ( iRow, number ); - } - markRow[pivotRow] = static_cast(largeInteger+1); - //modify linked list for pivots - deleteLink ( pivotRow ); - deleteLink ( pivotColumn + numberRows_ ); - totalElements_ += added; - return true; -} - - /********************************* END LARGE TEMPLATE ********/ - //@} -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Pivot tolerance - double pivotTolerance_; - /// Zero tolerance - double zeroTolerance_; -#ifndef COIN_FAST_CODE - /// Whether slack value is +1 or -1 - double slackValue_; -#else -#ifndef slackValue_ -#define slackValue_ -1.0 -#endif -#endif - /// How much to multiply areas by - double areaFactor_; - /// Relax check on accuracy in replaceColumn - double relaxCheck_; - /// Number of Rows in factorization - int numberRows_; - /// Number of Rows after iterating - int numberRowsExtra_; - /// Maximum number of Rows after iterating - int maximumRowsExtra_; - /// Number of Columns in factorization - int numberColumns_; - /// Number of Columns after iterating - int numberColumnsExtra_; - /// Maximum number of Columns after iterating - int maximumColumnsExtra_; - /// Number factorized in U (not row singletons) - int numberGoodU_; - /// Number factorized in L - int numberGoodL_; - /// Maximum number of pivots before factorization - int maximumPivots_; - /// Number pivots since last factorization - int numberPivots_; - /// Number of elements in U (to go) - /// or while iterating total overall - CoinBigIndex totalElements_; - /// Number of elements after factorization - CoinBigIndex factorElements_; - /// Pivot order for each Column - CoinIntArrayWithLength pivotColumn_; - /// Permutation vector for pivot row order - CoinIntArrayWithLength permute_; - /// DePermutation vector for pivot row order - CoinIntArrayWithLength permuteBack_; - /// Inverse Pivot order for each Column - CoinIntArrayWithLength pivotColumnBack_; - /// Status of factorization - int status_; - - /** 0 - no increasing rows - no permutations, - 1 - no increasing rows but permutations - 2 - increasing rows - - taken out as always 2 */ - //int increasingRows_; - - /// Number of trials before rejection - int numberTrials_; - /// Start of each Row as pointer - CoinBigIndexArrayWithLength startRowU_; - - /// Number in each Row - CoinIntArrayWithLength numberInRow_; - - /// Number in each Column - CoinIntArrayWithLength numberInColumn_; - - /// Number in each Column including pivoted - CoinIntArrayWithLength numberInColumnPlus_; - - /** First Row/Column with count of k, - can tell which by offset - Rows then Columns */ - CoinIntArrayWithLength firstCount_; - - /// Next Row/Column with count - CoinIntArrayWithLength nextCount_; - - /// Previous Row/Column with count - CoinIntArrayWithLength lastCount_; - - /// Next Column in memory order - CoinIntArrayWithLength nextColumn_; - - /// Previous Column in memory order - CoinIntArrayWithLength lastColumn_; - - /// Next Row in memory order - CoinIntArrayWithLength nextRow_; - - /// Previous Row in memory order - CoinIntArrayWithLength lastRow_; - - /// Columns left to do in a single pivot - CoinIntArrayWithLength saveColumn_; - - /// Marks rows to be updated - CoinIntArrayWithLength markRow_; - - /// Detail in messages - int messageLevel_; - - /// Larger of row and column size - int biggerDimension_; - - /// Base address for U (may change) - CoinIntArrayWithLength indexColumnU_; - - /// Pivots for L - CoinIntArrayWithLength pivotRowL_; - - /// Inverses of pivot values - CoinFactorizationDoubleArrayWithLength pivotRegion_; - - /// Number of slacks at beginning of U - int numberSlacks_; - - /// Number in U - int numberU_; - - /// Maximum space used in U - CoinBigIndex maximumU_; - - /// Base of U is always 0 - //int baseU_; - - /// Length of U - CoinBigIndex lengthU_; - - /// Length of area reserved for U - CoinBigIndex lengthAreaU_; - -/// Elements of U - CoinFactorizationDoubleArrayWithLength elementU_; - -/// Row indices of U - CoinIntArrayWithLength indexRowU_; - -/// Start of each column in U - CoinBigIndexArrayWithLength startColumnU_; - -/// Converts rows to columns in U - CoinBigIndexArrayWithLength convertRowToColumnU_; - - /// Number in L - CoinBigIndex numberL_; - -/// Base of L - CoinBigIndex baseL_; - - /// Length of L - CoinBigIndex lengthL_; - - /// Length of area reserved for L - CoinBigIndex lengthAreaL_; - - /// Elements of L - CoinFactorizationDoubleArrayWithLength elementL_; - - /// Row indices of L - CoinIntArrayWithLength indexRowL_; - - /// Start of each column in L - CoinBigIndexArrayWithLength startColumnL_; - - /// true if Forrest Tomlin update, false if PFI - bool doForrestTomlin_; - - /// Number in R - int numberR_; - - /// Length of R stuff - CoinBigIndex lengthR_; - - /// length of area reserved for R - CoinBigIndex lengthAreaR_; - - /// Elements of R - CoinFactorizationDouble *elementR_; - - /// Row indices for R - int *indexRowR_; - - /// Start of columns for R - CoinBigIndexArrayWithLength startColumnR_; - - /// Dense area - double * denseArea_; - - /// Dense area - actually used (for alignment etc) - double * denseAreaAddress_; - - /// Dense permutation - int * densePermute_; - - /// Number of dense rows - int numberDense_; - - /// Dense threshold - int denseThreshold_; - - /// First work area - CoinFactorizationDoubleArrayWithLength workArea_; - - /// Second work area - CoinUnsignedIntArrayWithLength workArea2_; - - /// Number of compressions done - CoinBigIndex numberCompressions_; - -public: - /// Below are all to collect - mutable double ftranCountInput_; - mutable double ftranCountAfterL_; - mutable double ftranCountAfterR_; - mutable double ftranCountAfterU_; - mutable double btranCountInput_; - mutable double btranCountAfterU_; - mutable double btranCountAfterR_; - mutable double btranCountAfterL_; - - /// We can roll over factorizations - mutable int numberFtranCounts_; - mutable int numberBtranCounts_; - - /// While these are average ratios collected over last period - double ftranAverageAfterL_; - double ftranAverageAfterR_; - double ftranAverageAfterU_; - double btranAverageAfterU_; - double btranAverageAfterR_; - double btranAverageAfterL_; -protected: - - /// For statistics -#if 0 - mutable bool collectStatistics_; -#else -#define collectStatistics_ 1 -#endif - - /// Below this use sparse technology - if 0 then no L row copy - int sparseThreshold_; - - /// And one for "sparsish" - int sparseThreshold2_; - - /// Start of each row in L - CoinBigIndexArrayWithLength startRowL_; - - /// Index of column in row for L - CoinIntArrayWithLength indexColumnL_; - - /// Elements in L (row copy) - CoinFactorizationDoubleArrayWithLength elementByRowL_; - - /// Sparse regions - mutable CoinIntArrayWithLength sparse_; - /** L to U bias - 0 - U bias, 1 - some U bias, 2 some L bias, 3 L bias - */ - int biasLU_; - /** Array persistence flag - If 0 then as now (delete/new) - 1 then only do arrays if bigger needed - 2 as 1 but give a bit extra if bigger needed - */ - int persistenceFlag_; -#ifdef ABC_USE_COIN_FACTORIZATION - /// Says if parallel - int parallelMode_; -#endif - //@} -}; -// Dense coding -#ifdef COIN_HAS_LAPACK -#ifndef COIN_FACTORIZATION_DENSE_CODE -#define COIN_FACTORIZATION_DENSE_CODE 1 -#endif -#endif -#ifdef COIN_FACTORIZATION_DENSE_CODE -/* Type of Fortran integer translated into C */ -#ifndef ipfint -//typedef ipfint FORTRAN_INTEGER_TYPE ; -typedef int ipfint; -typedef const int cipfint; -#endif -#endif -#endif -// Extra for ugly include -#ifdef UGLY_COIN_FACTOR_CODING -#define FAC_UNSET (FAC_SET+1) -{ - goodPivot=false; - //store pivot columns (so can easily compress) - CoinBigIndex startColumnThis = startColumn[iPivotColumn]; - CoinBigIndex endColumn = startColumnThis + numberDoColumn + 1; - int put = 0; - CoinBigIndex startRowThis = startRow[iPivotRow]; - CoinBigIndex endRow = startRowThis + numberDoRow + 1; - if ( pivotColumnPosition < 0 ) { - for ( pivotColumnPosition = startRowThis; pivotColumnPosition < endRow; pivotColumnPosition++ ) { - int iColumn = indexColumn[pivotColumnPosition]; - if ( iColumn != iPivotColumn ) { - saveColumn[put++] = iColumn; - } else { - break; - } - } - } else { - for (CoinBigIndex i = startRowThis ; i < pivotColumnPosition ; i++ ) { - saveColumn[put++] = indexColumn[i]; - } - } - assert (pivotColumnPosition lengthAreaL_ ) { - //need more memory - if ((messageLevel_&4)!=0) - printf("more memory needed in middle of invert\n"); - goto BAD_PIVOT; - } - //l+=currentAreaL_->elementByColumn-elementL; - CoinBigIndex lSave = l; - - CoinBigIndex * startColumnL = startColumnL_.array(); - startColumnL[numberGoodL_] = l; //for luck and first time - numberGoodL_++; - startColumnL[numberGoodL_] = l + numberDoColumn; - lengthL_ += numberDoColumn; - if ( pivotRowPosition < 0 ) { - for ( pivotRowPosition = startColumnThis; pivotRowPosition < endColumn; pivotRowPosition++ ) { - int iRow = indexRow[pivotRowPosition]; - if ( iRow != iPivotRow ) { - indexRowL[l] = iRow; - elementL[l] = element[pivotRowPosition]; - markRow[iRow] = l - lSave; - l++; - //take out of row list - CoinBigIndex start = startRow[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumn[where] != iPivotColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumn[where] = indexColumn[end - 1]; - numberInRow[iRow]--; - } else { - break; - } - } - } else { - CoinBigIndex i; - - for ( i = startColumnThis; i < pivotRowPosition; i++ ) { - int iRow = indexRow[i]; - - markRow[iRow] = l - lSave; - indexRowL[l] = iRow; - elementL[l] = element[i]; - l++; - //take out of row list - CoinBigIndex start = startRow[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumn[where] != iPivotColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumn[where] = indexColumn[end - 1]; - numberInRow[iRow]--; - assert (numberInRow[iRow]>=0); - } - } - assert (pivotRowPosition= end ) { - abort ( ); - } -#endif - indexColumn[where] = indexColumn[end - 1]; - numberInRow[iRow]--; - assert (numberInRow[iRow]>=0); - } - markRow[iPivotRow] = FAC_SET; - //compress pivot column (move pivot to front including saved) - numberInColumn[iPivotColumn] = 0; - //use end of L for temporary space - int *indexL = &indexRowL[lSave]; - CoinFactorizationDouble *multipliersL = &elementL[lSave]; - - //adjust - int j; - - for ( j = 0; j < numberDoColumn; j++ ) { - multipliersL[j] *= pivotMultiplier; - } - //zero out fill - CoinBigIndex iErase; - for ( iErase = 0; iErase < increment2 * numberDoRow; - iErase++ ) { - workArea2[iErase] = 0; - } - CoinBigIndex added = numberDoRow * numberDoColumn; - unsigned int *temp2 = workArea2; - int * nextColumn = nextColumn_.array(); - - //pack down and move to work - int jColumn; - for ( jColumn = 0; jColumn < numberDoRow; jColumn++ ) { - int iColumn = saveColumn[jColumn]; - CoinBigIndex startColumnThis = startColumn[iColumn]; - CoinBigIndex endColumn = startColumnThis + numberInColumn[iColumn]; - int iRow = indexRow[startColumnThis]; - CoinFactorizationDouble value = element[startColumnThis]; - double largest; - CoinBigIndex put = startColumnThis; - CoinBigIndex positionLargest = -1; - CoinFactorizationDouble thisPivotValue = 0.0; - - //compress column and find largest not updated - bool checkLargest; - int mark = markRow[iRow]; - - if ( mark == FAC_UNSET ) { - largest = fabs ( value ); - positionLargest = put; - put++; - checkLargest = false; - } else { - //need to find largest - largest = 0.0; - checkLargest = true; - if ( mark != FAC_SET ) { - //will be updated - workArea[mark] = value; - int word = mark >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = mark & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - added--; - } else { - thisPivotValue = value; - } - } - CoinBigIndex i; - for ( i = startColumnThis + 1; i < endColumn; i++ ) { - iRow = indexRow[i]; - value = element[i]; - int mark = markRow[iRow]; - - if ( mark == FAC_UNSET ) { - //keep - indexRow[put] = iRow; - element[put] = value; - if ( checkLargest ) { - double absValue = fabs ( value ); - - if ( absValue > largest ) { - largest = absValue; - positionLargest = put; - } - } - put++; - } else if ( mark != FAC_SET ) { - //will be updated - workArea[mark] = value; - int word = mark >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = mark & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - added--; - } else { - thisPivotValue = value; - } - } - //slot in pivot - element[put] = element[startColumnThis]; - indexRow[put] = indexRow[startColumnThis]; - if ( positionLargest == startColumnThis ) { - positionLargest = put; //follow if was largest - } - put++; - element[startColumnThis] = thisPivotValue; - indexRow[startColumnThis] = iPivotRow; - //clean up counts - startColumnThis++; - numberInColumn[iColumn] = put - startColumnThis; - int * numberInColumnPlus = numberInColumnPlus_.array(); - numberInColumnPlus[iColumn]++; - startColumn[iColumn]++; - //how much space have we got - int next = nextColumn[iColumn]; - CoinBigIndex space; - - space = startColumn[next] - put - numberInColumnPlus[next]; - //assume no zero elements - if ( numberDoColumn > space ) { - //getColumnSpace also moves fixed part - if ( !getColumnSpace ( iColumn, numberDoColumn ) ) { - goto BAD_PIVOT; - } - //redo starts - positionLargest = positionLargest + startColumn[iColumn] - startColumnThis; - startColumnThis = startColumn[iColumn]; - put = startColumnThis + numberInColumn[iColumn]; - } - double tolerance = zeroTolerance_; - - int *nextCount = nextCount_.array(); - for ( j = 0; j < numberDoColumn; j++ ) { - value = workArea[j] - thisPivotValue * multipliersL[j]; - double absValue = fabs ( value ); - - if ( absValue > tolerance ) { - workArea[j] = 0.0; - element[put] = value; - indexRow[put] = indexL[j]; - if ( absValue > largest ) { - largest = absValue; - positionLargest = put; - } - put++; - } else { - workArea[j] = 0.0; - added--; - int word = j >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = j & COINFACTORIZATION_MASK_PER_INT; - - if ( temp2[word] & ( 1 << bit ) ) { - //take out of row list - iRow = indexL[j]; - CoinBigIndex start = startRow[iRow]; - CoinBigIndex end = start + numberInRow[iRow]; - CoinBigIndex where = start; - - while ( indexColumn[where] != iColumn ) { - where++; - } /* endwhile */ -#if DEBUG_COIN - if ( where >= end ) { - abort ( ); - } -#endif - indexColumn[where] = indexColumn[end - 1]; - numberInRow[iRow]--; - } else { - //make sure won't be added - int word = j >> COINFACTORIZATION_SHIFT_PER_INT; - int bit = j & COINFACTORIZATION_MASK_PER_INT; - - temp2[word] = temp2[word] | ( 1 << bit ); //say already in counts - } - } - } - numberInColumn[iColumn] = put - startColumnThis; - //move largest - if ( positionLargest >= 0 ) { - value = element[positionLargest]; - iRow = indexRow[positionLargest]; - element[positionLargest] = element[startColumnThis]; - indexRow[positionLargest] = indexRow[startColumnThis]; - element[startColumnThis] = value; - indexRow[startColumnThis] = iRow; - } - //linked list for column - if ( nextCount[iColumn + numberRows_] != -2 ) { - //modify linked list - deleteLink ( iColumn + numberRows_ ); - addLink ( iColumn + numberRows_, numberInColumn[iColumn] ); - } - temp2 += increment2; - } - //get space for row list - unsigned int *putBase = workArea2; - int bigLoops = numberDoColumn >> COINFACTORIZATION_SHIFT_PER_INT; - int i = 0; - - // do linked lists and update counts - while ( bigLoops ) { - bigLoops--; - int bit; - for ( bit = 0; bit < COINFACTORIZATION_BITS_PER_INT; i++, bit++ ) { - unsigned int *putThis = putBase; - int iRow = indexL[i]; - - //get space - int number = 0; - int jColumn; - - for ( jColumn = 0; jColumn < numberDoRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - number += test; - } - int next = nextRow[iRow]; - CoinBigIndex space; - - space = startRow[next] - startRow[iRow]; - number += numberInRow[iRow]; - if ( space < number ) { - if ( !getRowSpace ( iRow, number ) ) { - goto BAD_PIVOT; - } - } - // now do - putThis = putBase; - next = nextRow[iRow]; - number = numberInRow[iRow]; - CoinBigIndex end = startRow[iRow] + number; - int saveIndex = indexColumn[startRow[next]]; - - //add in - for ( jColumn = 0; jColumn < numberDoRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - indexColumn[end] = saveColumn[jColumn]; - end += test; - } - //put back next one in case zapped - indexColumn[startRow[next]] = saveIndex; - markRow[iRow] = FAC_UNSET; - number = end - startRow[iRow]; - numberInRow[iRow] = number; - deleteLink ( iRow ); - addLink ( iRow, number ); - } - putBase++; - } /* endwhile */ - int bit; - - for ( bit = 0; i < numberDoColumn; i++, bit++ ) { - unsigned int *putThis = putBase; - int iRow = indexL[i]; - - //get space - int number = 0; - int jColumn; - - for ( jColumn = 0; jColumn < numberDoRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - number += test; - } - int next = nextRow[iRow]; - CoinBigIndex space; - - space = startRow[next] - startRow[iRow]; - number += numberInRow[iRow]; - if ( space < number ) { - if ( !getRowSpace ( iRow, number ) ) { - goto BAD_PIVOT; - } - } - // now do - putThis = putBase; - next = nextRow[iRow]; - number = numberInRow[iRow]; - CoinBigIndex end = startRow[iRow] + number; - int saveIndex; - - saveIndex = indexColumn[startRow[next]]; - - //add in - for ( jColumn = 0; jColumn < numberDoRow; jColumn++ ) { - unsigned int test = *putThis; - - putThis += increment2; - test = 1 - ( ( test >> bit ) & 1 ); - - indexColumn[end] = saveColumn[jColumn]; - end += test; - } - indexColumn[startRow[next]] = saveIndex; - markRow[iRow] = FAC_UNSET; - number = end - startRow[iRow]; - numberInRow[iRow] = number; - deleteLink ( iRow ); - addLink ( iRow, number ); - } - markRow[iPivotRow] = FAC_UNSET; - //modify linked list for pivots - deleteLink ( iPivotRow ); - deleteLink ( iPivotColumn + numberRows_ ); - totalElements_ += added; - goodPivot= true; - // **** UGLY UGLY UGLY - } - BAD_PIVOT: - - ; -} -#undef FAC_UNSET -#endif diff --git a/thirdparty/linux/include/coin1/CoinFileIO.hpp b/thirdparty/linux/include/coin1/CoinFileIO.hpp deleted file mode 100644 index 20be1a94..00000000 --- a/thirdparty/linux/include/coin1/CoinFileIO.hpp +++ /dev/null @@ -1,166 +0,0 @@ -/* $Id: CoinFileIO.hpp 1439 2011-06-13 16:31:21Z stefan $ */ -// Copyright (C) 2005, COIN-OR. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinFileIO_H -#define CoinFileIO_H - -#include - -/// Base class for FileIO classes. -class CoinFileIOBase -{ -public: - /// Constructor. - /// @param fileName The name of the file used by this object. - CoinFileIOBase (const std::string &fileName); - - /// Destructor. - ~CoinFileIOBase (); - - /// Return the name of the file used by this object. - const char *getFileName () const; - - /// Return the method of reading being used - inline std::string getReadType () const - { return readType_.c_str();} -protected: - std::string readType_; -private: - CoinFileIOBase (); - CoinFileIOBase (const CoinFileIOBase &); - - std::string fileName_; -}; - -/// Abstract base class for file input classes. -class CoinFileInput: public CoinFileIOBase -{ -public: - /// indicates whether CoinFileInput supports gzip'ed files - static bool haveGzipSupport(); - /// indicates whether CoinFileInput supports bzip2'ed files - static bool haveBzip2Support(); - - /// Factory method, that creates a CoinFileInput (more precisely - /// a subclass of it) for the file specified. This method reads the - /// first few bytes of the file and determines if this is a compressed - /// or a plain file and returns the correct subclass to handle it. - /// If the file does not exist or uses a compression not compiled in - /// an exception is thrown. - /// @param fileName The file that should be read. - static CoinFileInput *create (const std::string &fileName); - - /// Constructor (don't use this, use the create method instead). - /// @param fileName The name of the file used by this object. - CoinFileInput (const std::string &fileName); - - /// Destructor. - virtual ~CoinFileInput (); - - /// Read a block of data from the file, similar to fread. - /// @param buffer Address of a buffer to store the data into. - /// @param size Number of bytes to read (buffer should be large enough). - /// @return Number of bytes read. - virtual int read (void *buffer, int size) = 0; - - /// Reads up to (size-1) characters an stores them into the buffer, - /// similar to fgets. - /// Reading ends, when EOF or a newline occurs or (size-1) characters have - /// been read. The resulting string is terminated with '\0'. If reading - /// ends due to an encoutered newline, the '\n' is put into the buffer, - /// before the '\0' is appended. - /// @param buffer The buffer to put the string into. - /// @param size The size of the buffer in characters. - /// @return buffer on success, or 0 if no characters have been read. - virtual char *gets (char *buffer, int size) = 0; -}; - -/// Abstract base class for file output classes. -class CoinFileOutput: public CoinFileIOBase -{ -public: - - /// The compression method. - enum Compression { - COMPRESS_NONE = 0, ///< No compression. - COMPRESS_GZIP = 1, ///< gzip compression. - COMPRESS_BZIP2 = 2 ///< bzip2 compression. - }; - - /// Returns whether the specified compression method is supported - /// (i.e. was compiled into COIN). - static bool compressionSupported (Compression compression); - - /// Factory method, that creates a CoinFileOutput (more precisely - /// a subclass of it) for the file specified. If the compression method - /// is not supported an exception is thrown (so use compressionSupported - /// first, if this is a problem). The reason for not providing direct - /// access to the subclasses (and using such a method instead) is that - /// depending on the build configuration some of the classes are not - /// available (or functional). This way we can handle all required ifdefs - /// here instead of polluting other files. - /// @param fileName The file that should be read. - /// @param compression Compression method used. - static CoinFileOutput *create (const std::string &fileName, - Compression compression); - - /// Constructor (don't use this, use the create method instead). - /// @param fileName The name of the file used by this object. - CoinFileOutput (const std::string &fileName); - - /// Destructor. - virtual ~CoinFileOutput (); - - /// Write a block of data to the file, similar to fwrite. - /// @param buffer Address of a buffer containing the data to be written. - /// @param size Number of bytes to write. - /// @return Number of bytes written. - virtual int write (const void * buffer, int size) = 0; - - /// Write a string to the file (like fputs). - /// Just as with fputs no trailing newline is inserted! - /// The terminating '\0' is not written to the file. - /// The default implementation determines the length of the string - /// and calls write on it. - /// @param s The zero terminated string to be written. - /// @return true on success, false on error. - virtual bool puts (const char *s); - - /// Convenience method: just a 'puts(s.c_str())'. - inline bool puts (const std::string &s) - { - return puts (s.c_str ()); - } -}; - -/*! \relates CoinFileInput - \brief Test if the given string looks like an absolute file path - - The criteria are: - - unix: string begins with `/' - - windows: string begins with `\' or with `drv:' (drive specifier) -*/ -bool fileAbsPath (const std::string &path) ; - -/*! \relates CoinFileInput - \brief Test if the file is readable, using likely versions of the file - name, and return the name that worked. - - The file name is constructed from \p name using the following rules: -
        -
      • An absolute path is not modified. -
      • If the name begins with `~', an attempt is made to replace `~' - with the value of the environment variable HOME. -
      • If a default prefix (\p dfltPrefix) is provided, it is - prepended to the name. -
      - If the constructed file name cannot be opened, and CoinUtils was built - with support for compressed files, fileCoinReadable will try any - standard extensions for supported compressed files. - - The value returned in \p name is the file name that actually worked. -*/ -bool fileCoinReadable(std::string &name, - const std::string &dfltPrefix = std::string("")); -#endif diff --git a/thirdparty/linux/include/coin1/CoinFinite.hpp b/thirdparty/linux/include/coin1/CoinFinite.hpp deleted file mode 100644 index 71b5b658..00000000 --- a/thirdparty/linux/include/coin1/CoinFinite.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* $Id: CoinFinite.hpp 1762 2014-12-29 20:37:12Z tkr $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -/* Defines COIN_DBL_MAX and relatives and provides CoinFinite and CoinIsnan. */ - -#ifndef CoinFinite_H -#define CoinFinite_H - -#include - -//============================================================================= -// Smallest positive double value and Plus infinity (double and int) - -#if 1 -const double COIN_DBL_MIN = (std::numeric_limits::min)(); -const double COIN_DBL_MAX = (std::numeric_limits::max)(); -const int COIN_INT_MAX = (std::numeric_limits::max)(); -const double COIN_INT_MAX_AS_DOUBLE = (std::numeric_limits::max)(); -#else -#define COIN_DBL_MIN (std::numeric_limits::min()) -#define COIN_DBL_MAX (std::numeric_limits::max()) -#define COIN_INT_MAX (std::numeric_limits::max()) -#define COIN_INT_MAX_AS_DOUBLE (std::numeric_limits::max()) -#endif - -/** checks if a double value is finite (not infinity and not NaN) */ -extern bool CoinFinite(double val); - -/** checks if a double value is not a number */ -extern bool CoinIsnan(double val); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinFloatEqual.hpp b/thirdparty/linux/include/coin1/CoinFloatEqual.hpp deleted file mode 100644 index d5edfffa..00000000 --- a/thirdparty/linux/include/coin1/CoinFloatEqual.hpp +++ /dev/null @@ -1,177 +0,0 @@ -/* $Id: CoinFloatEqual.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinFloatEqual_H -#define CoinFloatEqual_H - -#include -#include - -#include "CoinFinite.hpp" - -/*! \file CoinFloatEqual.hpp - \brief Function objects for testing equality of real numbers. - - Two objects are provided; one tests for equality to an absolute tolerance, - one to a scaled tolerance. The tests will handle IEEE floating point, but - note that infinity == infinity. Mathematicians are rolling in their graves, - but this matches the behaviour for the common practice of using - DBL_MAX (numeric_limits::max(), or similar - large finite number) as infinity. - -

      - Example usage: - @verbatim - double d1 = 3.14159 ; - double d2 = d1 ; - double d3 = d1+.0001 ; - - CoinAbsFltEq eq1 ; - CoinAbsFltEq eq2(.001) ; - - assert( eq1(d1,d2) ) ; - assert( !eq1(d1,d3) ) ; - assert( eq2(d1,d3) ) ; - @endverbatim - CoinRelFltEq follows the same pattern. */ - -/*! \brief Equality to an absolute tolerance - - Operands are considered equal if their difference is within an epsilon ; - the test does not consider the relative magnitude of the operands. -*/ - -class CoinAbsFltEq -{ - public: - - //! Compare function - - inline bool operator() (const double f1, const double f2) const - - { if (CoinIsnan(f1) || CoinIsnan(f2)) return false ; - if (f1 == f2) return true ; - return (fabs(f1-f2) < epsilon_) ; } - - /*! \name Constructors and destructors */ - //@{ - - /*! \brief Default constructor - - Default tolerance is 1.0e-10. - */ - - CoinAbsFltEq () : epsilon_(1.e-10) {} - - //! Alternate constructor with epsilon as a parameter - - CoinAbsFltEq (const double epsilon) : epsilon_(epsilon) {} - - //! Destructor - - virtual ~CoinAbsFltEq () {} - - //! Copy constructor - - CoinAbsFltEq (const CoinAbsFltEq& src) : epsilon_(src.epsilon_) {} - - //! Assignment - - CoinAbsFltEq& operator= (const CoinAbsFltEq& rhs) - - { if (this != &rhs) epsilon_ = rhs.epsilon_ ; - return (*this) ; } - - //@} - - private: - - /*! \name Private member data */ - //@{ - - //! Equality tolerance. - - double epsilon_ ; - - //@} - -} ; - - - -/*! \brief Equality to a scaled tolerance - - Operands are considered equal if their difference is within a scaled - epsilon calculated as epsilon_*(1+CoinMax(|f1|,|f2|)). -*/ - -class CoinRelFltEq -{ - public: - - //! Compare function - - inline bool operator() (const double f1, const double f2) const - - { if (CoinIsnan(f1) || CoinIsnan(f2)) return false ; - if (f1 == f2) return true ; - if (!CoinFinite(f1) || !CoinFinite(f2)) return false ; - - double tol = (fabs(f1)>fabs(f2))?fabs(f1):fabs(f2) ; - - return (fabs(f1-f2) <= epsilon_*(1+tol)) ; } - - /*! \name Constructors and destructors */ - //@{ - -#ifndef COIN_FLOAT - /*! Default constructor - - Default tolerance is 1.0e-10. - */ - CoinRelFltEq () : epsilon_(1.e-10) {} -#else - /*! Default constructor - - Default tolerance is 1.0e-6. - */ - CoinRelFltEq () : epsilon_(1.e-6) {} ; // as float -#endif - - //! Alternate constructor with epsilon as a parameter - - CoinRelFltEq (const double epsilon) : epsilon_(epsilon) {} - - //! Destructor - - virtual ~CoinRelFltEq () {} - - //! Copy constructor - - CoinRelFltEq (const CoinRelFltEq & src) : epsilon_(src.epsilon_) {} - - //! Assignment - - CoinRelFltEq& operator= (const CoinRelFltEq& rhs) - - { if (this != &rhs) epsilon_ = rhs.epsilon_ ; - return (*this) ; } - - //@} - -private: - - /*! \name Private member data */ - //@{ - - //! Base equality tolerance - - double epsilon_ ; - - //@} - -} ; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinHelperFunctions.hpp b/thirdparty/linux/include/coin1/CoinHelperFunctions.hpp deleted file mode 100644 index 3409bbcb..00000000 --- a/thirdparty/linux/include/coin1/CoinHelperFunctions.hpp +++ /dev/null @@ -1,1111 +0,0 @@ -/* $Id: CoinHelperFunctions.hpp 1679 2013-12-05 11:27:45Z forrest $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinHelperFunctions_H -#define CoinHelperFunctions_H - -#include "CoinUtilsConfig.h" - -#if defined(_MSC_VER) -# include -# include -# define getcwd _getcwd -# include -#else -# include -#endif -//#define USE_MEMCPY - -#include -#include -#include -#include "CoinTypes.hpp" -#include "CoinError.hpp" - -// Compilers can produce better code if they know about __restrict -#ifndef COIN_RESTRICT -#ifdef COIN_USE_RESTRICT -#define COIN_RESTRICT __restrict -#else -#define COIN_RESTRICT -#endif -#endif - -//############################################################################# - -/** This helper function copies an array to another location using Duff's - device (for a speedup of ~2). The arrays are given by pointers to their - first entries and by the size of the source array. Overlapping arrays are - handled correctly. */ - -template inline void -CoinCopyN(register const T* from, const int size, register T* to) -{ - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinCopyN", ""); -#endif - - register int n = (size + 7) / 8; - if (to > from) { - register const T* downfrom = from + size; - register T* downto = to + size; - // Use Duff's device to copy - switch (size % 8) { - case 0: do{ *--downto = *--downfrom; - case 7: *--downto = *--downfrom; - case 6: *--downto = *--downfrom; - case 5: *--downto = *--downfrom; - case 4: *--downto = *--downfrom; - case 3: *--downto = *--downfrom; - case 2: *--downto = *--downfrom; - case 1: *--downto = *--downfrom; - }while(--n>0); - } - } else { - // Use Duff's device to copy - --from; - --to; - switch (size % 8) { - case 0: do{ *++to = *++from; - case 7: *++to = *++from; - case 6: *++to = *++from; - case 5: *++to = *++from; - case 4: *++to = *++from; - case 3: *++to = *++from; - case 2: *++to = *++from; - case 1: *++to = *++from; - }while(--n>0); - } - } -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location using Duff's - device (for a speedup of ~2). The source array is given by its first and - "after last" entry; the target array is given by its first entry. - Overlapping arrays are handled correctly. - - All of the various CoinCopyN variants use an int for size. On 64-bit - architectures, the address diff last-first will be a 64-bit quantity. - Given that everything else uses an int, I'm going to choose to kick - the difference down to int. -- lh, 100823 -- -*/ -template inline void -CoinCopy(register const T* first, register const T* last, register T* to) -{ - CoinCopyN(first, static_cast(last-first), to); -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The arrays are given by pointers to their first - entries and by the size of the source array. - - Note JJF - the speed claim seems to be false on IA32 so I have added - CoinMemcpyN which can be used for atomic data */ -template inline void -CoinDisjointCopyN(register const T* from, const int size, register T* to) -{ -#ifndef _MSC_VER - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinDisjointCopyN", ""); -#endif - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinDisjointCopyN", ""); -#endif - - for (register int n = size / 8; n > 0; --n, from += 8, to += 8) { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to[4] = from[4]; - to[5] = from[5]; - to[6] = from[6]; - to[7] = from[7]; - } - switch (size % 8) { - case 7: to[6] = from[6]; - case 6: to[5] = from[5]; - case 5: to[4] = from[4]; - case 4: to[3] = from[3]; - case 3: to[2] = from[2]; - case 2: to[1] = from[1]; - case 1: to[0] = from[0]; - case 0: break; - } -#else - CoinCopyN(from, size, to); -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The source array is given by its first and "after - last" entry; the target array is given by its first entry. */ -template inline void -CoinDisjointCopy(register const T* first, register const T* last, - register T* to) -{ - CoinDisjointCopyN(first, static_cast(last - first), to); -} - -//----------------------------------------------------------------------------- - -/*! \brief Return an array of length \p size filled with input from \p array, - or null if \p array is null. -*/ - -template inline T* -CoinCopyOfArray( const T * array, const int size) -{ - if (array) { - T * arrayNew = new T[size]; - std::memcpy(arrayNew,array,size*sizeof(T)); - return arrayNew; - } else { - return NULL; - } -} - - -/*! \brief Return an array of length \p size filled with first copySize from \p array, - or null if \p array is null. -*/ - -template inline T* -CoinCopyOfArrayPartial( const T * array, const int size,const int copySize) -{ - if (array||size) { - T * arrayNew = new T[size]; - assert (copySize<=size); - std::memcpy(arrayNew,array,copySize*sizeof(T)); - return arrayNew; - } else { - return NULL; - } -} - -/*! \brief Return an array of length \p size filled with input from \p array, - or filled with (scalar) \p value if \p array is null -*/ - -template inline T* -CoinCopyOfArray( const T * array, const int size, T value) -{ - T * arrayNew = new T[size]; - if (array) { - std::memcpy(arrayNew,array,size*sizeof(T)); - } else { - int i; - for (i=0;i inline T* -CoinCopyOfArrayOrZero( const T * array , const int size) -{ - T * arrayNew = new T[size]; - if (array) { - std::memcpy(arrayNew,array,size*sizeof(T)); - } else { - std::memset(arrayNew,0,size*sizeof(T)); - } - return arrayNew; -} - - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The arrays are given by pointers to their first - entries and by the size of the source array. - - Note JJF - the speed claim seems to be false on IA32 so I have added - alternative coding if USE_MEMCPY defined*/ -#ifndef COIN_USE_RESTRICT -template inline void -CoinMemcpyN(register const T* from, const int size, register T* to) -{ -#ifndef _MSC_VER -#ifdef USE_MEMCPY - // Use memcpy - seems a lot faster on Intel with gcc -#ifndef NDEBUG - // Some debug so check - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinMemcpyN", ""); - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinMemcpyN", ""); -#endif -#endif - std::memcpy(to,from,size*sizeof(T)); -#else - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinMemcpyN", ""); -#endif - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinMemcpyN", ""); -#endif - - for (register int n = size / 8; n > 0; --n, from += 8, to += 8) { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to[4] = from[4]; - to[5] = from[5]; - to[6] = from[6]; - to[7] = from[7]; - } - switch (size % 8) { - case 7: to[6] = from[6]; - case 6: to[5] = from[5]; - case 5: to[4] = from[4]; - case 4: to[3] = from[3]; - case 3: to[2] = from[2]; - case 2: to[1] = from[1]; - case 1: to[0] = from[0]; - case 0: break; - } -#endif -#else - CoinCopyN(from, size, to); -#endif -} -#else -template inline void -CoinMemcpyN(const T * COIN_RESTRICT from, int size, T* COIN_RESTRICT to) -{ -#ifdef USE_MEMCPY - std::memcpy(to,from,size*sizeof(T)); -#else - T * COIN_RESTRICT put = to; - const T * COIN_RESTRICT get = from; - for ( ; 0 inline void -CoinMemcpy(register const T* first, register const T* last, - register T* to) -{ - CoinMemcpyN(first, static_cast(last - first), to); -} - -//############################################################################# - -/** This helper function fills an array with a given value. For speed 8 entries - are filled at a time. The array is given by a pointer to its first entry - and its size. - - Note JJF - the speed claim seems to be false on IA32 so I have added - CoinZero to allow for memset. */ -template inline void -CoinFillN(register T* to, const int size, register const T value) -{ - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinFillN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, to += 8) { - to[0] = value; - to[1] = value; - to[2] = value; - to[3] = value; - to[4] = value; - to[5] = value; - to[6] = value; - to[7] = value; - } - switch (size % 8) { - case 7: to[6] = value; - case 6: to[5] = value; - case 5: to[4] = value; - case 4: to[3] = value; - case 3: to[2] = value; - case 2: to[1] = value; - case 1: to[0] = value; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --to; - switch (size % 8) { - case 0: do{ *++to = value; - case 7: *++to = value; - case 6: *++to = value; - case 5: *++to = value; - case 4: *++to = value; - case 3: *++to = value; - case 2: *++to = value; - case 1: *++to = value; - }while(--n>0); - } -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function fills an array with a given value. For speed 8 - entries are filled at a time. The array is given by its first and "after - last" entry. */ -template inline void -CoinFill(register T* first, register T* last, const T value) -{ - CoinFillN(first, last - first, value); -} - -//############################################################################# - -/** This helper function fills an array with zero. For speed 8 entries - are filled at a time. The array is given by a pointer to its first entry - and its size. - - Note JJF - the speed claim seems to be false on IA32 so I have allowed - for memset as an alternative */ -template inline void -CoinZeroN(register T* to, const int size) -{ -#ifdef USE_MEMCPY - // Use memset - seems faster on Intel with gcc -#ifndef NDEBUG - // Some debug so check - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinZeroN", ""); -#endif - memset(to,0,size*sizeof(T)); -#else - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinZeroN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, to += 8) { - to[0] = 0; - to[1] = 0; - to[2] = 0; - to[3] = 0; - to[4] = 0; - to[5] = 0; - to[6] = 0; - to[7] = 0; - } - switch (size % 8) { - case 7: to[6] = 0; - case 6: to[5] = 0; - case 5: to[4] = 0; - case 4: to[3] = 0; - case 3: to[2] = 0; - case 2: to[1] = 0; - case 1: to[0] = 0; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --to; - switch (size % 8) { - case 0: do{ *++to = 0; - case 7: *++to = 0; - case 6: *++to = 0; - case 5: *++to = 0; - case 4: *++to = 0; - case 3: *++to = 0; - case 2: *++to = 0; - case 1: *++to = 0; - }while(--n>0); - } -#endif -#endif -} -/// This Debug helper function checks an array is all zero -inline void -CoinCheckDoubleZero(double * to, const int size) -{ - int n=0; - for (int j=0;j inline void -CoinZero(register T* first, register T* last) -{ - CoinZeroN(first, last - first); -} - -//############################################################################# - -/** Returns strdup or NULL if original NULL */ -inline char * CoinStrdup(const char * name) -{ - char* dup = NULL; - if (name) { - const int len = static_cast(strlen(name)); - dup = static_cast(malloc(len+1)); - CoinMemcpyN(name, len, dup); - dup[len] = 0; - } - return dup; -} - -//############################################################################# - -/** Return the larger (according to operator<() of the arguments. - This function was introduced because for some reason compiler tend to - handle the max() function differently. */ -template inline T -CoinMax(register const T x1, register const T x2) -{ - return (x1 > x2) ? x1 : x2; -} - -//----------------------------------------------------------------------------- - -/** Return the smaller (according to operator<() of the arguments. - This function was introduced because for some reason compiler tend to - handle the min() function differently. */ -template inline T -CoinMin(register const T x1, register const T x2) -{ - return (x1 < x2) ? x1 : x2; -} - -//----------------------------------------------------------------------------- - -/** Return the absolute value of the argument. This function was introduced - because for some reason compiler tend to handle the abs() function - differently. */ -template inline T -CoinAbs(const T value) -{ - return value<0 ? -value : value; -} - -//############################################################################# - -/** This helper function tests whether the entries of an array are sorted - according to operator<. The array is given by a pointer to its first entry - and by its size. */ -template inline bool -CoinIsSorted(register const T* first, const int size) -{ - if (size == 0) - return true; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("negative number of entries", "CoinIsSorted", ""); -#endif -#if 1 - // size1 is the number of comparisons to be made - const int size1 = size - 1; - for (register int n = size1 / 8; n > 0; --n, first += 8) { - if (first[8] < first[7]) return false; - if (first[7] < first[6]) return false; - if (first[6] < first[5]) return false; - if (first[5] < first[4]) return false; - if (first[4] < first[3]) return false; - if (first[3] < first[2]) return false; - if (first[2] < first[1]) return false; - if (first[1] < first[0]) return false; - } - - switch (size1 % 8) { - case 7: if (first[7] < first[6]) return false; - case 6: if (first[6] < first[5]) return false; - case 5: if (first[5] < first[4]) return false; - case 4: if (first[4] < first[3]) return false; - case 3: if (first[3] < first[2]) return false; - case 2: if (first[2] < first[1]) return false; - case 1: if (first[1] < first[0]) return false; - case 0: break; - } -#else - register const T* next = first; - register const T* last = first + size; - for (++next; next != last; first = next, ++next) - if (*next < *first) - return false; -#endif - return true; -} - -//----------------------------------------------------------------------------- - -/** This helper function tests whether the entries of an array are sorted - according to operator<. The array is given by its first and "after - last" entry. */ -template inline bool -CoinIsSorted(register const T* first, register const T* last) -{ - return CoinIsSorted(first, static_cast(last - first)); -} - -//############################################################################# - -/** This helper function fills an array with the values init, init+1, init+2, - etc. For speed 8 entries are filled at a time. The array is given by a - pointer to its first entry and its size. */ -template inline void -CoinIotaN(register T* first, const int size, register T init) -{ - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("negative number of entries", "CoinIotaN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, first += 8, init += 8) { - first[0] = init; - first[1] = init + 1; - first[2] = init + 2; - first[3] = init + 3; - first[4] = init + 4; - first[5] = init + 5; - first[6] = init + 6; - first[7] = init + 7; - } - switch (size % 8) { - case 7: first[6] = init + 6; - case 6: first[5] = init + 5; - case 5: first[4] = init + 4; - case 4: first[3] = init + 3; - case 3: first[2] = init + 2; - case 2: first[1] = init + 1; - case 1: first[0] = init; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --first; - --init; - switch (size % 8) { - case 0: do{ *++first = ++init; - case 7: *++first = ++init; - case 6: *++first = ++init; - case 5: *++first = ++init; - case 4: *++first = ++init; - case 3: *++first = ++init; - case 2: *++first = ++init; - case 1: *++first = ++init; - }while(--n>0); - } -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function fills an array with the values init, init+1, init+2, - etc. For speed 8 entries are filled at a time. The array is given by its - first and "after last" entry. */ -template inline void -CoinIota(T* first, const T* last, T init) -{ - CoinIotaN(first, last-first, init); -} - -//############################################################################# - -/** This helper function deletes certain entries from an array. The array is - given by pointers to its first and "after last" entry (first two - arguments). The positions of the entries to be deleted are given in the - integer array specified by the last two arguments (again, first and "after - last" entry). */ -template inline T * -CoinDeleteEntriesFromArray(register T * arrayFirst, register T * arrayLast, - const int * firstDelPos, const int * lastDelPos) -{ - int delNum = static_cast(lastDelPos - firstDelPos); - if (delNum == 0) - return arrayLast; - - if (delNum < 0) - throw CoinError("trying to delete negative number of entries", - "CoinDeleteEntriesFromArray", ""); - - int * delSortedPos = NULL; - if (! (CoinIsSorted(firstDelPos, lastDelPos) && - std::adjacent_find(firstDelPos, lastDelPos) == lastDelPos)) { - // the positions of the to be deleted is either not sorted or not unique - delSortedPos = new int[delNum]; - CoinDisjointCopy(firstDelPos, lastDelPos, delSortedPos); - std::sort(delSortedPos, delSortedPos + delNum); - delNum = static_cast(std::unique(delSortedPos, - delSortedPos+delNum) - delSortedPos); - } - const int * delSorted = delSortedPos ? delSortedPos : firstDelPos; - - const int last = delNum - 1; - int size = delSorted[0]; - for (int i = 0; i < last; ++i) { - const int copyFirst = delSorted[i] + 1; - const int copyLast = delSorted[i+1]; - CoinCopy(arrayFirst + copyFirst, arrayFirst + copyLast, - arrayFirst + size); - size += copyLast - copyFirst; - } - const int copyFirst = delSorted[last] + 1; - const int copyLast = static_cast(arrayLast - arrayFirst); - CoinCopy(arrayFirst + copyFirst, arrayFirst + copyLast, - arrayFirst + size); - size += copyLast - copyFirst; - - if (delSortedPos) - delete[] delSortedPos; - - return arrayFirst + size; -} - -//############################################################################# - -#define COIN_OWN_RANDOM_32 - -#if defined COIN_OWN_RANDOM_32 -/* Thanks to Stefano Gliozzi for providing an operating system - independent random number generator. */ - -/*! \brief Return a random number between 0 and 1 - - A platform-independent linear congruential generator. For a given seed, the - generated sequence is always the same regardless of the (32-bit) - architecture. This allows to build & test in different environments, getting - in most cases the same optimization path. - - Set \p isSeed to true and supply an integer seed to set the seed - (vid. #CoinSeedRandom) - - \todo Anyone want to volunteer an upgrade for 64-bit architectures? -*/ -inline double CoinDrand48 (bool isSeed = false, unsigned int seed = 1) -{ - static unsigned int last = 123456; - if (isSeed) { - last = seed; - } else { - last = 1664525*last+1013904223; - return ((static_cast (last))/4294967296.0); - } - return (0.0); -} - -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) -{ - CoinDrand48(true, iseed); -} - -#else // COIN_OWN_RANDOM_32 - -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN32__) - -/// Return a random number between 0 and 1 -inline double CoinDrand48() { return rand() / (double) RAND_MAX; } -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) { srand(iseed + 69822); } - -#else - -/// Return a random number between 0 and 1 -inline double CoinDrand48() { return drand48(); } -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) { srand48(iseed + 69822); } - -#endif - -#endif // COIN_OWN_RANDOM_32 - -//############################################################################# - -/** This function figures out whether file names should contain slashes or - backslashes as directory separator */ -inline char CoinFindDirSeparator() -{ - int size = 1000; - char* buf = 0; - while (true) { - buf = new char[size]; - if (getcwd(buf, size)) - break; - delete[] buf; - buf = 0; - size = 2*size; - } - // if first char is '/' then it's unix and the dirsep is '/'. otherwise we - // assume it's dos and the dirsep is '\' - char dirsep = buf[0] == '/' ? '/' : '\\'; - delete[] buf; - return dirsep; -} -//############################################################################# - -inline int CoinStrNCaseCmp(const char* s0, const char* s1, - const size_t len) -{ - for (size_t i = 0; i < len; ++i) { - if (s0[i] == 0) { - return s1[i] == 0 ? 0 : -1; - } - if (s1[i] == 0) { - return 1; - } - const int c0 = std::tolower(s0[i]); - const int c1 = std::tolower(s1[i]); - if (c0 < c1) - return -1; - if (c0 > c1) - return 1; - } - return 0; -} - -//############################################################################# - -/// Swap the arguments. -template inline void CoinSwap (T &x, T &y) -{ - T t = x; - x = y; - y = t; -} - -//############################################################################# - -/** This helper function copies an array to file - Returns 0 if OK, 1 if bad write. -*/ - -template inline int -CoinToFile( const T* array, CoinBigIndex size, FILE * fp) -{ - CoinBigIndex numberWritten; - if (array&&size) { - numberWritten = - static_cast(fwrite(&size,sizeof(int),1,fp)); - if (numberWritten!=1) - return 1; - numberWritten = - static_cast(fwrite(array,sizeof(T),size_t(size),fp)); - if (numberWritten!=size) - return 1; - } else { - size = 0; - numberWritten = - static_cast(fwrite(&size,sizeof(int),1,fp)); - if (numberWritten!=1) - return 1; - } - return 0; -} - -//############################################################################# - -/** This helper function copies an array from file and creates with new. - Passed in array is ignored i.e. not deleted. - But if NULL and size does not match and newSize 0 then leaves as NULL and 0 - Returns 0 if OK, 1 if bad read, 2 if size did not match. -*/ - -template inline int -CoinFromFile( T* &array, CoinBigIndex size, FILE * fp, CoinBigIndex & newSize) -{ - CoinBigIndex numberRead; - numberRead = - static_cast(fread(&newSize,sizeof(int),1,fp)); - if (numberRead!=1) - return 1; - int returnCode=0; - if (size!=newSize&&(newSize||array)) - returnCode=2; - if (newSize) { - array = new T [newSize]; - numberRead = - static_cast(fread(array,sizeof(T),newSize,fp)); - if (numberRead!=newSize) - returnCode=1; - } else { - array = NULL; - } - return returnCode; -} - -//############################################################################# - -/// Cube Root -#if 0 -inline double CoinCbrt(double x) -{ -#if defined(_MSC_VER) - return pow(x,(1./3.)); -#else - return cbrt(x); -#endif -} -#endif - -//----------------------------------------------------------------------------- - -/// This helper returns "sizeof" as an int -#define CoinSizeofAsInt(type) (static_cast(sizeof(type))) -/// This helper returns "strlen" as an int -inline int -CoinStrlenAsInt(const char * string) -{ - return static_cast(strlen(string)); -} - -/** Class for thread specific random numbers -*/ -#if defined COIN_OWN_RANDOM_32 -class CoinThreadRandom { -public: - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - CoinThreadRandom() - { seed_=12345678;} - /** Constructor wih seed. */ - CoinThreadRandom(int seed) - { - seed_ = seed; - } - /** Destructor */ - ~CoinThreadRandom() {} - // Copy - CoinThreadRandom(const CoinThreadRandom & rhs) - { seed_ = rhs.seed_;} - // Assignment - CoinThreadRandom& operator=(const CoinThreadRandom & rhs) - { - if (this != &rhs) { - seed_ = rhs.seed_; - } - return *this; - } - - //@} - - /**@name Sets/gets */ - - //@{ - /** Set seed. */ - inline void setSeed(int seed) - { - seed_ = seed; - } - /** Get seed. */ - inline unsigned int getSeed() const - { - return seed_; - } - /// return a random number - inline double randomDouble() const - { - double retVal; - seed_ = 1664525*(seed_)+1013904223; - retVal = ((static_cast (seed_))/4294967296.0); - return retVal; - } - /// make more random (i.e. for startup) - inline void randomize(int n=0) - { - if (!n) - n=seed_ & 255; - for (int i=0;i -#include "CoinFinite.hpp" -#ifndef CLP_NO_VECTOR -#include "CoinPackedVectorBase.hpp" -#endif -#include "CoinSort.hpp" -#include "CoinHelperFunctions.hpp" -#include - -#ifndef COIN_FLOAT -#define COIN_INDEXED_TINY_ELEMENT 1.0e-50 -#define COIN_INDEXED_REALLY_TINY_ELEMENT 1.0e-100 -#else -#define COIN_INDEXED_TINY_ELEMENT 1.0e-35 -#define COIN_INDEXED_REALLY_TINY_ELEMENT 1.0e-39 -#endif - -/** Indexed Vector - -This stores values unpacked but apart from that is a bit like CoinPackedVector. -It is designed to be lightweight in normal use. - -It now has a "packed" mode when it is even more like CoinPackedVector - -Indices array has capacity_ extra chars which are zeroed and can -be used for any purpose - but must be re-zeroed - -Stores vector of indices and associated element values. -Supports sorting of indices. - -Does not support negative indices. - -Does NOT support testing for duplicates - -*** getElements is no longer supported - -Here is a sample usage: -@verbatim - const int ne = 4; - int inx[ne] = { 1, 4, 0, 2 } - double el[ne] = { 10., 40., 1., 50. } - - // Create vector and set its valuex1 - CoinIndexedVector r(ne,inx,el); - - // access as a full storage vector - assert( r[ 0]==1. ); - assert( r[ 1]==10.); - assert( r[ 2]==50.); - assert( r[ 3]==0. ); - assert( r[ 4]==40.); - - // sort Elements in increasing order - r.sortIncrElement(); - - // access each index and element - assert( r.getIndices ()[0]== 0 ); - assert( r.getIndices ()[1]== 1 ); - assert( r.getIndices ()[2]== 4 ); - assert( r.getIndices ()[3]== 2 ); - - // access as a full storage vector - assert( r[ 0]==1. ); - assert( r[ 1]==10.); - assert( r[ 2]==50.); - assert( r[ 3]==0. ); - assert( r[ 4]==40.); - - // Tests for equality and equivalence - CoinIndexedVector r1; - r1=r; - assert( r==r1 ); - assert( r.equivalent(r1) ); - r.sortIncrElement(); - assert( r!=r1 ); - assert( r.equivalent(r1) ); - - // Add indexed vectors. - // Similarly for subtraction, multiplication, - // and division. - CoinIndexedVector add = r + r1; - assert( add[0] == 1.+ 1. ); - assert( add[1] == 10.+10. ); - assert( add[2] == 50.+50. ); - assert( add[3] == 0.+ 0. ); - assert( add[4] == 40.+40. ); - - assert( r.sum() == 10.+40.+1.+50. ); -@endverbatim -*/ -class CoinIndexedVector { - friend void CoinIndexedVectorUnitTest(); - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getNumElements() const { return nElements_; } - /// Get indices of elements - inline const int * getIndices() const { return indices_; } - /// Get element values - // ** No longer supported virtual const double * getElements() const ; - /// Get indices of elements - inline int * getIndices() { return indices_; } - /** Get the vector as a dense vector. This is normal storage method. - The user should not not delete [] this. - */ - inline double * denseVector() const { return elements_; } - /// For very temporary use when user needs to borrow a dense vector - inline void setDenseVector(double * array) - { elements_ = array;} - /// For very temporary use when user needs to borrow an index vector - inline void setIndexVector(int * array) - { indices_ = array;} - /** Access the i'th element of the full storage vector. - */ - double & operator[](int i) const; - - //@} - - //------------------------------------------------------------------- - // Set indices and elements - //------------------------------------------------------------------- - /**@name Set methods */ - //@{ - /// Set the size - inline void setNumElements(int value) { nElements_ = value; - if (!nElements_) packedMode_=false;} - /// Reset the vector (as if were just created an empty vector). This leaves arrays! - void clear(); - /// Reset the vector (as if were just created an empty vector) - void empty(); - /** Assignment operator. */ - CoinIndexedVector & operator=(const CoinIndexedVector &); -#ifndef CLP_NO_VECTOR - /** Assignment operator from a CoinPackedVectorBase.
      - NOTE: This assumes no duplicates */ - CoinIndexedVector & operator=(const CoinPackedVectorBase & rhs); -#endif - /** Copy the contents of one vector into another. If multiplier is 1 - It is the equivalent of = but if vectors are same size does - not re-allocate memory just clears and copies */ - void copy(const CoinIndexedVector & rhs, double multiplier=1.0); - - /** Borrow ownership of the arguments to this vector. - Size is the length of the unpacked elements vector. */ - void borrowVector(int size, int numberIndices, int* inds, double* elems); - - /** Return ownership of the arguments to this vector. - State after is empty . - */ - void returnVector(); - - /** Set vector numberIndices, indices, and elements. - NumberIndices is the length of both the indices and elements vectors. - The indices and elements vectors are copied into this class instance's - member data. Assumed to have no duplicates */ - void setVector(int numberIndices, const int * inds, const double * elems); - - /** Set vector size, indices, and elements. - Size is the length of the unpacked elements vector. - The indices and elements vectors are copied into this class instance's - member data. We do not check for duplicate indices */ - void setVector(int size, int numberIndices, const int * inds, const double * elems); - - /** Elements set to have the same scalar value */ - void setConstant(int size, const int * inds, double elems); - - /** Indices are not specified and are taken to be 0,1,...,size-1 */ - void setFull(int size, const double * elems); - - /** Set an existing element in the indexed vector - The first argument is the "index" into the elements() array - */ - void setElement(int index, double element); - - /// Insert an element into the vector - void insert(int index, double element); - /// Insert a nonzero element into the vector - inline void quickInsert(int index, double element) - { - assert (!elements_[index]); - indices_[nElements_++] = index; - assert (nElements_<=capacity_); - elements_[index] = element; - } - /** Insert or if exists add an element into the vector - Any resulting zero elements will be made tiny */ - void add(int index, double element); - /** Insert or if exists add an element into the vector - Any resulting zero elements will be made tiny. - This version does no checking */ - inline void quickAdd(int index, double element) - { - if (elements_[index]) { - element += elements_[index]; - if ((element > 0 ? element : -element) >= COIN_INDEXED_TINY_ELEMENT) { - elements_[index] = element; - } else { - elements_[index] = 1.0e-100; - } - } else if ((element > 0 ? element : -element) >= COIN_INDEXED_TINY_ELEMENT) { - indices_[nElements_++] = index; - assert (nElements_<=capacity_); - elements_[index] = element; - } - } - /** Insert or if exists add an element into the vector - Any resulting zero elements will be made tiny. - This knows element is nonzero - This version does no checking */ - inline void quickAddNonZero(int index, double element) - { - assert (element); - if (elements_[index]) { - element += elements_[index]; - if ((element > 0 ? element : -element) >= COIN_INDEXED_TINY_ELEMENT) { - elements_[index] = element; - } else { - elements_[index] = COIN_DBL_MIN; - } - } else { - indices_[nElements_++] = index; - assert (nElements_<=capacity_); - elements_[index] = element; - } - } - /** Makes nonzero tiny. - This version does no checking */ - inline void zero(int index) - { - if (elements_[index]) - elements_[index] = COIN_DBL_MIN; - } - /** set all small values to zero and return number remaining - - < tolerance => 0.0 */ - int clean(double tolerance); - /// Same but packs down - int cleanAndPack(double tolerance); - /// Same but packs down and is safe (i.e. if order is odd) - int cleanAndPackSafe(double tolerance); - /// Mark as packed - inline void setPacked() - { packedMode_ = true;} -#ifndef NDEBUG - /// For debug check vector is clear i.e. no elements - void checkClear(); - /// For debug check vector is clean i.e. elements match indices - void checkClean(); -#else - inline void checkClear() {}; - inline void checkClean() {}; -#endif - /// Scan dense region and set up indices (returns number found) - int scan(); - /** Scan dense region from start to < end and set up indices - returns number found - */ - int scan(int start, int end); - /** Scan dense region and set up indices (returns number found). - Only ones >= tolerance */ - int scan(double tolerance); - /** Scan dense region from start to < end and set up indices - returns number found. Only >= tolerance - */ - int scan(int start, int end, double tolerance); - /// These are same but pack down - int scanAndPack(); - int scanAndPack(int start, int end); - int scanAndPack(double tolerance); - int scanAndPack(int start, int end, double tolerance); - /// Create packed array - void createPacked(int number, const int * indices, - const double * elements); - /// Create unpacked array - void createUnpacked(int number, const int * indices, - const double * elements); - /// Create unpacked singleton - void createOneUnpackedElement(int index, double element); - /// This is mainly for testing - goes from packed to indexed - void expand(); -#ifndef CLP_NO_VECTOR - /// Append a CoinPackedVector to the end - void append(const CoinPackedVectorBase & caboose); -#endif - /// Append a CoinIndexedVector to the end (with extra space) - void append(const CoinIndexedVector & caboose); - /// Append a CoinIndexedVector to the end and modify indices - void append(CoinIndexedVector & other,int adjustIndex,bool zapElements=false); - - /// Swap values in positions i and j of indices and elements - void swap(int i, int j); - - /// Throw away all entries in rows >= newSize - void truncate(int newSize); - /// Print out - void print() const; - //@} - /**@name Arithmetic operators. */ - //@{ - /// add value to every entry - void operator+=(double value); - /// subtract value from every entry - void operator-=(double value); - /// multiply every entry by value - void operator*=(double value); - /// divide every entry by value (** 0 vanishes) - void operator/=(double value); - //@} - - /**@name Comparison operators on two indexed vectors */ - //@{ -#ifndef CLP_NO_VECTOR - /** Equal. Returns true if vectors have same length and corresponding - element of each vector is equal. */ - bool operator==(const CoinPackedVectorBase & rhs) const; - /// Not equal - bool operator!=(const CoinPackedVectorBase & rhs) const; -#endif - /** Equal. Returns true if vectors have same length and corresponding - element of each vector is equal. */ - bool operator==(const CoinIndexedVector & rhs) const; - /// Not equal - bool operator!=(const CoinIndexedVector & rhs) const; - /// Equal with a tolerance (returns -1 or position of inequality). - int isApproximatelyEqual(const CoinIndexedVector & rhs, double tolerance=1.0e-8) const; - //@} - - /**@name Index methods */ - //@{ - /// Get value of maximum index - int getMaxIndex() const; - /// Get value of minimum index - int getMinIndex() const; - //@} - - - /**@name Sorting */ - //@{ - /** Sort the indexed storage vector (increasing indices). */ - void sort() - { std::sort(indices_,indices_+nElements_); } - - void sortIncrIndex() - { std::sort(indices_,indices_+nElements_); } - - void sortDecrIndex(); - - void sortIncrElement(); - - void sortDecrElement(); - void sortPacked(); - - //@} - - //############################################################################# - - /**@name Arithmetic operators on packed vectors. - - NOTE: These methods operate on those positions where at - least one of the arguments has a value listed. At those positions the - appropriate operation is executed, Otherwise the result of the operation is - considered 0.
      - NOTE 2: Because these methods return an object (they can't - return a reference, though they could return a pointer...) they are - very inefficient... - */ -//@{ -/// Return the sum of two indexed vectors -CoinIndexedVector operator+( - const CoinIndexedVector& op2); - -/// Return the difference of two indexed vectors -CoinIndexedVector operator-( - const CoinIndexedVector& op2); - -/// Return the element-wise product of two indexed vectors -CoinIndexedVector operator*( - const CoinIndexedVector& op2); - -/// Return the element-wise ratio of two indexed vectors (0.0/0.0 => 0.0) (0 vanishes) -CoinIndexedVector operator/( - const CoinIndexedVector& op2); -/// The sum of two indexed vectors -void operator+=(const CoinIndexedVector& op2); - -/// The difference of two indexed vectors -void operator-=( const CoinIndexedVector& op2); - -/// The element-wise product of two indexed vectors -void operator*=(const CoinIndexedVector& op2); - -/// The element-wise ratio of two indexed vectors (0.0/0.0 => 0.0) (0 vanishes) -void operator/=(const CoinIndexedVector& op2); -//@} - - /**@name Memory usage */ - //@{ - /** Reserve space. - If one knows the eventual size of the indexed vector, - then it may be more efficient to reserve the space. - */ - void reserve(int n); - /** capacity returns the size which could be accomodated without - having to reallocate storage. - */ - inline int capacity() const { return capacity_; } - inline void setCapacity(int value) - { capacity_ = value; } - /// Sets packed mode - inline void setPackedMode(bool yesNo) - { packedMode_=yesNo;} - /// Gets packed mode - inline bool packedMode() const - { return packedMode_;} - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor */ - CoinIndexedVector(); - /** Alternate Constructors - set elements to vector of doubles */ - CoinIndexedVector(int size, const int * inds, const double * elems); - /** Alternate Constructors - set elements to same scalar value */ - CoinIndexedVector(int size, const int * inds, double element); - /** Alternate Constructors - construct full storage with indices 0 through - size-1. */ - CoinIndexedVector(int size, const double * elements); - /** Alternate Constructors - just size */ - CoinIndexedVector(int size); - /** Copy constructor. */ - CoinIndexedVector(const CoinIndexedVector &); - /** Copy constructor.2 */ - CoinIndexedVector(const CoinIndexedVector *); -#ifndef CLP_NO_VECTOR - /** Copy constructor from a PackedVectorBase. */ - CoinIndexedVector(const CoinPackedVectorBase & rhs); -#endif - /** Destructor */ - ~CoinIndexedVector (); - //@} - -private: - /**@name Private methods */ - //@{ - /// Copy internal data - void gutsOfSetVector(int size, - const int * inds, const double * elems); - void gutsOfSetVector(int size, int numberIndices, - const int * inds, const double * elems); - void gutsOfSetPackedVector(int size, int numberIndices, - const int * inds, const double * elems); - /// - void gutsOfSetConstant(int size, - const int * inds, double value); - //@} - -protected: - /**@name Private member data */ - //@{ - /// Vector indices - int * indices_; - ///Vector elements - double * elements_; - /// Size of indices and packed elements vectors - int nElements_; - /// Amount of memory allocated for indices_, and elements_. - int capacity_; - /// Offset to get where new allocated array - int offset_; - /// If true then is operating in packed mode - bool packedMode_; - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CoinIndexedVector class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void -CoinIndexedVectorUnitTest(); -/** Pointer with length in bytes - - This has a pointer to an array and the number of bytes in array. - If number of bytes==-1 then - CoinConditionalNew deletes existing pointer and returns new pointer - of correct size (and number bytes still -1). - CoinConditionalDelete deletes existing pointer and NULLs it. - So behavior is as normal (apart from New deleting pointer which will have - no effect with good coding practices. - If number of bytes >=0 then - CoinConditionalNew just returns existing pointer if array big enough - otherwise deletes existing pointer, allocates array with spare 1%+64 bytes - and updates number of bytes - CoinConditionalDelete sets number of bytes = -size-2 and then array - returns NULL -*/ -class CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_; } - /// Get the size - inline int rawSize() const - { return size_; } - /// See if persistence already on - inline bool switchedOn() const - { return size_!=-1; } - /// Get the capacity (just read it) - inline int capacity() const - { return (size_>-2) ? size_ : (-size_)-2; } - /// Set the capacity to >=0 if <=-2 - inline void setCapacity() - { if (size_<=-2) size_ = (-size_)-2; } - /// Get Array - inline const char * array() const - { return (size_>-2) ? array_ : NULL; } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value; } - /// Set the size to -1 - inline void switchOff() - { size_ = -1; } - /// Set the size to -2 and alignment - inline void switchOn(int alignment=3) - { size_ = -2; alignment_=alignment;} - /// Does what is needed to set persistence - void setPersistence(int flag,int currentLength); - /// Zero out array - void clear(); - /// Swaps memory between two members - void swap(CoinArrayWithLength & other); - /// Extend a persistent array keeping data (size in bytes) - void extend(int newSize); - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - char * conditionalNew(long sizeWanted); - /// Conditionally deletes - void conditionalDelete(); - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinArrayWithLength() - : array_(NULL),size_(-1),offset_(0),alignment_(0) - { } - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinArrayWithLength(int size) - : size_(-1),offset_(0),alignment_(0) - { array_=new char [size];} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - mode>0 size_ set to size and zeroed - if size<=0 just does alignment - If abs(mode) >2 then align on that as power of 2 - */ - CoinArrayWithLength(int size, int mode); - /** Copy constructor. */ - CoinArrayWithLength(const CoinArrayWithLength & rhs); - /** Copy constructor.2 */ - CoinArrayWithLength(const CoinArrayWithLength * rhs); - /** Assignment operator. */ - CoinArrayWithLength& operator=(const CoinArrayWithLength & rhs); - /** Assignment with length (if -1 use internal length) */ - void copy(const CoinArrayWithLength & rhs, int numberBytes=-1); - /** Assignment with length - does not copy */ - void allocate(const CoinArrayWithLength & rhs, int numberBytes); - /** Destructor */ - ~CoinArrayWithLength (); - /// Get array with alignment - void getArray(int size); - /// Really get rid of array with alignment - void reallyFreeArray(); - /// Get enough space (if more needed then do at least needed) - void getCapacity(int numberBytes,int numberIfNeeded=-1); - //@} - -protected: - /**@name Private member data */ - //@{ - /// Array - char * array_; - /// Size of array in bytes - CoinBigIndex size_; - /// Offset of array - int offset_; - /// Alignment wanted (power of 2) - int alignment_; - //@} -}; -/// double * version - -class CoinDoubleArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(double); } - /// Get Array - inline double * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(double); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline double * conditionalNew(int sizeWanted) - { return reinterpret_cast ( CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast ((sizeWanted)*CoinSizeofAsInt(double)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinDoubleArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinDoubleArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(double)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinDoubleArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(double),mode) {} - /** Copy constructor. */ - inline CoinDoubleArrayWithLength(const CoinDoubleArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinDoubleArrayWithLength(const CoinDoubleArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinDoubleArrayWithLength& operator=(const CoinDoubleArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// CoinFactorizationDouble * version - -class CoinFactorizationDoubleArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(CoinFactorizationDouble); } - /// Get Array - inline CoinFactorizationDouble * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(CoinFactorizationDouble); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline CoinFactorizationDouble * conditionalNew(int sizeWanted) - { return reinterpret_cast (CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast (( sizeWanted)*CoinSizeofAsInt(CoinFactorizationDouble)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinFactorizationDoubleArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinFactorizationDoubleArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(CoinFactorizationDouble)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinFactorizationDoubleArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(CoinFactorizationDouble),mode) {} - /** Copy constructor. */ - inline CoinFactorizationDoubleArrayWithLength(const CoinFactorizationDoubleArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinFactorizationDoubleArrayWithLength(const CoinFactorizationDoubleArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinFactorizationDoubleArrayWithLength& operator=(const CoinFactorizationDoubleArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// CoinFactorizationLongDouble * version - -class CoinFactorizationLongDoubleArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(long double); } - /// Get Array - inline long double * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(long double); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline long double * conditionalNew(int sizeWanted) - { return reinterpret_cast (CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast (( sizeWanted)*CoinSizeofAsInt(long double)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinFactorizationLongDoubleArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinFactorizationLongDoubleArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(long double)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinFactorizationLongDoubleArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(long double),mode) {} - /** Copy constructor. */ - inline CoinFactorizationLongDoubleArrayWithLength(const CoinFactorizationLongDoubleArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinFactorizationLongDoubleArrayWithLength(const CoinFactorizationLongDoubleArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinFactorizationLongDoubleArrayWithLength& operator=(const CoinFactorizationLongDoubleArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// int * version - -class CoinIntArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(int); } - /// Get Array - inline int * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(int); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline int * conditionalNew(int sizeWanted) - { return reinterpret_cast (CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast (( sizeWanted)*CoinSizeofAsInt(int)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinIntArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinIntArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(int)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinIntArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(int),mode) {} - /** Copy constructor. */ - inline CoinIntArrayWithLength(const CoinIntArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinIntArrayWithLength(const CoinIntArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinIntArrayWithLength& operator=(const CoinIntArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// CoinBigIndex * version - -class CoinBigIndexArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(CoinBigIndex); } - /// Get Array - inline CoinBigIndex * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(CoinBigIndex); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline CoinBigIndex * conditionalNew(int sizeWanted) - { return reinterpret_cast (CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast (( sizeWanted)*CoinSizeofAsInt(CoinBigIndex)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinBigIndexArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinBigIndexArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(CoinBigIndex)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinBigIndexArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(CoinBigIndex),mode) {} - /** Copy constructor. */ - inline CoinBigIndexArrayWithLength(const CoinBigIndexArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinBigIndexArrayWithLength(const CoinBigIndexArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinBigIndexArrayWithLength& operator=(const CoinBigIndexArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// unsigned int * version - -class CoinUnsignedIntArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(unsigned int); } - /// Get Array - inline unsigned int * array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(unsigned int); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline unsigned int * conditionalNew(int sizeWanted) - { return reinterpret_cast (CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast (( sizeWanted)*CoinSizeofAsInt(unsigned int)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinUnsignedIntArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinUnsignedIntArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(unsigned int)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinUnsignedIntArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(unsigned int),mode) {} - /** Copy constructor. */ - inline CoinUnsignedIntArrayWithLength(const CoinUnsignedIntArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinUnsignedIntArrayWithLength(const CoinUnsignedIntArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinUnsignedIntArrayWithLength& operator=(const CoinUnsignedIntArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// void * version - -class CoinVoidStarArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/CoinSizeofAsInt(void *); } - /// Get Array - inline void ** array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*CoinSizeofAsInt(void *); } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline void ** conditionalNew(int sizeWanted) - { return reinterpret_cast ( CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast ((sizeWanted)*CoinSizeofAsInt(void *)) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinVoidStarArrayWithLength() - { array_=NULL; size_=-1;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinVoidStarArrayWithLength(int size) - { array_=new char [size*CoinSizeofAsInt(void *)]; size_=-1;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinVoidStarArrayWithLength(int size, int mode) - : CoinArrayWithLength(size*CoinSizeofAsInt(void *),mode) {} - /** Copy constructor. */ - inline CoinVoidStarArrayWithLength(const CoinVoidStarArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinVoidStarArrayWithLength(const CoinVoidStarArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinVoidStarArrayWithLength& operator=(const CoinVoidStarArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} -}; -/// arbitrary version - -class CoinArbitraryArrayWithLength : public CoinArrayWithLength { - -public: - /**@name Get methods. */ - //@{ - /// Get the size - inline int getSize() const - { return size_/lengthInBytes_; } - /// Get Array - inline void ** array() const - { return reinterpret_cast ((size_>-2) ? array_ : NULL); } - //@} - - /**@name Set methods */ - //@{ - /// Set the size - inline void setSize(int value) - { size_ = value*lengthInBytes_; } - //@} - - /**@name Condition methods */ - //@{ - /// Conditionally gets new array - inline char * conditionalNew(int length, int sizeWanted) - { lengthInBytes_=length;return reinterpret_cast ( CoinArrayWithLength::conditionalNew(sizeWanted>=0 ? static_cast - ((sizeWanted)*lengthInBytes_) : -1)); } - //@} - - /**@name Constructors and destructors */ - //@{ - /** Default constructor - NULL*/ - inline CoinArbitraryArrayWithLength(int length=1) - { array_=NULL; size_=-1;lengthInBytes_=length;} - /** Alternate Constructor - length in bytes - size_ -1 */ - inline CoinArbitraryArrayWithLength(int length, int size) - { array_=new char [size*length]; size_=-1; lengthInBytes_=length;} - /** Alternate Constructor - length in bytes - mode - 0 size_ set to size - 1 size_ set to size and zeroed - */ - inline CoinArbitraryArrayWithLength(int length, int size, int mode) - : CoinArrayWithLength(size*length,mode) {lengthInBytes_=length;} - /** Copy constructor. */ - inline CoinArbitraryArrayWithLength(const CoinArbitraryArrayWithLength & rhs) - : CoinArrayWithLength(rhs) {} - /** Copy constructor.2 */ - inline CoinArbitraryArrayWithLength(const CoinArbitraryArrayWithLength * rhs) - : CoinArrayWithLength(rhs) {} - /** Assignment operator. */ - inline CoinArbitraryArrayWithLength& operator=(const CoinArbitraryArrayWithLength & rhs) - { CoinArrayWithLength::operator=(rhs); return *this;} - //@} - -protected: - /**@name Private member data */ - //@{ - /// Length in bytes - int lengthInBytes_; - //@} -}; -class CoinPartitionedVector : public CoinIndexedVector { - -public: -#ifndef COIN_PARTITIONS -#define COIN_PARTITIONS 8 -#endif - /**@name Get methods. */ - //@{ - /// Get the size of a partition - inline int getNumElements(int partition) const { assert (partition - -#include "CoinPackedMatrix.hpp" -#include "CoinMessage.hpp" -class CoinSet; - -const int MAX_OBJECTIVES = 2; - -typedef int COINColumnIndex; - - /** Class to read and write Lp files - - Lp file format: - -/ this is a comment
      -\ this too
      - Min
      - obj: x0 + x1 + 3 x2 - 4.5 xyr + 1
      - s.t.
      - cons1: x0 - x2 - 2.3 x4 <= 4.2 / this is another comment
      - c2: x1 + x2 >= 1
      - cc: x1 + x2 + xyr = 2
      - Bounds
      - 0 <= x1 <= 3
      - 1 >= x2
      - x3 = 1
      - -2 <= x4 <= Inf
      - xyr free
      - Integers
      - x0
      - Generals
      - x1 xyr
      - Binaries
      - x2
      - End - -Notes:

        -
      • Keywords are: Min, Max, Minimize, Maximize, s.t., Subject To, - Bounds, Integers, Generals, Binaries, End, Free, Inf. -
      • Keywords are not case sensitive and may be in plural or singular form. - They should not be used as objective, row or column names. -
      • Bounds, Integers, Generals, Binaries sections are optional. -
      • Generals and Integers are synonymous. -
      • Bounds section (if any) must come before Integers, Generals, and - Binaries sections. -
      • Row names must be followed by ':' without blank space. - Row names are optional. If row names are present, - they must be distinct (if the k-th constraint has no given name, its name - is set automatically to "consk" for k=0,...,). - For valid row names, see the method is_invalid_name(). -
      • Column names must be followed by a blank space. They must be distinct. - For valid column names, see the method is_invalid_name(). -
      • Multiple objectives may be specified, but when there are multiple - objectives, they must have names (to indicate where each one starts). -
      • The objective function names must be followed by ':' without blank space. - If there is a single objective, the objective function name is optional. - If no name is given, the name is set to "obj" by default. - For valid objective function names, see the method is_invalid_name(). -
      • Ranged constraints are written as two constraints. - If a name is given for a ranged constraint, the upper bound constraint - has that name and the lower bound constraint has that name with "_low" - as suffix. This should be kept in mind when assigning names to ranged - constraint, as the resulting name must be distinct from all the other - names and be considered valid by the method is_invalid_name(). -
      • At most one term related to any single variable may appear in the - objective function; if more than one term are present, only the last - one is taken into account. - At most one constant term may appear in the objective function; - if present, it must appear last. -
      • Default bounds are 0 for lower bound and +infinity for upper bound. -
      • Free variables get default lower bound -infinity and - default upper bound +infinity. Writing "x0 Free" in an - LP file means "set lower bound on x0 to -infinity". -
      • If more than one upper (resp. lower) bound on a variable appears in - the Bounds section, the last one is the one taken into - account. The bounds for a binary variable are set to 0/1 only if this - bound is stronger than the bound obtained from the Bounds section. -
      • Numbers larger than DBL_MAX (or larger than 1e+400) in the input file - might crash the code. -
      • A comment must start with '\' or '/'. That symbol must either be - the first character of a line or be preceded by a blank space. The - comment ends at the end of the - line. Comments are skipped while reading an Lp file and they may be - inserted anywhere. -
      -*/ -class CoinLpIO { - friend void CoinLpIOUnitTest(const std::string & lpDir); -public: - - /**@name Constructor and Destructor */ - //@{ - /// Default Constructor - CoinLpIO(); - - /// Does the heavy lifting for destruct and assignment. - void gutsOfDestructor(); - - /// Does the heavy lifting for copy and assignment - void gutsOfCopy(const CoinLpIO &); - - /// assignment operator - CoinLpIO & operator = (const CoinLpIO& rhs) ; - - /// Copy constructor - CoinLpIO (const CoinLpIO &); - - /// Destructor - ~CoinLpIO(); - - /** Free the vector previous_names_[section] and set - card_previous_names_[section] to 0. - section = 0 for row names, - section = 1 for column names. - */ - void freePreviousNames(const int section); - - /// Free all memory (except memory related to hash tables and objName_). - void freeAll(); - //@} - - /** A quick inlined function to convert from lb/ub style constraint - definition to sense/rhs/range style */ - inline void - convertBoundToSense(const double lower, const double upper, - char& sense, double& right, double& range) const; - - /**@name Queries */ - //@{ - - /// Get the problem name - const char * getProblemName() const; - - /// Set problem name - void setProblemName(const char *name); - - /// Get number of columns - int getNumCols() const; - - /// Get number of rows - int getNumRows() const; - - /// Get number of nonzero elements - int getNumElements() const; - - /// Get pointer to array[getNumCols()] of column lower bounds - const double * getColLower() const; - - /// Get pointer to array[getNumCols()] of column upper bounds - const double * getColUpper() const; - - /// Get pointer to array[getNumRows()] of row lower bounds - const double * getRowLower() const; - - /// Get pointer to array[getNumRows()] of row upper bounds - const double * getRowUpper() const; - /** Get pointer to array[getNumRows()] of constraint senses. -
        -
      • 'L': <= constraint -
      • 'E': = constraint -
      • 'G': >= constraint -
      • 'R': ranged constraint -
      • 'N': free constraint -
      - */ - const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of constraint right-hand sides. - - Given constraints with upper (rowupper) and/or lower (rowlower) bounds, - the constraint right-hand side (rhs) is set as -
        -
      • if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i] -
      • if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'N' then rhs()[i] == 0.0 -
      - */ - const double * getRightHandSide() const; - - /** Get pointer to array[getNumRows()] of row ranges. - - Given constraints with upper (rowupper) and/or lower (rowlower) bounds, - the constraint range (rowrange) is set as -
        -
      • if rowsense()[i] == 'R' then - rowrange()[i] == rowupper()[i] - rowlower()[i] -
      • if rowsense()[i] != 'R' then - rowrange()[i] is 0.0 -
      - Put another way, only ranged constraints have a nontrivial value for - rowrange. - */ - const double * getRowRange() const; - - /// Get pointer to array[getNumCols()] of objective function coefficients - const int getNumObjectives() const; - - /// Get pointer to array[getNumCols()] of objective function coefficients - const double * getObjCoefficients() const; - - /// Get pointer to array[getNumCols()] of objective function coefficients for objective j - const double * getObjCoefficients(int j) const; - - /// Get pointer to row-wise copy of the coefficient matrix - const CoinPackedMatrix * getMatrixByRow() const; - - /// Get pointer to column-wise copy of the coefficient matrix - const CoinPackedMatrix * getMatrixByCol() const; - - /// Get objective function name - const char * getObjName() const; - - /// Get objective function name for objective j - const char * getObjName(int j) const; - - /// Get pointer to array[*card_prev] of previous row names. - /// The value of *card_prev might be different than getNumRows()+1 if - /// non distinct - /// row names were present or if no previous names were saved or if - /// the object was holding a different problem before. - void getPreviousRowNames(char const * const * prev, - int *card_prev) const; - - /// Get pointer to array[*card_prev] of previous column names. - /// The value of *card_prev might be different than getNumCols() if non - /// distinct column names were present of if no previous names were saved, - /// or if the object was holding a different problem before. - void getPreviousColNames(char const * const * prev, - int *card_prev) const; - - /// Get pointer to array[getNumRows()+1] of row names, including - /// objective function name as last entry. - char const * const * getRowNames() const; - - /// Get pointer to array[getNumCols()] of column names - char const * const *getColNames() const; - - /// Return the row name for the specified index. - /// Return the objective function name if index = getNumRows(). - /// Return 0 if the index is out of range or if row names are not defined. - const char * rowName(int index) const; - - /// Return the column name for the specified index. - /// Return 0 if the index is out of range or if column names are not - /// defined. - const char * columnName(int index) const; - - /// Return the index for the specified row name. - /// Return getNumRows() for the objective function name. - /// Return -1 if the name is not found. - int rowIndex(const char * name) const; - - /// Return the index for the specified column name. - /// Return -1 if the name is not found. - int columnIndex(const char * name) const; - - ///Returns the (constant) objective offset - double objectiveOffset() const; - - ///Returns the (constant) objective offset for objective j - double objectiveOffset(int j) const; - - /// Set objective offset - inline void setObjectiveOffset(double value) - { objectiveOffset_[0] = value;} - - /// Set objective offset - inline void setObjectiveOffset(double value, int j) - { objectiveOffset_[j] = value;} - - /// Return true if a column is an integer (binary or general - /// integer) variable - bool isInteger(int columnNumber) const; - - /// Get characteristic vector of integer variables - const char * integerColumns() const; - //@} - - /**@name Parameters */ - //@{ - /// Get infinity - double getInfinity() const; - - /// Set infinity. Any number larger is considered infinity. - /// Default: DBL_MAX - void setInfinity(const double); - - /// Get epsilon - double getEpsilon() const; - - /// Set epsilon. - /// Default: 1e-5. - void setEpsilon(const double); - - /// Get numberAcross, the number of monomials to be printed per line - int getNumberAcross() const; - - /// Set numberAcross. - /// Default: 10. - void setNumberAcross(const int); - - /// Get decimals, the number of digits to write after the decimal point - int getDecimals() const; - - /// Set decimals. - /// Default: 5 - void setDecimals(const int); - //@} - - /**@name Public methods */ - //@{ - /** Set the data of the object. - Set it from the coefficient matrix m, the lower bounds - collb, the upper bounds colub, objective function obj_coeff, - integrality vector integrality, lower/upper bounds on the constraints. - The sense of optimization of the objective function is assumed to be - a minimization. - Numbers larger than DBL_MAX (or larger than 1e+400) - might crash the code. There are two version. The second one is for - setting multiple objectives. - */ - void setLpDataWithoutRowAndColNames( - const CoinPackedMatrix& m, - const double* collb, const double* colub, - const double* obj_coeff, - const char* integrality, - const double* rowlb, const double* rowub); - - void setLpDataWithoutRowAndColNames( - const CoinPackedMatrix& m, - const double* collb, const double* colub, - const double* obj_coeff[MAX_OBJECTIVES], - int num_objectives, - const char* integrality, - const double* rowlb, const double* rowub); - - /** Return 0 if buff is a valid name for a row, a column or objective - function, return a positive number otherwise. - If parameter ranged = true, the name is intended for a ranged - constraint.
      - Return 1 if the name has more than 100 characters (96 characters - for a ranged constraint name, as "_low" will be added to the name).
      - Return 2 if the name starts with a number.
      - Return 3 if the name is not built with - the letters a to z, A to Z, the numbers 0 to 9 or the characters - " ! # $ % & ( ) . ; ? @ _ ' ` { } ~
      - Return 4 if the name is a keyword.
      - Return 5 if the name is empty or NULL. */ - int is_invalid_name(const char *buff, const bool ranged) const; - - /** Return 0 if each of the card_vnames entries of vnames is a valid name, - return a positive number otherwise. The return value, if not 0, is the - return value of is_invalid_name() for the last invalid name - in vnames. If check_ranged = true, the names are row names and - names for ranged constaints must be checked for additional restrictions - since "_low" will be added to the name if an Lp file is written. - When check_ranged = true, card_vnames must have getNumRows()+1 entries, - with entry vnames[getNumRows()] being the - name of the objective function. - For a description of valid names and return values, see the method - is_invalid_name(). - - This method must not be called with check_ranged = true before - setLpDataWithoutRowAndColNames() has been called, since access - to the indices of all the ranged constraints is required. - */ - int are_invalid_names(char const * const *vnames, - const int card_vnames, - const bool check_ranged) const; - - /// Set objective function name to the default "obj" and row - /// names to the default "cons0", "cons1", ... - void setDefaultRowNames(); - - /// Set column names to the default "x0", "x1", ... - void setDefaultColNames(); - - /** Set the row and column names. - The array rownames must either be NULL or have exactly getNumRows()+1 - distinct entries, - each of them being a valid name (see is_invalid_name()) and the - last entry being the intended name for the objective function. - If rownames is NULL, existing row names and objective function - name are not changed. - If rownames is deemed invalid, default row names and objective function - name are used (see setDefaultRowNames()). The memory location of - array rownames (or its entries) should not be related - to the memory location of the array (or entries) obtained from - getRowNames() or getPreviousRowNames(), as the call to - setLpDataRowAndColNames() modifies the corresponding arrays. - Unpredictable results - are obtained if this requirement is ignored. - - Similar remarks apply to the array colnames, which must either be - NULL or have exactly getNumCols() entries. - */ - void setLpDataRowAndColNames(char const * const * const rownames, - char const * const * const colnames); - - /** Write the data in Lp format in the file with name filename. - Coefficients with value less than epsilon away from an integer value - are written as integers. - Write at most numberAcross monomials on a line. - Write non integer numbers with decimals digits after the decimal point. - Write objective function name and row names if useRowNames = true. - - Ranged constraints are written as two constraints. - If row names are used, the upper bound constraint has the - name of the original ranged constraint and the - lower bound constraint has for name the original name with - "_low" as suffix. If doing so creates two identical row names, - default row names are used (see setDefaultRowNames()). - */ - int writeLp(const char *filename, - const double epsilon, - const int numberAcross, - const int decimals, - const bool useRowNames = true); - - /** Write the data in Lp format in the file pointed to by the paramater fp. - Coefficients with value less than epsilon away from an integer value - are written as integers. - Write at most numberAcross monomials on a line. - Write non integer numbers with decimals digits after the decimal point. - Write objective function name and row names if useRowNames = true. - - Ranged constraints are written as two constraints. - If row names are used, the upper bound constraint has the - name of the original ranged constraint and the - lower bound constraint has for name the original name with - "_low" as suffix. If doing so creates two identical row names, - default row names are used (see setDefaultRowNames()). - */ - int writeLp(FILE *fp, - const double epsilon, - const int numberAcross, - const int decimals, - const bool useRowNames = true); - - /// Write the data in Lp format in the file with name filename. - /// Write objective function name and row names if useRowNames = true. - int writeLp(const char *filename, const bool useRowNames = true); - - /// Write the data in Lp format in the file pointed to by the parameter fp. - /// Write objective function name and row names if useRowNames = true. - int writeLp(FILE *fp, const bool useRowNames = true); - - /// Read the data in Lp format from the file with name filename, using - /// the given value for epsilon. If the original problem is - /// a maximization problem, the objective function is immediadtly - /// flipped to get a minimization problem. - void readLp(const char *filename, const double epsilon); - - /// Read the data in Lp format from the file with name filename. - /// If the original problem is - /// a maximization problem, the objective function is immediadtly - /// flipped to get a minimization problem. - void readLp(const char *filename); - - /// Read the data in Lp format from the file stream, using - /// the given value for epsilon. - /// If the original problem is - /// a maximization problem, the objective function is immediadtly - /// flipped to get a minimization problem. - void readLp(FILE *fp, const double epsilon); - - /// Read the data in Lp format from the file stream. - /// If the original problem is - /// a maximization problem, the objective function is immediadtly - /// flipped to get a minimization problem. - void readLp(FILE *fp); - - /// Dump the data. Low level method for debugging. - void print() const; - - /// Load in SOS stuff - void loadSOS(int numberSets,const CoinSet * sets); - - /// Load in SOS stuff - void loadSOS(int numberSets,const CoinSet ** sets); - - /// Number of SOS sets - inline int numberSets() const - { return numberSets_;} - - /// Set information - inline CoinSet ** setInformation() const - { return set_;} - //@} -/**@name Message handling */ -//@{ - /** Pass in Message handler - - Supply a custom message handler. It will not be destroyed when the - CoinMpsIO object is destroyed. - */ - void passInMessageHandler(CoinMessageHandler * handler); - - /// Set the language for messages. - void newLanguage(CoinMessages::Language language); - - /// Set the language for messages. - inline void setLanguage(CoinMessages::Language language) {newLanguage(language);} - - /// Return the message handler - inline CoinMessageHandler * messageHandler() const {return handler_;} - - /// Return the messages - inline CoinMessages messages() {return messages_;} - /// Return the messages pointer - inline CoinMessages * messagesPointer() {return & messages_;} -//@} - -protected: - /// Problem name - char * problemName_; - - /// Message handler - CoinMessageHandler * handler_; - /** Flag to say if the message handler is the default handler. - - If true, the handler will be destroyed when the CoinMpsIO - object is destroyed; if false, it will not be destroyed. - */ - bool defaultHandler_; - /// Messages - CoinMessages messages_; - - /// Number of rows - int numberRows_; - - /// Number of columns - int numberColumns_; - - /// Number of elements - int numberElements_; - - /// Pointer to column-wise copy of problem matrix coefficients. - mutable CoinPackedMatrix *matrixByColumn_; - - /// Pointer to row-wise copy of problem matrix coefficients. - CoinPackedMatrix *matrixByRow_; - - /// Pointer to dense vector of row lower bounds - double * rowlower_; - - /// Pointer to dense vector of row upper bounds - double * rowupper_; - - /// Pointer to dense vector of column lower bounds - double * collower_; - - /// Pointer to dense vector of column upper bounds - double * colupper_; - - /// Pointer to dense vector of row rhs - mutable double * rhs_; - - /** Pointer to dense vector of slack variable upper bounds for ranged - constraints (undefined for non-ranged constraints) - */ - mutable double *rowrange_; - - /// Pointer to dense vector of row senses - mutable char * rowsense_; - - /// Pointer to dense vector of objective coefficients - double * objective_[MAX_OBJECTIVES]; - - /// Number of objectives - int num_objectives_; - - /// Constant offset for objective value - double objectiveOffset_[MAX_OBJECTIVES]; - - /// Pointer to dense vector specifying if a variable is continuous - /// (0) or integer (1). - char * integerType_; - - /// Pointer to sets - CoinSet ** set_; - - /// Number of sets - int numberSets_; - - /// Current file name - char * fileName_; - - /// Value to use for infinity - double infinity_; - - /// Value to use for epsilon - double epsilon_; - - /// Number of monomials printed in a row - int numberAcross_; - - /// Number of decimals printed for coefficients - int decimals_; - - /// Objective function name - char *objName_[MAX_OBJECTIVES]; - - /** Row names (including objective function name) - and column names when stopHash() for the corresponding - section was last called or for initial names (deemed invalid) - read from a file.
      - section = 0 for row names, - section = 1 for column names. */ - char **previous_names_[2]; - - /// card_previous_names_[section] holds the number of entries in the vector - /// previous_names_[section]. - /// section = 0 for row names, - /// section = 1 for column names. - int card_previous_names_[2]; - - /// Row names (including objective function name) - /// and column names (linked to Hash tables). - /// section = 0 for row names, - /// section = 1 for column names. - char **names_[2]; - - typedef struct { - int index, next; - } CoinHashLink; - - /// Maximum number of entries in a hash table section. - /// section = 0 for row names, - /// section = 1 for column names. - int maxHash_[2]; - - /// Number of entries in a hash table section. - /// section = 0 for row names, - /// section = 1 for column names. - int numberHash_[2]; - - /// Hash tables with two sections. - /// section = 0 for row names (including objective function name), - /// section = 1 for column names. - mutable CoinHashLink *hash_[2]; - - /// Build the hash table for the given names. The parameter number is - /// the cardinality of parameter names. Remove duplicate names. - /// - /// section = 0 for row names, - /// section = 1 for column names. - void startHash(char const * const * const names, - const COINColumnIndex number, - int section); - - /// Delete hash storage. If section = 0, it also frees objName_. - /// section = 0 for row names, - /// section = 1 for column names. - void stopHash(int section); - - /// Return the index of the given name, return -1 if the name is not found. - /// Return getNumRows() for the objective function name. - /// section = 0 for row names (including objective function name), - /// section = 1 for column names. - COINColumnIndex findHash(const char *name, int section) const; - - /// Insert thisName in the hash table if not present yet; does nothing - /// if the name is already in. - /// section = 0 for row names, - /// section = 1 for column names. - void insertHash(const char *thisName, int section); - - /// Write a coefficient. - /// print_1 = 0 : do not print the value 1. - void out_coeff(FILE *fp, double v, int print_1) const; - - /// Locate the objective function. - /// Return 1 if found the keyword "Minimize" or one of its variants, - /// -1 if found keyword "Maximize" or one of its variants. - int find_obj(FILE *fp) const; - - /// Return an integer indicating if the keyword "subject to" or one - /// of its variants has been read. - /// Return 1 if buff is the keyword "s.t" or one of its variants. - /// Return 2 if buff is the keyword "subject" or one of its variants. - /// Return 0 otherwise. - int is_subject_to(const char *buff) const; - - /// Return 1 if the first character of buff is a number. - /// Return 0 otherwise. - int first_is_number(const char *buff) const; - - /// Return 1 if the first character of buff is '/' or '\'. - /// Return 0 otherwise. - int is_comment(const char *buff) const; - - /// Read the file fp until buff contains an end of line - void skip_comment(char *buff, FILE *fp) const; - - /// Put in buff the next string that is not part of a comment - void scan_next(char *buff, FILE *fp) const; - - /// Return 1 if buff is the keyword "free" or one of its variants. - /// Return 0 otherwise. - int is_free(const char *buff) const; - - /// Return 1 if buff is the keyword "inf" or one of its variants. - /// Return 0 otherwise. - int is_inf(const char *buff) const; - - /// Return an integer indicating the inequality sense read. - /// Return 0 if buff is '<='. - /// Return 1 if buff is '='. - /// Return 2 if buff is '>='. - /// Return -1 otherwise. - int is_sense(const char *buff) const; - - /// Return an integer indicating if one of the keywords "Bounds", "Integers", - /// "Generals", "Binaries", "Semi-continuous", "Sos", "End", or one - /// of their variants has been read. (note Semi-continuous not coded) - /// Return 1 if buff is the keyword "Bounds" or one of its variants. - /// Return 2 if buff is the keyword "Integers" or "Generals" or one of their - /// variants. - /// Return 3 if buff is the keyword "Binaries" or one of its variants. - /// Return 4 if buff is the keyword "Semi-continuous" or one of its variants. - /// Return 5 if buff is the keyword "Sos" or one of its variants. - /// Return 6 if buff is the keyword "End" or one of its variants. - /// Return 0 otherwise. - int is_keyword(const char *buff) const; - - /// Read a monomial of the objective function. - /// Return 1 if "subject to" or one of its variants has been read. - int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt, - char **obj_name, int *num_objectives, int *obj_starts); - - /// Read a monomial of a constraint. - /// Return a positive number if the sense of the inequality has been - /// read (see method is_sense() for the return code). - /// Return -1 otherwise. - int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name, - int cnt_coeff) const; - - /// Reallocate vectors related to number of coefficients. - void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const; - - /// Reallocate vectors related to rows. - void realloc_row(char ***rowNames, int **start, double **rhs, - double **rowlow, double **rowup, int *maxrow) const; - - /// Reallocate vectors related to columns. - void realloc_col(double **collow, double **colup, char **is_int, - int *maxcol) const; - - /// Read a constraint. - void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames, - int *cnt_coeff, int *maxcoeff, - double *rhs, double *rowlow, double *rowup, - int *cnt_row, double inf) const; - - /** Check that current objective name and all row names are distinct - including row names obtained by adding "_low" for ranged constraints. - If there is a conflict in the names, they are replaced by default - row names (see setDefaultRowNames()). - - This method must not be called before - setLpDataWithoutRowAndColNames() has been called, since access - to the indices of all the ranged constraints is required. - - This method must not be called before - setLpDataRowAndColNames() has been called, since access - to all the row names is required. - */ - void checkRowNames(); - - /** Check that current column names are distinct. - If not, they are replaced by default - column names (see setDefaultColNames()). - - This method must not be called before - setLpDataRowAndColNames() has been called, since access - to all the column names is required. - */ - void checkColNames(); - -}; - -void -CoinLpIOUnitTest(const std::string& lpDir); - - -#endif diff --git a/thirdparty/linux/include/coin1/CoinMessage.hpp b/thirdparty/linux/include/coin1/CoinMessage.hpp deleted file mode 100644 index cfdcd491..00000000 --- a/thirdparty/linux/include/coin1/CoinMessage.hpp +++ /dev/null @@ -1,96 +0,0 @@ -/* $Id: CoinMessage.hpp 1691 2014-03-19 12:43:56Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinMessage_H -#define CoinMessage_H - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#endif - -/*! \file - - This file contains the enum for the standard set of Coin messages and a - class definition whose sole purpose is to supply a constructor. The text - ot the messages is defined in CoinMessage.cpp, - - CoinMessageHandler.hpp contains the generic facilities for message - handling. -*/ - -#include "CoinMessageHandler.hpp" - -/*! \brief Symbolic names for the standard set of COIN messages */ - -enum COIN_Message -{ - COIN_MPS_LINE=0, - COIN_MPS_STATS, - COIN_MPS_ILLEGAL, - COIN_MPS_BADIMAGE, - COIN_MPS_DUPOBJ, - COIN_MPS_DUPROW, - COIN_MPS_NOMATCHROW, - COIN_MPS_NOMATCHCOL, - COIN_MPS_FILE, - COIN_MPS_BADFILE1, - COIN_MPS_BADFILE2, - COIN_MPS_EOF, - COIN_MPS_RETURNING, - COIN_MPS_CHANGED, - COIN_SOLVER_MPS, - COIN_PRESOLVE_COLINFEAS, - COIN_PRESOLVE_ROWINFEAS, - COIN_PRESOLVE_COLUMNBOUNDA, - COIN_PRESOLVE_COLUMNBOUNDB, - COIN_PRESOLVE_NONOPTIMAL, - COIN_PRESOLVE_STATS, - COIN_PRESOLVE_INFEAS, - COIN_PRESOLVE_UNBOUND, - COIN_PRESOLVE_INFEASUNBOUND, - COIN_PRESOLVE_INTEGERMODS, - COIN_PRESOLVE_POSTSOLVE, - COIN_PRESOLVE_NEEDS_CLEANING, - COIN_PRESOLVE_PASS, -# if PRESOLVE_DEBUG - COIN_PRESOLDBG_FIRSTCHECK, - COIN_PRESOLDBG_RCOSTACC, - COIN_PRESOLDBG_RCOSTSTAT, - COIN_PRESOLDBG_STATSB, - COIN_PRESOLDBG_DUALSTAT, -# endif - COIN_GENERAL_INFO, - COIN_GENERAL_INFO2, - COIN_GENERAL_WARNING, - COIN_DUMMY_END -}; - - -/*! \class CoinMessage - \brief The standard set of Coin messages - - This class provides convenient access to the standard set of Coin messages. - In a nutshell, it's a CoinMessages object with a constructor that - preloads the standard Coin messages. -*/ - -class CoinMessage : public CoinMessages { - -public: - - /**@name Constructors etc */ - //@{ - /*! \brief Constructor - - Build a CoinMessages object and load it with the standard set of - Coin messages. - */ - CoinMessage(Language language=us_en); - //@} - -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinMessageHandler.hpp b/thirdparty/linux/include/coin1/CoinMessageHandler.hpp deleted file mode 100644 index 79226301..00000000 --- a/thirdparty/linux/include/coin1/CoinMessageHandler.hpp +++ /dev/null @@ -1,666 +0,0 @@ -/* $Id: CoinMessageHandler.hpp 1514 2011-12-10 23:35:23Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinMessageHandler_H -#define CoinMessageHandler_H - -#include "CoinUtilsConfig.h" -#include "CoinPragma.hpp" - -#include -#include -#include -#include - -/** \file CoinMessageHandler.hpp - \brief This is a first attempt at a message handler. - - The COIN Project is in favo(u)r of multi-language support. This implementation - of a message handler tries to make it as lightweight as possible in the sense - that only a subset of messages need to be defined --- the rest default to US - English. - - The default handler at present just prints to stdout or to a FILE pointer - - \todo - This needs to be worked over for correct operation with ISO character codes. -*/ - -/* - I (jjf) am strongly in favo(u)r of language support for an open - source project, but I have tried to make it as lightweight as - possible in the sense that only a subset of messages need to be - defined - the rest default to US English. There will be different - sets of messages for each component - so at present there is a - Clp component and a Coin component. - - Because messages are only used in a controlled environment and have no - impact on code and are tested by other tests I have included tests such - as language and derivation in other unit tests. -*/ -/* - Where there are derived classes I (jjf) have started message numbers at 1001. -*/ - - -/** \brief Class for one massaged message. - - A message consists of a text string with formatting codes (#message_), - an integer identifier (#externalNumber_) which also determines the severity - level (#severity_) of the message, and a detail (logging) level (#detail_). - - CoinOneMessage is just a container to hold this information. The - interpretation is set by CoinMessageHandler, which see. - */ - -class CoinOneMessage { - -public: - /**@name Constructors etc */ - //@{ - /** Default constructor. */ - CoinOneMessage(); - /** Normal constructor */ - CoinOneMessage(int externalNumber, char detail, - const char * message); - /** Destructor */ - ~CoinOneMessage(); - /** The copy constructor */ - CoinOneMessage(const CoinOneMessage&); - /** assignment operator. */ - CoinOneMessage& operator=(const CoinOneMessage&); - //@} - - /**@name Useful stuff */ - //@{ - /// Replace message text (e.g., text in a different language) - void replaceMessage(const char * message); - //@} - - /**@name Get and set methods */ - //@{ - /** Get message ID number */ - inline int externalNumber() const - {return externalNumber_;} - /** \brief Set message ID number - - In the default CoinMessageHandler, this number is printed in the message - prefix and is used to determine the message severity level. - */ - inline void setExternalNumber(int number) - {externalNumber_=number;} - /// Severity - inline char severity() const - {return severity_;} - /// Set detail level - inline void setDetail(int level) - {detail_=static_cast (level);} - /// Get detail level - inline int detail() const - {return detail_;} - /// Return the message text - inline char * message() const - {return message_;} - //@} - - /**@name member data */ - //@{ - /// number to print out (also determines severity) - int externalNumber_; - /// Will only print if detail matches - char detail_; - /// Severity - char severity_; - /// Messages (in correct language) (not all 400 may exist) - mutable char message_[400]; - //@} -}; - -/** \brief Class to hold and manipulate an array of massaged messages. - - Note that the message index used to reference a message in the array of - messages is completely distinct from the external ID number stored with the - message. -*/ - -class CoinMessages { - -public: - /** \brief Supported languages - - These are the languages that are supported. At present only - us_en is serious and the rest are for testing. - */ - enum Language { - us_en = 0, - uk_en, - it - }; - - /**@name Constructors etc */ - //@{ - /** Constructor with number of messages. */ - CoinMessages(int numberMessages=0); - /** Destructor */ - ~CoinMessages(); - /** The copy constructor */ - CoinMessages(const CoinMessages&); - /** assignment operator. */ - CoinMessages& operator=(const CoinMessages&); - //@} - - /**@name Useful stuff */ - //@{ - /*! \brief Installs a new message in the specified index position - - Any existing message is replaced, and a copy of the specified message is - installed. - */ - void addMessage(int messageNumber, const CoinOneMessage & message); - /*! \brief Replaces the text of the specified message - - Any existing text is deleted and the specified text is copied into the - specified message. - */ - void replaceMessage(int messageNumber, const char * message); - /** Language. Need to think about iso codes */ - inline Language language() const - {return language_;} - /** Set language */ - void setLanguage(Language newlanguage) - {language_ = newlanguage;} - /// Change detail level for one message - void setDetailMessage(int newLevel, int messageNumber); - /** \brief Change detail level for several messages - - messageNumbers is expected to contain the indices of the messages to be - changed. - If numberMessages >= 10000 or messageNumbers is NULL, the detail level - is changed on all messages. - */ - void setDetailMessages(int newLevel, int numberMessages, - int * messageNumbers); - /** Change detail level for all messages with low <= ID number < high */ - void setDetailMessages(int newLevel, int low, int high); - - /// Returns class - inline int getClass() const - { return class_;} - /// Moves to compact format - void toCompact(); - /// Moves from compact format - void fromCompact(); - //@} - - /**@name member data */ - //@{ - /// Number of messages - int numberMessages_; - /// Language - Language language_; - /// Source (null-terminated string, maximum 4 characters). - char source_[5]; - /// Class - see later on before CoinMessageHandler - int class_; - /** Length of fake CoinOneMessage array. - First you get numberMessages_ pointers which point to stuff - */ - int lengthMessages_; - /// Messages - CoinOneMessage ** message_; - //@} -}; - -// for convenience eol -enum CoinMessageMarker { - CoinMessageEol = 0, - CoinMessageNewline = 1 -}; - -/** Base class for message handling - - The default behavior is described here: messages are printed, and (if the - severity is sufficiently high) execution will be aborted. Inherit and - redefine the methods #print and #checkSeverity to augment the behaviour. - - Messages can be printed with or without a prefix; the prefix will consist - of a source string, the external ID number, and a letter code, - e.g., Clp6024W. - A prefix makes the messages look less nimble but is very useful - for "grep" etc. - -

      Usage

      - - The general approach to using the COIN messaging facility is as follows: -
        -
      • Define your messages. For each message, you must supply an external - ID number, a log (detail) level, and a format string. Typically, you - define a convenience structure for this, something that's easy to - use to create an array of initialised message definitions at compile - time. -
      • Create a CoinMessages object, sized to accommodate the number of - messages you've defined. (Incremental growth will happen if - necessary as messages are loaded, but it's inefficient.) -
      • Load the messages into the CoinMessages object. Typically this - entails creating a CoinOneMessage object for each message and - passing it as a parameter to CoinMessages::addMessage(). You specify - the message's internal ID as the other parameter to addMessage. -
      • Create and use a CoinMessageHandler object to print messages. -
      - See, for example, CoinMessage.hpp and CoinMessage.cpp for an example of - the first three steps. `Format codes' below has a simple example of - printing a message. - -

      External ID numbers and severity

      - - CoinMessageHandler assumes the following relationship between the - external ID number of a message and the severity of the message: - \li <3000 are informational ('I') - \li <6000 warnings ('W') - \li <9000 non-fatal errors ('E') - \li >=9000 aborts the program (after printing the message) ('S') - -

      Log (detail) levels

      - - The default behaviour is that a message will print if its detail level - is less than or equal to the handler's log level. If all you want to - do is set a single log level for the handler, use #setLogLevel(int). - - If you want to get fancy, here's how it really works: There's an array, - #logLevels_, which you can manipulate with #setLogLevel(int,int). Each - entry logLevels_[i] specifies the log level for messages of class i (see - CoinMessages::class_). If logLevels_[0] is set to the magic number -1000 - you get the simple behaviour described above, whatever the class of the - messages. If logLevels_[0] is set to a valid log level (>= 0), then - logLevels_[i] really is the log level for messages of class i. - -

      Format codes

      - - CoinMessageHandler can print integers (normal, long, and long long), - doubles, characters, and strings. See the descriptions of the - various << operators. - - When processing a standard message with a format string, the formatting - codes specified in the format string will be passed to the sprintf - function, along with the argument. When generating a message with no - format string, each << operator uses a simple format code appropriate for - its argument. Consult the documentation for the standard printf facility - for further information on format codes. - - The special format code `%?' provides a hook to enable or disable - printing. For each `%?' code, there must be a corresponding call to - printing(bool). This provides a way to define optional parts in - messages, delineated by the code `%?' in the format string. Printing can - be suppressed for these optional parts, but any operands must still be - supplied. For example, given the message string - \verbatim - "A message with%? an optional integer %d and%? a double %g." - \endverbatim - installed in CoinMessages \c exampleMsgs with index 5, and - \c CoinMessageHandler \c hdl, the code - \code - hdl.message(5,exampleMsgs) ; - hdl.printing(true) << 42 ; - hdl.printing(true) << 53.5 << CoinMessageEol ; - \endcode - will print - \verbatim - A message with an optional integer 42 and a double 53.5. - \endverbatim - while - \code - hdl.message(5,exampleMsgs) ; - hdl.printing(false) << 42 ; - hdl.printing(true) << 53.5 << CoinMessageEol ; - \endcode - will print - \verbatim - A message with a double 53.5. - \endverbatim - - For additional examples of usage, see CoinMessageHandlerUnitTest in - CoinMessageHandlerTest.cpp. -*/ - -class CoinMessageHandler { - -friend bool CoinMessageHandlerUnitTest () ; - -public: - /**@name Virtual methods that the derived classes may provide */ - //@{ - /** Print message, return 0 normally. - */ - virtual int print() ; - /** Check message severity - if too bad then abort - */ - virtual void checkSeverity() ; - //@} - - /**@name Constructors etc */ - //@{ - /// Constructor - CoinMessageHandler(); - /// Constructor to put to file pointer (won't be closed) - CoinMessageHandler(FILE *fp); - /** Destructor */ - virtual ~CoinMessageHandler(); - /** The copy constructor */ - CoinMessageHandler(const CoinMessageHandler&); - /** Assignment operator. */ - CoinMessageHandler& operator=(const CoinMessageHandler&); - /// Clone - virtual CoinMessageHandler * clone() const; - //@} - /**@name Get and set methods */ - //@{ - /// Get detail level of a message. - inline int detail(int messageNumber, const CoinMessages &normalMessage) const - { return normalMessage.message_[messageNumber]->detail();} - /** Get current log (detail) level. */ - inline int logLevel() const - { return logLevel_;} - /** \brief Set current log (detail) level. - - If the log level is equal or greater than the detail level of a message, - the message will be printed. A rough convention for the amount of output - expected is - - 0 - none - - 1 - minimal - - 2 - normal low - - 3 - normal high - - 4 - verbose - - Please assign log levels to messages accordingly. Log levels of 8 and - above (8,16,32, etc.) are intended for selective debugging. - The logical AND of the log level specified in the message and the current - log level is used to determine if the message is printed. (In other words, - you're using individual bits to determine which messages are printed.) - */ - void setLogLevel(int value); - /** Get alternative log level. */ - inline int logLevel(int which) const - { return logLevels_[which];} - /*! \brief Set alternative log level value. - - Can be used to store alternative log level information within the handler. - */ - void setLogLevel(int which, int value); - - /// Set the number of significant digits for printing floating point numbers - void setPrecision(unsigned int new_precision); - /// Current number of significant digits for printing floating point numbers - inline int precision() { return (g_precision_) ; } - - /// Switch message prefix on or off. - void setPrefix(bool yesNo); - /// Current setting for printing message prefix. - bool prefix() const; - /*! \brief Values of double fields already processed. - - As the parameter for a double field is processed, the value is saved - and can be retrieved using this function. - */ - inline double doubleValue(int position) const - { return doubleValue_[position];} - /*! \brief Number of double fields already processed. - - Incremented each time a field of type double is processed. - */ - inline int numberDoubleFields() const - {return static_cast(doubleValue_.size());} - /*! \brief Values of integer fields already processed. - - As the parameter for a integer field is processed, the value is saved - and can be retrieved using this function. - */ - inline int intValue(int position) const - { return longValue_[position];} - /*! \brief Number of integer fields already processed. - - Incremented each time a field of type integer is processed. - */ - inline int numberIntFields() const - {return static_cast(longValue_.size());} - /*! \brief Values of char fields already processed. - - As the parameter for a char field is processed, the value is saved - and can be retrieved using this function. - */ - inline char charValue(int position) const - { return charValue_[position];} - /*! \brief Number of char fields already processed. - - Incremented each time a field of type char is processed. - */ - inline int numberCharFields() const - {return static_cast(charValue_.size());} - /*! \brief Values of string fields already processed. - - As the parameter for a string field is processed, the value is saved - and can be retrieved using this function. - */ - inline std::string stringValue(int position) const - { return stringValue_[position];} - /*! \brief Number of string fields already processed. - - Incremented each time a field of type string is processed. - */ - inline int numberStringFields() const - {return static_cast(stringValue_.size());} - - /// Current message - inline CoinOneMessage currentMessage() const - {return currentMessage_;} - /// Source of current message - inline std::string currentSource() const - {return source_;} - /// Output buffer - inline const char * messageBuffer() const - {return messageBuffer_;} - /// Highest message number (indicates any errors) - inline int highestNumber() const - {return highestNumber_;} - /// Get current file pointer - inline FILE * filePointer() const - { return fp_;} - /// Set new file pointer - inline void setFilePointer(FILE * fp) - { fp_ = fp;} - //@} - - /**@name Actions to create a message */ - //@{ - /*! \brief Start a message - - Look up the specified message. A prefix will be generated if enabled. - The message will be printed if the current log level is equal or greater - than the log level of the message. - */ - CoinMessageHandler &message(int messageNumber, - const CoinMessages &messages) ; - - /*! \brief Start or continue a message - - With detail = -1 (default), does nothing except return a reference to the - handler. (I.e., msghandler.message() << "foo" is precisely equivalent - to msghandler << "foo".) If \p msgDetail is >= 0, is will be used - as the detail level to determine whether the message should print - (assuming class 0). - - This can be used with any of the << operators. One use is to start - a message which will be constructed entirely from scratch. Another - use is continuation of a message after code that interrupts the usual - sequence of << operators. - */ - CoinMessageHandler & message(int detail = -1) ; - - /*! \brief Print a complete message - - Generate a standard prefix and append \c msg `as is'. This is intended as - a transition mechanism. The standard prefix is generated (if enabled), - and \c msg is appended. The message must be ended with a CoinMessageEol - marker. Attempts to add content with << will have no effect. - - The default value of \p detail will not change printing status. If - \p detail is >= 0, it will be used as the detail level to determine - whether the message should print (assuming class 0). - - */ - CoinMessageHandler &message(int externalNumber, const char *source, - const char *msg, - char severity, int detail = -1) ; - - /*! \brief Process an integer parameter value. - - The default format code is `%d'. - */ - CoinMessageHandler & operator<< (int intvalue); -#if COIN_BIG_INDEX==1 - /*! \brief Process a long integer parameter value. - - The default format code is `%ld'. - */ - CoinMessageHandler & operator<< (long longvalue); -#endif -#if COIN_BIG_INDEX==2 - /*! \brief Process a long long integer parameter value. - - The default format code is `%ld'. - */ - CoinMessageHandler & operator<< (long long longvalue); -#endif - /*! \brief Process a double parameter value. - - The default format code is `%d'. - */ - CoinMessageHandler & operator<< (double doublevalue); - /*! \brief Process a STL string parameter value. - - The default format code is `%g'. - */ - CoinMessageHandler & operator<< (const std::string& stringvalue); - /*! \brief Process a char parameter value. - - The default format code is `%s'. - */ - CoinMessageHandler & operator<< (char charvalue); - /*! \brief Process a C-style string parameter value. - - The default format code is `%c'. - */ - CoinMessageHandler & operator<< (const char *stringvalue); - /*! \brief Process a marker. - - The default format code is `%s'. - */ - CoinMessageHandler & operator<< (CoinMessageMarker); - /** Finish (and print) the message. - - Equivalent to using the CoinMessageEol marker. - */ - int finish(); - /*! \brief Enable or disable printing of an optional portion of a message. - - Optional portions of a message are delimited by `%?' markers, and - printing processes one %? marker. If \c onOff is true, the subsequent - portion of the message (to the next %? marker or the end of the format - string) will be printed. If \c onOff is false, printing is suppressed. - Parameters must still be supplied, whether printing is suppressed or not. - See the class documentation for an example. - */ - CoinMessageHandler & printing(bool onOff); - - //@} - - /** Log levels will be by type and will then use type - given in CoinMessage::class_ - - - 0 - Branch and bound code or similar - - 1 - Solver - - 2 - Stuff in Coin directory - - 3 - Cut generators - */ -#define COIN_NUM_LOG 4 -/// Maximum length of constructed message (characters) -#define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE 1000 -protected: - /**@name Protected member data */ - //@{ - /// values in message - std::vector doubleValue_; - std::vector longValue_; - std::vector charValue_; - std::vector stringValue_; - /// Log level - int logLevel_; - /// Log levels - int logLevels_[COIN_NUM_LOG]; - /// Whether we want prefix (may get more subtle so is int) - int prefix_; - /// Current message - CoinOneMessage currentMessage_; - /// Internal number for use with enums - int internalNumber_; - /// Format string for message (remainder) - char * format_; - /// Output buffer - char messageBuffer_[COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE]; - /// Position in output buffer - char * messageOut_; - /// Current source of message - std::string source_; - /** 0 - Normal. - 1 - Put in values, move along format, but don't print. - 2 - A complete message was provided; nothing more to do but print - when CoinMessageEol is processed. Any << operators are treated - as noops. - 3 - do nothing except look for CoinMessageEol (i.e., the message - detail level was not sufficient to cause it to print). - */ - int printStatus_; - /// Highest message number (indicates any errors) - int highestNumber_; - /// File pointer - FILE * fp_; - /// Current format for floating point numbers - char g_format_[8]; - /// Current number of significant digits for floating point numbers - int g_precision_ ; - //@} - -private: - - /** The body of the copy constructor and the assignment operator */ - void gutsOfCopy(const CoinMessageHandler &rhs) ; - - /*! \brief Internal function to locate next format code. - - Intended for internal use. Side effects modify the format string. - */ - char *nextPerCent(char *start, const bool initial = false) ; - - /*! \brief Internal printing function. - - Makes it easier to split up print into clean, print and check severity - */ - int internalPrint() ; - - /// Decide if this message should print. - void calcPrintStatus(int msglvl, int msgclass) ; - - -}; - -//############################################################################# -/** A function that tests the methods in the CoinMessageHandler class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -bool -CoinMessageHandlerUnitTest(); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinModel.hpp b/thirdparty/linux/include/coin1/CoinModel.hpp deleted file mode 100644 index 6d1ff5b0..00000000 --- a/thirdparty/linux/include/coin1/CoinModel.hpp +++ /dev/null @@ -1,1054 +0,0 @@ -/* $Id: CoinModel.hpp 1691 2014-03-19 12:43:56Z forrest $ */ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinModel_H -#define CoinModel_H - -#include "CoinModelUseful.hpp" -#include "CoinMessageHandler.hpp" -#include "CoinPackedMatrix.hpp" -#include "CoinFinite.hpp" -class CoinBaseModel { - -public: - - - /**@name Constructors, destructor */ - //@{ - /// Default Constructor - CoinBaseModel (); - - /// Copy constructor - CoinBaseModel ( const CoinBaseModel &rhs); - - /// Assignment operator - CoinBaseModel & operator=( const CoinBaseModel& rhs); - - /// Clone - virtual CoinBaseModel * clone() const=0; - - /// Destructor - virtual ~CoinBaseModel () ; - //@} - - /**@name For getting information */ - //@{ - /// Return number of rows - inline int numberRows() const - { return numberRows_;} - /// Return number of columns - inline int numberColumns() const - { return numberColumns_;} - /// Return number of elements - virtual CoinBigIndex numberElements() const = 0; - /** Returns the (constant) objective offset - This is the RHS entry for the objective row - */ - inline double objectiveOffset() const - { return objectiveOffset_;} - /// Set objective offset - inline void setObjectiveOffset(double value) - { objectiveOffset_=value;} - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline double optimizationDirection() const { - return optimizationDirection_; - } - /// Set direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline void setOptimizationDirection(double value) - { optimizationDirection_=value;} - /// Get print level 0 - off, 1 - errors, 2 - more - inline int logLevel() const - { return logLevel_;} - /// Set print level 0 - off, 1 - errors, 2 - more - void setLogLevel(int value); - /// Return the problem name - inline const char * getProblemName() const - { return problemName_.c_str();} - /// Set problem name - void setProblemName(const char *name) ; - /// Set problem name - void setProblemName(const std::string &name) ; - /// Return the row block name - inline const std::string & getRowBlock() const - { return rowBlockName_;} - /// Set row block name - inline void setRowBlock(const std::string &name) - { rowBlockName_ = name;} - /// Return the column block name - inline const std::string & getColumnBlock() const - { return columnBlockName_;} - /// Set column block name - inline void setColumnBlock(const std::string &name) - { columnBlockName_ = name;} - /// Pass in message handler - void setMessageHandler(CoinMessageHandler * handler); - //@} - -protected: - /**@name Data members */ - //@{ - /// Current number of rows - int numberRows_; - /// Current number of columns - int numberColumns_; - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - double optimizationDirection_; - /// Objective offset to be passed on - double objectiveOffset_; - /// Problem name - std::string problemName_; - /// Rowblock name - std::string rowBlockName_; - /// Columnblock name - std::string columnBlockName_; - /// Message handler (Passed in) - CoinMessageHandler * handler_; - /// Messages - CoinMessages messages_; - - /** Print level. - I could have gone for full message handling but this should normally - be silent and lightweight. - -1 - use passed in message handler - 0 - no output - 1 - on errors - 2 - more detailed - */ - int logLevel_; - //@} - /// data - -}; - -/** - This is a simple minded model which is stored in a format which makes - it easier to construct and modify but not efficient for algorithms. It has - to be passed across to ClpModel or OsiSolverInterface by addRows, addCol(umn)s - or loadProblem. - - It may have up to four parts - - 1) A matrix of doubles (or strings - see note A) - 2) Column information including integer information and names - 3) Row information including names - 4) Quadratic objective (not implemented - but see A) - - This class is meant to make it more efficient to build a model. It is at - its most efficient when all additions are done as addRow or as addCol but - not mixed. If only 1 and 2 exist then solver.addColumns may be used to pass to solver, - if only 1 and 3 exist then solver.addRows may be used. Otherwise solver.loadProblem - must be used. - - If addRows and addColumns are mixed or if individual elements are set then the - speed will drop to some extent and more memory will be used. - - It is also possible to iterate over existing elements and to access columns and rows - by name. Again each of these use memory and cpu time. However memory is unlikely - to be critical as most algorithms will use much more. - - Notes: - A) Although this could be used to pass nonlinear information around the - only use at present is to have named values e.g. value1 which can then be - set to a value after model is created. I have no idea whether that could - be useful but I thought it might be fun. - Quadratic terms are allowed in strings! A solver could try and use this - if so - the convention is that 0.5* quadratic is stored - - B) This class could be useful for modeling. -*/ - -class CoinModel : public CoinBaseModel { - -public: - /**@name Useful methods for building model */ - //@{ - /** add a row - numberInRow may be zero */ - void addRow(int numberInRow, const int * columns, - const double * elements, double rowLower=-COIN_DBL_MAX, - double rowUpper=COIN_DBL_MAX, const char * name=NULL); - /// add a column - numberInColumn may be zero */ - void addColumn(int numberInColumn, const int * rows, - const double * elements, - double columnLower=0.0, - double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0, - const char * name=NULL, bool isInteger=false); - /// add a column - numberInColumn may be zero */ - inline void addCol(int numberInColumn, const int * rows, - const double * elements, - double columnLower=0.0, - double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0, - const char * name=NULL, bool isInteger=false) - { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue, - name,isInteger);} - /// Sets value for row i and column j - inline void operator() (int i,int j,double value) - { setElement(i,j,value);} - /// Sets value for row i and column j - void setElement(int i,int j,double value) ; - /** Gets sorted row - user must provide enough space - (easiest is allocate number of columns). - If column or element NULL then just returns number - Returns number of elements - */ - int getRow(int whichRow, int * column, double * element); - /** Gets sorted column - user must provide enough space - (easiest is allocate number of rows). - If row or element NULL then just returns number - Returns number of elements - */ - int getColumn(int whichColumn, int * column, double * element); - /// Sets quadratic value for column i and j - void setQuadraticElement(int i,int j,double value) ; - /// Sets value for row i and column j as string - inline void operator() (int i,int j,const char * value) - { setElement(i,j,value);} - /// Sets value for row i and column j as string - void setElement(int i,int j,const char * value) ; - /// Associates a string with a value. Returns string id (or -1 if does not exist) - int associateElement(const char * stringValue, double value); - /** Sets rowLower (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowLower(int whichRow,double rowLower); - /** Sets rowUpper (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowUpper(int whichRow,double rowUpper); - /** Sets rowLower and rowUpper (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowBounds(int whichRow,double rowLower,double rowUpper); - /** Sets name (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowName(int whichRow,const char * rowName); - /** Sets columnLower (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnLower(int whichColumn,double columnLower); - /** Sets columnUpper (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnUpper(int whichColumn,double columnUpper); - /** Sets columnLower and columnUpper (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnBounds(int whichColumn,double columnLower,double columnUpper); - /** Sets columnObjective (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnObjective(int whichColumn,double columnObjective); - /** Sets name (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnName(int whichColumn,const char * columnName); - /** Sets integer state (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnIsInteger(int whichColumn,bool columnIsInteger); - /** Sets columnObjective (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setObjective(int whichColumn,double columnObjective) - { setColumnObjective( whichColumn, columnObjective);} - /** Sets integer state (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setIsInteger(int whichColumn,bool columnIsInteger) - { setColumnIsInteger( whichColumn, columnIsInteger);} - /** Sets integer (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setInteger(int whichColumn) - { setColumnIsInteger( whichColumn, true);} - /** Sets continuous (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setContinuous(int whichColumn) - { setColumnIsInteger( whichColumn, false);} - /** Sets columnLower (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColLower(int whichColumn,double columnLower) - { setColumnLower( whichColumn, columnLower);} - /** Sets columnUpper (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColUpper(int whichColumn,double columnUpper) - { setColumnUpper( whichColumn, columnUpper);} - /** Sets columnLower and columnUpper (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColBounds(int whichColumn,double columnLower,double columnUpper) - { setColumnBounds( whichColumn, columnLower, columnUpper);} - /** Sets columnObjective (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColObjective(int whichColumn,double columnObjective) - { setColumnObjective( whichColumn, columnObjective);} - /** Sets name (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColName(int whichColumn,const char * columnName) - { setColumnName( whichColumn, columnName);} - /** Sets integer (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setColIsInteger(int whichColumn,bool columnIsInteger) - { setColumnIsInteger( whichColumn, columnIsInteger);} - /** Sets rowLower (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowLower(int whichRow,const char * rowLower); - /** Sets rowUpper (if row does not exist then - all rows up to this are defined with default values and no elements) - */ - void setRowUpper(int whichRow,const char * rowUpper); - /** Sets columnLower (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnLower(int whichColumn,const char * columnLower); - /** Sets columnUpper (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnUpper(int whichColumn,const char * columnUpper); - /** Sets columnObjective (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnObjective(int whichColumn,const char * columnObjective); - /** Sets integer (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - void setColumnIsInteger(int whichColumn,const char * columnIsInteger); - /** Sets columnObjective (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setObjective(int whichColumn,const char * columnObjective) - { setColumnObjective( whichColumn, columnObjective);} - /** Sets integer (if column does not exist then - all columns up to this are defined with default values and no elements) - */ - inline void setIsInteger(int whichColumn,const char * columnIsInteger) - { setColumnIsInteger( whichColumn, columnIsInteger);} - /** Deletes all entries in row and bounds. Will be ignored by - writeMps etc and will be packed down if asked for. */ - void deleteRow(int whichRow); - /** Deletes all entries in column and bounds and objective. Will be ignored by - writeMps etc and will be packed down if asked for. */ - void deleteColumn(int whichColumn); - /** Deletes all entries in column and bounds. If last column the number of columns - will be decremented and true returned. */ - inline void deleteCol(int whichColumn) - { deleteColumn(whichColumn);} - /// Takes element out of matrix - returning position (<0 if not there); - int deleteElement(int row, int column); - /// Takes element out of matrix when position known - void deleteThisElement(int row, int column,int position); - /** Packs down all rows i.e. removes empty rows permanently. Empty rows - have no elements and feasible bounds. returns number of rows deleted. */ - int packRows(); - /** Packs down all columns i.e. removes empty columns permanently. Empty columns - have no elements and no objective. returns number of columns deleted. */ - int packColumns(); - /** Packs down all columns i.e. removes empty columns permanently. Empty columns - have no elements and no objective. returns number of columns deleted. */ - inline int packCols() - { return packColumns();} - /** Packs down all rows and columns. i.e. removes empty rows and columns permanently. - Empty rows have no elements and feasible bounds. - Empty columns have no elements and no objective. - returns number of rows+columns deleted. */ - int pack(); - - /** Sets columnObjective array - */ - void setObjective(int numberColumns,const double * objective) ; - /** Sets columnLower array - */ - void setColumnLower(int numberColumns,const double * columnLower); - /** Sets columnLower array - */ - inline void setColLower(int numberColumns,const double * columnLower) - { setColumnLower( numberColumns, columnLower);} - /** Sets columnUpper array - */ - void setColumnUpper(int numberColumns,const double * columnUpper); - /** Sets columnUpper array - */ - inline void setColUpper(int numberColumns,const double * columnUpper) - { setColumnUpper( numberColumns, columnUpper);} - /** Sets rowLower array - */ - void setRowLower(int numberRows,const double * rowLower); - /** Sets rowUpper array - */ - void setRowUpper(int numberRows,const double * rowUpper); - - /** Write the problem in MPS format to a file with the given filename. - - \param compression can be set to three values to indicate what kind - of file should be written -
        -
      • 0: plain text (default) -
      • 1: gzip compressed (.gz is appended to \c filename) -
      • 2: bzip2 compressed (.bz2 is appended to \c filename) (TODO) -
      - If the library was not compiled with the requested compression then - writeMps falls back to writing a plain text file. - - \param formatType specifies the precision to used for values in the - MPS file -
        -
      • 0: normal precision (default) -
      • 1: extra accuracy -
      • 2: IEEE hex -
      - - \param numberAcross specifies whether 1 or 2 (default) values should be - specified on every data line in the MPS file. - - not const as may change model e.g. fill in default bounds - */ - int writeMps(const char *filename, int compression = 0, - int formatType = 0, int numberAcross = 2, bool keepStrings=false) ; - - /** Check two models against each other. Return nonzero if different. - Ignore names if that set. - May modify both models by cleaning up - */ - int differentModel(CoinModel & other, bool ignoreNames); - //@} - - - /**@name For structured models */ - //@{ - /// Pass in CoinPackedMatrix (and switch off element updates) - void passInMatrix(const CoinPackedMatrix & matrix); - /** Convert elements to CoinPackedMatrix (and switch off element updates). - Returns number of errors */ - int convertMatrix(); - /// Return a pointer to CoinPackedMatrix (or NULL) - inline const CoinPackedMatrix * packedMatrix() const - { return packedMatrix_;} - /// Return pointers to original rows (for decomposition) - inline const int * originalRows() const - { return rowType_;} - /// Return pointers to original columns (for decomposition) - inline const int * originalColumns() const - { return columnType_;} - //@} - - - /**@name For getting information */ - //@{ - /// Return number of elements - inline CoinBigIndex numberElements() const - { return numberElements_;} - /// Return elements as triples - inline const CoinModelTriple * elements() const - { return elements_;} - /// Returns value for row i and column j - inline double operator() (int i,int j) const - { return getElement(i,j);} - /// Returns value for row i and column j - double getElement(int i,int j) const; - /// Returns value for row rowName and column columnName - inline double operator() (const char * rowName,const char * columnName) const - { return getElement(rowName,columnName);} - /// Returns value for row rowName and column columnName - double getElement(const char * rowName,const char * columnName) const; - /// Returns quadratic value for columns i and j - double getQuadraticElement(int i,int j) const; - /** Returns value for row i and column j as string. - Returns NULL if does not exist. - Returns "Numeric" if not a string - */ - const char * getElementAsString(int i,int j) const; - /** Returns pointer to element for row i column j. - Only valid until next modification. - NULL if element does not exist */ - double * pointer (int i,int j) const; - /** Returns position in elements for row i column j. - Only valid until next modification. - -1 if element does not exist */ - int position (int i,int j) const; - - - /** Returns first element in given row - index is -1 if none. - Index is given by .index and value by .value - */ - CoinModelLink firstInRow(int whichRow) const ; - /** Returns last element in given row - index is -1 if none. - Index is given by .index and value by .value - */ - CoinModelLink lastInRow(int whichRow) const ; - /** Returns first element in given column - index is -1 if none. - Index is given by .index and value by .value - */ - CoinModelLink firstInColumn(int whichColumn) const ; - /** Returns last element in given column - index is -1 if none. - Index is given by .index and value by .value - */ - CoinModelLink lastInColumn(int whichColumn) const ; - /** Returns next element in current row or column - index is -1 if none. - Index is given by .index and value by .value. - User could also tell because input.next would be NULL - */ - CoinModelLink next(CoinModelLink & current) const ; - /** Returns previous element in current row or column - index is -1 if none. - Index is given by .index and value by .value. - User could also tell because input.previous would be NULL - May not be correct if matrix updated. - */ - CoinModelLink previous(CoinModelLink & current) const ; - /** Returns first element in given quadratic column - index is -1 if none. - Index is given by .index and value by .value - May not be correct if matrix updated. - */ - CoinModelLink firstInQuadraticColumn(int whichColumn) const ; - /** Returns last element in given quadratic column - index is -1 if none. - Index is given by .index and value by .value - */ - CoinModelLink lastInQuadraticColumn(int whichColumn) const ; - /** Gets rowLower (if row does not exist then -COIN_DBL_MAX) - */ - double getRowLower(int whichRow) const ; - /** Gets rowUpper (if row does not exist then +COIN_DBL_MAX) - */ - double getRowUpper(int whichRow) const ; - /** Gets name (if row does not exist then NULL) - */ - const char * getRowName(int whichRow) const ; - inline double rowLower(int whichRow) const - { return getRowLower(whichRow);} - /** Gets rowUpper (if row does not exist then COIN_DBL_MAX) - */ - inline double rowUpper(int whichRow) const - { return getRowUpper(whichRow) ;} - /** Gets name (if row does not exist then NULL) - */ - inline const char * rowName(int whichRow) const - { return getRowName(whichRow);} - /** Gets columnLower (if column does not exist then 0.0) - */ - double getColumnLower(int whichColumn) const ; - /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) - */ - double getColumnUpper(int whichColumn) const ; - /** Gets columnObjective (if column does not exist then 0.0) - */ - double getColumnObjective(int whichColumn) const ; - /** Gets name (if column does not exist then NULL) - */ - const char * getColumnName(int whichColumn) const ; - /** Gets if integer (if column does not exist then false) - */ - bool getColumnIsInteger(int whichColumn) const ; - /** Gets columnLower (if column does not exist then 0.0) - */ - inline double columnLower(int whichColumn) const - { return getColumnLower(whichColumn);} - /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) - */ - inline double columnUpper(int whichColumn) const - { return getColumnUpper(whichColumn) ;} - /** Gets columnObjective (if column does not exist then 0.0) - */ - inline double columnObjective(int whichColumn) const - { return getColumnObjective(whichColumn);} - /** Gets columnObjective (if column does not exist then 0.0) - */ - inline double objective(int whichColumn) const - { return getColumnObjective(whichColumn);} - /** Gets name (if column does not exist then NULL) - */ - inline const char * columnName(int whichColumn) const - { return getColumnName(whichColumn);} - /** Gets if integer (if column does not exist then false) - */ - inline bool columnIsInteger(int whichColumn) const - { return getColumnIsInteger(whichColumn);} - /** Gets if integer (if column does not exist then false) - */ - inline bool isInteger(int whichColumn) const - { return getColumnIsInteger(whichColumn);} - /** Gets columnLower (if column does not exist then 0.0) - */ - inline double getColLower(int whichColumn) const - { return getColumnLower(whichColumn);} - /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) - */ - inline double getColUpper(int whichColumn) const - { return getColumnUpper(whichColumn) ;} - /** Gets columnObjective (if column does not exist then 0.0) - */ - inline double getColObjective(int whichColumn) const - { return getColumnObjective(whichColumn);} - /** Gets name (if column does not exist then NULL) - */ - inline const char * getColName(int whichColumn) const - { return getColumnName(whichColumn);} - /** Gets if integer (if column does not exist then false) - */ - inline bool getColIsInteger(int whichColumn) const - { return getColumnIsInteger(whichColumn);} - /** Gets rowLower (if row does not exist then -COIN_DBL_MAX) - */ - const char * getRowLowerAsString(int whichRow) const ; - /** Gets rowUpper (if row does not exist then +COIN_DBL_MAX) - */ - const char * getRowUpperAsString(int whichRow) const ; - inline const char * rowLowerAsString(int whichRow) const - { return getRowLowerAsString(whichRow);} - /** Gets rowUpper (if row does not exist then COIN_DBL_MAX) - */ - inline const char * rowUpperAsString(int whichRow) const - { return getRowUpperAsString(whichRow) ;} - /** Gets columnLower (if column does not exist then 0.0) - */ - const char * getColumnLowerAsString(int whichColumn) const ; - /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) - */ - const char * getColumnUpperAsString(int whichColumn) const ; - /** Gets columnObjective (if column does not exist then 0.0) - */ - const char * getColumnObjectiveAsString(int whichColumn) const ; - /** Gets if integer (if column does not exist then false) - */ - const char * getColumnIsIntegerAsString(int whichColumn) const ; - /** Gets columnLower (if column does not exist then 0.0) - */ - inline const char * columnLowerAsString(int whichColumn) const - { return getColumnLowerAsString(whichColumn);} - /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) - */ - inline const char * columnUpperAsString(int whichColumn) const - { return getColumnUpperAsString(whichColumn) ;} - /** Gets columnObjective (if column does not exist then 0.0) - */ - inline const char * columnObjectiveAsString(int whichColumn) const - { return getColumnObjectiveAsString(whichColumn);} - /** Gets columnObjective (if column does not exist then 0.0) - */ - inline const char * objectiveAsString(int whichColumn) const - { return getColumnObjectiveAsString(whichColumn);} - /** Gets if integer (if column does not exist then false) - */ - inline const char * columnIsIntegerAsString(int whichColumn) const - { return getColumnIsIntegerAsString(whichColumn);} - /** Gets if integer (if column does not exist then false) - */ - inline const char * isIntegerAsString(int whichColumn) const - { return getColumnIsIntegerAsString(whichColumn);} - /// Row index from row name (-1 if no names or no match) - int row(const char * rowName) const; - /// Column index from column name (-1 if no names or no match) - int column(const char * columnName) const; - /// Returns type - inline int type() const - { return type_;} - /// returns unset value - inline double unsetValue() const - { return -1.23456787654321e-97;} - /// Creates a packed matrix - return number of errors - int createPackedMatrix(CoinPackedMatrix & matrix, - const double * associated); - /** Fills in startPositive and startNegative with counts for +-1 matrix. - If not +-1 then startPositive[0]==-1 otherwise counts and - startPositive[numberColumns]== size - - return number of errors - */ - int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative, - const double * associated); - /** Creates +-1 matrix given startPositive and startNegative counts for +-1 matrix. - */ - void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative, - int * indices, - const double * associated); - /// Creates copies of various arrays - return number of errors - int createArrays(double * & rowLower, double * & rowUpper, - double * & columnLower, double * & columnUpper, - double * & objective, int * & integerType, - double * & associated); - /// Says if strings exist - inline bool stringsExist() const - { return string_.numberItems()!=0;} - /// Return string array - inline const CoinModelHash * stringArray() const - { return &string_;} - /// Returns associated array - inline double * associatedArray() const - { return associated_;} - /// Return rowLower array - inline double * rowLowerArray() const - { return rowLower_;} - /// Return rowUpper array - inline double * rowUpperArray() const - { return rowUpper_;} - /// Return columnLower array - inline double * columnLowerArray() const - { return columnLower_;} - /// Return columnUpper array - inline double * columnUpperArray() const - { return columnUpper_;} - /// Return objective array - inline double * objectiveArray() const - { return objective_;} - /// Return integerType array - inline int * integerTypeArray() const - { return integerType_;} - /// Return row names array - inline const CoinModelHash * rowNames() const - { return &rowName_;} - /// Return column names array - inline const CoinModelHash * columnNames() const - { return &columnName_;} - /// Reset row names - inline void zapRowNames() - { rowName_=CoinModelHash();} - /// Reset column names - inline void zapColumnNames() - { columnName_=CoinModelHash();} - /// Returns array of 0 or nonzero if can be a cut (or returns NULL) - inline const int * cutMarker() const - { return cut_;} - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline double optimizationDirection() const { - return optimizationDirection_; - } - /// Set direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline void setOptimizationDirection(double value) - { optimizationDirection_=value;} - /// Return pointer to more information - inline void * moreInfo() const - { return moreInfo_;} - /// Set pointer to more information - inline void setMoreInfo(void * info) - { moreInfo_ = info;} - /** Returns which parts of model are set - 1 - matrix - 2 - rhs - 4 - row names - 8 - column bounds and/or objective - 16 - column names - 32 - integer types - */ - int whatIsSet() const; - //@} - - /**@name for block models - matrix will be CoinPackedMatrix */ - //@{ - /*! \brief Load in a problem by copying the arguments. The constraints on - the rows are given by lower and upper bounds. - - If a pointer is 0 then the following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - - Note that the default values for rowub and rowlb produce the - constraint -infty <= ax <= infty. This is probably not what you want. - */ - void loadBlock (const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) ; - /*! \brief Load in a problem by copying the arguments. - The constraints on the rows are given by sense/rhs/range triplets. - - If a pointer is 0 then the following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • obj: all variables have 0 objective coefficient -
      • rowsen: all rows are >= -
      • rowrhs: all right hand sides are 0 -
      • rowrng: 0 for the ranged rows -
      - - Note that the default values for rowsen, rowrhs, and rowrng produce the - constraint ax >= 0. - */ - void loadBlock (const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) ; - - /*! \brief Load in a problem by copying the arguments. The constraint - matrix is is specified with standard column-major - column starts / row indices / coefficients vectors. - The constraints on the rows are given by lower and upper bounds. - - The matrix vectors must be gap-free. Note that start must - have numcols+1 entries so that the length of the last column - can be calculated as start[numcols]-start[numcols-1]. - - See the previous loadBlock method using rowlb and rowub for default - argument values. - */ - void loadBlock (const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) ; - - /*! \brief Load in a problem by copying the arguments. The constraint - matrix is is specified with standard column-major - column starts / row indices / coefficients vectors. - The constraints on the rows are given by sense/rhs/range triplets. - - The matrix vectors must be gap-free. Note that start must - have numcols+1 entries so that the length of the last column - can be calculated as start[numcols]-start[numcols-1]. - - See the previous loadBlock method using sense/rhs/range for default - argument values. - */ - void loadBlock (const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) ; - - //@} - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinModel(); - /** Constructor with sizes. */ - CoinModel(int firstRows, int firstColumns, int firstElements,bool noNames=false); - /** Read a problem in MPS or GAMS format from the given filename. - */ - CoinModel(const char *fileName, int allowStrings=0); - /** Read a problem from AMPL nl file - NOTE - as I can't work out configure etc the source code is in Cbc_ampl.cpp! - */ - CoinModel( int nonLinear, const char * fileName,const void * info); - /// From arrays - CoinModel(int numberRows, int numberColumns, - const CoinPackedMatrix * matrix, - const double * rowLower, const double * rowUpper, - const double * columnLower, const double * columnUpper, - const double * objective); - /// Clone - virtual CoinBaseModel * clone() const; - - /** Destructor */ - virtual ~CoinModel(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinModel(const CoinModel&); - /// = - CoinModel& operator=(const CoinModel&); - //@} - - /**@name For debug */ - //@{ - /// Checks that links are consistent - void validateLinks() const; - //@} -private: - /// Resize - void resize(int maximumRows, int maximumColumns, int maximumElements); - /// Fill in default row information - void fillRows(int which,bool forceCreation,bool fromAddRow=false); - /// Fill in default column information - void fillColumns(int which,bool forceCreation,bool fromAddColumn=false); - /** Fill in default linked list information (1= row, 2 = column) - Marked as const as list is mutable */ - void fillList(int which, CoinModelLinkedList & list,int type) const ; - /** Create a linked list and synchronize free - type 1 for row 2 for column - Marked as const as list is mutable */ - void createList(int type) const; - /// Adds one string, returns index - int addString(const char * string); - /** Gets a double from a string possibly containing named strings, - returns unset if not found - */ - double getDoubleFromString(CoinYacc & info, const char * string); - /// Frees value memory - void freeStringMemory(CoinYacc & info); -public: - /// Fills in all associated - returning number of errors - int computeAssociated(double * associated); - /** Gets correct form for a quadratic row - user to delete - If row is not quadratic then returns which other variables are involved - with tiny (1.0e-100) elements and count of total number of variables which could not - be put in quadratic form - */ - CoinPackedMatrix * quadraticRow(int rowNumber,double * linear, - int & numberBad) const; - /// Replaces a quadratic row - void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart); - /** If possible return a model where if all variables marked nonzero are fixed - the problem will be linear. At present may only work if quadratic. - Returns NULL if not possible - */ - CoinModel * reorder(const char * mark) const; - /** Expands out all possible combinations for a knapsack - If buildObj NULL then just computes space needed - returns number elements - On entry numberOutput is maximum allowed, on exit it is number needed or - -1 (as will be number elements) if maximum exceeded. numberOutput will have at - least space to return values which reconstruct input. - Rows returned will be original rows but no entries will be returned for - any rows all of whose entries are in knapsack. So up to user to allow for this. - If reConstruct >=0 then returns number of entrie which make up item "reConstruct" - in expanded knapsack. Values in buildRow and buildElement; - */ - int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart, - int * buildRow, double * buildElement,int reConstruct=-1) const; - /// Sets cut marker array - void setCutMarker(int size,const int * marker); - /// Sets priority array - void setPriorities(int size,const int * priorities); - /// priorities (given for all columns (-1 if not integer) - inline const int * priorities() const - { return priority_;} - /// For decomposition set original row and column indices - void setOriginalIndices(const int * row, const int * column); - -private: - /** Read a problem from AMPL nl file - so not constructor so gdb will work - */ - void gdb( int nonLinear, const char * fileName, const void * info); - /// returns jColumn (-2 if linear term, -1 if unknown) and coefficient - int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const; - /// Aborts with message about packedMatrix - void badType() const; - /**@name Data members */ - //@{ - /// Maximum number of rows - int maximumRows_; - /// Maximum number of columns - int maximumColumns_; - /// Current number of elements - int numberElements_; - /// Maximum number of elements - int maximumElements_; - /// Current number of quadratic elements - int numberQuadraticElements_; - /// Maximum number of quadratic elements - int maximumQuadraticElements_; - /// Row lower - double * rowLower_; - /// Row upper - double * rowUpper_; - /// Row names - CoinModelHash rowName_; - /** Row types. - Has information - at present - bit 0 - rowLower is a string - bit 1 - rowUpper is a string - NOTE - if converted to CoinPackedMatrix - may be indices of - original rows (i.e. when decomposed) - */ - int * rowType_; - /// Objective - double * objective_; - /// Column Lower - double * columnLower_; - /// Column Upper - double * columnUpper_; - /// Column names - CoinModelHash columnName_; - /// Integer information - int * integerType_; - /// Strings - CoinModelHash string_; - /** Column types. - Has information - at present - bit 0 - columnLower is a string - bit 1 - columnUpper is a string - bit 2 - objective is a string - bit 3 - integer setting is a string - NOTE - if converted to CoinPackedMatrix - may be indices of - original columns (i.e. when decomposed) - */ - int * columnType_; - /// If simple then start of each row/column - int * start_; - /// Actual elements - CoinModelTriple * elements_; - /// Actual elements as CoinPackedMatrix - CoinPackedMatrix * packedMatrix_; - /// Hash for elements - mutable CoinModelHash2 hashElements_; - /// Linked list for rows - mutable CoinModelLinkedList rowList_; - /// Linked list for columns - mutable CoinModelLinkedList columnList_; - /// Actual quadratic elements (always linked lists) - CoinModelTriple * quadraticElements_; - /// Hash for quadratic elements - mutable CoinModelHash2 hashQuadraticElements_; - /// Array for sorting indices - int * sortIndices_; - /// Array for sorting elements - double * sortElements_; - /// Size of sort arrays - int sortSize_; - /// Linked list for quadratic rows - mutable CoinModelLinkedList quadraticRowList_; - /// Linked list for quadratic columns - mutable CoinModelLinkedList quadraticColumnList_; - /// Size of associated values - int sizeAssociated_; - /// Associated values - double * associated_; - /// Number of SOS - all these are done in one go e.g. from ampl - int numberSOS_; - /// SOS starts - int * startSOS_; - /// SOS members - int * memberSOS_; - /// SOS type - int * typeSOS_; - /// SOS priority - int * prioritySOS_; - /// SOS reference - double * referenceSOS_; - /// priorities (given for all columns (-1 if not integer) - int * priority_; - /// Nonzero if row is cut - done in one go e.g. from ampl - int * cut_; - /// Pointer to more information - void * moreInfo_; - /** Type of build - - -1 unset, - 0 for row, - 1 for column, - 2 linked. - 3 matrix is CoinPackedMatrix (and at present can't be modified); - */ - mutable int type_; - /// True if no names EVER being used (for users who know what they are doing) - bool noNames_; - /** Links present (could be tested by sizes of objects) - 0 - none, - 1 - row links, - 2 - column links, - 3 - both - */ - mutable int links_; - //@} -}; -/// Just function of single variable x -double getFunctionValueFromString(const char * string, const char * x, double xValue); -/// faster version -double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue); -#endif diff --git a/thirdparty/linux/include/coin1/CoinModelUseful.hpp b/thirdparty/linux/include/coin1/CoinModelUseful.hpp deleted file mode 100644 index f9eeea33..00000000 --- a/thirdparty/linux/include/coin1/CoinModelUseful.hpp +++ /dev/null @@ -1,441 +0,0 @@ -/* $Id: CoinModelUseful.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinModelUseful_H -#define CoinModelUseful_H - - -#include -#include -#include -#include -#include -#include -#include - - -#include "CoinPragma.hpp" - -/** - This is for various structures/classes needed by CoinModel. - - CoinModelLink - CoinModelLinkedList - CoinModelHash -*/ -/// for going through row or column - -class CoinModelLink { - -public: - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinModelLink(); - /** Destructor */ - ~CoinModelLink(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinModelLink(const CoinModelLink&); - /// = - CoinModelLink& operator=(const CoinModelLink&); - //@} - - /**@name Sets and gets method */ - //@{ - /// Get row - inline int row() const - { return row_;} - /// Get column - inline int column() const - { return column_;} - /// Get value - inline double value() const - { return value_;} - /// Get value - inline double element() const - { return value_;} - /// Get position - inline int position() const - { return position_;} - /// Get onRow - inline bool onRow() const - { return onRow_;} - /// Set row - inline void setRow(int row) - { row_=row;} - /// Set column - inline void setColumn(int column) - { column_=column;} - /// Set value - inline void setValue(double value) - { value_=value;} - /// Set value - inline void setElement(double value) - { value_=value;} - /// Set position - inline void setPosition(int position) - { position_=position;} - /// Set onRow - inline void setOnRow(bool onRow) - { onRow_=onRow;} - //@} - -private: - /**@name Data members */ - //@{ - /// Row - int row_; - /// Column - int column_; - /// Value as double - double value_; - /// Position in data - int position_; - /// If on row chain - bool onRow_; - //@} -}; - -/// for linked lists -// for specifying triple -typedef struct { - // top bit is nonzero if string - // rest is row - unsigned int row; - //CoinModelRowIndex row; - int column; - double value; // If string then index into strings -} CoinModelTriple; -inline int rowInTriple(const CoinModelTriple & triple) -{ return triple.row&0x7fffffff;} -inline void setRowInTriple(CoinModelTriple & triple,int iRow) -{ triple.row = iRow|(triple.row&0x80000000);} -inline bool stringInTriple(const CoinModelTriple & triple) -{ return (triple.row&0x80000000)!=0;} -inline void setStringInTriple(CoinModelTriple & triple,bool string) -{ triple.row = (string ? 0x80000000 : 0)|(triple.row&0x7fffffff);} -inline void setRowAndStringInTriple(CoinModelTriple & triple, - int iRow,bool string) -{ triple.row = (string ? 0x80000000 : 0)|iRow;} -/// for names and hashing -// for hashing -typedef struct { - int index, next; -} CoinModelHashLink; - -/* Function type. */ -typedef double (*func_t) (double); - -/// For string evaluation -/* Data type for links in the chain of symbols. */ -struct symrec -{ - char *name; /* name of symbol */ - int type; /* type of symbol: either VAR or FNCT */ - union - { - double var; /* value of a VAR */ - func_t fnctptr; /* value of a FNCT */ - } value; - struct symrec *next; /* link field */ -}; - -typedef struct symrec symrec; - -class CoinYacc { -private: - CoinYacc(const CoinYacc& rhs); - CoinYacc& operator=(const CoinYacc& rhs); - -public: - CoinYacc() : symtable(NULL), symbuf(NULL), length(0), unsetValue(0) {} - ~CoinYacc() - { - if (length) { - free(symbuf); - symbuf = NULL; - } - symrec* s = symtable; - while (s) { - free(s->name); - symtable = s; - s = s->next; - free(symtable); - } - } - -public: - symrec * symtable; - char * symbuf; - int length; - double unsetValue; -}; - -class CoinModelHash { - -public: - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinModelHash(); - /** Destructor */ - ~CoinModelHash(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinModelHash(const CoinModelHash&); - /// = - CoinModelHash& operator=(const CoinModelHash&); - //@} - - /**@name sizing (just increases) */ - //@{ - /// Resize hash (also re-hashs) - void resize(int maxItems,bool forceReHash=false); - /// Number of items i.e. rows if just row names - inline int numberItems() const - { return numberItems_;} - /// Set number of items - void setNumberItems(int number); - /// Maximum number of items - inline int maximumItems() const - { return maximumItems_;} - /// Names - inline const char *const * names() const - { return names_;} - //@} - - /**@name hashing */ - //@{ - /// Returns index or -1 - int hash(const char * name) const; - /// Adds to hash - void addHash(int index, const char * name); - /// Deletes from hash - void deleteHash(int index); - /// Returns name at position (or NULL) - const char * name(int which) const; - /// Returns non const name at position (or NULL) - char * getName(int which) const; - /// Sets name at position (does not create) - void setName(int which,char * name ) ; - /// Validates - void validateHash() const; -private: - /// Returns a hash value - int hashValue(const char * name) const; -public: - //@} -private: - /**@name Data members */ - //@{ - /// Names - char ** names_; - /// hash - CoinModelHashLink * hash_; - /// Number of items - int numberItems_; - /// Maximum number of items - int maximumItems_; - /// Last slot looked at - int lastSlot_; - //@} -}; -/// For int,int hashing -class CoinModelHash2 { - -public: - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinModelHash2(); - /** Destructor */ - ~CoinModelHash2(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinModelHash2(const CoinModelHash2&); - /// = - CoinModelHash2& operator=(const CoinModelHash2&); - //@} - - /**@name sizing (just increases) */ - //@{ - /// Resize hash (also re-hashs) - void resize(int maxItems, const CoinModelTriple * triples,bool forceReHash=false); - /// Number of items - inline int numberItems() const - { return numberItems_;} - /// Set number of items - void setNumberItems(int number); - /// Maximum number of items - inline int maximumItems() const - { return maximumItems_;} - //@} - - /**@name hashing */ - //@{ - /// Returns index or -1 - int hash(int row, int column, const CoinModelTriple * triples) const; - /// Adds to hash - void addHash(int index, int row, int column, const CoinModelTriple * triples); - /// Deletes from hash - void deleteHash(int index, int row, int column); -private: - /// Returns a hash value - int hashValue(int row, int column) const; -public: - //@} -private: - /**@name Data members */ - //@{ - /// hash - CoinModelHashLink * hash_; - /// Number of items - int numberItems_; - /// Maximum number of items - int maximumItems_; - /// Last slot looked at - int lastSlot_; - //@} -}; -class CoinModelLinkedList { - -public: - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinModelLinkedList(); - /** Destructor */ - ~CoinModelLinkedList(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinModelLinkedList(const CoinModelLinkedList&); - /// = - CoinModelLinkedList& operator=(const CoinModelLinkedList&); - //@} - - /**@name sizing (just increases) */ - //@{ - /** Resize list - for row list maxMajor is maximum rows. - */ - void resize(int maxMajor,int maxElements); - /** Create list - for row list maxMajor is maximum rows. - type 0 row list, 1 column list - */ - void create(int maxMajor,int maxElements, - int numberMajor, int numberMinor, - int type, - int numberElements, const CoinModelTriple * triples); - /// Number of major items i.e. rows if just row links - inline int numberMajor() const - { return numberMajor_;} - /// Maximum number of major items i.e. rows if just row links - inline int maximumMajor() const - { return maximumMajor_;} - /// Number of elements - inline int numberElements() const - { return numberElements_;} - /// Maximum number of elements - inline int maximumElements() const - { return maximumElements_;} - /// First on free chain - inline int firstFree() const - { return first_[maximumMajor_];} - /// Last on free chain - inline int lastFree() const - { return last_[maximumMajor_];} - /// First on chain - inline int first(int which) const - { return first_[which];} - /// Last on chain - inline int last(int which) const - { return last_[which];} - /// Next array - inline const int * next() const - { return next_;} - /// Previous array - inline const int * previous() const - { return previous_;} - //@} - - /**@name does work */ - //@{ - /** Adds to list - easy case i.e. add row to row list - Returns where chain starts - */ - int addEasy(int majorIndex, int numberOfElements, const int * indices, - const double * elements, CoinModelTriple * triples, - CoinModelHash2 & hash); - /** Adds to list - hard case i.e. add row to column list - */ - void addHard(int minorIndex, int numberOfElements, const int * indices, - const double * elements, CoinModelTriple * triples, - CoinModelHash2 & hash); - /** Adds to list - hard case i.e. add row to column list - This is when elements have been added to other copy - */ - void addHard(int first, const CoinModelTriple * triples, - int firstFree, int lastFree,const int * nextOther); - /** Deletes from list - same case i.e. delete row from row list - */ - void deleteSame(int which, CoinModelTriple * triples, - CoinModelHash2 & hash, bool zapTriples); - /** Deletes from list - other case i.e. delete row from column list - This is when elements have been deleted from other copy - */ - void updateDeleted(int which, CoinModelTriple * triples, - CoinModelLinkedList & otherList); - /** Deletes one element from Row list - */ - void deleteRowOne(int position, CoinModelTriple * triples, - CoinModelHash2 & hash); - /** Update column list for one element when - one element deleted from row copy - */ - void updateDeletedOne(int position, const CoinModelTriple * triples); - /// Fills first,last with -1 - void fill(int first,int last); - /** Puts in free list from other list */ - void synchronize(CoinModelLinkedList & other); - /// Checks that links are consistent - void validateLinks(const CoinModelTriple * triples) const; - //@} -private: - /**@name Data members */ - //@{ - /// Previous - maximumElements long - int * previous_; - /// Next - maximumElements long - int * next_; - /// First - maximumMajor+1 long (last free element chain) - int * first_; - /// Last - maximumMajor+1 long (last free element chain) - int * last_; - /// Number of major items i.e. rows if just row links - int numberMajor_; - /// Maximum number of major items i.e. rows if just row links - int maximumMajor_; - /// Number of elements - int numberElements_; - /// Maximum number of elements - int maximumElements_; - /// 0 row list, 1 column list - int type_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinMpsIO.hpp b/thirdparty/linux/include/coin1/CoinMpsIO.hpp deleted file mode 100644 index 8f0226a5..00000000 --- a/thirdparty/linux/include/coin1/CoinMpsIO.hpp +++ /dev/null @@ -1,1056 +0,0 @@ -/* $Id: CoinMpsIO.hpp 1642 2013-10-16 00:43:14Z tkr $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinMpsIO_H -#define CoinMpsIO_H - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#endif - -#include -#include - -#include "CoinUtilsConfig.h" -#include "CoinPackedMatrix.hpp" -#include "CoinMessageHandler.hpp" -#include "CoinFileIO.hpp" -class CoinModel; - -/// The following lengths are in decreasing order (for 64 bit etc) -/// Large enough to contain element index -/// This is already defined as CoinBigIndex -/// Large enough to contain column index -typedef int COINColumnIndex; - -/// Large enough to contain row index (or basis) -typedef int COINRowIndex; - -// We are allowing free format - but there is a limit! -// User can override by using CXXFLAGS += -DCOIN_MAX_FIELD_LENGTH=nnn -#ifndef COIN_MAX_FIELD_LENGTH -#define COIN_MAX_FIELD_LENGTH 160 -#endif -#define MAX_CARD_LENGTH 5*COIN_MAX_FIELD_LENGTH+80 - -enum COINSectionType { COIN_NO_SECTION, COIN_NAME_SECTION, COIN_ROW_SECTION, - COIN_COLUMN_SECTION, - COIN_RHS_SECTION, COIN_RANGES_SECTION, COIN_BOUNDS_SECTION, - COIN_ENDATA_SECTION, COIN_EOF_SECTION, COIN_QUADRATIC_SECTION, - COIN_CONIC_SECTION,COIN_QUAD_SECTION,COIN_SOS_SECTION, - COIN_BASIS_SECTION,COIN_UNKNOWN_SECTION -}; - -enum COINMpsType { COIN_N_ROW, COIN_E_ROW, COIN_L_ROW, COIN_G_ROW, - COIN_BLANK_COLUMN, COIN_S1_COLUMN, COIN_S2_COLUMN, COIN_S3_COLUMN, - COIN_INTORG, COIN_INTEND, COIN_SOSEND, COIN_UNSET_BOUND, - COIN_UP_BOUND, COIN_FX_BOUND, COIN_LO_BOUND, COIN_FR_BOUND, - COIN_MI_BOUND, COIN_PL_BOUND, COIN_BV_BOUND, - COIN_UI_BOUND, COIN_LI_BOUND, COIN_BOTH_BOUNDS_SET, - COIN_SC_BOUND, COIN_S1_BOUND, COIN_S2_BOUND, - COIN_BS_BASIS, COIN_XL_BASIS, COIN_XU_BASIS, - COIN_LL_BASIS, COIN_UL_BASIS, COIN_UNKNOWN_MPS_TYPE -}; -class CoinMpsIO; -/// Very simple code for reading MPS data -class CoinMpsCardReader { - -public: - - /**@name Constructor and destructor */ - //@{ - /// Constructor expects file to be open - /// This one takes gzFile if fp null - CoinMpsCardReader ( CoinFileInput *input, CoinMpsIO * reader ); - - /// Destructor - ~CoinMpsCardReader ( ); - //@} - - - /**@name card stuff */ - //@{ - /// Read to next section - COINSectionType readToNextSection ( ); - /// Gets next field and returns section type e.g. COIN_COLUMN_SECTION - COINSectionType nextField ( ); - /** Gets next field for .gms file and returns type. - -1 - EOF - 0 - what we expected (and processed so pointer moves past) - 1 - not what we expected - leading blanks always ignored - input types - 0 - anything - stops on non blank card - 1 - name (in columnname) - 2 - value - 3 - value name pair - 4 - equation type - 5 - ; - */ - int nextGmsField ( int expectedType ); - /// Returns current section type - inline COINSectionType whichSection ( ) const { - return section_; - } - /// Sets current section type - inline void setWhichSection(COINSectionType section ) { - section_=section; - } - /// Sees if free format. - inline bool freeFormat() const - { return freeFormat_;} - /// Sets whether free format. Mainly for blank RHS etc - inline void setFreeFormat(bool yesNo) - { freeFormat_=yesNo;} - /// Only for first field on card otherwise BLANK_COLUMN - /// e.g. COIN_E_ROW - inline COINMpsType mpsType ( ) const { - return mpsType_; - } - /// Reads and cleans card - taking out trailing blanks - return 1 if EOF - int cleanCard(); - /// Returns row name of current field - inline const char *rowName ( ) const { - return rowName_; - } - /// Returns column name of current field - inline const char *columnName ( ) const { - return columnName_; - } - /// Returns value in current field - inline double value ( ) const { - return value_; - } - /// Returns value as string in current field - inline const char *valueString ( ) const { - return valueString_; - } - /// Whole card (for printing) - inline const char *card ( ) const { - return card_; - } - /// Whole card - so we look at it (not const so nextBlankOr will work for gms reader) - inline char *mutableCard ( ) { - return card_; - } - /// set position (again so gms reader will work) - inline void setPosition(char * position) - { position_=position;} - /// get position (again so gms reader will work) - inline char * getPosition() const - { return position_;} - /// Returns card number - inline CoinBigIndex cardNumber ( ) const { - return cardNumber_; - } - /// Returns file input - inline CoinFileInput * fileInput ( ) const { - return input_; - } - /// Sets whether strings allowed - inline void setStringsAllowed() - { stringsAllowed_=true;} - //@} - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Current value - double value_; - /// Current card image - char card_[MAX_CARD_LENGTH]; - /// Current position within card image - char *position_; - /// End of card - char *eol_; - /// Current COINMpsType - COINMpsType mpsType_; - /// Current row name - char rowName_[COIN_MAX_FIELD_LENGTH]; - /// Current column name - char columnName_[COIN_MAX_FIELD_LENGTH]; - /// File input - CoinFileInput *input_; - /// Which section we think we are in - COINSectionType section_; - /// Card number - CoinBigIndex cardNumber_; - /// Whether free format. Just for blank RHS etc - bool freeFormat_; - /// Whether IEEE - 0 no, 1 INTEL, 2 not INTEL - int ieeeFormat_; - /// If all names <= 8 characters then allow embedded blanks - bool eightChar_; - /// MpsIO - CoinMpsIO * reader_; - /// Message handler - CoinMessageHandler * handler_; - /// Messages - CoinMessages messages_; - /// Current element as characters (only if strings allowed) - char valueString_[COIN_MAX_FIELD_LENGTH]; - /// Whether strings allowed - bool stringsAllowed_; - //@} -public: - /**@name methods */ - //@{ - /// type - 0 normal, 1 INTEL IEEE, 2 other IEEE - double osi_strtod(char * ptr, char ** output, int type); - /// remove blanks - static void strcpyAndCompress ( char *to, const char *from ); - /// - static char * nextBlankOr ( char *image ); - /// For strings - double osi_strtod(char * ptr, char ** output); - //@} - -}; - -//############################################################################# -#ifdef USE_SBB -class SbbObject; -class SbbModel; -#endif -/// Very simple class for containing data on set -class CoinSet { - -public: - - /**@name Constructor and destructor */ - //@{ - /// Default constructor - CoinSet ( ); - /// Constructor - CoinSet ( int numberEntries, const int * which); - - /// Copy constructor - CoinSet (const CoinSet &); - - /// Assignment operator - CoinSet & operator=(const CoinSet& rhs); - - /// Destructor - virtual ~CoinSet ( ); - //@} - - - /**@name gets */ - //@{ - /// Returns number of entries - inline int numberEntries ( ) const - { return numberEntries_; } - /// Returns type of set - 1 =SOS1, 2 =SOS2 - inline int setType ( ) const - { return setType_; } - /// Returns list of variables - inline const int * which ( ) const - { return which_; } - /// Returns weights - inline const double * weights ( ) const - { return weights_; } - //@} - -#ifdef USE_SBB - /**@name Use in sbb */ - //@{ - /// returns an object of type SbbObject - virtual SbbObject * sbbObject(SbbModel * model) const - { return NULL;} - //@} -#endif - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Number of entries - int numberEntries_; - /// type of set - int setType_; - /// Which variables are in set - int * which_; - /// Weights - double * weights_; - //@} -}; - -//############################################################################# -/// Very simple class for containing SOS set -class CoinSosSet : public CoinSet{ - -public: - - /**@name Constructor and destructor */ - //@{ - /// Constructor - CoinSosSet ( int numberEntries, const int * which, const double * weights, int type); - - /// Destructor - virtual ~CoinSosSet ( ); - //@} - - -#ifdef USE_SBB - /**@name Use in sbb */ - //@{ - /// returns an object of type SbbObject - virtual SbbObject * sbbObject(SbbModel * model) const ; - //@} -#endif - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - //@} -}; - -//############################################################################# - -/** MPS IO Interface - - This class can be used to read in mps files without a solver. After - reading the file, the CoinMpsIO object contains all relevant data, which - may be more than a particular OsiSolverInterface allows for. Items may - be deleted to allow for flexibility of data storage. - - The implementation makes the CoinMpsIO object look very like a dummy solver, - as the same conventions are used. -*/ - -class CoinMpsIO { - friend void CoinMpsIOUnitTest(const std::string & mpsDir); - -public: - -/** @name Methods to retrieve problem information - - These methods return information about the problem held by the CoinMpsIO - object. - - Querying an object that has no data associated with it result in zeros for - the number of rows and columns, and NULL pointers from the methods that - return vectors. Const pointers returned from any data-query method are - always valid -*/ -//@{ - /// Get number of columns - int getNumCols() const; - - /// Get number of rows - int getNumRows() const; - - /// Get number of nonzero elements - int getNumElements() const; - - /// Get pointer to array[getNumCols()] of column lower bounds - const double * getColLower() const; - - /// Get pointer to array[getNumCols()] of column upper bounds - const double * getColUpper() const; - - /** Get pointer to array[getNumRows()] of constraint senses. -
        -
      • 'L': <= constraint -
      • 'E': = constraint -
      • 'G': >= constraint -
      • 'R': ranged constraint -
      • 'N': free constraint -
      - */ - const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of constraint right-hand sides. - - Given constraints with upper (rowupper) and/or lower (rowlower) bounds, - the constraint right-hand side (rhs) is set as -
        -
      • if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i] -
      • if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'N' then rhs()[i] == 0.0 -
      - */ - const double * getRightHandSide() const; - - /** Get pointer to array[getNumRows()] of row ranges. - - Given constraints with upper (rowupper) and/or lower (rowlower) bounds, - the constraint range (rowrange) is set as -
        -
      • if rowsense()[i] == 'R' then - rowrange()[i] == rowupper()[i] - rowlower()[i] -
      • if rowsense()[i] != 'R' then - rowrange()[i] is 0.0 -
      - Put another way, only range constraints have a nontrivial value for - rowrange. - */ - const double * getRowRange() const; - - /// Get pointer to array[getNumRows()] of row lower bounds - const double * getRowLower() const; - - /// Get pointer to array[getNumRows()] of row upper bounds - const double * getRowUpper() const; - - /// Get pointer to array[getNumCols()] of objective function coefficients - const double * getObjCoefficients() const; - - /// Get pointer to row-wise copy of the coefficient matrix - const CoinPackedMatrix * getMatrixByRow() const; - - /// Get pointer to column-wise copy of the coefficient matrix - const CoinPackedMatrix * getMatrixByCol() const; - - /// Return true if column is a continuous variable - bool isContinuous(int colNumber) const; - - /** Return true if a column is an integer variable - - Note: This function returns true if the the column - is a binary or general integer variable. - */ - bool isInteger(int columnNumber) const; - - /** Returns array[getNumCols()] specifying if a variable is integer. - - At present, simply coded as zero (continuous) and non-zero (integer) - May be extended at a later date. - */ - const char * integerColumns() const; - - /** Returns the row name for the specified index. - - Returns 0 if the index is out of range. - */ - const char * rowName(int index) const; - - /** Returns the column name for the specified index. - - Returns 0 if the index is out of range. - */ - const char * columnName(int index) const; - - /** Returns the index for the specified row name - - Returns -1 if the name is not found. - Returns numberRows for the objective row and > numberRows for - dropped free rows. - */ - int rowIndex(const char * name) const; - - /** Returns the index for the specified column name - - Returns -1 if the name is not found. - */ - int columnIndex(const char * name) const; - - /** Returns the (constant) objective offset - - This is the RHS entry for the objective row - */ - double objectiveOffset() const; - /// Set objective offset - inline void setObjectiveOffset(double value) - { objectiveOffset_=value;} - - /// Return the problem name - const char * getProblemName() const; - - /// Return the objective name - const char * getObjectiveName() const; - - /// Return the RHS vector name - const char * getRhsName() const; - - /// Return the range vector name - const char * getRangeName() const; - - /// Return the bound vector name - const char * getBoundName() const; - /// Number of string elements - inline int numberStringElements() const - { return numberStringElements_;} - /// String element - inline const char * stringElement(int i) const - { return stringElements_[i];} -//@} - - -/** @name Methods to set problem information - - Methods to load a problem into the CoinMpsIO object. -*/ -//@{ - - /// Set the problem data - void setMpsData(const CoinPackedMatrix& m, const double infinity, - const double* collb, const double* colub, - const double* obj, const char* integrality, - const double* rowlb, const double* rowub, - char const * const * const colnames, - char const * const * const rownames); - void setMpsData(const CoinPackedMatrix& m, const double infinity, - const double* collb, const double* colub, - const double* obj, const char* integrality, - const double* rowlb, const double* rowub, - const std::vector & colnames, - const std::vector & rownames); - void setMpsData(const CoinPackedMatrix& m, const double infinity, - const double* collb, const double* colub, - const double* obj, const char* integrality, - const char* rowsen, const double* rowrhs, - const double* rowrng, - char const * const * const colnames, - char const * const * const rownames); - void setMpsData(const CoinPackedMatrix& m, const double infinity, - const double* collb, const double* colub, - const double* obj, const char* integrality, - const char* rowsen, const double* rowrhs, - const double* rowrng, - const std::vector & colnames, - const std::vector & rownames); - - /** Pass in an array[getNumCols()] specifying if a variable is integer. - - At present, simply coded as zero (continuous) and non-zero (integer) - May be extended at a later date. - */ - void copyInIntegerInformation(const char * integerInformation); - - /// Set problem name - void setProblemName(const char *name) ; - - /// Set objective name - void setObjectiveName(const char *name) ; - -//@} - -/** @name Parameter set/get methods - - Methods to set and retrieve MPS IO parameters. -*/ - -//@{ - /// Set infinity - void setInfinity(double value); - - /// Get infinity - double getInfinity() const; - - /// Set default upper bound for integer variables - void setDefaultBound(int value); - - /// Get default upper bound for integer variables - int getDefaultBound() const; - /// Whether to allow string elements - inline int allowStringElements() const - { return allowStringElements_;} - /// Whether to allow string elements (0 no, 1 yes, 2 yes and try flip) - inline void setAllowStringElements(int yesNo) - { allowStringElements_ = yesNo;} - /** Small element value - elements less than this set to zero on input - default is 1.0e-14 */ - inline double getSmallElementValue() const - { return smallElement_;} - inline void setSmallElementValue(double value) - { smallElement_=value;} -//@} - - -/** @name Methods for problem input and output - - Methods to read and write MPS format problem files. - - The read and write methods return the number of errors that occurred during - the IO operation, or -1 if no file is opened. - - \note - If the CoinMpsIO class was compiled with support for libz then - readMps will automatically try to append .gz to the file name and open it as - a compressed file if the specified file name cannot be opened. - (Automatic append of the .bz2 suffix when libbz is used is on the TODO list.) - - \todo - Allow for file pointers and positioning -*/ - -//@{ - /// Set the current file name for the CoinMpsIO object - void setFileName(const char * name); - - /// Get the current file name for the CoinMpsIO object - const char * getFileName() const; - - /** Read a problem in MPS format from the given filename. - - Use "stdin" or "-" to read from stdin. - */ - int readMps(const char *filename, const char *extension = "mps"); - - /** Read a problem in MPS format from the given filename. - - Use "stdin" or "-" to read from stdin. - But do sets as well - */ - int readMps(const char *filename, const char *extension , - int & numberSets, CoinSet **& sets); - - /** Read a problem in MPS format from a previously opened file - - More precisely, read a problem using a CoinMpsCardReader object already - associated with this CoinMpsIO object. - - \todo - Provide an interface that will allow a client to associate a - CoinMpsCardReader object with a CoinMpsIO object by setting the - cardReader_ field. - */ - int readMps(); - /// and - int readMps(int & numberSets, CoinSet **& sets); - /** Read a basis in MPS format from the given filename. - If VALUES on NAME card and solution not NULL fills in solution - status values as for CoinWarmStartBasis (but one per char) - -1 file error, 0 normal, 1 has solution values - - Use "stdin" or "-" to read from stdin. - - If sizes of names incorrect - read without names - */ - int readBasis(const char *filename, const char *extension , - double * solution, unsigned char *rowStatus, unsigned char *columnStatus, - const std::vector & colnames,int numberColumns, - const std::vector & rownames, int numberRows); - - /** Read a problem in GAMS format from the given filename. - - Use "stdin" or "-" to read from stdin. - if convertObjective then massages objective column - */ - int readGms(const char *filename, const char *extension = "gms",bool convertObjective=false); - - /** Read a problem in GAMS format from the given filename. - - Use "stdin" or "-" to read from stdin. - But do sets as well - */ - int readGms(const char *filename, const char *extension , - int & numberSets, CoinSet **& sets); - - /** Read a problem in GAMS format from a previously opened file - - More precisely, read a problem using a CoinMpsCardReader object already - associated with this CoinMpsIO object. - - */ - // Not for now int readGms(); - /// and - int readGms(int & numberSets, CoinSet **& sets); - /** Read a problem in GMPL (subset of AMPL) format from the given filenames. - */ - int readGMPL(const char *modelName, const char * dataName=NULL, bool keepNames=false); - - /** Write the problem in MPS format to a file with the given filename. - - \param compression can be set to three values to indicate what kind - of file should be written -
        -
      • 0: plain text (default) -
      • 1: gzip compressed (.gz is appended to \c filename) -
      • 2: bzip2 compressed (.bz2 is appended to \c filename) (TODO) -
      - If the library was not compiled with the requested compression then - writeMps falls back to writing a plain text file. - - \param formatType specifies the precision to used for values in the - MPS file -
        -
      • 0: normal precision (default) -
      • 1: extra accuracy -
      • 2: IEEE hex -
      - - \param numberAcross specifies whether 1 or 2 (default) values should be - specified on every data line in the MPS file. - - \param quadratic specifies quadratic objective to be output - */ - int writeMps(const char *filename, int compression = 0, - int formatType = 0, int numberAcross = 2, - CoinPackedMatrix * quadratic = NULL, - int numberSOS=0,const CoinSet * setInfo=NULL) const; - - /// Return card reader object so can see what last card was e.g. QUADOBJ - inline const CoinMpsCardReader * reader() const - { return cardReader_;} - - /** Read in a quadratic objective from the given filename. - - If filename is NULL (or the same as the currently open file) then - reading continues from the current file. - If not, the file is closed and the specified file is opened. - - Code should be added to - general MPS reader to read this if QSECTION - Data is assumed to be Q and objective is c + 1/2 xT Q x - No assumption is made for symmetry, positive definite, etc. - No check is made for duplicates or non-triangular if checkSymmetry==0. - If 1 checks lower triangular (so off diagonal should be 2*Q) - if 2 makes lower triangular and assumes full Q (but adds off diagonals) - - Arrays should be deleted by delete [] - - Returns number of errors: -
        -
      • -1: bad file -
      • -2: no Quadratic section -
      • -3: an empty section -
      • +n: then matching errors etc (symmetry forced) -
      • -4: no matching errors but fails triangular test - (triangularity forced) -
      - columnStart is numberColumns+1 long, others numberNonZeros - */ - int readQuadraticMps(const char * filename, - int * &columnStart, int * &column, double * &elements, - int checkSymmetry); - - /** Read in a list of cones from the given filename. - - If filename is NULL (or the same as the currently open file) then - reading continues from the current file. - If not, the file is closed and the specified file is opened. - - Code should be added to - general MPS reader to read this if CSECTION - No checking is done that in unique cone - - Arrays should be deleted by delete [] - - Returns number of errors, -1 bad file, -2 no conic section, - -3 empty section - - columnStart is numberCones+1 long, other number of columns in matrix - - coneType is 1 for QUAD, 2 for RQUAD (numberCones long) -*/ - int readConicMps(const char * filename, - int * &columnStart, int * &column, int * &coneType, int & numberCones); - /// Set whether to move objective from matrix - inline void setConvertObjective(bool trueFalse) - { convertObjective_=trueFalse;} - /// copies in strings from a CoinModel - returns number - int copyStringElements(const CoinModel * model); - //@} - -/** @name Constructors and destructors */ -//@{ - /// Default Constructor - CoinMpsIO(); - - /// Copy constructor - CoinMpsIO (const CoinMpsIO &); - - /// Assignment operator - CoinMpsIO & operator=(const CoinMpsIO& rhs); - - /// Destructor - ~CoinMpsIO (); -//@} - - -/**@name Message handling */ -//@{ - /** Pass in Message handler - - Supply a custom message handler. It will not be destroyed when the - CoinMpsIO object is destroyed. - */ - void passInMessageHandler(CoinMessageHandler * handler); - - /// Set the language for messages. - void newLanguage(CoinMessages::Language language); - - /// Set the language for messages. - inline void setLanguage(CoinMessages::Language language) {newLanguage(language);} - - /// Return the message handler - inline CoinMessageHandler * messageHandler() const {return handler_;} - - /// Return the messages - inline CoinMessages messages() {return messages_;} - /// Return the messages pointer - inline CoinMessages * messagesPointer() {return & messages_;} -//@} - - -/**@name Methods to release storage - - These methods allow the client to reduce the storage used by the CoinMpsIO - object be selectively releasing unneeded problem information. -*/ -//@{ - /** Release all information which can be re-calculated. - - E.g., row sense, copies of rows, hash tables for names. - */ - void releaseRedundantInformation(); - - /// Release all row information (lower, upper) - void releaseRowInformation(); - - /// Release all column information (lower, upper, objective) - void releaseColumnInformation(); - - /// Release integer information - void releaseIntegerInformation(); - - /// Release row names - void releaseRowNames(); - - /// Release column names - void releaseColumnNames(); - - /// Release matrix information - void releaseMatrixInformation(); - //@} - -protected: - -/**@name Miscellaneous helper functions */ - //@{ - - /// Utility method used several times to implement public methods - void - setMpsDataWithoutRowAndColNames( - const CoinPackedMatrix& m, const double infinity, - const double* collb, const double* colub, - const double* obj, const char* integrality, - const double* rowlb, const double* rowub); - void - setMpsDataColAndRowNames( - const std::vector & colnames, - const std::vector & rownames); - void - setMpsDataColAndRowNames( - char const * const * const colnames, - char const * const * const rownames); - - - /// Does the heavy lifting for destruct and assignment. - void gutsOfDestructor(); - - /// Does the heavy lifting for copy and assignment. - void gutsOfCopy(const CoinMpsIO &); - - /// Clears problem data from the CoinMpsIO object. - void freeAll(); - - - /** A quick inlined function to convert from lb/ub style constraint - definition to sense/rhs/range style */ - inline void - convertBoundToSense(const double lower, const double upper, - char& sense, double& right, double& range) const; - /** A quick inlined function to convert from sense/rhs/range stryle - constraint definition to lb/ub style */ - inline void - convertSenseToBound(const char sense, const double right, - const double range, - double& lower, double& upper) const; - - /** Deal with a filename - - As the name says. - Returns +1 if the file name is new, 0 if it's the same as before - (i.e., matches fileName_), and -1 if there's an error and the file - can't be opened. - Handles automatic append of .gz suffix when compiled with libz. - - \todo - Add automatic append of .bz2 suffix when compiled with libbz. - */ - - int dealWithFileName(const char * filename, const char * extension, - CoinFileInput * &input); - /** Add string to list - iRow==numberRows is objective, nr+1 is lo, nr+2 is up - iColumn==nc is rhs (can't cope with ranges at present) - */ - void addString(int iRow,int iColumn, const char * value); - /// Decode string - void decodeString(int iString, int & iRow, int & iColumn, const char * & value) const; - //@} - - - // for hashing - typedef struct { - int index, next; - } CoinHashLink; - - /**@name Hash table methods */ - //@{ - /// Creates hash list for names (section = 0 for rows, 1 columns) - void startHash ( char **names, const int number , int section ); - /// This one does it when names are already in - void startHash ( int section ) const; - /// Deletes hash storage - void stopHash ( int section ); - /// Finds match using hash, -1 not found - int findHash ( const char *name , int section ) const; - //@} - - /**@name Cached problem information */ - //@{ - /// Problem name - char * problemName_; - - /// Objective row name - char * objectiveName_; - - /// Right-hand side vector name - char * rhsName_; - - /// Range vector name - char * rangeName_; - - /// Bounds vector name - char * boundName_; - - /// Number of rows - int numberRows_; - - /// Number of columns - int numberColumns_; - - /// Number of coefficients - CoinBigIndex numberElements_; - - /// Pointer to dense vector of row sense indicators - mutable char *rowsense_; - - /// Pointer to dense vector of row right-hand side values - mutable double *rhs_; - - /** Pointer to dense vector of slack variable upper bounds for range - constraints (undefined for non-range rows) - */ - mutable double *rowrange_; - - /// Pointer to row-wise copy of problem matrix coefficients. - mutable CoinPackedMatrix *matrixByRow_; - - /// Pointer to column-wise copy of problem matrix coefficients. - CoinPackedMatrix *matrixByColumn_; - - /// Pointer to dense vector of row lower bounds - double * rowlower_; - - /// Pointer to dense vector of row upper bounds - double * rowupper_; - - /// Pointer to dense vector of column lower bounds - double * collower_; - - /// Pointer to dense vector of column upper bounds - double * colupper_; - - /// Pointer to dense vector of objective coefficients - double * objective_; - - /// Constant offset for objective value (i.e., RHS value for OBJ row) - double objectiveOffset_; - - - /** Pointer to dense vector specifying if a variable is continuous - (0) or integer (1). - */ - char * integerType_; - - /** Row and column names - Linked to hash table sections (0 - row names, 1 column names) - */ - char **names_[2]; - //@} - - /** @name Hash tables */ - //@{ - /// Current file name - char * fileName_; - - /// Number of entries in a hash table section - int numberHash_[2]; - - /// Hash tables (two sections, 0 - row names, 1 - column names) - mutable CoinHashLink *hash_[2]; - //@} - - /** @name CoinMpsIO object parameters */ - //@{ - /// Upper bound when no bounds for integers - int defaultBound_; - - /// Value to use for infinity - double infinity_; - /// Small element value - double smallElement_; - - /// Message handler - CoinMessageHandler * handler_; - /** Flag to say if the message handler is the default handler. - - If true, the handler will be destroyed when the CoinMpsIO - object is destroyed; if false, it will not be destroyed. - */ - bool defaultHandler_; - /// Messages - CoinMessages messages_; - /// Card reader - CoinMpsCardReader * cardReader_; - /// If .gms file should it be massaged to move objective - bool convertObjective_; - /// Whether to allow string elements - int allowStringElements_; - /// Maximum number of string elements - int maximumStringElements_; - /// Number of string elements - int numberStringElements_; - /// String elements - char ** stringElements_; - //@} - -}; - -//############################################################################# -/** A function that tests the methods in the CoinMpsIO class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. Also, if this method is compiled with - optimization, the compilation takes 10-15 minutes and the machine pages - (has 256M core memory!)... */ -void -CoinMpsIOUnitTest(const std::string & mpsDir); -// Function to return number in most efficient way -// section is 0 for columns, 1 for rhs,ranges and 2 for bounds -/* formatType is - 0 - normal and 8 character names - 1 - extra accuracy - 2 - IEEE hex - INTEL - 3 - IEEE hex - not INTEL -*/ -void -CoinConvertDouble(int section, int formatType, double value, char outputValue[24]); - -#endif - diff --git a/thirdparty/linux/include/coin1/CoinOslFactorization.hpp b/thirdparty/linux/include/coin1/CoinOslFactorization.hpp deleted file mode 100644 index 0b51b01c..00000000 --- a/thirdparty/linux/include/coin1/CoinOslFactorization.hpp +++ /dev/null @@ -1,280 +0,0 @@ -/* $Id: CoinOslFactorization.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 1987, 2009, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -/* - Authors - - John Forrest - - */ -#ifndef CoinOslFactorization_H -#define CoinOslFactorization_H -#include -#include -#include -#include "CoinTypes.hpp" -#include "CoinIndexedVector.hpp" -#include "CoinDenseFactorization.hpp" -class CoinPackedMatrix; -/** This deals with Factorization and Updates - This is ripped off from OSL!!!!!!!!! - - I am assuming that 32 bits is enough for number of rows or columns, but CoinBigIndex - may be redefined to get 64 bits. - */ - -typedef struct {int suc, pre;} EKKHlink; -typedef struct _EKKfactinfo { - double drtpiv; - double demark; - double zpivlu; - double zeroTolerance; - double areaFactor; - int *xrsadr; - int *xcsadr; - int *xrnadr; - int *xcnadr; - int *krpadr; - int *kcpadr; - int *mpermu; - int *bitArray; - int * back; - char * nonzero; - double * trueStart; - mutable double *kadrpm; - int *R_etas_index; - int *R_etas_start; - double *R_etas_element; - - int *xecadr; - int *xeradr; - double *xeeadr; - double *xe2adr; - EKKHlink * kp1adr; - EKKHlink * kp2adr; - double * kw1adr; - double * kw2adr; - double * kw3adr; - int * hpivcoR; - int nrow; - int nrowmx; - int firstDoRow; - int firstLRow; - int maxinv; - int nnetas; - int iterin; - int iter0; - int invok; - int nbfinv; - int num_resets; - int nnentl; - int nnentu; -#ifdef CLP_REUSE_ETAS - int save_nnentu; -#endif - int ndenuc; - int npivots; /* use as xpivsq in factorization */ - int kmxeta; - int xnetal; - int first_dense; - int last_dense; - int iterno; - int numberSlacks; - int lastSlack; - int firstNonSlack; - int xnetalval; - int lstart; - int if_sparse_update; - mutable int packedMode; - int switch_off_sparse_update; - int nuspike; - bool rows_ok; /* replaces test using mrstrt[1] */ -#ifdef CLP_REUSE_ETAS - mutable int reintro; -#endif - int nR_etas; - int sortedEta; /* if vector for F-T is sorted */ - int lastEtaCount; - int ifvsol; - int eta_size; - int last_eta_size; - int maxNNetas; -} EKKfactinfo; - -class CoinOslFactorization : public CoinOtherFactorization { - friend void CoinOslFactorizationUnitTest( const std::string & mpsDir ); - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - CoinOslFactorization ( ); - /// Copy constructor - CoinOslFactorization ( const CoinOslFactorization &other); - - /// Destructor - virtual ~CoinOslFactorization ( ); - /// = copy - CoinOslFactorization & operator = ( const CoinOslFactorization & other ); - /// Clone - virtual CoinOtherFactorization * clone() const ; - //@} - - /**@name Do factorization - public */ - //@{ - /// Gets space for a factorization - virtual void getAreas ( int numberRows, - int numberColumns, - CoinBigIndex maximumL, - CoinBigIndex maximumU ); - - /// PreProcesses column ordered copy of basis - virtual void preProcess ( ); - /** Does most of factorization returning status - 0 - OK - -99 - needs more memory - -1 - singular - use numberGoodColumns and redo - */ - virtual int factor ( ); - /// Does post processing on valid factorization - putting variables on correct rows - virtual void postProcess(const int * sequence, int * pivotVariable); - /// Makes a non-singular basis by replacing variables - virtual void makeNonSingular(int * sequence, int numberColumns); - /** When part of LP - given by basic variables. - Actually does factorization. - Arrays passed in have non negative value to say basic. - If status is okay, basic variables have pivot row - this is only needed - If status is singular, then basic variables have pivot row - and ones thrown out have -1 - returns 0 -okay, -1 singular, -2 too many in basis, -99 memory */ - int factorize ( const CoinPackedMatrix & matrix, - int rowIsBasic[], int columnIsBasic[] , - double areaFactor = 0.0 ); - //@} - - /**@name general stuff such as number of elements */ - //@{ - /// Total number of elements in factorization - virtual inline int numberElements ( ) const { - return numberRows_*(numberColumns_+numberPivots_); - } - /// Returns array to put basis elements in - virtual CoinFactorizationDouble * elements() const; - /// Returns pivot row - virtual int * pivotRow() const; - /// Returns work area - virtual CoinFactorizationDouble * workArea() const; - /// Returns int work area - virtual int * intWorkArea() const; - /// Number of entries in each row - virtual int * numberInRow() const; - /// Number of entries in each column - virtual int * numberInColumn() const; - /// Returns array to put basis starts in - virtual CoinBigIndex * starts() const; - /// Returns permute back - virtual int * permuteBack() const; - /// Returns true if wants tableauColumn in replaceColumn - virtual bool wantsTableauColumn() const; - /** Useful information for factorization - 0 - iteration number - whereFrom is 0 for factorize and 1 for replaceColumn - */ - virtual void setUsefulInformation(const int * info,int whereFrom); - /// Set maximum pivots - virtual void maximumPivots ( int value ); - - /// Returns maximum absolute value in factorization - double maximumCoefficient() const; - /// Condition number - product of pivots after factorization - double conditionNumber() const; - /// Get rid of all memory - virtual void clearArrays(); - //@} - - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - virtual int replaceColumn ( CoinIndexedVector * regionSparse, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying=false, - double acceptablePivot=1.0e-8); - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false); - /** This version has same effect as above with FTUpdate==false - so number returned is always >=0 */ - virtual int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) const; - /// does FTRAN on two columns - virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermute=false); - /** Updates one column (BTRAN) from regionSparse2 - regionSparse starts as zero and is zero at end - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - //@} - /// *** Below this user may not want to know about - - /**@name various uses of factorization - which user may not want to know about (left over from my LP code) */ - //@{ - /// Get rid of all memory - //inline void clearArrays() - //{ gutsOfDestructor();} - /// Returns array to put basis indices in - virtual int * indices() const; - /// Returns permute in - virtual inline int * permute() const - { return NULL;/*pivotRow_*/;} - //@} - - /// The real work of desstructor - void gutsOfDestructor(bool clearFact=true); - /// The real work of constructor - void gutsOfInitialize(bool zapFact=true); - /// The real work of copy - void gutsOfCopy(const CoinOslFactorization &other); - - //@} -protected: - /** Returns accuracy status of replaceColumn - returns 0=OK, 1=Probably OK, 2=singular */ - int checkPivot(double saveFromU, double oldPivot) const; -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Osl factorization data - EKKfactinfo factInfo_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinPackedMatrix.hpp b/thirdparty/linux/include/coin1/CoinPackedMatrix.hpp deleted file mode 100644 index c6837ac2..00000000 --- a/thirdparty/linux/include/coin1/CoinPackedMatrix.hpp +++ /dev/null @@ -1,947 +0,0 @@ -/* $Id: CoinPackedMatrix.hpp 1560 2012-11-24 00:29:01Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPackedMatrix_H -#define CoinPackedMatrix_H - -#include "CoinError.hpp" -#include "CoinTypes.hpp" -#ifndef CLP_NO_VECTOR -#include "CoinPackedVectorBase.hpp" -#include "CoinShallowPackedVector.hpp" -#else -class CoinRelFltEq; -#endif - -/** Sparse Matrix Base Class - - This class is intended to represent sparse matrices using row-major - or column-major ordering. The representation is very efficient for - adding, deleting, or retrieving major-dimension vectors. Adding - a minor-dimension vector is less efficient, but can be helped by - providing "extra" space as described in the next paragraph. Deleting - a minor-dimension vector requires inspecting all coefficients in the - matrix. Retrieving a minor-dimension vector would incur the same cost - and is not supported (except in the sense that you can write a loop to - retrieve all coefficients one at a time). Consider physically transposing - the matrix, or keeping a second copy with the other major-vector ordering. - - The sparse represention can be completely compact or it can have "extra" - space available at the end of each major vector. Incorporating extra - space into the sparse matrix representation can improve performance in - cases where new data needs to be inserted into the packed matrix against - the major-vector orientation (e.g, inserting a row into a matrix stored - in column-major order). - - For example if the matrix: - @verbatim - 3 1 0 -2 -1 0 0 -1 - 0 2 1.1 0 0 0 0 0 - 0 0 1 0 0 1 0 0 - 0 0 0 2.8 0 0 -1.2 0 - 5.6 0 0 0 1 0 0 1.9 - - was stored by rows (with no extra space) in - CoinPackedMatrix r then: - r.getElements() returns a vector containing: - 3 1 -2 -1 -1 2 1.1 1 1 2.8 -1.2 5.6 1 1.9 - r.getIndices() returns a vector containing: - 0 1 3 4 7 1 2 2 5 3 6 0 4 7 - r.getVectorStarts() returns a vector containing: - 0 5 7 9 11 14 - r.getNumElements() returns 14. - r.getMajorDim() returns 5. - r.getVectorSize(0) returns 5. - r.getVectorSize(1) returns 2. - r.getVectorSize(2) returns 2. - r.getVectorSize(3) returns 2. - r.getVectorSize(4) returns 3. - - If stored by columns (with no extra space) then: - c.getElements() returns a vector containing: - 3 5.6 1 2 1.1 1 -2 2.8 -1 1 1 -1.2 -1 1.9 - c.getIndices() returns a vector containing: - 0 4 0 1 1 2 0 3 0 4 2 3 0 4 - c.getVectorStarts() returns a vector containing: - 0 2 4 6 8 10 11 12 14 - c.getNumElements() returns 14. - c.getMajorDim() returns 8. - @endverbatim - - Compiling this class with CLP_NO_VECTOR defined will excise all methods - which use CoinPackedVectorBase, CoinPackedVector, or CoinShallowPackedVector - as parameters or return types. - - Compiling this class with COIN_FAST_CODE defined removes index range checks. -*/ -class CoinPackedMatrix { - friend void CoinPackedMatrixUnitTest(); - -public: - - - //--------------------------------------------------------------------------- - /**@name Query members */ - //@{ - /** Return the current setting of the extra gap. */ - inline double getExtraGap() const { return extraGap_; } - /** Return the current setting of the extra major. */ - inline double getExtraMajor() const { return extraMajor_; } - - /** Reserve sufficient space for appending major-ordered vectors. - If create is true, empty columns are created (for column generation) */ - void reserve(const int newMaxMajorDim, const CoinBigIndex newMaxSize, - bool create=false); - /** Clear the data, but do not free any arrays */ - void clear(); - - /** Whether the packed matrix is column major ordered or not. */ - inline bool isColOrdered() const { return colOrdered_; } - - /** Whether the packed matrix has gaps or not. */ - inline bool hasGaps() const { return (size_vectorStarts array - - See #start_. - */ - inline int getSizeVectorStarts() const - { return ((majorDim_ > 0)?(majorDim_+1):(0)) ; } - - /*! \brief The size of the vectorLengths array - - See #length_. - */ - inline int getSizeVectorLengths() const { return majorDim_; } - - /*! \brief The positions where the major-dimension vectors start in - elements and indices. - - See #start_. - */ - inline const CoinBigIndex * getVectorStarts() const { return start_; } - - /*! \brief The lengths of the major-dimension vectors. - - See #length_. - */ - inline const int * getVectorLengths() const { return length_; } - - /** The position of the first element in the i'th major-dimension vector. - */ - CoinBigIndex getVectorFirst(const int i) const { -#ifndef COIN_FAST_CODE - if (i < 0 || i >= majorDim_) - throw CoinError("bad index", "vectorFirst", "CoinPackedMatrix"); -#endif - return start_[i]; - } - /** The position of the last element (well, one entry past the - last) in the i'th major-dimension vector. */ - CoinBigIndex getVectorLast(const int i) const { -#ifndef COIN_FAST_CODE - if (i < 0 || i >= majorDim_) - throw CoinError("bad index", "vectorLast", "CoinPackedMatrix"); -#endif - return start_[i] + length_[i]; - } - /** The length of i'th vector. */ - inline int getVectorSize(const int i) const { -#ifndef COIN_FAST_CODE - if (i < 0 || i >= majorDim_) - throw CoinError("bad index", "vectorSize", "CoinPackedMatrix"); -#endif - return length_[i]; - } -#ifndef CLP_NO_VECTOR - /** Return the i'th vector in matrix. */ - const CoinShallowPackedVector getVector(int i) const { -#ifndef COIN_FAST_CODE - if (i < 0 || i >= majorDim_) - throw CoinError("bad index", "vector", "CoinPackedMatrix"); -#endif - return CoinShallowPackedVector(length_[i], - index_ + start_[i], - element_ + start_[i], - false); - } -#endif - /** Returns an array containing major indices. The array is - getNumElements long and if getVectorStarts() is 0,2,5 then - the array would start 0,0,1,1,1,2... - This method is provided to go back from a packed format - to a triple format. It returns NULL if there are gaps in - matrix so user should use removeGaps() if there are any gaps. - It does this as this array has to match getElements() and - getIndices() and because it makes no sense otherwise. - The returned array is allocated with new int[], - free it with delete[]. */ - int * getMajorIndices() const; - //@} - - //--------------------------------------------------------------------------- - /**@name Modifying members */ - //@{ - /*! \brief Set the dimensions of the matrix. - - The method name is deceptive; the effect is to append empty columns - and/or rows to the matrix to reach the specified dimensions. - A negative number for either dimension means that that dimension - doesn't change. An exception will be thrown if the specified dimensions - are smaller than the current dimensions. - */ - void setDimensions(int numrows, int numcols); - - /** Set the extra gap to be allocated to the specified value. */ - void setExtraGap(const double newGap); - /** Set the extra major to be allocated to the specified value. */ - void setExtraMajor(const double newMajor); -#ifndef CLP_NO_VECTOR - /*! Append a column to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if the column vector specifies a nonexistent row index. Otherwise the - method assumes that every index fits into the matrix. - */ - void appendCol(const CoinPackedVectorBase& vec); -#endif - /*! Append a column to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if the column vector specifies a nonexistent row index. Otherwise the - method assumes that every index fits into the matrix. - */ - void appendCol(const int vecsize, - const int *vecind, const double *vecelem); -#ifndef CLP_NO_VECTOR - /*! Append a set of columns to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if any of the column vectors specify a nonexistent row index. Otherwise - the method assumes that every index fits into the matrix. - */ - void appendCols(const int numcols, - const CoinPackedVectorBase * const * cols); -#endif - /*! Append a set of columns to the end of the matrix. - - Returns the number of errors (nonexistent or duplicate row index). - No error checking is performed if \p numberRows < 0. - */ - int appendCols(const int numcols, - const CoinBigIndex * columnStarts, const int * row, - const double * element, int numberRows=-1); -#ifndef CLP_NO_VECTOR - /*! Append a row to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if the row vector specifies a nonexistent column index. Otherwise the - method assumes that every index fits into the matrix. - */ - void appendRow(const CoinPackedVectorBase& vec); -#endif - /*! Append a row to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if the row vector specifies a nonexistent column index. Otherwise the - method assumes that every index fits into the matrix. - */ - void appendRow(const int vecsize, - const int *vecind, const double *vecelem); -#ifndef CLP_NO_VECTOR - /*! Append a set of rows to the end of the matrix. - - When compiled with COIN_DEBUG defined this method throws an exception - if any of the row vectors specify a nonexistent column index. Otherwise - the method assumes that every index fits into the matrix. - */ - void appendRows(const int numrows, - const CoinPackedVectorBase * const * rows); -#endif - /*! Append a set of rows to the end of the matrix. - - Returns the number of errors (nonexistent or duplicate column index). - No error checking is performed if \p numberColumns < 0. - */ - int appendRows(const int numrows, - const CoinBigIndex * rowStarts, const int * column, - const double * element, int numberColumns=-1); - - /** Append the argument to the "right" of the current matrix. Imagine this - as adding new columns (don't worry about how the matrices are ordered, - that is taken care of). An exception is thrown if the number of rows - is different in the matrices. */ - void rightAppendPackedMatrix(const CoinPackedMatrix& matrix); - /** Append the argument to the "bottom" of the current matrix. Imagine this - as adding new rows (don't worry about how the matrices are ordered, - that is taken care of). An exception is thrown if the number of columns - is different in the matrices. */ - void bottomAppendPackedMatrix(const CoinPackedMatrix& matrix); - - /** Delete the columns whose indices are listed in indDel. */ - void deleteCols(const int numDel, const int * indDel); - /** Delete the rows whose indices are listed in indDel. */ - void deleteRows(const int numDel, const int * indDel); - - /** Replace the elements of a vector. The indices remain the same. - At most the number specified will be replaced. - The index is between 0 and major dimension of matrix */ - void replaceVector(const int index, - const int numReplace, const double * newElements); - /** Modify one element of packed matrix. An element may be added. - This works for either ordering - If the new element is zero it will be deleted unless - keepZero true */ - void modifyCoefficient(int row, int column, double newElement, - bool keepZero=false); - /** Return one element of packed matrix. - This works for either ordering - If it is not present will return 0.0 */ - double getCoefficient(int row, int column) const; - - /** Eliminate all elements in matrix whose - absolute value is less than threshold. - The column starts are not affected. Returns number of elements - eliminated. Elements eliminated are at end of each vector - */ - int compress(double threshold); - /** Eliminate all duplicate AND small elements in matrix - The column starts are not affected. Returns number of elements - eliminated. - */ - int eliminateDuplicates(double threshold); - /** Sort all columns so indices are increasing.in each column */ - void orderMatrix(); - /** Really clean up matrix. - a) eliminate all duplicate AND small elements in matrix - b) remove all gaps and set extraGap_ and extraMajor_ to 0.0 - c) reallocate arrays and make max lengths equal to lengths - d) orders elements - returns number of elements eliminated - */ - int cleanMatrix(double threshold=1.0e-20); - //@} - - //--------------------------------------------------------------------------- - /**@name Methods that reorganize the whole matrix */ - //@{ - /** Remove the gaps from the matrix if there were any - Can also remove small elements fabs() <= removeValue*/ - void removeGaps(double removeValue=-1.0); - - /** Extract a submatrix from matrix. Those major-dimension vectors of - the matrix comprise the submatrix whose indices are given in the - arguments. Does not allow duplicates. */ - void submatrixOf(const CoinPackedMatrix& matrix, - const int numMajor, const int * indMajor); - /** Extract a submatrix from matrix. Those major-dimension vectors of - the matrix comprise the submatrix whose indices are given in the - arguments. Allows duplicates and keeps order. */ - void submatrixOfWithDuplicates(const CoinPackedMatrix& matrix, - const int numMajor, const int * indMajor); -#if 0 - /** Extract a submatrix from matrix. Those major/minor-dimension vectors of - the matrix comprise the submatrix whose indices are given in the - arguments. */ - void submatrixOf(const CoinPackedMatrix& matrix, - const int numMajor, const int * indMajor, - const int numMinor, const int * indMinor); -#endif - - /** Copy method. This method makes an exact replica of the argument, - including the extra space parameters. */ - void copyOf(const CoinPackedMatrix& rhs); - /** Copy the arguments to the matrix. If len is a NULL pointer - then the matrix is assumed to have no gaps in it and len - will be created accordingly. */ - void copyOf(const bool colordered, - const int minor, const int major, const CoinBigIndex numels, - const double * elem, const int * ind, - const CoinBigIndex * start, const int * len, - const double extraMajor=0.0, const double extraGap=0.0); - /** Copy method. This method makes an exact replica of the argument, - including the extra space parameters. - If there is room it will re-use arrays */ - void copyReuseArrays(const CoinPackedMatrix& rhs); - - /*! \brief Make a reverse-ordered copy. - - This method makes an exact replica of the argument with the major - vector orientation changed from row (column) to column (row). - The extra space parameters are also copied and reversed. - (Cf. #reverseOrdering, which does the same thing in place.) - */ - void reverseOrderedCopyOf(const CoinPackedMatrix& rhs); - - /** Assign the arguments to the matrix. If len is a NULL - pointer then the matrix is assumed to have no gaps in it and - len will be created accordingly.
      - NOTE 1: After this method returns the pointers - passed to the method will be NULL pointers!
      - NOTE 2: When the matrix is eventually destructed the - arrays will be deleted by delete[]. Hence one should use - this method ONLY if all array swere allocated by new[]! */ - void assignMatrix(const bool colordered, - const int minor, const int major, - const CoinBigIndex numels, - double *& elem, int *& ind, - CoinBigIndex *& start, int *& len, - const int maxmajor = -1, const CoinBigIndex maxsize = -1); - - - - /** Assignment operator. This copies out the data, but uses the current - matrix's extra space parameters. */ - CoinPackedMatrix & operator=(const CoinPackedMatrix& rhs); - - /*! \brief Reverse the ordering of the packed matrix. - - Change the major vector orientation of the matrix data structures from - row (column) to column (row). (Cf. #reverseOrderedCopyOf, which does - the same thing but produces a new matrix.) - */ - void reverseOrdering(); - - /*! \brief Transpose the matrix. - - \note - If you start with a column-ordered matrix and invoke transpose, you - will have a row-ordered transposed matrix. To change the major vector - orientation (e.g., to transform a column-ordered matrix to a - column-ordered transposed matrix), invoke transpose() followed by - #reverseOrdering(). - */ - void transpose(); - - /*! \brief Swap the content of two packed matrices. */ - void swap(CoinPackedMatrix& matrix); - - //@} - - //--------------------------------------------------------------------------- - /**@name Matrix times vector methods */ - //@{ - /** Return A * x in y. - @pre x must be of size numColumns() - @pre y must be of size numRows() */ - void times(const double * x, double * y) const; -#ifndef CLP_NO_VECTOR - /** Return A * x in y. Same as the previous - method, just x is given in the form of a packed vector. */ - void times(const CoinPackedVectorBase& x, double * y) const; -#endif - /** Return x * A in y. - @pre x must be of size numRows() - @pre y must be of size numColumns() */ - void transposeTimes(const double * x, double * y) const; -#ifndef CLP_NO_VECTOR - /** Return x * A in y. Same as the previous - method, just x is given in the form of a packed vector. */ - void transposeTimes(const CoinPackedVectorBase& x, double * y) const; -#endif - //@} - - //--------------------------------------------------------------------------- - /**@name Helper functions used internally, but maybe useful externally. - - These methods do not worry about testing whether the packed matrix is - row or column major ordered; they operate under the assumption that the - correct version is invoked. In fact, a number of other methods simply - just call one of these after testing the ordering of the matrix. */ - //@{ - - //------------------------------------------------------------------------- - /**@name Queries */ - //@{ - /** Count the number of entries in every minor-dimension vector and - return an array containing these lengths. The returned array is - allocated with new int[], free it with - delete[]. */ - int * countOrthoLength() const; - /** Count the number of entries in every minor-dimension vector and - fill in an array containing these lengths. */ - void countOrthoLength(int * counts) const; - /** Major dimension. For row ordered matrix this would be the number of - rows. */ - inline int getMajorDim() const { return majorDim_; } - /** Set major dimension. For row ordered matrix this would be the number of - rows. Use with great care.*/ - inline void setMajorDim(int value) { majorDim_ = value; } - /** Minor dimension. For row ordered matrix this would be the number of - columns. */ - inline int getMinorDim() const { return minorDim_; } - /** Set minor dimension. For row ordered matrix this would be the number of - columns. Use with great care.*/ - inline void setMinorDim(int value) { minorDim_ = value; } - /** Current maximum for major dimension. For row ordered matrix this many - rows can be added without reallocating the vector related to the - major dimension (start_ and length_). */ - inline int getMaxMajorDim() const { return maxMajorDim_; } - - /** Dump the matrix on stdout. When in dire straits this method can - help. */ - void dumpMatrix(const char* fname = NULL) const; - - /// Print a single matrix element. - void printMatrixElement(const int row_val, const int col_val) const; - //@} - - //------------------------------------------------------------------------- - /*! @name Append vectors - - \details - When compiled with COIN_DEBUG defined these methods throw an exception - if the major (minor) vector contains an index that's invalid for the - minor (major) dimension. Otherwise the methods assume that every index - fits into the matrix. - */ - //@{ -#ifndef CLP_NO_VECTOR - /** Append a major-dimension vector to the end of the matrix. */ - void appendMajorVector(const CoinPackedVectorBase& vec); -#endif - /** Append a major-dimension vector to the end of the matrix. */ - void appendMajorVector(const int vecsize, const int *vecind, - const double *vecelem); -#ifndef CLP_NO_VECTOR - /** Append several major-dimensonvectors to the end of the matrix */ - void appendMajorVectors(const int numvecs, - const CoinPackedVectorBase * const * vecs); - - /** Append a minor-dimension vector to the end of the matrix. */ - void appendMinorVector(const CoinPackedVectorBase& vec); -#endif - /** Append a minor-dimension vector to the end of the matrix. */ - void appendMinorVector(const int vecsize, const int *vecind, - const double *vecelem); -#ifndef CLP_NO_VECTOR - /** Append several minor-dimension vectors to the end of the matrix */ - void appendMinorVectors(const int numvecs, - const CoinPackedVectorBase * const * vecs); -#endif - /*! \brief Append a set of rows (columns) to the end of a column (row) - ordered matrix. - - This case is when we know there are no gaps and majorDim_ will not - change. - - \todo - This method really belongs in the group of protected methods with - #appendMinor; there are no safeties here even with COIN_DEBUG. - Apparently this method was needed in ClpPackedMatrix and giving it - proper visibility was too much trouble. Should be moved. - */ - void appendMinorFast(const int number, - const CoinBigIndex * starts, const int * index, - const double * element); - //@} - - //------------------------------------------------------------------------- - /*! \name Append matrices - - \details - We'll document these methods assuming that the current matrix is - column major ordered (Hence in the ...SameOrdered() - methods the argument is column ordered, in the - OrthoOrdered() methods the argument is row ordered.) - */ - //@{ - /** Append the columns of the argument to the right end of this matrix. - @pre minorDim_ == matrix.minorDim_
      - This method throws an exception if the minor dimensions are not the - same. */ - void majorAppendSameOrdered(const CoinPackedMatrix& matrix); - /** Append the columns of the argument to the bottom end of this matrix. - @pre majorDim_ == matrix.majorDim_
      - This method throws an exception if the major dimensions are not the - same. */ - void minorAppendSameOrdered(const CoinPackedMatrix& matrix); - /** Append the rows of the argument to the right end of this matrix. - @pre minorDim_ == matrix.majorDim_
      - This method throws an exception if the minor dimension of the - current matrix is not the same as the major dimension of the - argument matrix. */ - void majorAppendOrthoOrdered(const CoinPackedMatrix& matrix); - /** Append the rows of the argument to the bottom end of this matrix. - @pre majorDim_ == matrix.minorDim_
      - This method throws an exception if the major dimension of the - current matrix is not the same as the minor dimension of the - argument matrix. */ - void minorAppendOrthoOrdered(const CoinPackedMatrix& matrix); - //@} - - //----------------------------------------------------------------------- - /**@name Delete vectors */ - //@{ - /** Delete the major-dimension vectors whose indices are listed in - indDel. */ - void deleteMajorVectors(const int numDel, const int * indDel); - /** Delete the minor-dimension vectors whose indices are listed in - indDel. */ - void deleteMinorVectors(const int numDel, const int * indDel); - //@} - - //----------------------------------------------------------------------- - /**@name Various dot products. */ - //@{ - /** Return A * x (multiplied from the "right" direction) in - y. - @pre x must be of size majorDim() - @pre y must be of size minorDim() */ - void timesMajor(const double * x, double * y) const; -#ifndef CLP_NO_VECTOR - /** Return A * x (multiplied from the "right" direction) in - y. Same as the previous method, just x is - given in the form of a packed vector. */ - void timesMajor(const CoinPackedVectorBase& x, double * y) const; -#endif - /** Return A * x (multiplied from the "right" direction) in - y. - @pre x must be of size minorDim() - @pre y must be of size majorDim() */ - void timesMinor(const double * x, double * y) const; -#ifndef CLP_NO_VECTOR - /** Return A * x (multiplied from the "right" direction) in - y. Same as the previous method, just x is - given in the form of a packed vector. */ - void timesMinor(const CoinPackedVectorBase& x, double * y) const; -#endif - //@} - //@} - - //-------------------------------------------------------------------------- - /**@name Logical Operations. */ - //@{ -#ifndef CLP_NO_VECTOR - /*! \brief Test for equivalence. - - Two matrices are equivalent if they are both row- or column-ordered, - they have the same dimensions, and each (major) vector is equivalent. - The operator used to test for equality can be specified using the - \p FloatEqual template parameter. - */ - template bool - isEquivalent(const CoinPackedMatrix& rhs, const FloatEqual& eq) const - { - // Both must be column order or both row ordered and must be of same size - if ((isColOrdered() ^ rhs.isColOrdered()) || - (getNumCols() != rhs.getNumCols()) || - (getNumRows() != rhs.getNumRows()) || - (getNumElements() != rhs.getNumElements())) - return false; - - for (int i=getMajorDim()-1; i >= 0; --i) { - CoinShallowPackedVector pv = getVector(i); - CoinShallowPackedVector rhsPv = rhs.getVector(i); - if ( !pv.isEquivalent(rhsPv,eq) ) - return false; - } - return true; - } - - /*! \brief Test for equivalence and report differences - - Equivalence is defined as for #isEquivalent. In addition, this method will - print differences to std::cerr. Intended for use in unit tests and - for debugging. - */ - bool isEquivalent2(const CoinPackedMatrix& rhs) const; -#else - /*! \brief Test for equivalence. - - Two matrices are equivalent if they are both row- or column-ordered, - they have the same dimensions, and each (major) vector is equivalent. - This method is optimised for speed. CoinPackedVector#isEquivalent is - replaced with more efficient code for repeated comparison of - equal-length vectors. The CoinRelFltEq operator is used. - */ - bool isEquivalent(const CoinPackedMatrix& rhs, const CoinRelFltEq & eq) const; -#endif - /*! \brief Test for equivalence. - - The test for element equality is the default CoinRelFltEq operator. - */ - bool isEquivalent(const CoinPackedMatrix& rhs) const; - //@} - - //-------------------------------------------------------------------------- - /*! \name Non-const methods - - These are to be used with great care when doing column generation, etc. - */ - //@{ - /** A vector containing the elements in the packed matrix. Note that there - might be gaps in this list, entries that do not belong to any - major-dimension vector. To get the actual elements one should look at - this vector together with #start_ and #length_. */ - inline double * getMutableElements() const { return element_; } - /** A vector containing the minor indices of the elements in the packed - matrix. Note that there might be gaps in this list, entries that do not - belong to any major-dimension vector. To get the actual elements one - should look at this vector together with #start_ and - #length_. */ - inline int * getMutableIndices() const { return index_; } - - /** The positions where the major-dimension vectors start in #element_ and - #index_. */ - inline CoinBigIndex * getMutableVectorStarts() const { return start_; } - /** The lengths of the major-dimension vectors. */ - inline int * getMutableVectorLengths() const { return length_; } - /// Change the size of the bulk store after modifying - be careful - inline void setNumElements(CoinBigIndex value) - { size_ = value;} - /*! NULLify element array - - Used when space is very tight. Does not free the space! - */ - inline void nullElementArray() {element_=NULL;} - - /*! NULLify start array - - Used when space is very tight. Does not free the space! - */ - inline void nullStartArray() {start_=NULL;} - - /*! NULLify length array - - Used when space is very tight. Does not free the space! - */ - inline void nullLengthArray() {length_=NULL;} - - /*! NULLify index array - - Used when space is very tight. Does not free the space! - */ - inline void nullIndexArray() {index_=NULL;} - //@} - - //-------------------------------------------------------------------------- - /*! \name Constructors and destructors */ - //@{ - /// Default Constructor creates an empty column ordered packed matrix - CoinPackedMatrix(); - - /// A constructor where the ordering and the gaps are specified - CoinPackedMatrix(const bool colordered, - const double extraMajor, const double extraGap); - - CoinPackedMatrix(const bool colordered, - const int minor, const int major, const CoinBigIndex numels, - const double * elem, const int * ind, - const CoinBigIndex * start, const int * len, - const double extraMajor, const double extraGap); - - CoinPackedMatrix(const bool colordered, - const int minor, const int major, const CoinBigIndex numels, - const double * elem, const int * ind, - const CoinBigIndex * start, const int * len); - - /** Create packed matrix from triples. - If colordered is true then the created matrix will be column ordered. - Duplicate matrix elements are allowed. The created matrix will have - the sum of the duplicates.
      - For example if:
      - rowIndices[0]=2; colIndices[0]=5; elements[0]=2.0
      - rowIndices[1]=2; colIndices[1]=5; elements[1]=0.5
      - then the created matrix will contain a value of 2.5 in row 2 and column 5.
      - The matrix is created without gaps. - */ - CoinPackedMatrix(const bool colordered, - const int * rowIndices, - const int * colIndices, - const double * elements, - CoinBigIndex numels ); - - /// Copy constructor - CoinPackedMatrix(const CoinPackedMatrix& m); - - /*! \brief Copy constructor with fine tuning - - This constructor allows for the specification of an exact amount of extra - space and/or reverse ordering. - - \p extraForMajor is the exact number of spare major vector slots after - any possible reverse ordering. If \p extraForMajor < 0, all gaps and small - elements will be removed from the copy, otherwise gaps and small elements - are preserved. - - \p extraElements is the exact number of spare element entries. - - The usual multipliers, #extraMajor_ and #extraGap_, are set to zero. - */ - CoinPackedMatrix(const CoinPackedMatrix &m, - int extraForMajor, int extraElements, - bool reverseOrdering = false) ; - - /** Subset constructor (without gaps). Duplicates are allowed - and order is as given */ - CoinPackedMatrix (const CoinPackedMatrix & wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - - /// Destructor - virtual ~CoinPackedMatrix(); - //@} - - /*! \name Debug Utilities */ - //@{ - /*! \brief Scan the matrix for anomalies. - - Returns the number of anomalies. Scans the structure for gaps, - obviously bogus indices and coefficients, and inconsistencies. Gaps - are not an error unless #hasGaps() says the matrix should be - gap-free. Zeroes are not an error unless \p zeroesAreError is set to - true. - - Values for verbosity are: - - 0: No messages, just the return value - - 1: Messages about errors - - 2: If there are no errors, a message indicating the matrix was - checked is printed (positive confirmation). - - 3: Adds a bit more information about the matrix. - - 4: Prints warnings about zeroes even if they're not considered - errors. - - Obviously bogus coefficients are coefficients that are NaN or have - absolute value greater than 1e50. Zeros have absolute value less - than 1e-50. - */ - int verifyMtx(int verbosity = 1, bool zeroesAreError = false) const ; - //@} - - //-------------------------------------------------------------------------- -protected: - void gutsOfDestructor(); - void gutsOfCopyOf(const bool colordered, - const int minor, const int major, const CoinBigIndex numels, - const double * elem, const int * ind, - const CoinBigIndex * start, const int * len, - const double extraMajor=0.0, const double extraGap=0.0); - /// When no gaps we can do faster - void gutsOfCopyOfNoGaps(const bool colordered, - const int minor, const int major, - const double * elem, const int * ind, - const CoinBigIndex * start); - void gutsOfOpEqual(const bool colordered, - const int minor, const int major, const CoinBigIndex numels, - const double * elem, const int * ind, - const CoinBigIndex * start, const int * len); - void resizeForAddingMajorVectors(const int numVec, const int * lengthVec); - void resizeForAddingMinorVectors(const int * addedEntries); - - /*! \brief Append a set of rows (columns) to the end of a row (colum) - ordered matrix. - - If \p numberOther > 0 the method will check if any of the new rows - (columns) contain duplicate indices or invalid indices and return the - number of errors. A valid minor index must satisfy - \code 0 <= k < numberOther \endcode - If \p numberOther < 0 no checking is performed. - */ - int appendMajor(const int number, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther=-1); - /*! \brief Append a set of rows (columns) to the end of a column (row) - ordered matrix. - - If \p numberOther > 0 the method will check if any of the new rows - (columns) contain duplicate indices or indices outside the current - range for the major dimension and return the number of violations. - If \p numberOther <= 0 the major dimension will be expanded as - necessary and there are no checks for duplicate indices. - */ - int appendMinor(const int number, - const CoinBigIndex * starts, const int * index, - const double * element, int numberOther=-1); - -private: - inline CoinBigIndex getLastStart() const { - return majorDim_ == 0 ? 0 : start_[majorDim_]; - } - - //-------------------------------------------------------------------------- -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /** A flag indicating whether the matrix is column or row major ordered. */ - bool colOrdered_; - /** This much times more space should be allocated for each major-dimension - vector (with respect to the number of entries in the vector) when the - matrix is resized. The purpose of these gaps is to allow fast insertion - of new minor-dimension vectors. */ - double extraGap_; - /** his much times more space should be allocated for major-dimension - vectors when the matrix is resized. The purpose of these gaps is to - allow fast addition of new major-dimension vectors. */ - double extraMajor_; - - /** List of nonzero element values. The entries in the gaps between - major-dimension vectors are undefined. */ - double *element_; - /** List of nonzero element minor-dimension indices. The entries in the gaps - between major-dimension vectors are undefined. */ - int *index_; - /** Starting positions of major-dimension vectors. */ - CoinBigIndex *start_; - /** Lengths of major-dimension vectors. */ - int *length_; - - /// number of vectors in matrix - int majorDim_; - /// size of other dimension - int minorDim_; - /// the number of nonzero entries - CoinBigIndex size_; - - /// max space allocated for major-dimension - int maxMajorDim_; - /// max space allocated for entries - CoinBigIndex maxSize_; - //@} -}; - -//############################################################################# -/*! \brief Test the methods in the CoinPackedMatrix class. - - The only reason for it not to be a member method is that this way - it doesn't have to be compiled into the library. And that's a gain, - because the library should be compiled with optimization on, but this - method should be compiled with debugging. -*/ -void -CoinPackedMatrixUnitTest(); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPackedVector.hpp b/thirdparty/linux/include/coin1/CoinPackedVector.hpp deleted file mode 100644 index 9ea1febf..00000000 --- a/thirdparty/linux/include/coin1/CoinPackedVector.hpp +++ /dev/null @@ -1,657 +0,0 @@ -/* $Id: CoinPackedVector.hpp 1509 2011-12-05 13:50:48Z forrest $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPackedVector_H -#define CoinPackedVector_H - -#include - -#include "CoinPragma.hpp" -#include "CoinPackedVectorBase.hpp" -#include "CoinSort.hpp" - -#ifdef COIN_FAST_CODE -#ifndef COIN_NOTEST_DUPLICATE -#define COIN_NOTEST_DUPLICATE -#endif -#endif - -#ifndef COIN_NOTEST_DUPLICATE -#define COIN_DEFAULT_VALUE_FOR_DUPLICATE true -#else -#define COIN_DEFAULT_VALUE_FOR_DUPLICATE false -#endif -/** Sparse Vector - -Stores vector of indices and associated element values. -Supports sorting of vector while maintaining the original indices. - -Here is a sample usage: -@verbatim - const int ne = 4; - int inx[ne] = { 1, 4, 0, 2 } - double el[ne] = { 10., 40., 1., 50. } - - // Create vector and set its value - CoinPackedVector r(ne,inx,el); - - // access each index and element - assert( r.indices ()[0]== 1 ); - assert( r.elements()[0]==10. ); - assert( r.indices ()[1]== 4 ); - assert( r.elements()[1]==40. ); - assert( r.indices ()[2]== 0 ); - assert( r.elements()[2]== 1. ); - assert( r.indices ()[3]== 2 ); - assert( r.elements()[3]==50. ); - - // access original position of index - assert( r.originalPosition()[0]==0 ); - assert( r.originalPosition()[1]==1 ); - assert( r.originalPosition()[2]==2 ); - assert( r.originalPosition()[3]==3 ); - - // access as a full storage vector - assert( r[ 0]==1. ); - assert( r[ 1]==10.); - assert( r[ 2]==50.); - assert( r[ 3]==0. ); - assert( r[ 4]==40.); - - // sort Elements in increasing order - r.sortIncrElement(); - - // access each index and element - assert( r.indices ()[0]== 0 ); - assert( r.elements()[0]== 1. ); - assert( r.indices ()[1]== 1 ); - assert( r.elements()[1]==10. ); - assert( r.indices ()[2]== 4 ); - assert( r.elements()[2]==40. ); - assert( r.indices ()[3]== 2 ); - assert( r.elements()[3]==50. ); - - // access original position of index - assert( r.originalPosition()[0]==2 ); - assert( r.originalPosition()[1]==0 ); - assert( r.originalPosition()[2]==1 ); - assert( r.originalPosition()[3]==3 ); - - // access as a full storage vector - assert( r[ 0]==1. ); - assert( r[ 1]==10.); - assert( r[ 2]==50.); - assert( r[ 3]==0. ); - assert( r[ 4]==40.); - - // Restore orignal sort order - r.sortOriginalOrder(); - - assert( r.indices ()[0]== 1 ); - assert( r.elements()[0]==10. ); - assert( r.indices ()[1]== 4 ); - assert( r.elements()[1]==40. ); - assert( r.indices ()[2]== 0 ); - assert( r.elements()[2]== 1. ); - assert( r.indices ()[3]== 2 ); - assert( r.elements()[3]==50. ); - - // Tests for equality and equivalence - CoinPackedVector r1; - r1=r; - assert( r==r1 ); - assert( r.equivalent(r1) ); - r.sortIncrElement(); - assert( r!=r1 ); - assert( r.equivalent(r1) ); - - // Add packed vectors. - // Similarly for subtraction, multiplication, - // and division. - CoinPackedVector add = r + r1; - assert( add[0] == 1.+ 1. ); - assert( add[1] == 10.+10. ); - assert( add[2] == 50.+50. ); - assert( add[3] == 0.+ 0. ); - assert( add[4] == 40.+40. ); - - assert( r.sum() == 10.+40.+1.+50. ); -@endverbatim -*/ -class CoinPackedVector : public CoinPackedVectorBase { - friend void CoinPackedVectorUnitTest(); - -public: - /**@name Get methods. */ - //@{ - /// Get the size - virtual int getNumElements() const { return nElements_; } - /// Get indices of elements - virtual const int * getIndices() const { return indices_; } - /// Get element values - virtual const double * getElements() const { return elements_; } - /// Get indices of elements - int * getIndices() { return indices_; } - /// Get the size - inline int getVectorNumElements() const { return nElements_; } - /// Get indices of elements - inline const int * getVectorIndices() const { return indices_; } - /// Get element values - inline const double * getVectorElements() const { return elements_; } - /// Get element values - double * getElements() { return elements_; } - /** Get pointer to int * vector of original postions. - If the packed vector has not been sorted then this - function returns the vector: 0, 1, 2, ..., size()-1. */ - const int * getOriginalPosition() const { return origIndices_; } - //@} - - //------------------------------------------------------------------- - // Set indices and elements - //------------------------------------------------------------------- - /**@name Set methods */ - //@{ - /// Reset the vector (as if were just created an empty vector) - void clear(); - /** Assignment operator.
      - NOTE: This operator keeps the current - testForDuplicateIndex setting, and affter copying the data - it acts accordingly. */ - CoinPackedVector & operator=(const CoinPackedVector &); - /** Assignment operator from a CoinPackedVectorBase.
      - NOTE: This operator keeps the current - testForDuplicateIndex setting, and affter copying the data - it acts accordingly. */ - CoinPackedVector & operator=(const CoinPackedVectorBase & rhs); - - /** Assign the ownership of the arguments to this vector. - Size is the length of both the indices and elements vectors. - The indices and elements vectors are copied into this class instance's - member data. The last argument indicates whether this vector will have - to be tested for duplicate indices. - */ - void assignVector(int size, int*& inds, double*& elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - - /** Set vector size, indices, and elements. - Size is the length of both the indices and elements vectors. - The indices and elements vectors are copied into this class instance's - member data. The last argument specifies whether this vector will have - to be checked for duplicate indices whenever that can happen. */ - void setVector(int size, const int * inds, const double * elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - - /** Elements set to have the same scalar value */ - void setConstant(int size, const int * inds, double elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - - /** Indices are not specified and are taken to be 0,1,...,size-1 */ - void setFull(int size, const double * elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - - /** Indices are not specified and are taken to be 0,1,...,size-1, - but only where non zero*/ - void setFullNonZero(int size, const double * elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - - /** Set an existing element in the packed vector - The first argument is the "index" into the elements() array - */ - void setElement(int index, double element); - - /// Insert an element into the vector - void insert(int index, double element); - /// Append a CoinPackedVector to the end - void append(const CoinPackedVectorBase & caboose); - - /// Swap values in positions i and j of indices and elements - void swap(int i, int j); - - /** Resize the packed vector to be the first newSize elements. - Problem with truncate: what happens with origIndices_ ??? */ - void truncate(int newSize); - //@} - - /**@name Arithmetic operators. */ - //@{ - /// add value to every entry - void operator+=(double value); - /// subtract value from every entry - void operator-=(double value); - /// multiply every entry by value - void operator*=(double value); - /// divide every entry by value - void operator/=(double value); - //@} - - /**@name Sorting */ - //@{ - /** Sort the packed storage vector. - Typcical usages: -
       
      -       packedVector.sort(CoinIncrIndexOrdered());   //increasing indices
      -       packedVector.sort(CoinIncrElementOrdered()); // increasing elements
      -       
      - */ - template - void sort(const CoinCompare3 & tc) - { CoinSort_3(indices_, indices_ + nElements_, origIndices_, elements_, - tc); } - - void sortIncrIndex() - { CoinSort_3(indices_, indices_ + nElements_, origIndices_, elements_, - CoinFirstLess_3()); } - - void sortDecrIndex() - { CoinSort_3(indices_, indices_ + nElements_, origIndices_, elements_, - CoinFirstGreater_3()); } - - void sortIncrElement() - { CoinSort_3(elements_, elements_ + nElements_, origIndices_, indices_, - CoinFirstLess_3()); } - - void sortDecrElement() - { CoinSort_3(elements_, elements_ + nElements_, origIndices_, indices_, - CoinFirstGreater_3()); } - - - /** Sort in original order. - If the vector has been sorted, then this method restores - to its orignal sort order. - */ - void sortOriginalOrder(); - //@} - - /**@name Memory usage */ - //@{ - /** Reserve space. - If one knows the eventual size of the packed vector, - then it may be more efficient to reserve the space. - */ - void reserve(int n); - /** capacity returns the size which could be accomodated without - having to reallocate storage. - */ - int capacity() const { return capacity_; } - //@} - /**@name Constructors and destructors */ - //@{ - /** Default constructor */ - CoinPackedVector(bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /** \brief Alternate Constructors - set elements to vector of doubles - - This constructor copies the vectors provided as parameters. - */ - CoinPackedVector(int size, const int * inds, const double * elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /** \brief Alternate Constructors - set elements to vector of doubles - - This constructor takes ownership of the vectors passed as parameters. - \p inds and \p elems will be NULL on return. - */ - CoinPackedVector(int capacity, int size, int *&inds, double *&elems, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /** Alternate Constructors - set elements to same scalar value */ - CoinPackedVector(int size, const int * inds, double element, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /** Alternate Constructors - construct full storage with indices 0 through - size-1. */ - CoinPackedVector(int size, const double * elements, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /** Copy constructor. */ - CoinPackedVector(const CoinPackedVector &); - /** Copy constructor from a PackedVectorBase. */ - CoinPackedVector(const CoinPackedVectorBase & rhs); - /** Destructor */ - virtual ~CoinPackedVector (); - //@} - -private: - /**@name Private methods */ - //@{ - /// Copy internal date - void gutsOfSetVector(int size, - const int * inds, const double * elems, - bool testForDuplicateIndex, - const char * method); - /// - void gutsOfSetConstant(int size, - const int * inds, double value, - bool testForDuplicateIndex, - const char * method); - //@} - -private: - /**@name Private member data */ - //@{ - /// Vector indices - int * indices_; - ///Vector elements - double * elements_; - /// Size of indices and elements vectors - int nElements_; - /// original unsorted indices - int * origIndices_; - /// Amount of memory allocated for indices_, origIndices_, and elements_. - int capacity_; - //@} -}; - -//############################################################################# - -/**@name Arithmetic operators on packed vectors. - - NOTE: These methods operate on those positions where at - least one of the arguments has a value listed. At those positions the - appropriate operation is executed, Otherwise the result of the operation is - considered 0.
      - NOTE 2: There are two kind of operators here. One is used - like "c = binaryOp(a, b)", the other is used like "binaryOp(c, a, b)", but - they are really the same. The first is much more natural to use, but it - involves the creation of a temporary object (the function *must* return an - object), while the second form puts the result directly into the argument - "c". Therefore, depending on the circumstances, the second form can be - significantly faster. - */ -//@{ -template void -binaryOp(CoinPackedVector& retVal, - const CoinPackedVectorBase& op1, double value, - BinaryFunction bf) -{ - retVal.clear(); - const int s = op1.getNumElements(); - if (s > 0) { - retVal.reserve(s); - const int * inds = op1.getIndices(); - const double * elems = op1.getElements(); - for (int i=0; i inline void -binaryOp(CoinPackedVector& retVal, - double value, const CoinPackedVectorBase& op2, - BinaryFunction bf) -{ - binaryOp(retVal, op2, value, bf); -} - -template void -binaryOp(CoinPackedVector& retVal, - const CoinPackedVectorBase& op1, const CoinPackedVectorBase& op2, - BinaryFunction bf) -{ - retVal.clear(); - const int s1 = op1.getNumElements(); - const int s2 = op2.getNumElements(); -/* - Replaced || with &&, in response to complaint from Sven deVries, who - rightly points out || is not appropriate for additive operations. && - should be ok as long as binaryOp is understood not to create something - from nothing. -- lh, 04.06.11 -*/ - if (s1 == 0 && s2 == 0) - return; - - retVal.reserve(s1+s2); - - const int * inds1 = op1.getIndices(); - const double * elems1 = op1.getElements(); - const int * inds2 = op2.getIndices(); - const double * elems2 = op2.getElements(); - - int i; - // loop once for each element in op1 - for ( i=0; i CoinPackedVector -binaryOp(const CoinPackedVectorBase& op1, double value, - BinaryFunction bf) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, value, bf); - return retVal; -} - -template CoinPackedVector -binaryOp(double value, const CoinPackedVectorBase& op2, - BinaryFunction bf) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op2, value, bf); - return retVal; -} - -template CoinPackedVector -binaryOp(const CoinPackedVectorBase& op1, const CoinPackedVectorBase& op2, - BinaryFunction bf) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, op2, bf); - return retVal; -} - -//----------------------------------------------------------------------------- -/// Return the sum of two packed vectors -inline CoinPackedVector operator+(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, op2, std::plus()); - return retVal; -} - -/// Return the difference of two packed vectors -inline CoinPackedVector operator-(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, op2, std::minus()); - return retVal; -} - -/// Return the element-wise product of two packed vectors -inline CoinPackedVector operator*(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, op2, std::multiplies()); - return retVal; -} - -/// Return the element-wise ratio of two packed vectors -inline CoinPackedVector operator/(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2) -{ - CoinPackedVector retVal; - retVal.setTestForDuplicateIndex(true); - binaryOp(retVal, op1, op2, std::divides()); - return retVal; -} -//@} - -/// Returns the dot product of two CoinPackedVector objects whose elements are -/// doubles. Use this version if the vectors are *not* guaranteed to be sorted. -inline double sparseDotProduct(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2){ - int len, i; - double acc = 0.0; - CoinPackedVector retVal; - - CoinPackedVector retval = op1*op2; - len = retval.getNumElements(); - double * CParray = retval.getElements(); - - for(i = 0; i < len; i++){ - acc += CParray[i]; - } -return acc; -} - - -/// Returns the dot product of two sorted CoinPackedVector objects. -/// The vectors should be sorted in ascending order of indices. -inline double sortedSparseDotProduct(const CoinPackedVectorBase& op1, - const CoinPackedVectorBase& op2){ - int i, j, len1, len2; - double acc = 0.0; - - const double* v1val = op1.getElements(); - const double* v2val = op2.getElements(); - const int* v1ind = op1.getIndices(); - const int* v2ind = op2.getIndices(); - - len1 = op1.getNumElements(); - len2 = op2.getNumElements(); - - i = 0; - j = 0; - - while(i < len1 && j < len2){ - if(v1ind[i] == v2ind[j]){ - acc += v1val[i] * v2val[j]; - i++; - j++; - } - else if(v2ind[j] < v1ind[i]){ - j++; - } - else{ - i++; - } // end if-else-elseif - } // end while - return acc; - } - - -//----------------------------------------------------------------------------- - -/**@name Arithmetic operators on packed vector and a constant.
      - These functions create a packed vector as a result. That packed vector will - have the same indices as op1 and the specified operation is - done entry-wise with the given value. */ -//@{ -/// Return the sum of a packed vector and a constant -inline CoinPackedVector -operator+(const CoinPackedVectorBase& op1, double value) -{ - CoinPackedVector retVal(op1); - retVal += value; - return retVal; -} - -/// Return the difference of a packed vector and a constant -inline CoinPackedVector -operator-(const CoinPackedVectorBase& op1, double value) -{ - CoinPackedVector retVal(op1); - retVal -= value; - return retVal; -} - -/// Return the element-wise product of a packed vector and a constant -inline CoinPackedVector -operator*(const CoinPackedVectorBase& op1, double value) -{ - CoinPackedVector retVal(op1); - retVal *= value; - return retVal; -} - -/// Return the element-wise ratio of a packed vector and a constant -inline CoinPackedVector -operator/(const CoinPackedVectorBase& op1, double value) -{ - CoinPackedVector retVal(op1); - retVal /= value; - return retVal; -} - -//----------------------------------------------------------------------------- - -/// Return the sum of a constant and a packed vector -inline CoinPackedVector -operator+(double value, const CoinPackedVectorBase& op1) -{ - CoinPackedVector retVal(op1); - retVal += value; - return retVal; -} - -/// Return the difference of a constant and a packed vector -inline CoinPackedVector -operator-(double value, const CoinPackedVectorBase& op1) -{ - CoinPackedVector retVal(op1); - const int size = retVal.getNumElements(); - double* elems = retVal.getElements(); - for (int i = 0; i < size; ++i) { - elems[i] = value - elems[i]; - } - return retVal; -} - -/// Return the element-wise product of a constant and a packed vector -inline CoinPackedVector -operator*(double value, const CoinPackedVectorBase& op1) -{ - CoinPackedVector retVal(op1); - retVal *= value; - return retVal; -} - -/// Return the element-wise ratio of a a constant and packed vector -inline CoinPackedVector -operator/(double value, const CoinPackedVectorBase& op1) -{ - CoinPackedVector retVal(op1); - const int size = retVal.getNumElements(); - double* elems = retVal.getElements(); - for (int i = 0; i < size; ++i) { - elems[i] = value / elems[i]; - } - return retVal; -} -//@} - -//############################################################################# -/** A function that tests the methods in the CoinPackedVector class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void -CoinPackedVectorUnitTest(); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPackedVectorBase.hpp b/thirdparty/linux/include/coin1/CoinPackedVectorBase.hpp deleted file mode 100644 index dccc1cdd..00000000 --- a/thirdparty/linux/include/coin1/CoinPackedVectorBase.hpp +++ /dev/null @@ -1,269 +0,0 @@ -/* $Id: CoinPackedVectorBase.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPackedVectorBase_H -#define CoinPackedVectorBase_H - -#include -#include -#include "CoinPragma.hpp" -#include "CoinError.hpp" - -class CoinPackedVector; - -/** Abstract base class for various sparse vectors. - - Since this class is abstract, no object of this type can be created. The - sole purpose of this class is to provide access to a constant - packed vector. All members of this class are const methods, they can't - change the object. */ - -class CoinPackedVectorBase { - -public: - /**@name Virtual methods that the derived classes must provide */ - //@{ - /// Get length of indices and elements vectors - virtual int getNumElements() const = 0; - /// Get indices of elements - virtual const int * getIndices() const = 0; - /// Get element values - virtual const double * getElements() const = 0; - //@} - - /**@name Methods related to whether duplicate-index checking is performed. - - If the checking for duplicate indices is turned off, then - some CoinPackedVector methods may not work correctly if there - are duplicate indices. - Turning off the checking for duplicate indices may result in - better run time performance. - */ - //@{ - /** \brief Set to the argument value whether to test for duplicate indices - in the vector whenever they can occur. - - Calling this method with \p test set to true will trigger an immediate - check for duplicate indices. - */ - void setTestForDuplicateIndex(bool test) const; - /** \brief Set to the argument value whether to test for duplicate indices - in the vector whenever they can occur BUT we know that right - now the vector has no duplicate indices. - - Calling this method with \p test set to true will not trigger - an immediate check for duplicate indices; instead, it's assumed that - the result of the test will be true. - */ - void setTestForDuplicateIndexWhenTrue(bool test) const; - /** Returns true if the vector should be tested for duplicate indices when - they can occur. */ - bool testForDuplicateIndex() const { return testForDuplicateIndex_; } - /// Just sets test stuff false without a try etc - inline void setTestsOff() const - { testForDuplicateIndex_=false; testedDuplicateIndex_=false;} - //@} - - /**@name Methods for getting info on the packed vector as a full vector */ - //@{ - /** Get the vector as a dense vector. The argument specifies how long this - dense vector is.
      - NOTE: The user needs to delete[] this - pointer after it's not needed anymore. - */ - double * denseVector(int denseSize) const; - /** Access the i'th element of the full storage vector. - If the i'th is not stored, then zero is returned. The initial use of - this method has some computational and storage overhead associated with - it.
      - NOTE: This is very expensive. It is probably - much better to use denseVector(). - */ - double operator[](int i) const; - //@} - - /**@name Index methods */ - //@{ - /// Get value of maximum index - int getMaxIndex() const; - /// Get value of minimum index - int getMinIndex() const; - - /// Throw an exception if there are duplicate indices - void duplicateIndex(const char* methodName = NULL, - const char * className = NULL) const; - - /** Return true if the i'th element of the full storage vector exists in - the packed storage vector.*/ - bool isExistingIndex(int i) const; - - /** Return the position of the i'th element of the full storage vector. - If index does not exist then -1 is returned */ - int findIndex(int i) const; - - //@} - - /**@name Comparison operators on two packed vectors */ - //@{ - /** Equal. Returns true if vectors have same length and corresponding - element of each vector is equal. */ - bool operator==(const CoinPackedVectorBase & rhs) const; - /// Not equal - bool operator!=(const CoinPackedVectorBase & rhs) const; - -#if 0 - // LL: This should be implemented eventually. It is useful to have. - /** Lexicographic comparisons of two packed vectors. Returns - negative/0/positive depending on whether \c this is - smaller/equal.greater than \c rhs */ - int lexCompare(const CoinPackedVectorBase& rhs); -#endif - - /** This method establishes an ordering on packed vectors. It is complete - ordering, but not the same as lexicographic ordering. However, it is - quick and dirty to compute and thus it is useful to keep packed vectors - in a heap when all we care is to quickly check whether a particular - vector is already in the heap or not. Returns negative/0/positive - depending on whether \c this is smaller/equal.greater than \c rhs. */ - int compare(const CoinPackedVectorBase& rhs) const; - - /** equivalent - If shallow packed vector A & B are equivalent, then they - are still equivalent no matter how they are sorted. - In this method the FloatEqual function operator can be specified. The - default equivalence test is that the entries are relatively equal.
      - NOTE: This is a relatively expensive method as it - sorts the two shallow packed vectors. - */ - template bool - isEquivalent(const CoinPackedVectorBase& rhs, const FloatEqual& eq) const - { - if (getNumElements() != rhs.getNumElements()) - return false; - - duplicateIndex("equivalent", "CoinPackedVector"); - rhs.duplicateIndex("equivalent", "CoinPackedVector"); - - std::map mv; - const int * inds = getIndices(); - const double * elems = getElements(); - int i; - for ( i = getNumElements() - 1; i >= 0; --i) { - mv.insert(std::make_pair(inds[i], elems[i])); - } - - std::map mvRhs; - inds = rhs.getIndices(); - elems = rhs.getElements(); - for ( i = getNumElements() - 1; i >= 0; --i) { - mvRhs.insert(std::make_pair(inds[i], elems[i])); - } - - std::map::const_iterator mvI = mv.begin(); - std::map::const_iterator mvIlast = mv.end(); - std::map::const_iterator mvIrhs = mvRhs.begin(); - while (mvI != mvIlast) { - if (mvI->first != mvIrhs->first || ! eq(mvI->second, mvIrhs->second)) - return false; - ++mvI; - ++mvIrhs; - } - return true; - } - - bool isEquivalent(const CoinPackedVectorBase& rhs) const; - //@} - - - /**@name Arithmetic operators. */ - //@{ - /// Create the dot product with a full vector - double dotProduct(const double* dense) const; - - /// Return the 1-norm of the vector - double oneNorm() const; - - /// Return the square of the 2-norm of the vector - double normSquare() const; - - /// Return the 2-norm of the vector - double twoNorm() const; - - /// Return the infinity-norm of the vector - double infNorm() const; - - /// Sum elements of vector. - double sum() const; - //@} - -protected: - - /**@name Constructors, destructor - NOTE: All constructors are protected. There's no need - to expose them, after all, this is an abstract class. */ - //@{ - /** Default constructor. */ - CoinPackedVectorBase(); - -public: - /** Destructor */ - virtual ~CoinPackedVectorBase(); - //@} - -private: - /**@name Disabled methods */ - //@{ - /** The copy constructor.
      - This must be at least protected, but we make it private. The reason is - that when, say, a shallow packed vector is created, first the - underlying class, it this one is constructed. However, at that point we - don't know how much of the data members of this class we need to copy - over. Therefore the copy constructor is not used. */ - CoinPackedVectorBase(const CoinPackedVectorBase&); - /** This class provides const access to packed vectors, so there's - no need to provide an assignment operator. */ - CoinPackedVectorBase& operator=(const CoinPackedVectorBase&); - //@} - -protected: - - /**@name Protected methods */ - //@{ - /// Find Maximum and Minimum Indices - void findMaxMinIndices() const; - - /// Return indexSetPtr_ (create it if necessary). - std::set * indexSet(const char* methodName = NULL, - const char * className = NULL) const; - - /// Delete the indexSet - void clearIndexSet() const; - void clearBase() const; - void copyMaxMinIndex(const CoinPackedVectorBase & x) const { - maxIndex_ = x.maxIndex_; - minIndex_ = x.minIndex_; - } - //@} - -private: - /**@name Protected member data */ - //@{ - /// Contains max index value or -infinity - mutable int maxIndex_; - /// Contains minimum index value or infinity - mutable int minIndex_; - /** Store the indices in a set. This set is only created if it is needed. - Its primary use is testing for duplicate indices. - */ - mutable std::set * indexSetPtr_; - /** True if the vector should be tested for duplicate indices when they can - occur. */ - mutable bool testForDuplicateIndex_; - /** True if the vector has already been tested for duplicate indices. Most - of the operations in CoinPackedVector preserves this flag. */ - mutable bool testedDuplicateIndex_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinParam.hpp b/thirdparty/linux/include/coin1/CoinParam.hpp deleted file mode 100644 index 30cccc26..00000000 --- a/thirdparty/linux/include/coin1/CoinParam.hpp +++ /dev/null @@ -1,644 +0,0 @@ -/* $Id: CoinParam.hpp 1493 2011-11-01 16:56:07Z tkr $ */ -#ifndef CoinParam_H -#define CoinParam_H - -/* - Copyright (C) 2002, International Business Machines - Corporation and others. All Rights Reserved. - - This code is licensed under the terms of the Eclipse Public License (EPL). -*/ - -/*! \file CoinParam.hpp - \brief Declaration of a class for command line parameters. -*/ - -#include -#include -#include - -/*! \class CoinParam - \brief A base class for `keyword value' command line parameters. - - The underlying paradigm is that a parameter specifies an action to be - performed on a target object. The base class provides two function - pointers, a `push' function and a `pull' function. By convention, a push - function will set some value in the target object or perform some action - using the target object. A `pull' function will retrieve some value from - the target object. This is only a convention, however; CoinParam and - associated utilities make no use of these functions and have no hardcoded - notion of how they should be used. - - The action to be performed, and the target object, will be specific to a - particular application. It is expected that users will derive - application-specific parameter classes from this base class. A derived - class will typically add fields and methods to set/get a code for the - action to be performed (often, an enum class) and the target object (often, - a pointer or reference). - - Facilities provided by the base class and associated utility routines - include: -
        -
      • Support for common parameter types with numeric, string, or - keyword values. -
      • Support for short and long help messages. -
      • Pointers to `push' and `pull' functions as described above. -
      • Command line parsing and keyword matching. -
      - All utility routines are declared in the #CoinParamUtils namespace. - - The base class recognises five types of parameters: actions (which require - no value); numeric parameters with integer or real (double) values; keyword - parameters, where the value is one of a defined set of value-keywords; - and string parameters (where the value is a string). - The base class supports the definition of a valid range, a default value, - and short and long help messages for a parameter. - - As defined by the #CoinParamFunc typedef, push and pull functions - should take a single parameter, a pointer to a CoinParam. Typically this - object will actually be a derived class as described above, and the - implementation function will have access to all capabilities of CoinParam and - of the derived class. - - When specified as command line parameters, the expected syntax is `-keyword - value' or `-keyword=value'. You can also use the Gnu double-dash style, - `--keyword'. Spaces around the `=' will \e not work. - - The keyword (name) for a parameter can be defined with an `!' to mark the - minimal match point. For example, allow!ableGap will be considered matched - by the strings `allow', `allowa', `allowab', \e etc. Similarly, the - value-keyword strings for keyword parameters can be defined with `!' to - mark the minimal match point. Matching of keywords and value-keywords is - \e not case sensitive. -*/ - -class CoinParam -{ - -public: - -/*! \name Subtypes */ -//@{ - - /*! \brief Enumeration for the types of parameters supported by CoinParam - - CoinParam provides support for several types of parameters: -
        -
      • Action parameters, which require no value. -
      • Integer and double numeric parameters, with upper and lower bounds. -
      • String parameters that take an arbitrary string value. -
      • Keyword parameters that take a defined set of string (value-keyword) - values. Value-keywords are associated with integers in the order in - which they are added, starting from zero. -
      - */ - typedef enum { coinParamInvalid = 0, - coinParamAct, coinParamInt, coinParamDbl, - coinParamStr, coinParamKwd } CoinParamType ; - - /*! \brief Type declaration for push and pull functions. - - By convention, a return code of 0 indicates execution without error, >0 - indicates nonfatal error, and <0 indicates fatal error. This is only - convention, however; the base class makes no use of the push and pull - functions and has no hardcoded interpretation of the return code. - */ - typedef int (*CoinParamFunc)(CoinParam *param) ; - -//@} - -/*! \name Constructors and Destructors - - Be careful how you specify parameters for the constructors! Some compilers - are entirely too willing to convert almost anything to bool. -*/ -//@{ - - /*! \brief Default constructor */ - - CoinParam() ; - - /*! \brief Constructor for a parameter with a double value - - The default value is 0.0. Be careful to clearly indicate that \p lower and - \p upper are real (double) values to distinguish this constructor from the - constructor for an integer parameter. - */ - CoinParam(std::string name, std::string help, - double lower, double upper, double dflt = 0.0, - bool display = true) ; - - /*! \brief Constructor for a parameter with an integer value - - The default value is 0. - */ - CoinParam(std::string name, std::string help, - int lower, int upper, int dflt = 0, - bool display = true) ; - - /*! \brief Constructor for a parameter with keyword values - - The string supplied as \p firstValue becomes the first value-keyword. - Additional value-keywords can be added using appendKwd(). It's necessary - to specify both the first value-keyword (\p firstValue) and the default - value-keyword index (\p dflt) in order to distinguish this constructor - from the constructors for string and action parameters. - - Value-keywords are associated with an integer, starting with zero and - increasing as each keyword is added. The value-keyword given as \p - firstValue will be associated with the integer zero. The integer supplied - for \p dflt can be any value, as long as it will be valid once all - value-keywords have been added. - */ - CoinParam(std::string name, std::string help, - std::string firstValue, int dflt, bool display = true) ; - - /*! \brief Constructor for a string parameter - - For some compilers, the default value (\p dflt) must be specified - explicitly with type std::string to distinguish the constructor for a - string parameter from the constructor for an action parameter. For - example, use std::string("default") instead of simply "default", or use a - variable of type std::string. - */ - CoinParam(std::string name, std::string help, - std::string dflt, bool display = true) ; - - /*! \brief Constructor for an action parameter */ - - CoinParam(std::string name, std::string help, - bool display = true) ; - - /*! \brief Copy constructor */ - - CoinParam(const CoinParam &orig) ; - - /*! \brief Clone */ - - virtual CoinParam *clone() ; - - /*! \brief Assignment */ - - CoinParam &operator=(const CoinParam &rhs) ; - - /*! \brief Destructor */ - - virtual ~CoinParam() ; - -//@} - -/*! \name Methods to query and manipulate the value(s) of a parameter */ -//@{ - - /*! \brief Add an additional value-keyword to a keyword parameter */ - - void appendKwd(std::string kwd) ; - - /*! \brief Return the integer associated with the specified value-keyword - - Returns -1 if no value-keywords match the specified string. - */ - int kwdIndex(std::string kwd) const ; - - /*! \brief Return the value-keyword that is the current value of the - keyword parameter - */ - std::string kwdVal() const ; - - /*! \brief Set the value of the keyword parameter using the integer - associated with a value-keyword. - - If \p printIt is true, the corresponding value-keyword string will be - echoed to std::cout. - */ - void setKwdVal(int value, bool printIt = false) ; - - /*! \brief Set the value of the keyword parameter using a value-keyword - string. - - The given string will be tested against the set of value-keywords for - the parameter using the shortest match rules. - */ - void setKwdVal(const std::string value ) ; - - /*! \brief Prints the set of value-keywords defined for this keyword - parameter - */ - void printKwds() const ; - - - /*! \brief Set the value of a string parameter */ - - void setStrVal(std::string value) ; - - /*! \brief Get the value of a string parameter */ - - std::string strVal() const ; - - - /*! \brief Set the value of a double parameter */ - - void setDblVal(double value) ; - - /*! \brief Get the value of a double parameter */ - - double dblVal() const ; - - - /*! \brief Set the value of a integer parameter */ - - void setIntVal(int value) ; - - /*! \brief Get the value of a integer parameter */ - - int intVal() const ; - - - /*! \brief Add a short help string to a parameter */ - - inline void setShortHelp(const std::string help) { shortHelp_ = help ; } - - /*! \brief Retrieve the short help string */ - - inline std::string shortHelp() const { return (shortHelp_) ; } - - /*! \brief Add a long help message to a parameter - - See printLongHelp() for a description of how messages are broken into - lines. - */ - inline void setLongHelp(const std::string help) { longHelp_ = help ; } - - /*! \brief Retrieve the long help message */ - - inline std::string longHelp() const { return (longHelp_) ; } - - /*! \brief Print long help - - Prints the long help string, plus the valid range and/or keywords if - appropriate. The routine makes a best effort to break the message into - lines appropriate for an 80-character line. Explicit line breaks in the - message will be observed. The short help string will be used if - long help is not available. - */ - void printLongHelp() const ; - -//@} - -/*! \name Methods to query and manipulate a parameter object */ -//@{ - - /*! \brief Return the type of the parameter */ - - inline CoinParamType type() const { return (type_) ; } - - /*! \brief Set the type of the parameter */ - - inline void setType(CoinParamType type) { type_ = type ; } - - /*! \brief Return the parameter keyword (name) string */ - - inline std::string name() const { return (name_) ; } - - /*! \brief Set the parameter keyword (name) string */ - - inline void setName(std::string name) { name_ = name ; processName() ; } - - /*! \brief Check if the specified string matches the parameter keyword (name) - string - - Returns 1 if the string matches and meets the minimum match length, - 2 if the string matches but doesn't meet the minimum match length, - and 0 if the string doesn't match. Matches are \e not case-sensitive. - */ - int matches (std::string input) const ; - - /*! \brief Return the parameter keyword (name) string formatted to show - the minimum match length - - For example, if the parameter name was defined as allow!ableGap, the - string returned by matchName would be allow(ableGap). - */ - std::string matchName() const ; - - /*! \brief Set visibility of parameter - - Intended to control whether the parameter is shown when a list of - parameters is processed. Used by CoinParamUtils::printHelp when printing - help messages for a list of parameters. - */ - inline void setDisplay(bool display) { display_ = display ; } - - /*! \brief Get visibility of parameter */ - - inline bool display() const { return (display_) ; } - - /*! \brief Get push function */ - - inline CoinParamFunc pushFunc() { return (pushFunc_) ; } - - /*! \brief Set push function */ - - inline void setPushFunc(CoinParamFunc func) { pushFunc_ = func ; } - - /*! \brief Get pull function */ - - inline CoinParamFunc pullFunc() { return (pullFunc_) ; } - - /*! \brief Set pull function */ - - inline void setPullFunc(CoinParamFunc func) { pullFunc_ = func ; } - -//@} - -private: - -/*! \name Private methods */ -//@{ - - /*! Process a name for efficient matching */ - void processName() ; - -//@} - -/*! \name Private parameter data */ -//@{ - /// Parameter type (see #CoinParamType) - CoinParamType type_ ; - - /// Parameter name - std::string name_ ; - - /// Length of parameter name - size_t lengthName_ ; - - /*! \brief Minimum length required to declare a match for the parameter - name. - */ - size_t lengthMatch_ ; - - /// Lower bound on value for a double parameter - double lowerDblValue_ ; - - /// Upper bound on value for a double parameter - double upperDblValue_ ; - - /// Double parameter - current value - double dblValue_ ; - - /// Lower bound on value for an integer parameter - int lowerIntValue_ ; - - /// Upper bound on value for an integer parameter - int upperIntValue_ ; - - /// Integer parameter - current value - int intValue_ ; - - /// String parameter - current value - std::string strValue_ ; - - /// Set of valid value-keywords for a keyword parameter - std::vector definedKwds_ ; - - /*! \brief Current value for a keyword parameter (index into #definedKwds_) - */ - int currentKwd_ ; - - /// Push function - CoinParamFunc pushFunc_ ; - - /// Pull function - CoinParamFunc pullFunc_ ; - - /// Short help - std::string shortHelp_ ; - - /// Long help - std::string longHelp_ ; - - /// Display when processing lists of parameters? - bool display_ ; -//@} - -} ; - -/*! \relatesalso CoinParam - \brief A type for a parameter vector. -*/ -typedef std::vector CoinParamVec ; - -/*! \relatesalso CoinParam - \brief A stream output function for a CoinParam object. -*/ -std::ostream &operator<< (std::ostream &s, const CoinParam ¶m) ; - -/* - Bring in the utility functions for parameter handling (CbcParamUtils). -*/ - -/*! \brief Utility functions for processing CoinParam parameters. - - The functions in CoinParamUtils support command line or interactive - parameter processing and a help facility. Consult the `Related Functions' - section of the CoinParam class documentation for individual function - documentation. -*/ -namespace CoinParamUtils { - /*! \relatesalso CoinParam - \brief Take command input from the file specified by src. - - Use stdin for \p src to specify interactive prompting for commands. - */ - void setInputSrc(FILE *src) ; - - /*! \relatesalso CoinParam - \brief Returns true if command line parameters are being processed. - */ - bool isCommandLine() ; - - /*! \relatesalso CoinParam - \brief Returns true if parameters are being obtained from stdin. - */ - bool isInteractive() ; - - /*! \relatesalso CoinParam - \brief Attempt to read a string from the input. - - \p argc and \p argv are used only if isCommandLine() would return true. - If \p valid is supplied, it will be set to 0 if a string is parsed - without error, 2 if no field is present. - */ - std::string getStringField(int argc, const char *argv[], int *valid) ; - - /*! \relatesalso CoinParam - \brief Attempt to read an integer from the input. - - \p argc and \p argv are used only if isCommandLine() would return true. - If \p valid is supplied, it will be set to 0 if an integer is parsed - without error, 1 if there's a parse error, and 2 if no field is present. - */ - int getIntField(int argc, const char *argv[], int *valid) ; - - /*! \relatesalso CoinParam - \brief Attempt to read a real (double) from the input. - - \p argc and \p argv are used only if isCommandLine() would return true. - If \p valid is supplied, it will be set to 0 if a real number is parsed - without error, 1 if there's a parse error, and 2 if no field is present. - */ - double getDoubleField(int argc, const char *argv[], int *valid) ; - - /*! \relatesalso CoinParam - \brief Scan a parameter vector for parameters whose keyword (name) string - matches \p name using minimal match rules. - - \p matchNdx is set to the index of the last parameter that meets the - minimal match criteria (but note there should be at most one matching - parameter if the parameter vector is properly configured). \p shortCnt - is set to the number of short matches (should be zero for a properly - configured parameter vector if a minimal match is found). The return - value is the number of matches satisfying the minimal match requirement - (should be 0 or 1 in a properly configured vector). - */ - int matchParam(const CoinParamVec ¶mVec, std::string name, - int &matchNdx, int &shortCnt) ; - - /*! \relatesalso CoinParam - \brief Get the next command keyword (name) - - To be precise, return the next field from the current command input - source, after a bit of processing. In command line mode (isCommandLine() - returns true) the next field will normally be of the form `-keyword' or - `--keyword' (\e i.e., a parameter keyword), and the string returned would - be `keyword'. In interactive mode (isInteractive() returns true), the - user will be prompted if necessary. It is assumed that the user knows - not to use the `-' or `--' prefixes unless specifying parameters on the - command line. - - There are a number of special cases if we're in command line mode. The - order of processing of the raw string goes like this: -
        -
      • A stand-alone `-' is forced to `stdin'. -
      • A stand-alone '--' is returned as a word; interpretation is up to - the client. -
      • A prefix of '-' or '--' is stripped from the string. -
      - If the result is the string `stdin', command processing shifts to - interactive mode and the user is immediately prompted for a new command. - - Whatever results from the above sequence is returned to the user as the - return value of the function. An empty string indicates end of input. - - \p prompt will be used only if it's necessary to prompt the user in - interactive mode. - */ - - std::string getCommand(int argc, const char *argv[], - const std::string prompt, std::string *pfx = 0) ; - - /*! \relatesalso CoinParam - \brief Look up the command keyword (name) in the parameter vector. - Print help if requested. - - In the most straightforward use, \p name is a string without `?', and the - value returned is the index in \p paramVec of the single parameter that - matched \p name. One or more '?' characters at the end of \p name is a - query for information. The routine prints short (one '?') or long (more - than one '?') help messages for a query. Help is also printed in the case - where the name is ambiguous (some of the matches did not meet the minimal - match length requirement). - - Note that multiple matches meeting the minimal match requirement is a - configuration error. The mimimal match length for the parameters - involved is too short. - - If provided as parameters, on return -
        -
      • \p matchCnt will be set to the number of matches meeting the - minimal match requirement -
      • \p shortCnt will be set to the number of matches that did not - meet the miminal match requirement -
      • \p queryCnt will be set to the number of '?' characters at the - end of the name -
      - - The return values are: -
        -
      • >0: index in \p paramVec of the single unique match for \p name -
      • -1: a query was detected (one or more '?' characters at the end - of \p name -
      • -2: one or more short matches, not a query -
      • -3: no matches, not a query -
      • -4: multiple matches meeting the minimal match requirement - (configuration error) -
      - */ - int lookupParam(std::string name, CoinParamVec ¶mVec, - int *matchCnt = 0, int *shortCnt = 0, int *queryCnt = 0) ; - - /*! \relatesalso CoinParam - \brief Utility to print a long message as filled lines of text - - The routine makes a best effort to break lines without exceeding the - standard 80 character line length. Explicit newlines in \p msg will - be obeyed. - */ - void printIt(const char *msg) ; - - /*! \relatesalso CoinParam - \brief Utility routine to print help given a short match or explicit - request for help. - - The two really are related, in that a query (a string that ends with - one or more `?' characters) will often result in a short match. The - routine expects that \p name matches a single parameter, and does not - look for multiple matches. - - If called with \p matchNdx < 0, the routine will look up \p name in \p - paramVec and print the full name from the parameter. If called with \p - matchNdx > 0, it just prints the name from the specified parameter. If - the name is a query, short (one '?') or long (more than one '?') help - is printed. - - */ void shortOrHelpOne(CoinParamVec ¶mVec,int matchNdx, std::string - name, int numQuery) ; - - /*! \relatesalso CoinParam - \brief Utility routine to print help given multiple matches. - - If the name is not a query, or asks for short help (\e i.e., contains - zero or one '?' characters), the list of matching names is printed. If - the name asks for long help (contains two or more '?' characters), - short help is printed for each matching name. - */ - void shortOrHelpMany(CoinParamVec ¶mVec, - std::string name, int numQuery) ; - - /*! \relatesalso CoinParam - \brief Print a generic `how to use the command interface' help message. - - The message is hard coded to match the behaviour of the parsing utilities. - */ - void printGenericHelp() ; - - /*! \relatesalso CoinParam - \brief Utility routine to print help messages for one or more - parameters. - - Intended as a utility to implement explicit `help' commands. Help will be - printed for all parameters in \p paramVec from \p firstParam to \p - lastParam, inclusive. If \p shortHelp is true, short help messages will - be printed. If \p longHelp is true, long help messages are printed. \p - shortHelp overrules \p longHelp. If neither is true, only command - keywords are printed. \p prefix is printed before each line; it's an - imperfect attempt at indentation. - */ - void printHelp(CoinParamVec ¶mVec, int firstParam, int lastParam, - std::string prefix, - bool shortHelp, bool longHelp, bool hidden) ; -} - - -#endif /* CoinParam_H */ - diff --git a/thirdparty/linux/include/coin1/CoinPragma.hpp b/thirdparty/linux/include/coin1/CoinPragma.hpp deleted file mode 100644 index b9f8cd2b..00000000 --- a/thirdparty/linux/include/coin1/CoinPragma.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* $Id: CoinPragma.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPragma_H -#define CoinPragma_H - -//------------------------------------------------------------------- -// -// This is a file which can contain Pragma's that are -// generally applicable to any source file. -// -//------------------------------------------------------------------- - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -// Turn off compiler warning: -// "empty controlled statement found; is this the intent?" -# pragma warning(disable:4390) -// Turn off compiler warning about deprecated functions -# pragma warning(disable:4996) -#endif - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveDoubleton.hpp b/thirdparty/linux/include/coin1/CoinPresolveDoubleton.hpp deleted file mode 100644 index 3ad8cd23..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveDoubleton.hpp +++ /dev/null @@ -1,73 +0,0 @@ -/* $Id: CoinPresolveDoubleton.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveDoubleton_H -#define CoinPresolveDoubleton_H - -#define DOUBLETON 5 - -/*! \class doubleton_action - \brief Solve ax+by=c for y and substitute y out of the problem. - - This moves the bounds information for y onto x, making y free and allowing - us to substitute it away. - \verbatim - a x + b y = c - l1 <= x <= u1 - l2 <= y <= u2 ==> - - l2 <= (c - a x) / b <= u2 - b/-a > 0 ==> (b l2 - c) / -a <= x <= (b u2 - c) / -a - b/-a < 0 ==> (b u2 - c) / -a <= x <= (b l2 - c) / -a - \endverbatim -*/ -class doubleton_action : public CoinPresolveAction { - public: - struct action { - - double clox; - double cupx; - double costx; - - double costy; - - double rlo; - - double coeffx; - double coeffy; - - double *colel; - - int icolx; - int icoly; - int row; - int ncolx; - int ncoly; - }; - - const int nactions_; - const action *const actions_; - - private: - doubleton_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) -{} - - public: - const char *name() const { return ("doubleton_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~doubleton_action(); -}; -#endif - - diff --git a/thirdparty/linux/include/coin1/CoinPresolveDual.hpp b/thirdparty/linux/include/coin1/CoinPresolveDual.hpp deleted file mode 100644 index b021ce0c..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveDual.hpp +++ /dev/null @@ -1,85 +0,0 @@ -/* $Id: CoinPresolveDual.hpp 1510 2011-12-08 23:56:01Z lou $ */ - -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveDual_H -#define CoinPresolveDual_H - -/*! \class remove_dual_action - \brief Attempt to fix variables by bounding reduced costs - - The reduced cost of x_j is d_j = c_j - y*a_j (1). Assume minimization, - so that at optimality d_j >= 0 for x_j nonbasic at lower bound, and - d_j <= 0 for x_j nonbasic at upper bound. - - For a slack variable s_i, c_(n+i) = 0 and a_(n+i) is a unit vector, hence - d_(n+i) = -y_i. If s_i has a finite lower bound and no upper bound, we - must have y_i <= 0 at optimality. Similarly, if s_i has no lower bound and a - finite upper bound, we must have y_i >= 0. - - For a singleton variable x_j, d_j = c_j - y_i*a_ij. Given x_j with a - single finite bound, we can bound d_j greater or less than 0 at - optimality, and that allows us to calculate an upper or lower bound on y_i - (depending on the bound on d_j and the sign of a_ij). - - Now we have bounds on some subset of the y_i, and we can use these to - calculate upper and lower bounds on the d_j, using bound propagation on - (1). If we can manage to bound some d_j as strictly positive or strictly - negative, then at optimality the corresponding variable must be nonbasic - at its lower or upper bound, respectively. If the required bound is lacking, - the problem is unbounded. -*/ - -class remove_dual_action : public CoinPresolveAction { - - public: - - /// Destructor - ~remove_dual_action () ; - - /// Name - inline const char *name () const { return ("remove_dual_action") ; } - - /*! \brief Attempt to fix variables by bounding reduced costs - - Always scans all variables. Propagates bounds on reduced costs until there's - no change or until some set of variables can be fixed. - */ - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next) ; - - /*! \brief Postsolve - - In addition to fixing variables (handled by make_fixed_action), we may - need use our own postsolve to restore constraint bounds. - */ - void postsolve (CoinPostsolveMatrix *prob) const ; - - private: - - /// Postsolve (bound restore) instruction - struct action { - double rlo_ ; ///< restored row lower bound - double rup_ ; ///< restored row upper bound - int ndx_ ; ///< row index - } ; - - /// Constructor with postsolve actions. - remove_dual_action(int nactions, const action *actions, - const CoinPresolveAction *next) - : CoinPresolveAction(next), - nactions_(nactions), - actions_(actions) - {} - - /// Count of bound restore entries - const int nactions_ ; - /// Bound restore entries - const action *actions_ ; - -} ; -#endif - - diff --git a/thirdparty/linux/include/coin1/CoinPresolveDupcol.hpp b/thirdparty/linux/include/coin1/CoinPresolveDupcol.hpp deleted file mode 100644 index 16d3c91b..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveDupcol.hpp +++ /dev/null @@ -1,226 +0,0 @@ -/* $Id: CoinPresolveDupcol.hpp 1817 2015-03-22 16:43:28Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveDupcol_H -#define CoinPresolveDupcol_H - -#include "CoinPresolveMatrix.hpp" - -/*! - \file -*/ - -#define DUPCOL 10 - -/*! \class dupcol_action - \brief Detect and remove duplicate columns - - The general technique is to sum the coefficients a_(*,j) of each column. - Columns with identical sums are duplicates. The obvious problem is that, - e.g., [1 0 1 0] and [0 1 0 1] both add to 2. To minimize the - chances of false positives, the coefficients of each row are multipled by - a random number r_i, so that we sum r_i*a_ij. - - Candidate columns are checked to confirm they are identical. Where the - columns have the same objective coefficient, the two are combined. If the - columns have different objective coefficients, complications ensue. In order - to remove the duplicate, it must be possible to fix the variable at a bound. -*/ - -class dupcol_action : public CoinPresolveAction { - dupcol_action(); - dupcol_action(const dupcol_action& rhs); - dupcol_action& operator=(const dupcol_action& rhs); - - struct action { - double thislo; - double thisup; - double lastlo; - double lastup; - int ithis; - int ilast; - - double *colels; - int nincol; - }; - - const int nactions_; - // actions_ is owned by the class and must be deleted at destruction - const action *const actions_; - - dupcol_action(int nactions, const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), - actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~dupcol_action(); - -}; - - -/*! \class duprow_action - \brief Detect and remove duplicate rows - - The algorithm to detect duplicate rows is as outlined for dupcol_action. - - If the feasible interval for one constraint is strictly contained in the - other, the tighter (contained) constraint is kept. If the feasible - intervals are disjoint, the problem is infeasible. If the feasible - intervals overlap, both constraints are kept. - - duprow_action is definitely a work in progress; #postsolve is - unimplemented. - This doesn't matter as it uses useless_constraint. -*/ - -class duprow_action : public CoinPresolveAction { - struct action { - int row; - double lbound; - double ubound; - }; - - const int nactions_; - const action *const actions_; - - duprow_action():CoinPresolveAction(NULL),nactions_(0),actions_(NULL) {} - duprow_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - //~duprow_action() { delete[]actions_; } -}; - -class duprow3_action : public CoinPresolveAction { - struct action { - int row; - double lbound; - double ubound; - }; - - const int nactions_; - const action *const actions_; - - duprow3_action():CoinPresolveAction(NULL),nactions_(0),actions_(NULL) {} - duprow3_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - //~duprow_action() { delete[]actions_; } -}; - -/*! \class gubrow_action - \brief Detect and remove entries whose sum is known - - If we have an equality row where all entries same then - For other rows where all entries for that equality row are same - then we can delete entries and modify rhs - gubrow_action is definitely a work in progress; #postsolve is - unimplemented. -*/ - -class gubrow_action : public CoinPresolveAction { - struct action { - int row; - double lbound; - double ubound; - }; - - const int nactions_; - const action *const actions_; - - gubrow_action():CoinPresolveAction(NULL),nactions_(0),actions_(NULL) {} - gubrow_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - //~gubrow_action() { delete[]actions_; } -}; - -/*! \class twoxtwo_action - \brief Detect interesting 2 by 2 blocks - - If a variable has two entries and for each row there are only - two entries with same other variable then we can get rid of - one constraint and modify costs. - - This is a work in progress - I need more examples -*/ - -class twoxtwo_action : public CoinPresolveAction { - struct action { - double lbound_row; - double ubound_row; - double lbound_col; - double ubound_col; - double cost_col; - double cost_othercol; - int row; - int col; - int othercol; - }; - - const int nactions_; - const action *const actions_; - - twoxtwo_action():CoinPresolveAction(NULL),nactions_(0),actions_(NULL) {} - twoxtwo_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - ~twoxtwo_action() { delete [] actions_; } -}; - -#endif - diff --git a/thirdparty/linux/include/coin1/CoinPresolveEmpty.hpp b/thirdparty/linux/include/coin1/CoinPresolveEmpty.hpp deleted file mode 100644 index 336f1fd2..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveEmpty.hpp +++ /dev/null @@ -1,116 +0,0 @@ -/* $Id: CoinPresolveEmpty.hpp 1561 2012-11-24 00:32:16Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveEmpty_H -#define CoinPresolveEmpty_H - -/*! \file - - Drop/reinsert empty rows/columns. -*/ - -const int DROP_ROW = 3; -const int DROP_COL = 4; - -/*! \class drop_empty_cols_action - \brief Physically removes empty columns in presolve, and reinserts - empty columns in postsolve. - - Physical removal of rows and columns should be the last activities - performed during presolve. Do them exactly once. The row-major matrix - is not maintained by this transform. - - To physically drop the columns, CoinPrePostsolveMatrix::mcstrt_ and - CoinPrePostsolveMatrix::hincol_ are compressed, along with column bounds, - objective, and (if present) the column portions of the solution. This - renumbers the columns. drop_empty_cols_action::presolve will reconstruct - CoinPresolveMatrix::clink_. - - \todo Confirm correct behaviour with solution in presolve. -*/ - -class drop_empty_cols_action : public CoinPresolveAction { -private: - const int nactions_; - - struct action { - double clo; - double cup; - double cost; - double sol; - int jcol; - }; - const action *const actions_; - - drop_empty_cols_action(int nactions, - const action *const actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), - actions_(actions) - {} - - public: - const char *name() const { return ("drop_empty_cols_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *, - const int *ecols, - int necols, - const CoinPresolveAction*); - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~drop_empty_cols_action() { deleteAction(actions_,action*); } -}; - - -/*! \class drop_empty_rows_action - \brief Physically removes empty rows in presolve, and reinserts - empty rows in postsolve. - - Physical removal of rows and columns should be the last activities - performed during presolve. Do them exactly once. The row-major matrix - is not maintained by this transform. - - To physically drop the rows, the rows are renumbered, excluding empty - rows. This involves rewriting CoinPrePostsolveMatrix::hrow_ and compressing - the row bounds and (if present) the row portions of the solution. - - \todo Confirm behaviour when a solution is present in presolve. -*/ -class drop_empty_rows_action : public CoinPresolveAction { -private: - struct action { - double rlo; - double rup; - int row; - int fill_row; // which row was moved into position row to fill it - }; - - const int nactions_; - const action *const actions_; - - drop_empty_rows_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) -{} - - public: - const char *name() const { return ("drop_empty_rows_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~drop_empty_rows_action() { deleteAction(actions_,action*); } -}; -#endif - diff --git a/thirdparty/linux/include/coin1/CoinPresolveFixed.hpp b/thirdparty/linux/include/coin1/CoinPresolveFixed.hpp deleted file mode 100644 index dc59207d..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveFixed.hpp +++ /dev/null @@ -1,181 +0,0 @@ -/* $Id: CoinPresolveFixed.hpp 1510 2011-12-08 23:56:01Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveFixed_H -#define CoinPresolveFixed_H -#define FIXED_VARIABLE 1 - -/*! \class remove_fixed_action - \brief Excise fixed variables from the model. - - Implements the action of virtually removing one or more fixed variables - x_j from the model by substituting the value sol_j in each constraint. - Specifically, for each constraint i where a_ij != 0, rlo_i and rup_i - are adjusted by -a_ij*sol_j and a_ij is set to 0. - - There is an implicit assumption that the variable already has the correct - value. If this isn't true, corrections to row activity may be incorrect. - If you want to guard against this possibility, consider make_fixed_action. - - Actual removal of the empty column from the matrix is handled by - drop_empty_cols_action. Correction of the objective function is done there. -*/ -class remove_fixed_action : public CoinPresolveAction { - public: - /*! \brief Structure to hold information necessary to reintroduce a - column into the problem representation. - */ - struct action { - int col; ///< column index of variable - int start; ///< start of coefficients in #colels_ and #colrows_ - double sol; ///< value of variable - }; - /// Array of row indices for coefficients of excised columns - int *colrows_; - /// Array of coefficients of excised columns - double *colels_; - /// Number of entries in #actions_ - int nactions_; - /// Vector specifying variable(s) affected by this object - action *actions_; - - private: - /*! \brief Constructor */ - remove_fixed_action(int nactions, - action *actions, - double * colels, - int * colrows, - const CoinPresolveAction *next); - - public: - /// Returns string "remove_fixed_action". - const char *name() const; - - /*! \brief Excise the specified columns. - - Remove the specified columns (\p nfcols, \p fcols) from the problem - representation (\p prob), leaving the appropriate postsolve object - linked as the head of the list of postsolve objects (currently headed - by \p next). - */ - static const remove_fixed_action *presolve(CoinPresolveMatrix *prob, - int *fcols, - int nfcols, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - /// Destructor - virtual ~remove_fixed_action(); -}; - - -/*! \relates remove_fixed_action - \brief Scan the problem for fixed columns and remove them. - - A front end to collect a list of columns with equal bounds and hand them to - remove_fixed_action::presolve() for processing. -*/ - -const CoinPresolveAction *remove_fixed(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - -/*! \class make_fixed_action - \brief Fix a variable at a specified bound. - - Implements the action of fixing a variable by forcing both bounds to the same - value and forcing the value of the variable to match. - - If the bounds are already equal, and the value of the variable is already - correct, consider remove_fixed_action. -*/ -class make_fixed_action : public CoinPresolveAction { - - /// Structure to preserve the bound overwritten when fixing a variable - struct action { - double bound; ///< Value of bound overwritten to fix variable. - int col ; ///< column index of variable - }; - - /// Number of preserved bounds - int nactions_; - /// Vector of preserved bounds, one for each variable fixed in this object - const action *actions_; - - /*! \brief True to fix at lower bound, false to fix at upper bound. - - Note that this applies to all variables fixed in this object. - */ - const bool fix_to_lower_; - - /*! \brief The postsolve object with the information required to repopulate - the fixed columns. - */ - const remove_fixed_action *faction_; - - /*! \brief Constructor */ - make_fixed_action(int nactions, const action *actions, bool fix_to_lower, - const remove_fixed_action *faction, - const CoinPresolveAction *next) - : CoinPresolveAction(next), - nactions_(nactions), actions_(actions), - fix_to_lower_(fix_to_lower), - faction_(faction) - {} - - public: - /// Returns string "make_fixed_action". - const char *name() const; - - /*! \brief Perform actions to fix variables and return postsolve object - - For each specified variable (\p nfcols, \p fcols), fix the variable to - the specified bound (\p fix_to_lower) by setting the variable's bounds - to be equal in \p prob. Create a postsolve object, link it at the head of - the list of postsolve objects (\p next), and return the object. - */ - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - int *fcols, - int nfcols, - bool fix_to_lower, - const CoinPresolveAction *next); - - /*! \brief Postsolve (unfix variables) - - Back out the variables fixed by the presolve side of this object. - */ - void postsolve(CoinPostsolveMatrix *prob) const; - - /// Destructor - virtual ~make_fixed_action() { - deleteAction(actions_,action*); - delete faction_; - } -}; - -/*! \relates make_fixed_action - \brief Scan variables and fix any with equal bounds - - A front end to collect a list of columns with equal bounds and hand them to - make_fixed_action::presolve() for processing. -*/ - -const CoinPresolveAction *make_fixed(CoinPresolveMatrix *prob, - const CoinPresolveAction *next) ; - -/*! \brief Transfer costs from singleton variables - \relates make_fixed_action - - Transfers costs from singleton variables in equalities onto the other - variables. Will also transfer costs from one integer variable to other - integer variables with zero cost if there's a net gain in integer variables - with non-zero cost. - - The relation to make_fixed_action is tenuous, but this transform should be - attempted before the initial round of variable fixing. -*/ -void transferCosts(CoinPresolveMatrix * prob); -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveForcing.hpp b/thirdparty/linux/include/coin1/CoinPresolveForcing.hpp deleted file mode 100644 index ee5a641a..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveForcing.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/* $Id: CoinPresolveForcing.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveForcing_H -#define CoinPresolveForcing_H - -#include "CoinPresolveMatrix.hpp" - -/*! - \file -*/ - -#define IMPLIED_BOUND 7 - -/*! \class forcing_constraint_action - \brief Detect and process forcing constraints and useless constraints - - A constraint is useless if the bounds on the variables prevent the constraint - from ever being violated. - - A constraint is a forcing constraint if the bounds on the constraint force - the value of an involved variable to one of its bounds. A constraint can - force more than one variable. -*/ -class forcing_constraint_action : public CoinPresolveAction { - forcing_constraint_action(); - forcing_constraint_action(const forcing_constraint_action& rhs); - forcing_constraint_action& operator=(const forcing_constraint_action& rhs); -public: - struct action { - const int *rowcols; - const double *bounds; - int row; - int nlo; - int nup; - }; -private: - const int nactions_; - // actions_ is owned by the class and must be deleted at destruction - const action *const actions_; - -public: - forcing_constraint_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~forcing_constraint_action(); -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveImpliedFree.hpp b/thirdparty/linux/include/coin1/CoinPresolveImpliedFree.hpp deleted file mode 100644 index 8215b989..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveImpliedFree.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/* $Id: CoinPresolveImpliedFree.hpp 1694 2014-04-29 02:08:35Z tkr $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveImpliedFree_H -#define CoinPresolveImpliedFree_H - -/*! - \file -*/ - -#define IMPLIED_FREE 9 - -/*! \class implied_free_action - \brief Detect and process implied free variables - - Consider a singleton variable x (i.e., a variable involved in only - one constraint). Suppose that the bounds on that constraint, combined with - the bounds on the other variables involved in the constraint, are such that - even the worst case values of the other variables still imply bounds for x - which are tighter than the variable's original bounds. Since x can never - reach its upper or lower bounds, it is an implied free variable. Both x and - the constraint can be deleted from the problem. - - A similar transform for the case where the variable is not a natural column - singleton is handled by #subst_constraint_action. -*/ -class implied_free_action : public CoinPresolveAction { - struct action { - int row, col; - double clo, cup; - double rlo, rup; - const double *rowels; - const double *costs; - int ninrow; - }; - - const int nactions_; - const action *const actions_; - - implied_free_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob, - const CoinPresolveAction *next, - int & fillLevel); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~implied_free_action(); -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveIsolated.hpp b/thirdparty/linux/include/coin1/CoinPresolveIsolated.hpp deleted file mode 100644 index 38c700f3..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveIsolated.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id: CoinPresolveIsolated.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveIsolated_H -#define CoinPresolveIsolated_H - -#include "CoinPresolveMatrix.hpp" - -class isolated_constraint_action : public CoinPresolveAction { - isolated_constraint_action(); - isolated_constraint_action(const isolated_constraint_action& rhs); - isolated_constraint_action& operator=(const isolated_constraint_action& rhs); - - double rlo_; - double rup_; - int row_; - int ninrow_; - // the arrays are owned by the class and must be deleted at destruction - const int *rowcols_; - const double *rowels_; - const double *costs_; - - isolated_constraint_action(double rlo, - double rup, - int row, - int ninrow, - const int *rowcols, - const double *rowels, - const double *costs, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - rlo_(rlo), rup_(rup), row_(row), ninrow_(ninrow), - rowcols_(rowcols), rowels_(rowels), costs_(costs) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob, - int row, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~isolated_constraint_action(); -}; - - - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveMatrix.hpp b/thirdparty/linux/include/coin1/CoinPresolveMatrix.hpp deleted file mode 100644 index e608738a..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveMatrix.hpp +++ /dev/null @@ -1,1842 +0,0 @@ -/* $Id: CoinPresolveMatrix.hpp 1761 2014-12-10 09:43:07Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveMatrix_H -#define CoinPresolveMatrix_H - -#include "CoinPragma.hpp" -#include "CoinPackedMatrix.hpp" -#include "CoinMessage.hpp" -#include "CoinTime.hpp" - -#include -#include -#include -#include -#include - -#if PRESOLVE_DEBUG > 0 -#include "CoinFinite.hpp" -#endif - -/*! \file - - Declarations for CoinPresolveMatrix and CoinPostsolveMatrix and their - common base class CoinPrePostsolveMatrix. Also declarations for - CoinPresolveAction and a number of non-member utility functions. -*/ - - -#if defined(_MSC_VER) -// Avoid MS Compiler problem in recognizing type to delete -// by casting to type. -// Is this still necessary? -- lh, 111202 -- -#define deleteAction(array,type) delete [] ((type) array) -#else -#define deleteAction(array,type) delete [] array -#endif - -/* - Define PRESOLVE_DEBUG and PRESOLVE_CONSISTENCY on the configure command - line or in a Makefile! See comments in CoinPresolvePsdebug.hpp. -*/ -#if PRESOLVE_DEBUG > 0 || PRESOLVE_CONSISTENCY > 0 - -#define PRESOLVE_STMT(s) s - -#define PRESOLVEASSERT(x) \ - ((x) ? 1 : ((std::cerr << "FAILED ASSERTION at line " \ - << __LINE__ << ": " #x "\n"), abort(), 0)) - -inline void DIE(const char *s) { std::cout << s ; abort() ; } - -/*! \brief Indicate column or row present at start of postsolve - - This code is used during postsolve in [cr]done to indicate columns and rows - that are present in the presolved system (i.e., present at the start of - postsolve processing). - - \todo - There are a bunch of these code definitions, scattered through presolve - files. They should be collected in one place. -*/ -#define PRESENT_IN_REDUCED '\377' - -#else - -#define PRESOLVEASSERT(x) {} -#define PRESOLVE_STMT(s) {} - -inline void DIE(const char *) {} - -#endif - -/* - Unclear why these are separate from standard debug. -*/ -#ifndef PRESOLVE_DETAIL -#define PRESOLVE_DETAIL_PRINT(s) {} -#else -#define PRESOLVE_DETAIL_PRINT(s) s -#endif - -/*! \brief Zero tolerance - - OSL had a fixed zero tolerance; we still use that here. -*/ -const double ZTOLDP = 1e-12 ; -/*! \brief Alternate zero tolerance - - Use a different one if we are doing doubletons, etc. -*/ -const double ZTOLDP2 = 1e-10 ; - -/// The usual finite infinity -#define PRESOLVE_INF COIN_DBL_MAX -/// And a small infinity -#define PRESOLVE_SMALL_INF 1.0e20 -/// Check for infinity using finite infinity -#define PRESOLVEFINITE(n) (-PRESOLVE_INF < (n) && (n) < PRESOLVE_INF) - - -class CoinPostsolveMatrix ; - -/*! \class CoinPresolveAction - \brief Abstract base class of all presolve routines. - - The details will make more sense after a quick overview of the grand plan: - A presolve object is handed a problem object, which it is expected to - modify in some useful way. Assuming that it succeeds, the presolve object - should create a postsolve object, i.e., an object that contains - instructions for backing out the presolve transform to recover the original - problem. These postsolve objects are accumulated in a linked list, with each - successive presolve action adding its postsolve action to the head of the - list. The end result of all this is a presolved problem object, and a list - of postsolve objects. The presolved problem object is then handed to a - solver for optimization, and the problem object augmented with the - results. The list of postsolve objects is then traversed. Each of them - (un)modifies the problem object, with the end result being the original - problem, augmented with solution information. - - The problem object representation is CoinPrePostsolveMatrix and subclasses. - Check there for details. The \c CoinPresolveAction class and subclasses - represent the presolve and postsolve objects. - - In spite of the name, the only information held in a \c CoinPresolveAction - object is the information needed to postsolve (i.e., the information - needed to back out the presolve transformation). This information is not - expected to change, so the fields are all \c const. - - A subclass of \c CoinPresolveAction, implementing a specific pre/postsolve - action, is expected to declare a static function that attempts to perform a - presolve transformation. This function will be handed a CoinPresolveMatrix - to transform, and a pointer to the head of the list of postsolve objects. - If the transform is successful, the function will create a new - \c CoinPresolveAction object, link it at the head of the list of postsolve - objects, and return a pointer to the postsolve object it has just created. - Otherwise, it should return 0. It is expected that these static functions - will be the only things that can create new \c CoinPresolveAction objects; - this is expressed by making each subclass' constructor(s) private. - - Every subclass must also define a \c postsolve method. - This function will be handed a CoinPostsolveMatrix to transform. - - It is the client's responsibility to implement presolve and postsolve driver - routines. See OsiPresolve for examples. - - \note Since the only fields in a \c CoinPresolveAction are \c const, anything - one can do with a variable declared \c CoinPresolveAction* can also be - done with a variable declared \c const \c CoinPresolveAction* It is - expected that all derived subclasses of \c CoinPresolveAction also have - this property. -*/ -class CoinPresolveAction -{ - public: - /*! \brief Stub routine to throw exceptions. - - Exceptions are inefficient, particularly with g++. Even with xlC, the - use of exceptions adds a long prologue to a routine. Therefore, rather - than use throw directly in the routine, I use it in a stub routine. - */ - static void throwCoinError(const char *error, const char *ps_routine) - { throw CoinError(error, ps_routine, "CoinPresolve"); } - - /*! \brief The next presolve transformation - - Set at object construction. - */ - const CoinPresolveAction *next; - - /*! \brief Construct a postsolve object and add it to the transformation list. - - This is an `add to head' operation. This object will point to the - one passed as the parameter. - */ - CoinPresolveAction(const CoinPresolveAction *next) : next(next) {} - /// modify next (when building rather than passing) - inline void setNext(const CoinPresolveAction *nextAction) - { next = nextAction;} - - /*! \brief A name for debug printing. - - It is expected that the name is not stored in the transform itself. - */ - virtual const char *name() const = 0; - - /*! \brief Apply the postsolve transformation for this particular - presolve action. - */ - virtual void postsolve(CoinPostsolveMatrix *prob) const = 0; - - /*! \brief Virtual destructor. */ - virtual ~CoinPresolveAction() {} -}; - -/* - These are needed for OSI-aware constructors associated with - CoinPrePostsolveMatrix, CoinPresolveMatrix, and CoinPostsolveMatrix. -*/ -class ClpSimplex; -class OsiSolverInterface; - -/* - CoinWarmStartBasis is required for methods in CoinPrePostsolveMatrix - that accept/return a CoinWarmStartBasis object. -*/ -class CoinWarmStartBasis ; - -/*! \class CoinPrePostsolveMatrix - \brief Collects all the information about the problem that is needed - in both presolve and postsolve. - - In a bit more detail, a column-major representation of the constraint - matrix and upper and lower bounds on variables and constraints, plus row - and column solutions, reduced costs, and status. There's also a set of - arrays holding the original row and column numbers. - - As presolve and postsolve transform the matrix, it will occasionally be - necessary to expand the number of entries in a column. There are two - aspects: -
        -
      • During postsolve, the constraint system is expected to grow as - the smaller presolved system is transformed back to the original - system. -
      • During both pre- and postsolve, transforms can increase the number - of coefficients in a row or column. (See the - variable substitution, doubleton, and tripleton transforms.) -
      - - The first is addressed by the members #ncols0_, #nrows0_, and #nelems0_. - These should be set (via constructor parameters) to values large enough - for the largest size taken on by the constraint system. Typically, this - will be the size of the original constraint system. - - The second is addressed by a generous allocation of extra (empty) space - for the arrays used to hold coefficients and row indices. When columns - must be expanded, they are moved into the empty space. When it is used up, - the arrays are compacted. When compaction fails to produce sufficient - space, presolve/postsolve will fail. - - CoinPrePostsolveMatrix isn't really intended to be used `bare' --- the - expectation is that it'll be used through CoinPresolveMatrix or - CoinPostsolveMatrix. Some of the functions needed to load a problem are - defined in the derived classes. - - When CoinPresolve is applied when reoptimising, we need to be prepared to - accept a basis and modify it in step with the presolve actions (otherwise - we throw away all the advantages of warm start for reoptimization). But - other solution components (#acts_, #rowduals_, #sol_, and #rcosts_) are - needed only for postsolve, where they're used in places to determine the - proper action(s) when restoring rows or columns. If presolve is provided - with a solution, it will modify it in step with the presolve actions. - Moving the solution components from CoinPrePostsolveMatrix to - CoinPostsolveMatrix would break a lot of code. It's not clear that it's - worth it, and it would preclude upgrades to the presolve side that might - make use of any of these. -- lh, 080501 -- - - The constructors that take an OSI or ClpSimplex as a parameter really should - not be here, but for historical reasons they will likely remain for the - forseeable future. -- lh, 111202 -- -*/ - -class CoinPrePostsolveMatrix -{ - public: - - /*! \name Constructors & Destructors */ - - //@{ - /*! \brief `Native' constructor - - This constructor creates an empty object which must then be loaded. On - the other hand, it doesn't assume that the client is an - OsiSolverInterface. - */ - CoinPrePostsolveMatrix(int ncols_alloc, int nrows_alloc, - CoinBigIndex nelems_alloc) ; - - /*! \brief Generic OSI constructor - - See OSI code for the definition. - */ - CoinPrePostsolveMatrix(const OsiSolverInterface * si, - int ncols_, - int nrows_, - CoinBigIndex nelems_); - - /*! ClpOsi constructor - - See Clp code for the definition. - */ - CoinPrePostsolveMatrix(const ClpSimplex * si, - int ncols_, - int nrows_, - CoinBigIndex nelems_, - double bulkRatio); - - /// Destructor - ~CoinPrePostsolveMatrix(); - //@} - - /*! \brief Enum for status of various sorts - - Matches CoinWarmStartBasis::Status and adds superBasic. Most code that - converts between CoinPrePostsolveMatrix::Status and - CoinWarmStartBasis::Status will break if this correspondence is broken. - - superBasic is an unresolved problem: there's no analogue in - CoinWarmStartBasis::Status. - */ - enum Status { - isFree = 0x00, - basic = 0x01, - atUpperBound = 0x02, - atLowerBound = 0x03, - superBasic = 0x04 - }; - - /*! \name Functions to work with variable status - - Functions to work with the CoinPrePostsolveMatrix::Status enum and - related vectors. - - \todo - Why are we futzing around with three bit status? A holdover from the - packed arrays of CoinWarmStartBasis? Big swaths of the presolve code - manipulates colstat_ and rowstat_ as unsigned char arrays using simple - assignment to set values. - */ - //@{ - - /// Set row status (i.e., status of artificial for this row) - inline void setRowStatus(int sequence, Status status) - { - unsigned char & st_byte = rowstat_[sequence]; - st_byte = static_cast(st_byte & (~7)) ; - st_byte = static_cast(st_byte | status) ; - } - /// Get row status - inline Status getRowStatus(int sequence) const - {return static_cast (rowstat_[sequence]&7);} - /// Check if artificial for this row is basic - inline bool rowIsBasic(int sequence) const - {return (static_cast (rowstat_[sequence]&7)==basic);} - /// Set column status (i.e., status of primal variable) - inline void setColumnStatus(int sequence, Status status) - { - unsigned char & st_byte = colstat_[sequence]; - st_byte = static_cast(st_byte & (~7)) ; - st_byte = static_cast(st_byte | status) ; - -# ifdef PRESOLVE_DEBUG - switch (status) - { case isFree: - { if (clo_[sequence] > -PRESOLVE_INF || cup_[sequence] < PRESOLVE_INF) - { std::cout << "Bad status: Var " << sequence - << " isFree, lb = " << clo_[sequence] - << ", ub = " << cup_[sequence] << std::endl ; } - break ; } - case basic: - { break ; } - case atUpperBound: - { if (cup_[sequence] >= PRESOLVE_INF) - { std::cout << "Bad status: Var " << sequence - << " atUpperBound, lb = " << clo_[sequence] - << ", ub = " << cup_[sequence] << std::endl ; } - break ; } - case atLowerBound: - { if (clo_[sequence] <= -PRESOLVE_INF) - { std::cout << "Bad status: Var " << sequence - << " atLowerBound, lb = " << clo_[sequence] - << ", ub = " << cup_[sequence] << std::endl ; } - break ; } - case superBasic: - { if (clo_[sequence] <= -PRESOLVE_INF && cup_[sequence] >= PRESOLVE_INF) - { std::cout << "Bad status: Var " << sequence - << " superBasic, lb = " << clo_[sequence] - << ", ub = " << cup_[sequence] << std::endl ; } - break ; } - default: - { assert(false) ; - break ; } } -# endif - } - /// Get column (structural variable) status - inline Status getColumnStatus(int sequence) const - {return static_cast (colstat_[sequence]&7);} - /// Check if column (structural variable) is basic - inline bool columnIsBasic(int sequence) const - {return (static_cast (colstat_[sequence]&7)==basic);} - /*! \brief Set status of row (artificial variable) to the correct nonbasic - status given bounds and current value - */ - void setRowStatusUsingValue(int iRow); - /*! \brief Set status of column (structural variable) to the correct - nonbasic status given bounds and current value - */ - void setColumnStatusUsingValue(int iColumn); - /*! \brief Set column (structural variable) status vector */ - void setStructuralStatus(const char *strucStatus, int lenParam) ; - /*! \brief Set row (artificial variable) status vector */ - void setArtificialStatus(const char *artifStatus, int lenParam) ; - /*! \brief Set the status of all variables from a basis */ - void setStatus(const CoinWarmStartBasis *basis) ; - /*! \brief Get status in the form of a CoinWarmStartBasis */ - CoinWarmStartBasis *getStatus() ; - /*! \brief Return a print string for status of a column (structural - variable) - */ - const char *columnStatusString(int j) const ; - /*! \brief Return a print string for status of a row (artificial - variable) - */ - const char *rowStatusString(int i) const ; - //@} - - /*! \name Functions to load problem and solution information - - These functions can be used to load portions of the problem definition - and solution. See also the CoinPresolveMatrix and CoinPostsolveMatrix - classes. - */ - //@{ - /// Set the objective function offset for the original system. - void setObjOffset(double offset) ; - /*! \brief Set the objective sense (max/min) - - Coded as 1.0 for min, -1.0 for max. - Yes, there's a method, and a matching attribute. No, you really - don't want to set this to maximise. - */ - void setObjSense(double objSense) ; - /// Set the primal feasibility tolerance - void setPrimalTolerance(double primTol) ; - /// Set the dual feasibility tolerance - void setDualTolerance(double dualTol) ; - /// Set column lower bounds - void setColLower(const double *colLower, int lenParam) ; - /// Set column upper bounds - void setColUpper(const double *colUpper, int lenParam) ; - /// Set column solution - void setColSolution(const double *colSol, int lenParam) ; - /// Set objective coefficients - void setCost(const double *cost, int lenParam) ; - /// Set reduced costs - void setReducedCost(const double *redCost, int lenParam) ; - /// Set row lower bounds - void setRowLower(const double *rowLower, int lenParam) ; - /// Set row upper bounds - void setRowUpper(const double *rowUpper, int lenParam) ; - /// Set row solution - void setRowPrice(const double *rowSol, int lenParam) ; - /// Set row activity - void setRowActivity(const double *rowAct, int lenParam) ; - //@} - - /*! \name Functions to retrieve problem and solution information */ - //@{ - /// Get current number of columns - inline int getNumCols() const - { return (ncols_) ; } - /// Get current number of rows - inline int getNumRows() const - { return (nrows_) ; } - /// Get current number of non-zero coefficients - inline int getNumElems() const - { return (nelems_) ; } - /// Get column start vector for column-major packed matrix - inline const CoinBigIndex *getColStarts() const - { return (mcstrt_) ; } - /// Get column length vector for column-major packed matrix - inline const int *getColLengths() const - { return (hincol_) ; } - /// Get vector of row indices for column-major packed matrix - inline const int *getRowIndicesByCol() const - { return (hrow_) ; } - /// Get vector of elements for column-major packed matrix - inline const double *getElementsByCol() const - { return (colels_) ; } - /// Get column lower bounds - inline const double *getColLower() const - { return (clo_) ; } - /// Get column upper bounds - inline const double *getColUpper() const - { return (cup_) ; } - /// Get objective coefficients - inline const double *getCost() const - { return (cost_) ; } - /// Get row lower bounds - inline const double *getRowLower() const - { return (rlo_) ; } - /// Get row upper bounds - inline const double *getRowUpper() const - { return (rup_) ; } - /// Get column solution (primal variable values) - inline const double *getColSolution() const - { return (sol_) ; } - /// Get row activity (constraint lhs values) - inline const double *getRowActivity() const - { return (acts_) ; } - /// Get row solution (dual variables) - inline const double *getRowPrice() const - { return (rowduals_) ; } - /// Get reduced costs - inline const double *getReducedCost() const - { return (rcosts_) ; } - /// Count empty columns - inline int countEmptyCols() - { int empty = 0 ; - for (int i = 0 ; i < ncols_ ; i++) if (hincol_[i] == 0) empty++ ; - return (empty) ; } - //@} - - - /*! \name Message handling */ - //@{ - /// Return message handler - inline CoinMessageHandler *messageHandler() const - { return handler_; } - /*! \brief Set message handler - - The client retains responsibility for the handler --- it will not be - destroyed with the \c CoinPrePostsolveMatrix object. - */ - inline void setMessageHandler(CoinMessageHandler *handler) - { if (defaultHandler_ == true) - { delete handler_ ; - defaultHandler_ = false ; } - handler_ = handler ; } - /// Return messages - inline CoinMessages messages() const - { return messages_; } - //@} - - /*! \name Current and Allocated Size - - During pre- and postsolve, the matrix will change in size. During presolve - it will shrink; during postsolve it will grow. Hence there are two sets of - size variables, one for the current size and one for the allocated size. - (See the general comments for the CoinPrePostsolveMatrix class for more - information.) - */ - //@{ - - /// current number of columns - int ncols_; - /// current number of rows - int nrows_; - /// current number of coefficients - CoinBigIndex nelems_; - - /// Allocated number of columns - int ncols0_; - /// Allocated number of rows - int nrows0_ ; - /// Allocated number of coefficients - CoinBigIndex nelems0_ ; - /*! \brief Allocated size of bulk storage for row indices and coefficients - - This is the space allocated for hrow_ and colels_. This must be large - enough to allow columns to be copied into empty space when they need to - be expanded. For efficiency (to minimize the number of times the - representation must be compressed) it's recommended that this be at least - 2*nelems0_. - */ - CoinBigIndex bulk0_ ; - /// Ratio of bulk0_ to nelems0_; default is 2. - double bulkRatio_; - //@} - - /*! \name Problem representation - - The matrix is the common column-major format: A pair of vectors with - positional correspondence to hold coefficients and row indices, and a - second pair of vectors giving the starting position and length of each - column in the first pair. - */ - //@{ - /// Vector of column start positions in #hrow_, #colels_ - CoinBigIndex *mcstrt_; - /// Vector of column lengths - int *hincol_; - /// Row indices (positional correspondence with #colels_) - int *hrow_; - /// Coefficients (positional correspondence with #hrow_) - double *colels_; - - /// Objective coefficients - double *cost_; - /// Original objective offset - double originalOffset_; - - /// Column (primal variable) lower bounds - double *clo_; - /// Column (primal variable) upper bounds - double *cup_; - - /// Row (constraint) lower bounds - double *rlo_; - /// Row (constraint) upper bounds - double *rup_; - - /*! \brief Original column numbers - - Over the current range of column numbers in the presolved problem, - the entry for column j will contain the index of the corresponding - column in the original problem. - */ - int * originalColumn_; - /*! \brief Original row numbers - - Over the current range of row numbers in the presolved problem, the - entry for row i will contain the index of the corresponding row in - the original problem. - */ - int * originalRow_; - - /// Primal feasibility tolerance - double ztolzb_; - /// Dual feasibility tolerance - double ztoldj_; - - /*! \brief Maximization/minimization - - Yes, there's a variable here. No, you really don't want to set this to - maximise. See the main notes for CoinPresolveMatrix. - */ - double maxmin_; - //@} - - /*! \name Problem solution information - - The presolve phase will work without any solution information - (appropriate for initial optimisation) or with solution information - (appropriate for reoptimisation). When solution information is supplied, - presolve will maintain it to the best of its ability. #colstat_ is - checked to determine the presence/absence of status information. #sol_ is - checked for primal solution information, and #rowduals_ for dual solution - information. - - The postsolve phase requires the complete solution information from the - presolved problem (status, primal and dual solutions). It will be - transformed into a correct solution for the original problem. - */ - //@{ - /*! \brief Vector of primal variable values - - If #sol_ exists, it is assumed that primal solution information should be - updated and that #acts_ also exists. - */ - double *sol_; - /*! \brief Vector of dual variable values - - If #rowduals_ exists, it is assumed that dual solution information should - be updated and that #rcosts_ also exists. - */ - double *rowduals_; - /*! \brief Vector of constraint left-hand-side values (row activity) - - Produced by evaluating constraints according to #sol_. Updated iff - #sol_ exists. - */ - double *acts_; - /*! \brief Vector of reduced costs - - Produced by evaluating dual constraints according to #rowduals_. Updated - iff #rowduals_ exists. - */ - double *rcosts_; - - /*! \brief Status of primal variables - - Coded with CoinPrePostSolveMatrix::Status, one code per char. colstat_ and - #rowstat_ MUST be allocated as a single vector. This is to maintain - compatibility with ClpPresolve and OsiPresolve, which do it this way. - */ - unsigned char *colstat_; - - /*! \brief Status of constraints - - More accurately, the status of the logical variable associated with the - constraint. Coded with CoinPrePostSolveMatrix::Status, one code per char. - Note that this must be allocated as a single vector with #colstat_. - */ - unsigned char *rowstat_; - //@} - - /*! \name Message handling - - Uses the standard COIN approach: a default handler is installed, and the - CoinPrePostsolveMatrix object takes responsibility for it. If the client - replaces the handler with one of their own, it becomes their - responsibility. - */ - //@{ - /// Message handler - CoinMessageHandler *handler_; - /// Indicates if the current #handler_ is default (true) or not (false). - bool defaultHandler_; - /// Standard COIN messages - CoinMessage messages_; - //@} - -}; - -/*! \relates CoinPrePostsolveMatrix - \brief Generate a print string for a status code. -*/ -const char *statusName (CoinPrePostsolveMatrix::Status status) ; - - -/*! \class presolvehlink - \brief Links to aid in packed matrix modification - - Currently, the matrices held by the CoinPrePostsolveMatrix and - CoinPresolveMatrix objects are represented in the same way as a - CoinPackedMatrix. In the course of presolve and postsolve transforms, it - will happen that a major-dimension vector needs to increase in size. In - order to check whether there is enough room to add another coefficient in - place, it helps to know the next vector (in memory order) in the bulk - storage area. To do that, a linked list of major-dimension vectors is - maintained; the "pre" and "suc" fields give the previous and next vector, - in memory order (that is, the vector whose mcstrt_ or mrstrt_ entry is - next smaller or larger). - - Consider a column-major matrix with ncols columns. By definition, - presolvehlink[ncols].pre points to the column in the last occupied - position of the bulk storage arrays. There is no easy way to find the - column which occupies the first position (there is no presolvehlink[-1] to - consult). If the column that initially occupies the first position is - moved for expansion, there is no way to reclaim the space until the bulk - storage is compacted. The same holds for the last and first rows of a - row-major matrix, of course. -*/ - -class presolvehlink -{ public: - int pre, suc; -} ; - -#define NO_LINK -66666666 - -/*! \relates presolvehlink - \brief unlink vector i - - Remove vector i from the ordering. -*/ -inline void PRESOLVE_REMOVE_LINK(presolvehlink *link, int i) -{ - int ipre = link[i].pre; - int isuc = link[i].suc; - if (ipre >= 0) { - link[ipre].suc = isuc; - } - if (isuc >= 0) { - link[isuc].pre = ipre; - } - link[i].pre = NO_LINK, link[i].suc = NO_LINK; -} - -/*! \relates presolvehlink - \brief insert vector i after vector j - - Insert vector i between j and j.suc. -*/ -inline void PRESOLVE_INSERT_LINK(presolvehlink *link, int i, int j) -{ - int isuc = link[j].suc; - link[j].suc = i; - link[i].pre = j; - if (isuc >= 0) { - link[isuc].pre = i; - } - link[i].suc = isuc; -} - -/*! \relates presolvehlink - \brief relink vector j in place of vector i - - Replace vector i in the ordering with vector j. This is equivalent to -
      -     int pre = link[i].pre;
      -     PRESOLVE_REMOVE_LINK(link,i);
      -     PRESOLVE_INSERT_LINK(link,j,pre);
      -   
      - But, this routine will work even if i happens to be first in the order. -*/ -inline void PRESOLVE_MOVE_LINK(presolvehlink *link, int i, int j) -{ - int ipre = link[i].pre; - int isuc = link[i].suc; - if (ipre >= 0) { - link[ipre].suc = j; - } - if (isuc >= 0) { - link[isuc].pre = j; - } - link[i].pre = NO_LINK, link[i].suc = NO_LINK; -} - - -/*! \class CoinPresolveMatrix - \brief Augments CoinPrePostsolveMatrix with information about the problem - that is only needed during presolve. - - For problem manipulation, this class adds a row-major matrix - representation, linked lists that allow for easy manipulation of the matrix - when applying presolve transforms, and vectors to track row and column - processing status (changed, needs further processing, change prohibited) - - For problem representation, this class adds information about variable type - (integer or continuous), an objective offset, and a feasibility tolerance. - - NOTE that the #anyInteger_ and #anyProhibited_ flags are independent - of the vectors used to track this information for individual variables - (#integerType_ and #rowChanged_ and #colChanged_, respectively). - - NOTE also that at the end of presolve the column-major and row-major - matrix representations are loosely packed (i.e., there may be gaps - between columns in the bulk storage arrays). - - NOTE that while you might think that CoinPresolve is prepared to - handle minimisation or maximisation, it's unlikely that this still works. - This is a good thing: better to convert objective coefficients and duals - once, before starting presolve, rather than doing it over and over in - each transform that considers dual variables. - - The constructors that take an OSI or ClpSimplex as a parameter really should - not be here, but for historical reasons they will likely remain for the - forseeable future. -- lh, 111202 -- -*/ - -class CoinPresolveMatrix : public CoinPrePostsolveMatrix -{ - public: - - /*! \brief `Native' constructor - - This constructor creates an empty object which must then be loaded. - On the other hand, it doesn't assume that the client is an - OsiSolverInterface. - */ - CoinPresolveMatrix(int ncols_alloc, int nrows_alloc, - CoinBigIndex nelems_alloc) ; - - /*! \brief Clp OSI constructor - - See Clp code for the definition. - */ - CoinPresolveMatrix(int ncols0, - double maxmin, - // end prepost members - - ClpSimplex * si, - - // rowrep - int nrows, - CoinBigIndex nelems, - bool doStatus, - double nonLinearVariable, - double bulkRatio); - - /*! \brief Update the model held by a Clp OSI */ - void update_model(ClpSimplex * si, - int nrows0, - int ncols0, - CoinBigIndex nelems0); - /*! \brief Generic OSI constructor - - See OSI code for the definition. - */ - CoinPresolveMatrix(int ncols0, - double maxmin, - // end prepost members - OsiSolverInterface * si, - // rowrep - int nrows, - CoinBigIndex nelems, - bool doStatus, - double nonLinearVariable, - const char * prohibited, - const char * rowProhibited=NULL); - - /*! \brief Update the model held by a generic OSI */ - void update_model(OsiSolverInterface * si, - int nrows0, - int ncols0, - CoinBigIndex nelems0); - - /// Destructor - ~CoinPresolveMatrix(); - - /*! \brief Initialize a CoinPostsolveMatrix object, destroying the - CoinPresolveMatrix object. - - See CoinPostsolveMatrix::assignPresolveToPostsolve. - */ - friend void assignPresolveToPostsolve (CoinPresolveMatrix *&preObj) ; - - /*! \name Functions to load the problem representation - */ - //@{ - /*! \brief Load the cofficient matrix. - - Load the coefficient matrix before loading the other vectors (bounds, - objective, variable type) required to define the problem. - */ - void setMatrix(const CoinPackedMatrix *mtx) ; - - /// Count number of empty rows - inline int countEmptyRows() - { int empty = 0 ; - for (int i = 0 ; i < nrows_ ; i++) if (hinrow_[i] == 0) empty++ ; - return (empty) ; } - - /*! \brief Set variable type information for a single variable - - Set \p variableType to 0 for continous, 1 for integer. - Does not manipulate the #anyInteger_ flag. - */ - inline void setVariableType(int i, int variableType) - { if (integerType_ == 0) integerType_ = new unsigned char [ncols0_] ; - integerType_[i] = static_cast(variableType) ; } - - /*! \brief Set variable type information for all variables - - Set \p variableType[i] to 0 for continuous, 1 for integer. - Does not manipulate the #anyInteger_ flag. - */ - void setVariableType(const unsigned char *variableType, int lenParam) ; - - /*! \brief Set the type of all variables - - allIntegers should be true to set the type to integer, false to set the - type to continuous. - */ - void setVariableType (bool allIntegers, int lenParam) ; - - /// Set a flag for presence (true) or absence (false) of integer variables - inline void setAnyInteger (bool anyInteger = true) - { anyInteger_ = anyInteger ; } - //@} - - /*! \name Functions to retrieve problem information - */ - //@{ - - /// Get row start vector for row-major packed matrix - inline const CoinBigIndex *getRowStarts() const - { return (mrstrt_) ; } - /// Get vector of column indices for row-major packed matrix - inline const int *getColIndicesByRow() const - { return (hcol_) ; } - /// Get vector of elements for row-major packed matrix - inline const double *getElementsByRow() const - { return (rowels_) ; } - - /*! \brief Check for integrality of the specified variable. - - Consults the #integerType_ vector if present; fallback is the - #anyInteger_ flag. - */ - inline bool isInteger (int i) const - { if (integerType_ == 0) - { return (anyInteger_) ; } - else - if (integerType_[i] == 1) - { return (true) ; } - else - { return (false) ; } } - - /*! \brief Check if there are any integer variables - - Consults the #anyInteger_ flag - */ - inline bool anyInteger () const - { return (anyInteger_) ; } - /// Picks up any special options - inline int presolveOptions() const - { return presolveOptions_;} - /// Sets any special options (see #presolveOptions_) - inline void setPresolveOptions(int value) - { presolveOptions_=value;} - //@} - - /*! \name Matrix storage management links - - Linked lists, modelled after the linked lists used in OSL - factorization. They are used for management of the bulk coefficient - and minor index storage areas. - */ - //@{ - /// Linked list for the column-major representation. - presolvehlink *clink_; - /// Linked list for the row-major representation. - presolvehlink *rlink_; - //@} - - /// Objective function offset introduced during presolve - double dobias_ ; - - /// Adjust objective function constant offset - inline void change_bias(double change_amount) - { - dobias_ += change_amount ; - # if PRESOLVE_DEBUG > 2 - assert(fabs(change_amount)<1.0e50) ; - if (change_amount) - PRESOLVE_STMT(printf("changing bias by %g to %g\n", - change_amount, dobias_)) ; - # endif - } - - /*! \name Row-major representation - - Common row-major format: A pair of vectors with positional - correspondence to hold coefficients and column indices, and a second pair - of vectors giving the starting position and length of each row in - the first pair. - */ - //@{ - /// Vector of row start positions in #hcol, #rowels_ - CoinBigIndex *mrstrt_; - /// Vector of row lengths - int *hinrow_; - /// Coefficients (positional correspondence with #hcol_) - double *rowels_; - /// Column indices (positional correspondence with #rowels_) - int *hcol_; - //@} - - /// Tracks integrality of columns (1 for integer, 0 for continuous) - unsigned char *integerType_; - /*! \brief Flag to say if any variables are integer - - Note that this flag is not manipulated by the various - \c setVariableType routines. - */ - bool anyInteger_ ; - /// Print statistics for tuning - bool tuning_; - /// Say we want statistics - also set time - void statistics(); - /// Start time of presolve - double startTime_; - - /// Bounds can be moved by this to retain feasibility - double feasibilityTolerance_; - /// Return feasibility tolerance - inline double feasibilityTolerance() - { return (feasibilityTolerance_) ; } - /// Set feasibility tolerance - inline void setFeasibilityTolerance (double val) - { feasibilityTolerance_ = val ; } - - /*! \brief Output status: 0 = feasible, 1 = infeasible, 2 = unbounded - - Actually implemented as single bit flags: 1^0 = infeasible, 1^1 = - unbounded. - */ - int status_; - /// Returns problem status (0 = feasible, 1 = infeasible, 2 = unbounded) - inline int status() - { return (status_) ; } - /// Set problem status - inline void setStatus(int status) - { status_ = (status&0x3) ; } - - /*! \brief Presolve pass number - - Should be incremented externally by the method controlling application of - presolve transforms. - Used to control the execution of testRedundant (evoked by the - implied_free transform). - */ - int pass_; - /// Set pass number - inline void setPass (int pass = 0) - { pass_ = pass ; } - - /*! \brief Maximum substitution level - - Used to control the execution of subst from implied_free - */ - int maxSubstLevel_; - /// Set Maximum substitution level (normally 3) - inline void setMaximumSubstitutionLevel (int level) - { maxSubstLevel_ = level ; } - - - /*! \name Row and column processing status - - Information used to determine if rows or columns can be changed and - if they require further processing due to changes. - - There are four major lists: the [row,col]ToDo list, and the - [row,col]NextToDo list. In general, a transform processes entries from - the ToDo list and adds entries to the NextToDo list. - - There are two vectors, [row,col]Changed, which track the status of - individual rows and columns. - */ - //@{ - /*! \brief Column change status information - - Coded using the following bits: -
        -
      • 0x01: Column has changed -
      • 0x02: preprocessing prohibited -
      • 0x04: Column has been used -
      • 0x08: Column originally had infinite ub -
      - */ - unsigned char * colChanged_; - /// Input list of columns to process - int * colsToDo_; - /// Length of #colsToDo_ - int numberColsToDo_; - /// Output list of columns to process next - int * nextColsToDo_; - /// Length of #nextColsToDo_ - int numberNextColsToDo_; - - /*! \brief Row change status information - - Coded using the following bits: -
        -
      • 0x01: Row has changed -
      • 0x02: preprocessing prohibited -
      • 0x04: Row has been used -
      - */ - unsigned char * rowChanged_; - /// Input list of rows to process - int * rowsToDo_; - /// Length of #rowsToDo_ - int numberRowsToDo_; - /// Output list of rows to process next - int * nextRowsToDo_; - /// Length of #nextRowsToDo_ - int numberNextRowsToDo_; - /*! \brief Fine control over presolve actions - - Set/clear the following bits to allow or suppress actions: - - 0x01 allow duplicate column tests for integer variables - - 0x02 not used - - 0x04 set to inhibit x+y+z=1 mods - - 0x08 not used - - 0x10 set to allow stuff which won't unroll easily (overlapping - duplicate rows; opportunistic fixing of variables from bound - propagation). - - 0x04000 allow presolve transforms to arbitrarily ignore infeasibility - and set arbitrary feasible bounds. - - 0x10000 instructs implied_free_action to be `more lightweight'; will - return without doing anything after 15 presolve passes. - - 0x(2,4,6)0000 instructs implied_free_action to remove small created elements - - 0x80000000 set by presolve to say dupcol_action compressed columns - */ - int presolveOptions_; - /*! Flag to say if any rows or columns are marked as prohibited - - Note that this flag is not manipulated by any of the - various \c set*Prohibited routines. - */ - bool anyProhibited_; - //@} - - /*! \name Scratch work arrays - - Preallocated work arrays are useful to avoid having to allocate and free - work arrays in individual presolve methods. - - All are allocated from #setMatrix by #initializeStuff, freed from - #~CoinPresolveMatrix. You can use #deleteStuff followed by - #initializeStuff to remove and recreate them. - */ - //@{ - /// Preallocated scratch work array, 3*nrows_ - int *usefulRowInt_ ; - /// Preallocated scratch work array, 2*nrows_ - double *usefulRowDouble_ ; - /// Preallocated scratch work array, 2*ncols_ - int *usefulColumnInt_ ; - /// Preallocated scratch work array, ncols_ - double *usefulColumnDouble_ ; - /// Array of random numbers (max row,column) - double *randomNumber_ ; - - /// Work array for count of infinite contributions to row lhs upper bound - int *infiniteUp_ ; - /// Work array for sum of finite contributions to row lhs upper bound - double *sumUp_ ; - /// Work array for count of infinite contributions to row lhs lower bound - int *infiniteDown_ ; - /// Work array for sum of finite contributions to row lhs lower bound - double *sumDown_ ; - //@} - - /*! \brief Recompute row lhs bounds - - Calculate finite contributions to row lhs upper and lower bounds - and count infinite contributions. Returns the number of rows found - to be infeasible. - - If \p whichRow < 0, bounds are recomputed for all rows. - - As of 110611, this seems to be a work in progress in the sense that it's - barely used by the existing presolve code. - */ - int recomputeSums(int whichRow) ; - - /// Allocate scratch arrays - void initializeStuff() ; - /// Free scratch arrays - void deleteStuff() ; - - /*! \name Functions to manipulate row and column processing status */ - //@{ - - /*! \brief Initialise the column ToDo lists - - Places all columns in the #colsToDo_ list except for columns marked - as prohibited (viz. #colChanged_). - */ - void initColsToDo () ; - - /*! \brief Step column ToDo lists - - Moves columns on the #nextColsToDo_ list to the #colsToDo_ list, emptying - #nextColsToDo_. Returns the number of columns transferred. - */ - int stepColsToDo () ; - - /// Return the number of columns on the #colsToDo_ list - inline int numberColsToDo() - { return (numberColsToDo_) ; } - - /// Has column been changed? - inline bool colChanged(int i) const { - return (colChanged_[i]&1)!=0; - } - /// Mark column as not changed - inline void unsetColChanged(int i) { - colChanged_[i] = static_cast(colChanged_[i] & (~1)) ; - } - /// Mark column as changed. - inline void setColChanged(int i) { - colChanged_[i] = static_cast(colChanged_[i] | (1)) ; - } - /// Mark column as changed and add to list of columns to process next - inline void addCol(int i) { - if ((colChanged_[i]&1)==0) { - colChanged_[i] = static_cast(colChanged_[i] | (1)) ; - nextColsToDo_[numberNextColsToDo_++] = i; - } - } - /// Test if column is eligible for preprocessing - inline bool colProhibited(int i) const { - return (colChanged_[i]&2)!=0; - } - /*! \brief Test if column is eligible for preprocessing - - The difference between this method and #colProhibited() is that this - method first tests #anyProhibited_ before examining the specific entry - for the specified column. - */ - inline bool colProhibited2(int i) const { - if (!anyProhibited_) - return false; - else - return (colChanged_[i]&2)!=0; - } - /// Mark column as ineligible for preprocessing - inline void setColProhibited(int i) { - colChanged_[i] = static_cast(colChanged_[i] | (2)) ; - } - /*! \brief Test if column is marked as used - - This is for doing faster lookups to see where two columns have entries - in common. - */ - inline bool colUsed(int i) const { - return (colChanged_[i]&4)!=0; - } - /// Mark column as used - inline void setColUsed(int i) { - colChanged_[i] = static_cast(colChanged_[i] | (4)) ; - } - /// Mark column as unused - inline void unsetColUsed(int i) { - colChanged_[i] = static_cast(colChanged_[i] & (~4)) ; - } - /// Has column infinite ub (originally) - inline bool colInfinite(int i) const { - return (colChanged_[i]&8)!=0; - } - /// Mark column as not infinite ub (originally) - inline void unsetColInfinite(int i) { - colChanged_[i] = static_cast(colChanged_[i] & (~8)) ; - } - /// Mark column as infinite ub (originally) - inline void setColInfinite(int i) { - colChanged_[i] = static_cast(colChanged_[i] | (8)) ; - } - - /*! \brief Initialise the row ToDo lists - - Places all rows in the #rowsToDo_ list except for rows marked - as prohibited (viz. #rowChanged_). - */ - void initRowsToDo () ; - - /*! \brief Step row ToDo lists - - Moves rows on the #nextRowsToDo_ list to the #rowsToDo_ list, emptying - #nextRowsToDo_. Returns the number of rows transferred. - */ - int stepRowsToDo () ; - - /// Return the number of rows on the #rowsToDo_ list - inline int numberRowsToDo() - { return (numberRowsToDo_) ; } - - /// Has row been changed? - inline bool rowChanged(int i) const { - return (rowChanged_[i]&1)!=0; - } - /// Mark row as not changed - inline void unsetRowChanged(int i) { - rowChanged_[i] = static_cast(rowChanged_[i] & (~1)) ; - } - /// Mark row as changed - inline void setRowChanged(int i) { - rowChanged_[i] = static_cast(rowChanged_[i] | (1)) ; - } - /// Mark row as changed and add to list of rows to process next - inline void addRow(int i) { - if ((rowChanged_[i]&1)==0) { - rowChanged_[i] = static_cast(rowChanged_[i] | (1)) ; - nextRowsToDo_[numberNextRowsToDo_++] = i; - } - } - /// Test if row is eligible for preprocessing - inline bool rowProhibited(int i) const { - return (rowChanged_[i]&2)!=0; - } - /*! \brief Test if row is eligible for preprocessing - - The difference between this method and #rowProhibited() is that this - method first tests #anyProhibited_ before examining the specific entry - for the specified row. - */ - inline bool rowProhibited2(int i) const { - if (!anyProhibited_) - return false; - else - return (rowChanged_[i]&2)!=0; - } - /// Mark row as ineligible for preprocessing - inline void setRowProhibited(int i) { - rowChanged_[i] = static_cast(rowChanged_[i] | (2)) ; - } - /*! \brief Test if row is marked as used - - This is for doing faster lookups to see where two rows have entries - in common. It can be used anywhere as long as it ends up zeroed out. - */ - inline bool rowUsed(int i) const { - return (rowChanged_[i]&4)!=0; - } - /// Mark row as used - inline void setRowUsed(int i) { - rowChanged_[i] = static_cast(rowChanged_[i] | (4)) ; - } - /// Mark row as unused - inline void unsetRowUsed(int i) { - rowChanged_[i] = static_cast(rowChanged_[i] & (~4)) ; - } - - - /// Check if there are any prohibited rows or columns - inline bool anyProhibited() const - { return anyProhibited_;} - /// Set a flag for presence of prohibited rows or columns - inline void setAnyProhibited(bool val = true) - { anyProhibited_ = val ; } - //@} - -}; - -/*! \class CoinPostsolveMatrix - \brief Augments CoinPrePostsolveMatrix with information about the problem - that is only needed during postsolve. - - The notable point is that the matrix representation is threaded. The - representation is column-major and starts with the standard two pairs of - arrays: one pair to hold the row indices and coefficients, the second pair - to hold the column starting positions and lengths. But the row indices and - coefficients for a column do not necessarily occupy a contiguous block in - their respective arrays. Instead, a link array gives the position of the - next (row index,coefficient) pair. If the row index and value of a - coefficient a occupy position kp in their arrays, then the position of - the next coefficient a is found as kq = link[kp]. - - This threaded representation allows for efficient expansion of columns as - rows are reintroduced during postsolve transformations. The basic packed - structures are allocated to the expected size of the postsolved matrix, - and as new coefficients are added, their location is simply added to the - thread for the column. - - There is no provision to convert the threaded representation to a packed - representation. In the context of postsolve, it's not required. (You did - keep a copy of the original matrix, eh?) - - The constructors that take an OSI or ClpSimplex as a parameter really should - not be here, but for historical reasons they will likely remain for the - forseeable future. -- lh, 111202 -- -*/ -class CoinPostsolveMatrix : public CoinPrePostsolveMatrix -{ - public: - - /*! \brief `Native' constructor - - This constructor creates an empty object which must then be loaded. - On the other hand, it doesn't assume that the client is an - OsiSolverInterface. - */ - CoinPostsolveMatrix(int ncols_alloc, int nrows_alloc, - CoinBigIndex nelems_alloc) ; - - - /*! \brief Clp OSI constructor - - See Clp code for the definition. - */ - CoinPostsolveMatrix(ClpSimplex * si, - - int ncols0, - int nrows0, - CoinBigIndex nelems0, - - double maxmin_, - // end prepost members - - double *sol, - double *acts, - - unsigned char *colstat, - unsigned char *rowstat); - - /*! \brief Generic OSI constructor - - See OSI code for the definition. - */ - CoinPostsolveMatrix(OsiSolverInterface * si, - - int ncols0, - int nrows0, - CoinBigIndex nelems0, - - double maxmin_, - // end prepost members - - double *sol, - double *acts, - - unsigned char *colstat, - unsigned char *rowstat); - - /*! \brief Load an empty CoinPostsolveMatrix from a CoinPresolveMatrix - - This routine transfers the contents of the CoinPrePostsolveMatrix - object from the CoinPresolveMatrix object to the CoinPostsolveMatrix - object and completes initialisation of the CoinPostsolveMatrix object. - The empty shell of the CoinPresolveMatrix object is destroyed. - - The routine expects an empty CoinPostsolveMatrix object. If handed a loaded - object, a lot of memory will leak. - */ - void assignPresolveToPostsolve (CoinPresolveMatrix *&preObj) ; - - /// Destructor - ~CoinPostsolveMatrix(); - - /*! \name Column thread structures - - As mentioned in the class documentation, the entries for a given column - do not necessarily occupy a contiguous block of space. The #link_ array - is used to maintain the threading. There is one thread for each column, - and a single thread for all free entries in #hrow_ and #colels_. - - The allocated size of #link_ must be at least as large as the allocated - size of #hrow_ and #colels_. - */ - //@{ - - /*! \brief First entry in free entries thread */ - CoinBigIndex free_list_; - /// Allocated size of #link_ - int maxlink_; - /*! \brief Thread array - - Within a thread, link_[k] points to the next entry in the thread. - */ - CoinBigIndex *link_; - - //@} - - /*! \name Debugging aids - - These arrays are allocated only when CoinPresolve is compiled with - PRESOLVE_DEBUG defined. They hold codes which track the reason that - a column or row is added to the problem during postsolve. - */ - //@{ - char *cdone_; - char *rdone_; - //@} - - /// debug - void check_nbasic(); - -}; - - -/*! \defgroup MtxManip Presolve Matrix Manipulation Functions - - Functions to work with the loosely packed and threaded packed matrix - structures used during presolve and postsolve. -*/ -//@{ - -/*! \relates CoinPrePostsolveMatrix - \brief Initialise linked list for major vector order in bulk storage -*/ - -void presolve_make_memlists(/*CoinBigIndex *starts,*/ int *lengths, - presolvehlink *link, int n); - -/*! \relates CoinPrePostsolveMatrix - \brief Make sure a major-dimension vector k has room for one more - coefficient. - - You can use this directly, or use the inline wrappers presolve_expand_col - and presolve_expand_row -*/ -bool presolve_expand_major(CoinBigIndex *majstrts, double *majels, - int *minndxs, int *majlens, - presolvehlink *majlinks, int nmaj, int k) ; - -/*! \relates CoinPrePostsolveMatrix - \brief Make sure a column (colx) in a column-major matrix has room for - one more coefficient -*/ - -inline bool presolve_expand_col(CoinBigIndex *mcstrt, double *colels, - int *hrow, int *hincol, - presolvehlink *clink, int ncols, int colx) -{ return presolve_expand_major(mcstrt,colels, - hrow,hincol,clink,ncols,colx) ; } - -/*! \relates CoinPrePostsolveMatrix - \brief Make sure a row (rowx) in a row-major matrix has room for one - more coefficient -*/ - -inline bool presolve_expand_row(CoinBigIndex *mrstrt, double *rowels, - int *hcol, int *hinrow, - presolvehlink *rlink, int nrows, int rowx) -{ return presolve_expand_major(mrstrt,rowels, - hcol,hinrow,rlink,nrows,rowx) ; } - - -/*! \relates CoinPrePostsolveMatrix - \brief Find position of a minor index in a major vector. - - The routine returns the position \c k in \p minndxs for the specified - minor index \p tgt. It will abort if the entry does not exist. Can be - used directly or via the inline wrappers presolve_find_row and - presolve_find_col. -*/ -inline CoinBigIndex presolve_find_minor(int tgt, - CoinBigIndex ks, CoinBigIndex ke, - const int *minndxs) -{ CoinBigIndex k ; - for (k = ks ; k < ke ; k++) -#ifndef NDEBUG - { if (minndxs[k] == tgt) - return (k) ; } - DIE("FIND_MINOR") ; - - abort () ; return -1; -#else - { if (minndxs[k] == tgt) - break ; } - return (k) ; -#endif -} - -/*! \relates CoinPrePostsolveMatrix - \brief Find position of a row in a column in a column-major matrix. - - The routine returns the position \c k in \p hrow for the specified \p row. - It will abort if the entry does not exist. -*/ -inline CoinBigIndex presolve_find_row(int row, CoinBigIndex kcs, - CoinBigIndex kce, const int *hrow) -{ return presolve_find_minor(row,kcs,kce,hrow) ; } - -/*! \relates CoinPostsolveMatrix - \brief Find position of a column in a row in a row-major matrix. - - The routine returns the position \c k in \p hcol for the specified \p col. - It will abort if the entry does not exist. -*/ -inline CoinBigIndex presolve_find_col(int col, CoinBigIndex krs, - CoinBigIndex kre, const int *hcol) -{ return presolve_find_minor(col,krs,kre,hcol) ; } - - -/*! \relates CoinPrePostsolveMatrix - \brief Find position of a minor index in a major vector. - - The routine returns the position \c k in \p minndxs for the specified - minor index \p tgt. A return value of \p ke means the entry does not - exist. Can be used directly or via the inline wrappers - presolve_find_row1 and presolve_find_col1. -*/ -CoinBigIndex presolve_find_minor1(int tgt, CoinBigIndex ks, CoinBigIndex ke, - const int *minndxs); - -/*! \relates CoinPrePostsolveMatrix - \brief Find position of a row in a column in a column-major matrix. - - The routine returns the position \c k in \p hrow for the specified \p row. - A return value of \p kce means the entry does not exist. -*/ -inline CoinBigIndex presolve_find_row1(int row, CoinBigIndex kcs, - CoinBigIndex kce, const int *hrow) -{ return presolve_find_minor1(row,kcs,kce,hrow) ; } - -/*! \relates CoinPrePostsolveMatrix - \brief Find position of a column in a row in a row-major matrix. - - The routine returns the position \c k in \p hcol for the specified \p col. - A return value of \p kre means the entry does not exist. -*/ -inline CoinBigIndex presolve_find_col1(int col, CoinBigIndex krs, - CoinBigIndex kre, const int *hcol) -{ return presolve_find_minor1(col,krs,kre,hcol) ; } - -/*! \relates CoinPostsolveMatrix - \brief Find position of a minor index in a major vector in a threaded - matrix. - - The routine returns the position \c k in \p minndxs for the specified - minor index \p tgt. It will abort if the entry does not exist. Can be - used directly or via the inline wrapper presolve_find_row2. -*/ -CoinBigIndex presolve_find_minor2(int tgt, CoinBigIndex ks, int majlen, - const int *minndxs, - const CoinBigIndex *majlinks) ; - -/*! \relates CoinPostsolveMatrix - \brief Find position of a row in a column in a column-major threaded - matrix. - - The routine returns the position \c k in \p hrow for the specified \p row. - It will abort if the entry does not exist. -*/ -inline CoinBigIndex presolve_find_row2(int row, CoinBigIndex kcs, int collen, - const int *hrow, - const CoinBigIndex *clinks) -{ return presolve_find_minor2(row,kcs,collen,hrow,clinks) ; } - -/*! \relates CoinPostsolveMatrix - \brief Find position of a minor index in a major vector in a threaded - matrix. - - The routine returns the position \c k in \p minndxs for the specified - minor index \p tgt. It will return -1 if the entry does not exist. - Can be used directly or via the inline wrappers presolve_find_row3. -*/ -CoinBigIndex presolve_find_minor3(int tgt, CoinBigIndex ks, int majlen, - const int *minndxs, - const CoinBigIndex *majlinks) ; - -/*! \relates CoinPostsolveMatrix - \brief Find position of a row in a column in a column-major threaded - matrix. - - The routine returns the position \c k in \p hrow for the specified \p row. - It will return -1 if the entry does not exist. -*/ -inline CoinBigIndex presolve_find_row3(int row, CoinBigIndex kcs, int collen, - const int *hrow, - const CoinBigIndex *clinks) -{ return presolve_find_minor3(row,kcs,collen,hrow,clinks) ; } - -/*! \relates CoinPrePostsolveMatrix - \brief Delete the entry for a minor index from a major vector. - - Deletes the entry for \p minndx from the major vector \p majndx. - Specifically, the relevant entries are removed from the minor index - (\p minndxs) and coefficient (\p els) arrays and the vector length (\p - majlens) is decremented. Loose packing is maintained by swapping the last - entry in the row into the position occupied by the deleted entry. -*/ -inline void presolve_delete_from_major(int majndx, int minndx, - const CoinBigIndex *majstrts, - int *majlens, int *minndxs, double *els) -{ - const CoinBigIndex ks = majstrts[majndx] ; - const CoinBigIndex ke = ks+majlens[majndx] ; - - const CoinBigIndex kmi = presolve_find_minor(minndx,ks,ke,minndxs) ; - - minndxs[kmi] = minndxs[ke-1] ; - els[kmi] = els[ke-1] ; - majlens[majndx]-- ; - - return ; -} - -/*! \relates CoinPrePostsolveMatrix - \brief Delete marked entries - - Removes the entries specified in \p marked, compressing the major vector - to maintain loose packing. \p marked is cleared in the process. -*/ -inline void presolve_delete_many_from_major(int majndx, char *marked, - const CoinBigIndex *majstrts, - int *majlens, int *minndxs, double *els) -{ - const CoinBigIndex ks = majstrts[majndx] ; - const CoinBigIndex ke = ks+majlens[majndx] ; - CoinBigIndex put = ks ; - for (CoinBigIndex k = ks ; k < ke ; k++) { - int iMinor = minndxs[k] ; - if (!marked[iMinor]) { - minndxs[put] = iMinor ; - els[put++] = els[k] ; - } else { - marked[iMinor] = 0 ; - } - } - majlens[majndx] = put-ks ; - return ; -} - -/*! \relates CoinPrePostsolveMatrix - \brief Delete the entry for row \p row from column \p col in a - column-major matrix - - Deletes the entry for \p row from the major vector for \p col. - Specifically, the relevant entries are removed from the row index (\p - hrow) and coefficient (\p colels) arrays and the vector length (\p - hincol) is decremented. Loose packing is maintained by swapping the last - entry in the row into the position occupied by the deleted entry. -*/ -inline void presolve_delete_from_col(int row, int col, - const CoinBigIndex *mcstrt, - int *hincol, int *hrow, double *colels) -{ presolve_delete_from_major(col,row,mcstrt,hincol,hrow,colels) ; } - -/*! \relates CoinPrePostsolveMatrix - \brief Delete the entry for column \p col from row \p row in a - row-major matrix - - Deletes the entry for \p col from the major vector for \p row. - Specifically, the relevant entries are removed from the column index (\p - hcol) and coefficient (\p rowels) arrays and the vector length (\p - hinrow) is decremented. Loose packing is maintained by swapping the last - entry in the column into the position occupied by the deleted entry. -*/ -inline void presolve_delete_from_row(int row, int col, - const CoinBigIndex *mrstrt, - int *hinrow, int *hcol, double *rowels) -{ presolve_delete_from_major(row,col,mrstrt,hinrow,hcol,rowels) ; } - -/*! \relates CoinPostsolveMatrix - \brief Delete the entry for a minor index from a major vector in a - threaded matrix. - - Deletes the entry for \p minndx from the major vector \p majndx. - Specifically, the relevant entries are removed from the minor index (\p - minndxs) and coefficient (\p els) arrays and the vector length (\p - majlens) is decremented. The thread for the major vector is relinked - around the deleted entry and the space is returned to the free list. -*/ -void presolve_delete_from_major2 (int majndx, int minndx, - CoinBigIndex *majstrts, int *majlens, - int *minndxs, int *majlinks, - CoinBigIndex *free_listp) ; - -/*! \relates CoinPostsolveMatrix - \brief Delete the entry for row \p row from column \p col in a - column-major threaded matrix - - Deletes the entry for \p row from the major vector for \p col. - Specifically, the relevant entries are removed from the row index (\p - hrow) and coefficient (\p colels) arrays and the vector length (\p - hincol) is decremented. The thread for the major vector is relinked - around the deleted entry and the space is returned to the free list. -*/ -inline void presolve_delete_from_col2(int row, int col, CoinBigIndex *mcstrt, - int *hincol, int *hrow, - int *clinks, CoinBigIndex *free_listp) -{ presolve_delete_from_major2(col,row,mcstrt,hincol,hrow,clinks,free_listp) ; } - -//@} - -/*! \defgroup PresolveUtilities Presolve Utility Functions - - Utilities used by multiple presolve transform objects. -*/ -//@{ - -/*! \brief Duplicate a major-dimension vector; optionally omit the entry - with minor index \p tgt. - - Designed to copy a major-dimension vector from the paired coefficient - (\p elems) and minor index (\p indices) arrays used in the standard - packed matrix representation. Copies \p length entries starting at - \p offset. - - If \p tgt is specified, the entry with minor index == \p tgt is - omitted from the copy. -*/ -double *presolve_dupmajor(const double *elems, const int *indices, - int length, CoinBigIndex offset, int tgt = -1); - -/// Initialize a vector with random numbers -void coin_init_random_vec(double *work, int n); - -//@} - - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveMonitor.hpp b/thirdparty/linux/include/coin1/CoinPresolveMonitor.hpp deleted file mode 100644 index cef7a415..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveMonitor.hpp +++ /dev/null @@ -1,105 +0,0 @@ - -#ifndef CoinPresolveMonitor_H -#define CoinPresolveMonitor_H - -/*! - \brief Monitor a row or column for modification - - The purpose of this class is to monitor a row or column for modifications - during presolve and postsolve. Each object can monitor one row or - column. The initial copy of the row or column is loaded by the constructor. - Each subsequent call to checkAndTell() compares the current state of the row - or column with the stored state and reports any modifications. - - Internally the row or column is held as a CoinPackedVector so that it's - possible to follow a row or column through presolve (CoinPresolveMatrix) - and postsolve (CoinPostsolveMatrix). - - Do not underestimate the amount of work required here. Extracting a row from - the CoinPostsolve matrix requires a scan of every element in the matrix. - That's one scan by the constructor and one scan with every call to modify. - But that's precisely why it's virtually impossible to debug presolve without - aids. - - Parameter overloads for CoinPresolveMatrix and CoinPostsolveMatrix are a - little clumsy, but not a problem in use. The alternative is to add methods - to the CoinPresolveMatrix and CoinPostsolveMatrix classes that will only be - used for debugging. That's not too attractive either. -*/ -class CoinPresolveMonitor -{ - public: - - /*! \brief Default constructor - - Creates an empty monitor. - */ - CoinPresolveMonitor() ; - - /*! \brief Initialise from a CoinPresolveMatrix - - Load the initial row or column from a CoinPresolveMatrix. Set \p isRow - true for a row, false for a column. - */ - CoinPresolveMonitor(const CoinPresolveMatrix *mtx, bool isRow, int k) ; - - /*! \brief Initialise from a CoinPostsolveMatrix - - Load the initial row or column from a CoinPostsolveMatrix. Set \p isRow - true for a row, false for a column. - */ - CoinPresolveMonitor(const CoinPostsolveMatrix *mtx, bool isRow, int k) ; - - /*! \brief Compare the present row or column against the stored copy and - report differences. - - Load the current row or column from a CoinPresolveMatrix and compare. - Differences are printed to std::cout. - */ - void checkAndTell(const CoinPresolveMatrix *mtx) ; - - /*! \brief Compare the present row or column against the stored copy and - report differences. - - Load the current row or column from a CoinPostsolveMatrix and compare. - Differences are printed to std::cout. - */ - void checkAndTell(const CoinPostsolveMatrix *mtx) ; - - private: - - /// Extract a row from a CoinPresolveMatrix - CoinPackedVector *extractRow(int i, const CoinPresolveMatrix *mtx) const ; - - /// Extract a column from a CoinPresolveMatrix - CoinPackedVector *extractCol(int j, const CoinPresolveMatrix *mtx) const ; - - /// Extract a row from a CoinPostsolveMatrix - CoinPackedVector *extractRow(int i, const CoinPostsolveMatrix *mtx) const ; - - /// Extract a column from a CoinPostsolveMatrix - CoinPackedVector *extractCol(int j, const CoinPostsolveMatrix *mtx) const ; - - /// Worker method underlying the public checkAndTell methods. - void checkAndTell(CoinPackedVector *curVec, double lb, double ub) ; - - /// True to monitor a row, false to monitor a column - bool isRow_ ; - - /// Row or column index - int ndx_ ; - - /*! The original row or column - - Sorted in increasing order of indices. - */ - CoinPackedVector *origVec_ ; - - /// Original row or column lower bound - double lb_ ; - - /// Original row or column upper bound - double ub_ ; -} ; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolvePsdebug.hpp b/thirdparty/linux/include/coin1/CoinPresolvePsdebug.hpp deleted file mode 100644 index d72479a9..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolvePsdebug.hpp +++ /dev/null @@ -1,166 +0,0 @@ -/* $Id: CoinPresolvePsdebug.hpp 1560 2012-11-24 00:29:01Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolvePsdebug_H -#define CoinPresolvePsdebug_H - -/* - The current idea of the relation between PRESOLVE_DEBUG and - PRESOLVE_CONSISTENCY is that PRESOLVE_CONSISTENCY triggers the consistency - checks and PRESOLVE_DEBUG triggers consistency checks and output. - This isn't always true in the code, but that's the goal. Really, - the whole compile-time scheme should be replaced with something more - user-friendly (control variables that can be changed during the run). - - Also floating about are PRESOLVE_SUMMARY and COIN_PRESOLVE_TUNING. - -- lh, 111208 -- -*/ -/*! \defgroup PresolveDebugFunctions Presolve Debug Functions - - These functions implement consistency checks on data structures involved - in presolve and postsolve and on the components of the lp solution. - - To use these functions, include CoinPresolvePsdebug.hpp in your file and - define the compile-time constants PRESOLVE_SUMMARY, PRESOLVE_DEBUG, and - PRESOLVE_CONSISTENCY. A value is needed (i.e., PRESOLVE_DEBUG=1). - In a few places, higher values will get you a bit more output. - - ******** - - Define the symbols PRESOLVE_DEBUG and PRESOLVE_CONSISTENCY on the configure - command line (use ADD_CXXFLAGS), in a Makefile, or similar and do a full - rebuild (including any presolve driver code). If the symbols are not - consistently nonzero across *all* presolve code, you'll get something - between garbage and a core dump! Debugging adds messages to CoinMessage - and allocates and maintains arrays that hold debug information. - - That said, given that you've configured and built with PRESOLVE_DEBUG and - PRESOLVE_CONSISTENCY nonzero everywhere, it's safe to adjust PRESOLVE_DEBUG - to values in the range 1..n in individual files to increase or decrease the - amount of output. - - The suggested approach for PRESOLVE_DEBUG is to define it to 1 in the build - and then increase it in individual presolve code files to get more detail. - - ******** -*/ -//@{ - -/*! \relates CoinPresolveMatrix - \brief Check column-major and/or row-major matrices for duplicate - entries in the major vectors. - - By default, scans both the column- and row-major matrices. Set doCol (doRow) - to false to suppress the column (row) scan. -*/ -void presolve_no_dups(const CoinPresolveMatrix *preObj, - bool doCol = true, bool doRow = true) ; - -/*! \relates CoinPresolveMatrix - \brief Check the links which track storage order for major vectors in - the bulk storage area. - - By default, scans both the column- and row-major matrix. Set doCol = false to - suppress the column-major scan. Set doRow = false to suppres the row-major - scan. -*/ -void presolve_links_ok(const CoinPresolveMatrix *preObj, - bool doCol = true, bool doRow = true) ; - -/*! \relates CoinPresolveMatrix - \brief Check for explicit zeros in the column- and/or row-major matrices. - - By default, scans both the column- and row-major matrices. Set doCol (doRow) - to false to suppress the column (row) scan. -*/ -void presolve_no_zeros(const CoinPresolveMatrix *preObj, - bool doCol = true, bool doRow = true) ; - -/*! \relates CoinPresolveMatrix - \brief Checks for equivalence of the column- and row-major matrices. - - Normally the routine will test for coefficient presence and value. Set - \p chkvals to false to suppress the check for equal value. -*/ -void presolve_consistent(const CoinPresolveMatrix *preObj, - bool chkvals = true) ; - -/*! \relates CoinPostsolveMatrix - \brief Checks that column threads agree with column lengths -*/ -void presolve_check_threads(const CoinPostsolveMatrix *obj) ; - -/*! \relates CoinPostsolveMatrix - \brief Checks the free list - - Scans the thread of free locations in the bulk store and checks that all - entries are reasonable (0 <= index < bulk0_). If chkElemCnt is true, it - also checks that the total number of entries in the matrix plus the - locations on the free list total to the size of the bulk store. Postsolve - routines do not maintain an accurate element count, but this is useful - for checking a newly constructed postsolve matrix. -*/ -void presolve_check_free_list(const CoinPostsolveMatrix *obj, - bool chkElemCnt = false) ; - -/*! \relates CoinPostsolveMatrix - \brief Check stored reduced costs for accuracy and consistency with - variable status. - - The routine will check the value of the reduced costs for architectural - variables (CoinPrePostsolveMatrix::rcosts_). It performs an accuracy check - by recalculating the reduced cost from scratch. It will also check the - value for consistency with the status information in - CoinPrePostsolveMatrix::colstat_. -*/ -void presolve_check_reduced_costs(const CoinPostsolveMatrix *obj) ; - -/*! \relates CoinPostsolveMatrix - \brief Check the dual variables for consistency with row activity. - - The routine checks that the value of the dual variable is consistent - with the state of the constraint (loose, tight at lower bound, or tight at - upper bound). -*/ -void presolve_check_duals(const CoinPostsolveMatrix *postObj) ; - -/*! \relates CoinPresolveMatrix - \brief Check primal solution and architectural variable status. - - The architectural variables can be checked for bogus values, feasibility, - and valid status. The row activity is checked for bogus values, accuracy, - and feasibility. By default, row activity is not checked (presolve is - sloppy about maintaining it). See the definitions in - CoinPresolvePsdebug.cpp for more information. -*/ -void presolve_check_sol(const CoinPresolveMatrix *preObj, - int chkColSol = 2, int chkRowAct = 1, - int chkStatus = 1) ; - -/*! \relates CoinPostsolveMatrix - \brief Check primal solution and architectural variable status. - - The architectural variables can be checked for bogus values, feasibility, - and valid status. The row activity is checked for bogus values, accuracy, - and feasibility. See the definitions in CoinPresolvePsdebug.cpp for more - information. -*/ -void presolve_check_sol(const CoinPostsolveMatrix *postObj, - int chkColSol = 2, int chkRowAct = 2, - int chkStatus = 1) ; - -/*! \relates CoinPresolveMatrix - \brief Check for the proper number of basic variables. -*/ -void presolve_check_nbasic(const CoinPresolveMatrix *preObj) ; - -/*! \relates CoinPostsolveMatrix - \brief Check for the proper number of basic variables. -*/ -void presolve_check_nbasic(const CoinPostsolveMatrix *postObj) ; - -//@} - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveSingleton.hpp b/thirdparty/linux/include/coin1/CoinPresolveSingleton.hpp deleted file mode 100644 index 10bc1cc0..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveSingleton.hpp +++ /dev/null @@ -1,112 +0,0 @@ -/* $Id: CoinPresolveSingleton.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveSingleton_H -#define CoinPresolveSingleton_H -#define SLACK_DOUBLETON 2 -#define SLACK_SINGLETON 8 - -/*! - \file -*/ - -//const int MAX_SLACK_DOUBLETONS = 1000; - -/*! \class slack_doubleton_action - \brief Convert an explicit bound constraint to a column bound - - This transform looks for explicit bound constraints for a variable and - transfers the bound to the appropriate column bound array. - The constraint is removed from the constraint system. -*/ -class slack_doubleton_action : public CoinPresolveAction { - struct action { - double clo; - double cup; - - double rlo; - double rup; - - double coeff; - - int col; - int row; - }; - - const int nactions_; - const action *const actions_; - - slack_doubleton_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), - actions_(actions) -{} - - public: - const char *name() const { return ("slack_doubleton_action"); } - - /*! \brief Convert explicit bound constraints to column bounds. - - Not now There is a hard limit (#MAX_SLACK_DOUBLETONS) on the number of - constraints processed in a given call. \p notFinished is set to true - if candidates remain. - */ - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next, - bool ¬Finished); - - void postsolve(CoinPostsolveMatrix *prob) const; - - - virtual ~slack_doubleton_action() { deleteAction(actions_,action*); } -}; -/*! \class slack_singleton_action - \brief For variables with one entry - - If we have a variable with one entry and no cost then we can - transform the row from E to G etc. - If there is a row objective region then we may be able to do - this even with a cost. -*/ -class slack_singleton_action : public CoinPresolveAction { - struct action { - double clo; - double cup; - - double rlo; - double rup; - - double coeff; - - int col; - int row; - }; - - const int nactions_; - const action *const actions_; - - slack_singleton_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), - actions_(actions) -{} - - public: - const char *name() const { return ("slack_singleton_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next, - double * rowObjective); - - void postsolve(CoinPostsolveMatrix *prob) const; - - - virtual ~slack_singleton_action() { deleteAction(actions_,action*); } -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveSubst.hpp b/thirdparty/linux/include/coin1/CoinPresolveSubst.hpp deleted file mode 100644 index 93822a53..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveSubst.hpp +++ /dev/null @@ -1,101 +0,0 @@ -/* $Id: CoinPresolveSubst.hpp 1562 2012-11-24 00:36:15Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveSubst_H -#define CoinPresolveSubst_H - -/*! - \file -*/ - -#define SUBST_ROW 21 - -#include "CoinPresolveMatrix.hpp" - -/*! \class subst_constraint_action - \brief Detect and process implied free variables - - Consider a variable x. Suppose that we can find an equality such that the - bound on the equality, combined with - the bounds on the other variables involved in the equality, are such that - even the worst case values of the other variables still imply bounds for x - which are tighter than the variable's original bounds. Since x can never - reach its upper or lower bounds, it is an implied free variable. By solving - the equality for x and substituting for x in every other constraint - entangled with x, we can make x into a column singleton. Now x is an implied - free column singleton and both x and the equality can be removed. - - A similar transform for the case where the variable is a natural column - singleton is handled by #implied_free_action. In the current presolve - architecture, #implied_free_action is responsible for detecting implied free - variables that are natural column singletons or can be reduced to column - singletons. #implied_free_action calls subst_constraint_action to process - variables that must be reduced to column singletons. -*/ -class subst_constraint_action : public CoinPresolveAction { -private: - subst_constraint_action(); - subst_constraint_action(const subst_constraint_action& rhs); - subst_constraint_action& operator=(const subst_constraint_action& rhs); - - struct action { - double *rlos; - double *rups; - - double *coeffxs; - int *rows; - - int *ninrowxs; - int *rowcolsxs; - double *rowelsxs; - - const double *costsx; - int col; - int rowy; - - int nincol; - }; - - const int nactions_; - // actions_ is owned by the class and must be deleted at destruction - const action *const actions_; - - subst_constraint_action(int nactions, - action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob, - const int *implied_free, - const int * which, - int numberFree, - const CoinPresolveAction *next, - int fill_level); - static const CoinPresolveAction *presolveX(CoinPresolveMatrix * prob, - const CoinPresolveAction *next, - int fillLevel); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~subst_constraint_action(); -}; - - - - - -/*static*/ void implied_bounds(const double *els, - const double *clo, const double *cup, - const int *hcol, - CoinBigIndex krs, CoinBigIndex kre, - double *maxupp, double *maxdownp, - int jcol, - double rlo, double rup, - double *iclb, double *icub); -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveTighten.hpp b/thirdparty/linux/include/coin1/CoinPresolveTighten.hpp deleted file mode 100644 index 3a5319ba..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveTighten.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/* $Id: CoinPresolveTighten.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveTighten_H -#define CoinPresolveTighten_H - -#include "CoinPresolveMatrix.hpp" - -// This action has no separate class; -// instead, it decides which columns can be made fixed -// and calls make_fixed_action::presolve. -const CoinPresolveAction *tighten_zero_cost(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - -#define DO_TIGHTEN 30 - -class do_tighten_action : public CoinPresolveAction { - do_tighten_action(); - do_tighten_action(const do_tighten_action& rhs); - do_tighten_action& operator=(const do_tighten_action& rhs); - - struct action { - int *rows; - double *lbound; - double *ubound; - int col; - int nrows; - int direction; // just for assertions - }; - - const int nactions_; - const action *const actions_; - - do_tighten_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) {} - - public: - const char *name() const; - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~do_tighten_action(); - -}; -#endif - - diff --git a/thirdparty/linux/include/coin1/CoinPresolveTripleton.hpp b/thirdparty/linux/include/coin1/CoinPresolveTripleton.hpp deleted file mode 100644 index eaa79c5c..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveTripleton.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* $Id: CoinPresolveTripleton.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveTripleton_H -#define CoinPresolveTripleton_H -#define TRIPLETON 11 -/** We are only going to do this if it does not increase number of elements?. - It could be generalized to more than three but it seems unlikely it would - help. - - As it is adapted from doubleton icoly is one dropped. - */ -class tripleton_action : public CoinPresolveAction { - public: - struct action { - int icolx; - int icolz; - int row; - - int icoly; - double cloy; - double cupy; - double costy; - double clox; - double cupx; - double costx; - - double rlo; - double rup; - - double coeffx; - double coeffy; - double coeffz; - - double *colel; - - int ncolx; - int ncoly; - }; - - const int nactions_; - const action *const actions_; - - private: - tripleton_action(int nactions, - const action *actions, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nactions_(nactions), actions_(actions) -{} - - public: - const char *name() const { return ("tripleton_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~tripleton_action(); -}; -#endif - - diff --git a/thirdparty/linux/include/coin1/CoinPresolveUseless.hpp b/thirdparty/linux/include/coin1/CoinPresolveUseless.hpp deleted file mode 100644 index 624a3737..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveUseless.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* $Id: CoinPresolveUseless.hpp 1566 2012-11-29 19:33:56Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveUseless_H -#define CoinPresolveUseless_H -#define USELESS 20 - -class useless_constraint_action : public CoinPresolveAction { - struct action { - double rlo; - double rup; - const int *rowcols; - const double *rowels; - int row; - int ninrow; - }; - - const int nactions_; - const action *const actions_; - - useless_constraint_action(int nactions, - const action *actions, - const CoinPresolveAction *next); - - public: - const char *name() const; - - // These rows are asserted to be useless, - // that is, given a solution the row activity - // must be in range. - static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob, - const int *useless_rows, - int nuseless_rows, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~useless_constraint_action(); - -}; - -/*! \relates useless_constraint_action - \brief Scan constraints looking for useless constraints - - A front end to identify useless constraints and hand them to - useless_constraint_action::presolve() for processing. - - In a bit more detail, the routine implements a greedy algorithm that - identifies a set of necessary constraints. A constraint is necessary if it - implies a tighter bound on a variable than the original column bound. These - tighter column bounds are then used to calculate row activity and identify - constraints that are useless given the presence of the necessary - constraints. -*/ - -const CoinPresolveAction *testRedundant(CoinPresolveMatrix *prob, - const CoinPresolveAction *next) ; - - - -#endif diff --git a/thirdparty/linux/include/coin1/CoinPresolveZeros.hpp b/thirdparty/linux/include/coin1/CoinPresolveZeros.hpp deleted file mode 100644 index 219e6139..00000000 --- a/thirdparty/linux/include/coin1/CoinPresolveZeros.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/* $Id: CoinPresolveZeros.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinPresolveZeros_H -#define CoinPresolveZeros_H - -/*! \file - - Drop/reintroduce explicit zeros. -*/ - -#define DROP_ZERO 8 - -/*! \brief Tracking information for an explicit zero coefficient - - \todo Why isn't this a nested class in drop_zero_coefficients_action? - That would match the structure of other presolve classes. -*/ - -struct dropped_zero { - int row; - int col; -}; - -/*! \brief Removal of explicit zeros - - The presolve action for this class removes explicit zeros from the constraint - matrix. The postsolve action puts them back. -*/ -class drop_zero_coefficients_action : public CoinPresolveAction { - - const int nzeros_; - const dropped_zero *const zeros_; - - drop_zero_coefficients_action(int nzeros, - const dropped_zero *zeros, - const CoinPresolveAction *next) : - CoinPresolveAction(next), - nzeros_(nzeros), zeros_(zeros) -{} - - public: - const char *name() const { return ("drop_zero_coefficients_action"); } - - static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, - int *checkcols, - int ncheckcols, - const CoinPresolveAction *next); - - void postsolve(CoinPostsolveMatrix *prob) const; - - virtual ~drop_zero_coefficients_action() { deleteAction(zeros_,dropped_zero*); } -}; - -const CoinPresolveAction *drop_zero_coefficients(CoinPresolveMatrix *prob, - const CoinPresolveAction *next); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinRational.hpp b/thirdparty/linux/include/coin1/CoinRational.hpp deleted file mode 100644 index bfbfa5f9..00000000 --- a/thirdparty/linux/include/coin1/CoinRational.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// Authors: Matthew Saltzman and Ted Ralphs -// Copyright 2015, Matthew Saltzman and Ted Ralphs -// Licensed under the Eclipse Public License 1.0 - -#ifndef CoinRational_H -#define CoinRational_H - -#include - -//Small class for rational numbers -class CoinRational -{ - -public : - long getDenominator() { return denominator_; } - long getNumerator() { return numerator_; } - - CoinRational(): - numerator_(0), - denominator_(1) - {}; - - CoinRational(long n, long d): - numerator_(n), - denominator_(d) - {}; - - CoinRational(double val, double maxdelta, long maxdnom) - { - if (!nearestRational_(val, maxdelta, maxdnom)){ - numerator_ = 0; - denominator_ = 1; - } - }; - -private : - - long numerator_; - long denominator_; - - bool nearestRational_(double val, double maxdelta, long maxdnom); -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinSearchTree.hpp b/thirdparty/linux/include/coin1/CoinSearchTree.hpp deleted file mode 100644 index a0ce8e30..00000000 --- a/thirdparty/linux/include/coin1/CoinSearchTree.hpp +++ /dev/null @@ -1,465 +0,0 @@ -/* $Id: CoinSearchTree.hpp 1685 2014-01-27 03:05:07Z tkr $ */ -// Copyright (C) 2006, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinSearchTree_H -#define CoinSearchTree_H - -#include -#include -#include -#include - -#include "CoinFinite.hpp" -#include "CoinHelperFunctions.hpp" - -// #define DEBUG_PRINT - -//############################################################################# - -class BitVector128 { - friend bool operator<(const BitVector128& b0, const BitVector128& b1); -private: - unsigned int bits_[4]; -public: - BitVector128(); - BitVector128(unsigned int bits[4]); - ~BitVector128() {} - void set(unsigned int bits[4]); - void setBit(int i); - void clearBit(int i); - std::string str() const; -}; - -bool operator<(const BitVector128& b0, const BitVector128& b1); - -//############################################################################# - -/** A class from which the real tree nodes should be derived from. Some of the - data that undoubtedly exist in the real tree node is replicated here for - fast access. This class is used in the various comparison functions. */ -class CoinTreeNode { -protected: - CoinTreeNode() : - depth_(-1), - fractionality_(-1), - quality_(-COIN_DBL_MAX), - true_lower_bound_(-COIN_DBL_MAX), - preferred_() {} - CoinTreeNode(int d, - int f = -1, - double q = -COIN_DBL_MAX, - double tlb = -COIN_DBL_MAX, - BitVector128 p = BitVector128()) : - depth_(d), - fractionality_(f), - quality_(q), - true_lower_bound_(tlb), - preferred_(p) {} - CoinTreeNode(const CoinTreeNode& x) : - depth_(x.depth_), - fractionality_(x.fractionality_), - quality_(x.quality_), - true_lower_bound_(x.true_lower_bound_), - preferred_(x.preferred_) {} - CoinTreeNode& operator=(const CoinTreeNode& x) { - if (this != &x) { - depth_ = x.depth_; - fractionality_ = x.fractionality_; - quality_ = x.quality_; - true_lower_bound_ = x.true_lower_bound_; - preferred_ = x.preferred_; - } - return *this; - } -private: - /// The depth of the node in the tree - int depth_; - /** A measure of fractionality, e.g., the number of unsatisfied - integrality requirements */ - int fractionality_; - /** Some quality for the node. For normal branch-and-cut problems the LP - relaxation value will do just fine. It is probably an OK approximation - even if column generation is done. */ - double quality_; - /** A true lower bound on the node. May be -infinity. For normal - branch-and-cut problems the LP relaxation value is OK. It is different - when column generation is done. */ - double true_lower_bound_; - /** */ - BitVector128 preferred_; -public: - virtual ~CoinTreeNode() {} - - inline int getDepth() const { return depth_; } - inline int getFractionality() const { return fractionality_; } - inline double getQuality() const { return quality_; } - inline double getTrueLB() const { return true_lower_bound_; } - inline BitVector128 getPreferred() const { return preferred_; } - - inline void setDepth(int d) { depth_ = d; } - inline void setFractionality(int f) { fractionality_ = f; } - inline void setQuality(double q) { quality_ = q; } - inline void setTrueLB(double tlb) { true_lower_bound_ = tlb; } - inline void setPreferred(BitVector128 p) { preferred_ = p; } -}; - -//============================================================================== - -class CoinTreeSiblings { -private: - CoinTreeSiblings(); - CoinTreeSiblings& operator=(const CoinTreeSiblings&); -private: - int current_; - int numSiblings_; - CoinTreeNode** siblings_; -public: - CoinTreeSiblings(const int n, CoinTreeNode** nodes) : - current_(0), numSiblings_(n), siblings_(new CoinTreeNode*[n]) - { - CoinDisjointCopyN(nodes, n, siblings_); - } - CoinTreeSiblings(const CoinTreeSiblings& s) : - current_(s.current_), - numSiblings_(s.numSiblings_), - siblings_(new CoinTreeNode*[s.numSiblings_]) - { - CoinDisjointCopyN(s.siblings_, s.numSiblings_, siblings_); - } - ~CoinTreeSiblings() { delete[] siblings_; } - inline CoinTreeNode* currentNode() const { return siblings_[current_]; } - /** returns false if cannot be advanced */ - inline bool advanceNode() { return ++current_ != numSiblings_; } - inline int toProcess() const { return numSiblings_ - current_; } - inline int size() const { return numSiblings_; } - inline void printPref() const { - for (int i = 0; i < numSiblings_; ++i) { - std::string pref = siblings_[i]->getPreferred().str(); - printf("prefs of sibligs: sibling[%i]: %s\n", i, pref.c_str()); - } - } -}; - -//############################################################################# - -/** Function objects to compare search tree nodes. The comparison function - must return true if the first argument is "better" than the second one, - i.e., it should be processed first. */ -/*@{*/ -/** Depth First Search. */ -struct CoinSearchTreeComparePreferred { - static inline const char* name() { return "CoinSearchTreeComparePreferred"; } - inline bool operator()(const CoinTreeSiblings* x, - const CoinTreeSiblings* y) const { - register const CoinTreeNode* xNode = x->currentNode(); - register const CoinTreeNode* yNode = y->currentNode(); - const BitVector128 xPref = xNode->getPreferred(); - const BitVector128 yPref = yNode->getPreferred(); - bool retval = true; - if (xPref < yPref) { - retval = true; - } else if (yPref < xPref) { - retval = false; - } else { - retval = xNode->getQuality() < yNode->getQuality(); - } -#ifdef DEBUG_PRINT - printf("Comparing xpref (%s) and ypref (%s) : %s\n", - xpref.str().c_str(), ypref.str().c_str(), retval ? "T" : "F"); -#endif - return retval; - } -}; - -//----------------------------------------------------------------------------- -/** Depth First Search. */ -struct CoinSearchTreeCompareDepth { - static inline const char* name() { return "CoinSearchTreeCompareDepth"; } - inline bool operator()(const CoinTreeSiblings* x, - const CoinTreeSiblings* y) const { -#if 1 - return x->currentNode()->getDepth() >= y->currentNode()->getDepth(); -#else - if(x->currentNode()->getDepth() > y->currentNode()->getDepth()) - return 1; - if(x->currentNode()->getDepth() == y->currentNode()->getDepth() && - x->currentNode()->getQuality() <= y->currentNode()->getQuality()) - return 1; - return 0; -#endif - } -}; - -//----------------------------------------------------------------------------- -/* Breadth First Search */ -struct CoinSearchTreeCompareBreadth { - static inline const char* name() { return "CoinSearchTreeCompareBreadth"; } - inline bool operator()(const CoinTreeSiblings* x, - const CoinTreeSiblings* y) const { - return x->currentNode()->getDepth() < y->currentNode()->getDepth(); - } -}; - -//----------------------------------------------------------------------------- -/** Best first search */ -struct CoinSearchTreeCompareBest { - static inline const char* name() { return "CoinSearchTreeCompareBest"; } - inline bool operator()(const CoinTreeSiblings* x, - const CoinTreeSiblings* y) const { - return x->currentNode()->getQuality() < y->currentNode()->getQuality(); - } -}; - -//############################################################################# - -class CoinSearchTreeBase -{ -private: - CoinSearchTreeBase(const CoinSearchTreeBase&); - CoinSearchTreeBase& operator=(const CoinSearchTreeBase&); - -protected: - std::vector candidateList_; - int numInserted_; - int size_; - -protected: - CoinSearchTreeBase() : candidateList_(), numInserted_(0), size_(0) {} - - virtual void realpop() = 0; - virtual void realpush(CoinTreeSiblings* s) = 0; - virtual void fixTop() = 0; - -public: - virtual ~CoinSearchTreeBase() {} - virtual const char* compName() const = 0; - - inline const std::vector& getCandidates() const { - return candidateList_; - } - inline bool empty() const { return candidateList_.empty(); } - inline int size() const { return size_; } - inline int numInserted() const { return numInserted_; } - inline CoinTreeNode* top() const { - if (size_ == 0) - return NULL; -#ifdef DEBUG_PRINT - char output[44]; - output[43] = 0; - candidateList_.front()->currentNode()->getPreferred().print(output); - printf("top's pref: %s\n", output); -#endif - return candidateList_.front()->currentNode(); - } - /** pop will advance the \c next pointer among the siblings on the top and - then moves the top to its correct position. #realpop is the method - that actually removes the element from the heap */ - inline void pop() { - CoinTreeSiblings* s = candidateList_.front(); - if (!s->advanceNode()) { - realpop(); - delete s; - } else { - fixTop(); - } - --size_; - } - inline void push(int numNodes, CoinTreeNode** nodes, - const bool incrInserted = true) { - CoinTreeSiblings* s = new CoinTreeSiblings(numNodes, nodes); - realpush(s); - if (incrInserted) { - numInserted_ += numNodes; - } - size_ += numNodes; - } - inline void push(const CoinTreeSiblings& sib, - const bool incrInserted = true) { - CoinTreeSiblings* s = new CoinTreeSiblings(sib); -#ifdef DEBUG_PRINT - s->printPref(); -#endif - realpush(s); - if (incrInserted) { - numInserted_ += sib.toProcess(); - } - size_ += sib.toProcess(); - } -}; - -//############################################################################# - -// #define CAN_TRUST_STL_HEAP -#ifdef CAN_TRUST_STL_HEAP - -template -class CoinSearchTree : public CoinSearchTreeBase -{ -private: - Comp comp_; -protected: - virtual void realpop() { - candidateList_.pop_back(); - } - virtual void fixTop() { - CoinTreeSiblings* s = top(); - realpop(); - push(s, false); - } - virtual void realpush(CoinTreeSiblings* s) { - nodes_.push_back(s); - std::push_heap(candidateList_.begin(), candidateList_.end(), comp_); - } -public: - CoinSearchTree() : CoinSearchTreeBase(), comp_() {} - CoinSearchTree(const CoinSearchTreeBase& t) : - CoinSearchTreeBase(), comp_() { - candidateList_ = t.getCandidates(); - std::make_heap(candidateList_.begin(), candidateList_.end(), comp_); - numInserted_ = t.numInserted_; - size_ = t.size_; - } - ~CoinSearchTree() {} - const char* compName() const { return Comp::name(); } -}; - -#else - -template -class CoinSearchTree : public CoinSearchTreeBase -{ -private: - Comp comp_; - -protected: - virtual void realpop() { - candidateList_[0] = candidateList_.back(); - candidateList_.pop_back(); - fixTop(); - } - /** After changing data in the top node, fix the heap */ - virtual void fixTop() { - const size_t size = candidateList_.size(); - if (size > 1) { - CoinTreeSiblings** candidates = &candidateList_[0]; - CoinTreeSiblings* s = candidates[0]; - --candidates; - size_t pos = 1; - size_t ch; - for (ch = 2; ch < size; pos = ch, ch *= 2) { - if (comp_(candidates[ch+1], candidates[ch])) - ++ch; - if (comp_(s, candidates[ch])) - break; - candidates[pos] = candidates[ch]; - } - if (ch == size) { - if (comp_(candidates[ch], s)) { - candidates[pos] = candidates[ch]; - pos = ch; - } - } - candidates[pos] = s; - } - } - virtual void realpush(CoinTreeSiblings* s) { - candidateList_.push_back(s); - CoinTreeSiblings** candidates = &candidateList_[0]; - --candidates; - size_t pos = candidateList_.size(); - size_t ch; - for (ch = pos/2; ch != 0; pos = ch, ch /= 2) { - if (comp_(candidates[ch], s)) - break; - candidates[pos] = candidates[ch]; - } - candidates[pos] = s; - } - -public: - CoinSearchTree() : CoinSearchTreeBase(), comp_() {} - CoinSearchTree(const CoinSearchTreeBase& t) : - CoinSearchTreeBase(), comp_() { - candidateList_ = t.getCandidates(); - std::sort(candidateList_.begin(), candidateList_.end(), comp_); - numInserted_ = t.numInserted(); - size_ = t.size(); - } - virtual ~CoinSearchTree() {} - const char* compName() const { return Comp::name(); } -}; - -#endif - -//############################################################################# - -enum CoinNodeAction { - CoinAddNodeToCandidates, - CoinTestNodeForDiving, - CoinDiveIntoNode -}; - -class CoinSearchTreeManager -{ -private: - CoinSearchTreeManager(const CoinSearchTreeManager&); - CoinSearchTreeManager& operator=(const CoinSearchTreeManager&); -private: - CoinSearchTreeBase* candidates_; - int numSolution; - /** Whether there is an upper bound or not. The upper bound may have come - as input, not necessarily from a solution */ - bool hasUB_; - - /** variable used to test whether we need to reevaluate search strategy */ - bool recentlyReevaluatedSearchStrategy_; - -public: - CoinSearchTreeManager() : - candidates_(NULL), - numSolution(0), - recentlyReevaluatedSearchStrategy_(true) - {} - virtual ~CoinSearchTreeManager() { - delete candidates_; - } - - inline void setTree(CoinSearchTreeBase* t) { - delete candidates_; - candidates_ = t; - } - inline CoinSearchTreeBase* getTree() const { - return candidates_; - } - - inline bool empty() const { return candidates_->empty(); } - inline size_t size() const { return candidates_->size(); } - inline size_t numInserted() const { return candidates_->numInserted(); } - inline CoinTreeNode* top() const { return candidates_->top(); } - inline void pop() { candidates_->pop(); } - inline void push(CoinTreeNode* node, const bool incrInserted = true) { - candidates_->push(1, &node, incrInserted); - } - inline void push(const CoinTreeSiblings& s, const bool incrInserted=true) { - candidates_->push(s, incrInserted); - } - inline void push(const int n, CoinTreeNode** nodes, - const bool incrInserted = true) { - candidates_->push(n, nodes, incrInserted); - } - - inline CoinTreeNode* bestQualityCandidate() const { - return candidates_->top(); - } - inline double bestQuality() const { - return candidates_->top()->getQuality(); - } - void newSolution(double solValue); - void reevaluateSearchStrategy(); -}; - -//############################################################################# - -#endif diff --git a/thirdparty/linux/include/coin1/CoinShallowPackedVector.hpp b/thirdparty/linux/include/coin1/CoinShallowPackedVector.hpp deleted file mode 100644 index 07c1870b..00000000 --- a/thirdparty/linux/include/coin1/CoinShallowPackedVector.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/* $Id: CoinShallowPackedVector.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinShallowPackedVector_H -#define CoinShallowPackedVector_H - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#endif - -#include "CoinError.hpp" -#include "CoinPackedVectorBase.hpp" - -/** Shallow Sparse Vector - -This class is for sparse vectors where the indices and -elements are stored elsewhere. This class only maintains -pointers to the indices and elements. Since this class -does not own the index and element data it provides -read only access to to the data. An CoinSparsePackedVector -must be used when the sparse vector's data will be altered. - -This class stores pointers to the vectors. -It does not actually contain the vectors. - -Here is a sample usage: -@verbatim - const int ne = 4; - int inx[ne] = { 1, 4, 0, 2 }; - double el[ne] = { 10., 40., 1., 50. }; - - // Create vector and set its value - CoinShallowPackedVector r(ne,inx,el); - - // access each index and element - assert( r.indices ()[0]== 1 ); - assert( r.elements()[0]==10. ); - assert( r.indices ()[1]== 4 ); - assert( r.elements()[1]==40. ); - assert( r.indices ()[2]== 0 ); - assert( r.elements()[2]== 1. ); - assert( r.indices ()[3]== 2 ); - assert( r.elements()[3]==50. ); - - // access as a full storage vector - assert( r[ 0]==1. ); - assert( r[ 1]==10.); - assert( r[ 2]==50.); - assert( r[ 3]==0. ); - assert( r[ 4]==40.); - - // Tests for equality and equivalence - CoinShallowPackedVector r1; - r1=r; - assert( r==r1 ); - r.sort(CoinIncrElementOrdered()); - assert( r!=r1 ); - - // Add packed vectors. - // Similarly for subtraction, multiplication, - // and division. - CoinPackedVector add = r + r1; - assert( add[0] == 1.+ 1. ); - assert( add[1] == 10.+10. ); - assert( add[2] == 50.+50. ); - assert( add[3] == 0.+ 0. ); - assert( add[4] == 40.+40. ); - assert( r.sum() == 10.+40.+1.+50. ); -@endverbatim -*/ -class CoinShallowPackedVector : public CoinPackedVectorBase { - friend void CoinShallowPackedVectorUnitTest(); - -public: - - /**@name Get methods */ - //@{ - /// Get length of indices and elements vectors - virtual int getNumElements() const { return nElements_; } - /// Get indices of elements - virtual const int * getIndices() const { return indices_; } - /// Get element values - virtual const double * getElements() const { return elements_; } - //@} - - /**@name Set methods */ - //@{ - /// Reset the vector (as if were just created an empty vector) - void clear(); - /** Assignment operator. */ - CoinShallowPackedVector& operator=(const CoinShallowPackedVector & x); - /** Assignment operator from a CoinPackedVectorBase. */ - CoinShallowPackedVector& operator=(const CoinPackedVectorBase & x); - /** just like the explicit constructor */ - void setVector(int size, const int * indices, const double * elements, - bool testForDuplicateIndex = true); - //@} - - /**@name Methods to create, set and destroy */ - //@{ - /** Default constructor. */ - CoinShallowPackedVector(bool testForDuplicateIndex = true); - /** Explicit Constructor. - Set vector size, indices, and elements. Size is the length of both the - indices and elements vectors. The indices and elements vectors are not - copied into this class instance. The ShallowPackedVector only maintains - the pointers to the indices and elements vectors.
      - The last argument specifies whether the creator of the object knows in - advance that there are no duplicate indices. - */ - CoinShallowPackedVector(int size, - const int * indices, const double * elements, - bool testForDuplicateIndex = true); - /** Copy constructor from the base class. */ - CoinShallowPackedVector(const CoinPackedVectorBase &); - /** Copy constructor. */ - CoinShallowPackedVector(const CoinShallowPackedVector &); - /** Destructor. */ - virtual ~CoinShallowPackedVector() {} - /// Print vector information. - void print(); - //@} - -private: - /**@name Private member data */ - //@{ - /// Vector indices - const int * indices_; - ///Vector elements - const double * elements_; - /// Size of indices and elements vectors - int nElements_; - //@} -}; - -//############################################################################# -/** A function that tests the methods in the CoinShallowPackedVector class. The - only reason for it not to be a member method is that this way it doesn't - have to be compiled into the library. And that's a gain, because the - library should be compiled with optimization on, but this method should be - compiled with debugging. */ -void -CoinShallowPackedVectorUnitTest(); - -#endif diff --git a/thirdparty/linux/include/coin1/CoinSignal.hpp b/thirdparty/linux/include/coin1/CoinSignal.hpp deleted file mode 100644 index 2bbf0d04..00000000 --- a/thirdparty/linux/include/coin1/CoinSignal.hpp +++ /dev/null @@ -1,117 +0,0 @@ -/* $Id: CoinSignal.hpp 1810 2015-03-13 20:16:34Z tkr $ */ -// Copyright (C) 2003, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef _CoinSignal_hpp -#define _CoinSignal_hpp - -// This file is fully docified. -// There's nothing to docify... - -//############################################################################# - -#include - -//############################################################################# - -#if defined(_MSC_VER) - typedef void (__cdecl *CoinSighandler_t) (int); -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if (defined(__GNUC__) && defined(__linux__)) - typedef sighandler_t CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if defined(__CYGWIN__) && defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if defined(__MINGW32__) && defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if defined(__FreeBSD__) && defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if defined(__NetBSD__) && defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//----------------------------------------------------------------------------- - -#if defined(_AIX) -# if defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -# endif -#endif - -//----------------------------------------------------------------------------- - -#if defined (__hpux) -# define CoinSighandler_t_defined -# if defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# else - extern "C" { - typedef void (*CoinSighandler_t) (int); - } -# endif -#endif - -//----------------------------------------------------------------------------- - -#if defined(__sun) -# if defined(__SUNPRO_CC) -# include - extern "C" { - typedef void (*CoinSighandler_t) (int); - } -# define CoinSighandler_t_defined -# endif -# if defined(__GNUC__) - typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -# endif -#endif - -//----------------------------------------------------------------------------- - -#if defined(__MACH__) && defined(__GNUC__) -typedef __decltype(SIG_DFL) CoinSighandler_t; -# define CoinSighandler_t_defined -#endif - -//############################################################################# - -#ifndef CoinSighandler_t_defined -# warning("OS and/or compiler is not recognized. Defaulting to:"); -# warning("extern 'C' {") -# warning(" typedef void (*CoinSighandler_t) (int);") -# warning("}") - extern "C" { - typedef void (*CoinSighandler_t) (int); - } -#endif - -//############################################################################# - -#endif diff --git a/thirdparty/linux/include/coin1/CoinSimpFactorization.hpp b/thirdparty/linux/include/coin1/CoinSimpFactorization.hpp deleted file mode 100644 index 242b6cd2..00000000 --- a/thirdparty/linux/include/coin1/CoinSimpFactorization.hpp +++ /dev/null @@ -1,431 +0,0 @@ -/* $Id: CoinSimpFactorization.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2008, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -/* - This is a simple factorization of the LP Basis - */ -#ifndef CoinSimpFactorization_H -#define CoinSimpFactorization_H - -#include -#include -#include -#include "CoinTypes.hpp" -#include "CoinIndexedVector.hpp" -#include "CoinDenseFactorization.hpp" -class CoinPackedMatrix; - - -/// pointers used during factorization -class FactorPointers{ -public: - double *rowMax; - int *firstRowKnonzeros; - int *prevRow; - int *nextRow; - int *firstColKnonzeros; - int *prevColumn; - int *nextColumn; - int *newCols; - //constructor - FactorPointers( int numRows, int numCols, int *UrowLengths_, int *UcolLengths_ ); - // destructor - ~ FactorPointers(); -}; - -class CoinSimpFactorization : public CoinOtherFactorization { - friend void CoinSimpFactorizationUnitTest( const std::string & mpsDir ); - -public: - - /**@name Constructors and destructor and copy */ - //@{ - /// Default constructor - CoinSimpFactorization ( ); - /// Copy constructor - CoinSimpFactorization ( const CoinSimpFactorization &other); - - /// Destructor - virtual ~CoinSimpFactorization ( ); - /// = copy - CoinSimpFactorization & operator = ( const CoinSimpFactorization & other ); - /// Clone - virtual CoinOtherFactorization * clone() const ; - //@} - - /**@name Do factorization - public */ - //@{ - /// Gets space for a factorization - virtual void getAreas ( int numberRows, - int numberColumns, - CoinBigIndex maximumL, - CoinBigIndex maximumU ); - - /// PreProcesses column ordered copy of basis - virtual void preProcess ( ); - /** Does most of factorization returning status - 0 - OK - -99 - needs more memory - -1 - singular - use numberGoodColumns and redo - */ - virtual int factor ( ); - /// Does post processing on valid factorization - putting variables on correct rows - virtual void postProcess(const int * sequence, int * pivotVariable); - /// Makes a non-singular basis by replacing variables - virtual void makeNonSingular(int * sequence, int numberColumns); - //@} - - /**@name general stuff such as status */ - //@{ - /// Total number of elements in factorization - virtual inline int numberElements ( ) const { - return numberRows_*(numberColumns_+numberPivots_); - } - /// Returns maximum absolute value in factorization - double maximumCoefficient() const; - //@} - - /**@name rank one updates which do exist */ - //@{ - - /** Replaces one Column to basis, - returns 0=OK, 1=Probably OK, 2=singular, 3=no room - If checkBeforeModifying is true will do all accuracy checks - before modifying factorization. Whether to set this depends on - speed considerations. You could just do this on first iteration - after factorization and thereafter re-factorize - partial update already in U */ - virtual int replaceColumn ( CoinIndexedVector * regionSparse, - int pivotRow, - double pivotCheck , - bool checkBeforeModifying=false, - double acceptablePivot=1.0e-8); - //@} - - /**@name various uses of factorization (return code number elements) - which user may want to know about */ - //@{ - /** Updates one column (FTRAN) from regionSparse2 - Tries to do FT update - number returned is negative if no room - regionSparse starts as zero and is zero at end. - Note - if regionSparse2 packed on input - will be packed on output - */ - - virtual int updateColumnFT ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false); - - /** This version has same effect as above with FTUpdate==false - so number returned is always >=0 */ - virtual int updateColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false) const; - /// does FTRAN on two columns - virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1, - CoinIndexedVector * regionSparse2, - CoinIndexedVector * regionSparse3, - bool noPermute=false); - /// does updatecolumn if save==true keeps column for replace column - int upColumn ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2, - bool noPermute=false, bool save=false) const; - /** Updates one column (BTRAN) from regionSparse2 - regionSparse starts as zero and is zero at end - Note - if regionSparse2 packed on input - will be packed on output - */ - virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - /// does updateColumnTranspose, the other is a wrapper - int upColumnTranspose ( CoinIndexedVector * regionSparse, - CoinIndexedVector * regionSparse2) const; - //@} - /// *** Below this user may not want to know about - - /**@name various uses of factorization - which user may not want to know about (left over from my LP code) */ - //@{ - /// Get rid of all memory - inline void clearArrays() - { gutsOfDestructor();} - /// Returns array to put basis indices in - inline int * indices() const - { return reinterpret_cast (elements_+numberRows_*numberRows_);} - /// Returns permute in - virtual inline int * permute() const - { return pivotRow_;} - //@} - - /// The real work of destructor - void gutsOfDestructor(); - /// The real work of constructor - void gutsOfInitialize(); - /// The real work of copy - void gutsOfCopy(const CoinSimpFactorization &other); - - - /// calls factorization - void factorize(int numberOfRows, - int numberOfColumns, - const int colStarts[], - const int indicesRow[], - const double elements[]); - /// main loop of factorization - int mainLoopFactor (FactorPointers &pointers ); - /// copies L by rows - void copyLbyRows(); - /// copies U by columns - void copyUbyColumns(); - /// finds a pivot element using Markowitz count - int findPivot(FactorPointers &pointers, int &r, int &s, bool &ifSlack); - /// finds a pivot in a shortest column - int findPivotShCol(FactorPointers &pointers, int &r, int &s); - /// finds a pivot in the first column available - int findPivotSimp(FactorPointers &pointers, int &r, int &s); - /// does Gauss elimination - void GaussEliminate(FactorPointers &pointers, int &r, int &s); - /// finds short row that intersects a given column - int findShortRow(const int column, const int length, int &minRow, - int &minRowLength, FactorPointers &pointers); - /// finds short column that intersects a given row - int findShortColumn(const int row, const int length, int &minCol, - int &minColLength, FactorPointers &pointers); - /// finds maximum absolute value in a row - double findMaxInRrow(const int row, FactorPointers &pointers); - /// does pivoting - void pivoting(const int pivotRow, const int pivotColumn, - const double invPivot, FactorPointers &pointers); - /// part of pivoting - void updateCurrentRow(const int pivotRow, const int row, - const double multiplier, FactorPointers &pointers, - int &newNonZeros); - /// allocates more space for L - void increaseLsize(); - /// allocates more space for a row of U - void increaseRowSize(const int row, const int newSize); - /// allocates more space for a column of U - void increaseColSize(const int column, const int newSize, const bool b); - /// allocates more space for rows of U - void enlargeUrow(const int numNewElements); - /// allocates more space for columns of U - void enlargeUcol(const int numNewElements, const bool b); - /// finds a given row in a column - int findInRow(const int row, const int column); - /// finds a given column in a row - int findInColumn(const int column, const int row); - /// declares a row inactive - void removeRowFromActSet(const int row, FactorPointers &pointers); - /// declares a column inactive - void removeColumnFromActSet(const int column, FactorPointers &pointers); - /// allocates space for U - void allocateSpaceForU(); - /// allocates several working arrays - void allocateSomeArrays(); - /// initializes some numbers - void initialSomeNumbers(); - /// solves L x = b - void Lxeqb(double *b) const; - /// same as above but with two rhs - void Lxeqb2(double *b1, double *b2) const; - /// solves U x = b - void Uxeqb(double *b, double *sol) const; - /// same as above but with two rhs - void Uxeqb2(double *b1, double *sol1, double *sol2, double *b2) const; - /// solves x L = b - void xLeqb(double *b) const; - /// solves x U = b - void xUeqb(double *b, double *sol) const; - /// updates factorization after a Simplex iteration - int LUupdate(int newBasicCol); - /// creates a new eta vector - void newEta(int row, int numNewElements); - /// makes a copy of row permutations - void copyRowPermutations(); - /// solves H x = b, where H is a product of eta matrices - void Hxeqb(double *b) const; - /// same as above but with two rhs - void Hxeqb2(double *b1, double *b2) const; - /// solves x H = b - void xHeqb(double *b) const; - /// does FTRAN - void ftran(double *b, double *sol, bool save) const; - /// same as above but with two columns - void ftran2(double *b1, double *sol1, double *b2, double *sol2) const; - /// does BTRAN - void btran(double *b, double *sol) const; - ///--------------------------------------- - - - - //@} -protected: - /** Returns accuracy status of replaceColumn - returns 0=OK, 1=Probably OK, 2=singular */ - int checkPivot(double saveFromU, double oldPivot) const; -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// work array (should be initialized to zero) - double *denseVector_; - /// work array - double *workArea2_; - /// work array - double *workArea3_; - /// array of labels (should be initialized to zero) - int *vecLabels_; - /// array of indices - int *indVector_; - - /// auxiliary vector - double *auxVector_; - /// auxiliary vector - int *auxInd_; - - /// vector to keep for LUupdate - double *vecKeep_; - /// indices of this vector - int *indKeep_; - /// number of nonzeros - mutable int keepSize_; - - - - /// Starts of the rows of L - int *LrowStarts_; - /// Lengths of the rows of L - int *LrowLengths_; - /// L by rows - double *Lrows_; - /// indices in the rows of L - int *LrowInd_; - /// Size of Lrows_; - int LrowSize_; - /// Capacity of Lrows_ - int LrowCap_; - - /// Starts of the columns of L - int *LcolStarts_; - /// Lengths of the columns of L - int *LcolLengths_; - /// L by columns - double *Lcolumns_; - /// indices in the columns of L - int *LcolInd_; - /// numbers of elements in L - int LcolSize_; - /// maximum capacity of L - int LcolCap_; - - - /// Starts of the rows of U - int *UrowStarts_; - /// Lengths of the rows of U - int *UrowLengths_; -#ifdef COIN_SIMP_CAPACITY - /// Capacities of the rows of U - int *UrowCapacities_; -#endif - /// U by rows - double *Urows_; - /// Indices in the rows of U - int *UrowInd_; - /// maximum capacity of Urows - int UrowMaxCap_; - /// number of used places in Urows - int UrowEnd_; - /// first row in U - int firstRowInU_; - /// last row in U - int lastRowInU_; - /// previous row in U - int *prevRowInU_; - /// next row in U - int *nextRowInU_; - - /// Starts of the columns of U - int *UcolStarts_; - /// Lengths of the columns of U - int *UcolLengths_; -#ifdef COIN_SIMP_CAPACITY - /// Capacities of the columns of U - int *UcolCapacities_; -#endif - /// U by columns - double *Ucolumns_; - /// Indices in the columns of U - int *UcolInd_; - /// previous column in U - int *prevColInU_; - /// next column in U - int *nextColInU_; - /// first column in U - int firstColInU_; - /// last column in U - int lastColInU_; - /// maximum capacity of Ucolumns_ - int UcolMaxCap_; - /// last used position in Ucolumns_ - int UcolEnd_; - /// indicator of slack variables - int *colSlack_; - - /// inverse values of the elements of diagonal of U - double *invOfPivots_; - - /// permutation of columns - int *colOfU_; - /// position of column after permutation - int *colPosition_; - /// permutations of rows - int *rowOfU_; - /// position of row after permutation - int *rowPosition_; - /// permutations of rows during LUupdate - int *secRowOfU_; - /// position of row after permutation during LUupdate - int *secRowPosition_; - - /// position of Eta vector - int *EtaPosition_; - /// Starts of eta vectors - int *EtaStarts_; - /// Lengths of eta vectors - int *EtaLengths_; - /// columns of eta vectors - int *EtaInd_; - /// elements of eta vectors - double *Eta_; - /// number of elements in Eta_ - int EtaSize_; - /// last eta row - int lastEtaRow_; - /// maximum number of eta vectors - int maxEtaRows_; - /// Capacity of Eta_ - int EtaMaxCap_; - - /// minimum storage increase - int minIncrease_; - /// maximum size for the diagonal of U after update - double updateTol_; - /// do Shul heuristic - bool doSuhlHeuristic_; - /// maximum of U - double maxU_; - /// bound on the growth rate - double maxGrowth_; - /// maximum of A - double maxA_; - /// maximum number of candidates for pivot - int pivotCandLimit_; - /// number of slacks in basis - int numberSlacks_; - /// number of slacks in irst basis - int firstNumberSlacks_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinSmartPtr.hpp b/thirdparty/linux/include/coin1/CoinSmartPtr.hpp deleted file mode 100644 index 93366a24..00000000 --- a/thirdparty/linux/include/coin1/CoinSmartPtr.hpp +++ /dev/null @@ -1,528 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: CoinSmartPtr.hpp 1520 2012-01-29 00:43:31Z tkr $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 -// Removed lots of debugging stuff and reformatted: Laszlo Ladanyi, IBM -#ifndef CoinSmartPtr_hpp -#define CoinSmartPtr_hpp - -#include -#include -#include -#include - -namespace Coin { - - //######################################################################### - - /** ReferencedObject class. - * This is part of the implementation of an intrusive smart pointer - * design. This class stores the reference count of all the smart - * pointers that currently reference it. See the documentation for - * the SmartPtr class for more details. - * - * A SmartPtr behaves much like a raw pointer, but manages the lifetime - * of an object, deleting the object automatically. This class implements - * a reference-counting, intrusive smart pointer design, where all - * objects pointed to must inherit off of ReferencedObject, which - * stores the reference count. Although this is intrusive (native types - * and externally authored classes require wrappers to be referenced - * by smart pointers), it is a safer design. A more detailed discussion of - * these issues follows after the usage information. - * - * Usage Example: - * Note: to use the SmartPtr, all objects to which you point MUST - * inherit off of ReferencedObject. - * - * \verbatim - * - * In MyClass.hpp... - * - * #include "CoinSmartPtr.hpp" - - * - * class MyClass : public Coin::ReferencedObject // must derive from ReferencedObject - * { - * ... - * } - * - * In my_usage.cpp... - * - * #include "CoinSmartPtr.hpp" - * #include "MyClass.hpp" - * - * void func(AnyObject& obj) - * { - * Coin::SmartPtr ptr_to_myclass = new MyClass(...); - * // ptr_to_myclass now points to a new MyClass, - * // and the reference count is 1 - * - * ... - * - * obj.SetMyClass(ptr_to_myclass); - * // Here, let's assume that AnyObject uses a - * // SmartPtr internally here. - * // Now, both ptr_to_myclass and the internal - * // SmartPtr in obj point to the same MyClass object - * // and its reference count is 2. - * - * ... - * - * // No need to delete ptr_to_myclass, this - * // will be done automatically when the - * // reference count drops to zero. - * - * } - * - * \endverbatim - * - * Other Notes: - * The SmartPtr implements both dereference operators -> & *. - * The SmartPtr does NOT implement a conversion operator to - * the raw pointer. Use the GetRawPtr() method when this - * is necessary. Make sure that the raw pointer is NOT - * deleted. - * The SmartPtr implements the comparison operators == & != - * for a variety of types. Use these instead of - * \verbatim - * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this - * \endverbatim - * SmartPtr's, as currently implemented, do NOT handle circular references. - * For example: consider a higher level object using SmartPtrs to point - * to A and B, but A and B also point to each other (i.e. A has a - * SmartPtr to B and B has a SmartPtr to A). In this scenario, when the - * higher level object is finished with A and B, their reference counts - * will never drop to zero (since they reference each other) and they - * will not be deleted. This can be detected by memory leak tools like - * valgrind. If the circular reference is necessary, the problem can be - * overcome by a number of techniques: - * - * 1) A and B can have a method that "releases" each other, that is - * they set their internal SmartPtrs to NULL. - * \verbatim - * void AClass::ReleaseCircularReferences() - * { - * smart_ptr_to_B = NULL; - * } - * \endverbatim - * Then, the higher level class can call these methods before - * it is done using A & B. - * - * 2) Raw pointers can be used in A and B to reference each other. - * Here, an implicit assumption is made that the lifetime is - * controlled by the higher level object and that A and B will - * both exist in a controlled manner. Although this seems - * dangerous, in many situations, this type of referencing - * is very controlled and this is reasonably safe. - * - * 3) This SmartPtr class could be redesigned with the Weak/Strong - * design concept. Here, the SmartPtr is identified as being - * Strong (controls lifetime of the object) or Weak (merely - * referencing the object). The Strong SmartPtr increments - * (and decrements) the reference count in ReferencedObject - * but the Weak SmartPtr does not. In the example above, - * the higher level object would have Strong SmartPtrs to - * A and B, but A and B would have Weak SmartPtrs to each - * other. Then, when the higher level object was done with - * A and B, they would be deleted. The Weak SmartPtrs in A - * and B would not decrement the reference count and would, - * of course, not delete the object. This idea is very similar - * to item (2), where it is implied that the sequence of events - * is controlled such that A and B will not call anything using - * their pointers following the higher level delete (i.e. in - * their destructors!). This is somehow safer, however, because - * code can be written (however expensive) to perform run-time - * detection of this situation. For example, the ReferencedObject - * could store pointers to all Weak SmartPtrs that are referencing - * it and, in its destructor, tell these pointers that it is - * dying. They could then set themselves to NULL, or set an - * internal flag to detect usage past this point. - * - * Comments on Non-Intrusive Design: - * In a non-intrusive design, the reference count is stored somewhere other - * than the object being referenced. This means, unless the reference - * counting pointer is the first referencer, it must get a pointer to the - * referenced object from another smart pointer (so it has access to the - * reference count location). In this non-intrusive design, if we are - * pointing to an object with a smart pointer (or a number of smart - * pointers), and we then give another smart pointer the address through - * a RAW pointer, we will have two independent, AND INCORRECT, reference - * counts. To avoid this pitfall, we use an intrusive reference counting - * technique where the reference count is stored in the object being - * referenced. - */ - class ReferencedObject { - public: - ReferencedObject() : reference_count_(0) {} - virtual ~ReferencedObject() { assert(reference_count_ == 0); } - inline int ReferenceCount() const { return reference_count_; } - inline void AddRef() const { ++reference_count_; } - inline void ReleaseRef() const { --reference_count_; } - - private: - mutable int reference_count_; - }; - - //######################################################################### - - -//#define IP_DEBUG_SMARTPTR -#if COIN_IPOPT_CHECKLEVEL > 2 -# define IP_DEBUG_SMARTPTR -#endif -#ifdef IP_DEBUG_SMARTPTR -# include "IpDebug.hpp" -#endif - - /** Template class for Smart Pointers. - * A SmartPtr behaves much like a raw pointer, but manages the lifetime - * of an object, deleting the object automatically. This class implements - * a reference-counting, intrusive smart pointer design, where all - * objects pointed to must inherit off of ReferencedObject, which - * stores the reference count. Although this is intrusive (native types - * and externally authored classes require wrappers to be referenced - * by smart pointers), it is a safer design. A more detailed discussion of - * these issues follows after the usage information. - * - * Usage Example: - * Note: to use the SmartPtr, all objects to which you point MUST - * inherit off of ReferencedObject. - * - * \verbatim - * - * In MyClass.hpp... - * - * #include "CoinSmartPtr.hpp" - * - * class MyClass : public Coin::ReferencedObject // must derive from ReferencedObject - * { - * ... - * } - * - * In my_usage.cpp... - * - * #include "CoinSmartPtr.hpp" - * #include "MyClass.hpp" - * - * void func(AnyObject& obj) - * { - * SmartPtr ptr_to_myclass = new MyClass(...); - * // ptr_to_myclass now points to a new MyClass, - * // and the reference count is 1 - * - * ... - * - * obj.SetMyClass(ptr_to_myclass); - * // Here, let's assume that AnyObject uses a - * // SmartPtr internally here. - * // Now, both ptr_to_myclass and the internal - * // SmartPtr in obj point to the same MyClass object - * // and its reference count is 2. - * - * ... - * - * // No need to delete ptr_to_myclass, this - * // will be done automatically when the - * // reference count drops to zero. - * - * } - * - * \endverbatim - * - * It is not necessary to use SmartPtr's in all cases where an - * object is used that has been allocated "into" a SmartPtr. It is - * possible to just pass objects by reference or regular pointers, - * even if lower down in the stack a SmartPtr is to be held on to. - * Everything should work fine as long as a pointer created by "new" - * is immediately passed into a SmartPtr, and if SmartPtr's are used - * to hold on to objects. - * - * Other Notes: - * The SmartPtr implements both dereference operators -> & *. - * The SmartPtr does NOT implement a conversion operator to - * the raw pointer. Use the GetRawPtr() method when this - * is necessary. Make sure that the raw pointer is NOT - * deleted. - * The SmartPtr implements the comparison operators == & != - * for a variety of types. Use these instead of - * \verbatim - * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this - * \endverbatim - * SmartPtr's, as currently implemented, do NOT handle circular references. - * For example: consider a higher level object using SmartPtrs to point to - * A and B, but A and B also point to each other (i.e. A has a SmartPtr - * to B and B has a SmartPtr to A). In this scenario, when the higher - * level object is finished with A and B, their reference counts will - * never drop to zero (since they reference each other) and they - * will not be deleted. This can be detected by memory leak tools like - * valgrind. If the circular reference is necessary, the problem can be - * overcome by a number of techniques: - * - * 1) A and B can have a method that "releases" each other, that is - * they set their internal SmartPtrs to NULL. - * \verbatim - * void AClass::ReleaseCircularReferences() - * { - * smart_ptr_to_B = NULL; - * } - * \endverbatim - * Then, the higher level class can call these methods before - * it is done using A & B. - * - * 2) Raw pointers can be used in A and B to reference each other. - * Here, an implicit assumption is made that the lifetime is - * controlled by the higher level object and that A and B will - * both exist in a controlled manner. Although this seems - * dangerous, in many situations, this type of referencing - * is very controlled and this is reasonably safe. - * - * 3) This SmartPtr class could be redesigned with the Weak/Strong - * design concept. Here, the SmartPtr is identified as being - * Strong (controls lifetime of the object) or Weak (merely - * referencing the object). The Strong SmartPtr increments - * (and decrements) the reference count in ReferencedObject - * but the Weak SmartPtr does not. In the example above, - * the higher level object would have Strong SmartPtrs to - * A and B, but A and B would have Weak SmartPtrs to each - * other. Then, when the higher level object was done with - * A and B, they would be deleted. The Weak SmartPtrs in A - * and B would not decrement the reference count and would, - * of course, not delete the object. This idea is very similar - * to item (2), where it is implied that the sequence of events - * is controlled such that A and B will not call anything using - * their pointers following the higher level delete (i.e. in - * their destructors!). This is somehow safer, however, because - * code can be written (however expensive) to perform run-time - * detection of this situation. For example, the ReferencedObject - * could store pointers to all Weak SmartPtrs that are referencing - * it and, in its destructor, tell these pointers that it is - * dying. They could then set themselves to NULL, or set an - * internal flag to detect usage past this point. - * - * Comments on Non-Intrusive Design: - * In a non-intrusive design, the reference count is stored somewhere other - * than the object being referenced. This means, unless the reference - * counting pointer is the first referencer, it must get a pointer to the - * referenced object from another smart pointer (so it has access to the - * reference count location). In this non-intrusive design, if we are - * pointing to an object with a smart pointer (or a number of smart - * pointers), and we then give another smart pointer the address through - * a RAW pointer, we will have two independent, AND INCORRECT, reference - * counts. To avoid this pitfall, we use an intrusive reference counting - * technique where the reference count is stored in the object being - * referenced. - */ - template - class SmartPtr { - public: - /** Returns the raw pointer contained. Use to get the value of the - * raw ptr (i.e. to pass to other methods/functions, etc.) Note: This - * method does NOT copy, therefore, modifications using this value - * modify the underlying object contained by the SmartPtr, NEVER - * delete this returned value. - */ - T* GetRawPtr() const { return ptr_; } - - /** Returns true if the SmartPtr is NOT NULL. - * Use this to check if the SmartPtr is not null - * This is preferred to if(GetRawPtr(sp) != NULL) - */ - bool IsValid() const { return ptr_ != NULL; } - - /** Returns true if the SmartPtr is NULL. - * Use this to check if the SmartPtr IsNull. - * This is preferred to if(GetRawPtr(sp) == NULL) - */ - bool IsNull() const { return ptr_ == NULL; } - - private: - /**@name Private Data/Methods */ - //@{ - /** Actual raw pointer to the object. */ - T* ptr_; - - /** Release the currently referenced object. */ - void ReleasePointer_() { - if (ptr_) { - ptr_->ReleaseRef(); - if (ptr_->ReferenceCount() == 0) { - delete ptr_; - } - ptr_ = NULL; - } - } - - /** Set the value of the internal raw pointer from another raw - * pointer, releasing the previously referenced object if necessary. */ - SmartPtr& SetFromRawPtr_(T* rhs){ - ReleasePointer_(); // Release any old pointer - if (rhs != NULL) { - rhs->AddRef(); - ptr_ = rhs; - } - return *this; - } - - /** Set the value of the internal raw pointer from a SmartPtr, - * releasing the previously referenced object if necessary. */ - inline SmartPtr& SetFromSmartPtr_(const SmartPtr& rhs) { - SetFromRawPtr_(rhs.GetRawPtr()); - return (*this); - } - - //@} - - public: -#define dbg_smartptr_verbosity 0 - - /**@name Constructors/Destructors */ - //@{ - /** Default constructor, initialized to NULL */ - SmartPtr() : ptr_(NULL) {} - - /** Copy constructor, initialized from copy */ - SmartPtr(const SmartPtr& copy) : ptr_(NULL) { - (void) SetFromSmartPtr_(copy); - } - - /** Constructor, initialized from T* ptr */ - SmartPtr(T* ptr) : ptr_(NULL) { - (void) SetFromRawPtr_(ptr); - } - - /** Destructor, automatically decrements the reference count, deletes - * the object if necessary.*/ - ~SmartPtr() { - ReleasePointer_(); - } - //@} - - /**@name Overloaded operators. */ - //@{ - /** Overloaded arrow operator, allows the user to call - * methods using the contained pointer. */ - T* operator->() const { -#if COIN_COINUTILS_CHECKLEVEL > 0 - assert(ptr_); -#endif - return ptr_; - } - - /** Overloaded dereference operator, allows the user - * to dereference the contained pointer. */ - T& operator*() const { -#if COIN_IPOPT_CHECKLEVEL > 0 - assert(ptr_); -#endif - return *ptr_; - } - - /** Overloaded equals operator, allows the user to - * set the value of the SmartPtr from a raw pointer */ - SmartPtr& operator=(T* rhs) { - return SetFromRawPtr_(rhs); - } - - /** Overloaded equals operator, allows the user to - * set the value of the SmartPtr from another - * SmartPtr */ - SmartPtr& operator=(const SmartPtr& rhs) { - return SetFromSmartPtr_(rhs); - } - - /** Overloaded equality comparison operator, allows the - * user to compare the value of two SmartPtrs */ - template - friend - bool operator==(const SmartPtr& lhs, const SmartPtr& rhs); - - /** Overloaded equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator==(const SmartPtr& lhs, U2* raw_rhs); - - /** Overloaded equality comparison operator, allows the - * user to compare the value of a raw pointer with a SmartPtr. */ - template - friend - bool operator==(U1* lhs, const SmartPtr& raw_rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of two SmartPtrs */ - template - friend - bool operator!=(const SmartPtr& lhs, const SmartPtr& rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator!=(const SmartPtr& lhs, U2* raw_rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator!=(U1* lhs, const SmartPtr& raw_rhs); - //@} - - }; - - template - bool ComparePointers(const U1* lhs, const U2* rhs) { - if (lhs == rhs) { - return true; - } - // If lhs and rhs point to the same object with different interfaces - // U1 and U2, we cannot guarantee that the value of the pointers will - // be equivalent. We can guarantee this if we convert to void*. - return static_cast(lhs) == static_cast(rhs); - } - -} // namespace Coin - -//############################################################################# - -/**@name SmartPtr friends that are overloaded operators, so they are not in - the Coin namespace. */ -//@{ -template -bool operator==(const Coin::SmartPtr& lhs, const Coin::SmartPtr& rhs) { - return Coin::ComparePointers(lhs.GetRawPtr(), rhs.GetRawPtr()); -} - -template -bool operator==(const Coin::SmartPtr& lhs, U2* raw_rhs) { - return Coin::ComparePointers(lhs.GetRawPtr(), raw_rhs); -} - -template -bool operator==(U1* raw_lhs, const Coin::SmartPtr& rhs) { - return Coin::ComparePointers(raw_lhs, rhs.GetRawPtr()); -} - -template -bool operator!=(const Coin::SmartPtr& lhs, const Coin::SmartPtr& rhs) { - return ! operator==(lhs, rhs); -} - -template -bool operator!=(const Coin::SmartPtr& lhs, U2* raw_rhs) { - return ! operator==(lhs, raw_rhs); -} - -template -bool operator!=(U1* raw_lhs, const Coin::SmartPtr& rhs) { - return ! operator==(raw_lhs, rhs); -} -//@} - -#define CoinReferencedObject Coin::ReferencedObject -#define CoinSmartPtr Coin::SmartPtr -#define CoinComparePointers Coin::ComparePointers - -#endif diff --git a/thirdparty/linux/include/coin1/CoinSnapshot.hpp b/thirdparty/linux/include/coin1/CoinSnapshot.hpp deleted file mode 100644 index e928026b..00000000 --- a/thirdparty/linux/include/coin1/CoinSnapshot.hpp +++ /dev/null @@ -1,476 +0,0 @@ -/* $Id: CoinSnapshot.hpp 1416 2011-04-17 09:57:29Z stefan $ */ -// Copyright (C) 2006, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinSnapshot_H -#define CoinSnapshot_H - -class CoinPackedMatrix; -#include "CoinTypes.hpp" - -//############################################################################# - -/** NON Abstract Base Class for interfacing with cut generators or branching code or .. - It is designed to be snapshot of a problem at a node in tree - - The class may or may not own the arrays - see owned_ - - - Querying a problem that has no data associated with it will result in - zeros for the number of rows and columns, and NULL pointers from - the methods that return arrays. -*/ - -class CoinSnapshot { - -public: - - //--------------------------------------------------------------------------- - /**@name Problem query methods - - The Matrix pointers may be NULL - */ - //@{ - /// Get number of columns - inline int getNumCols() const - { return numCols_;} - - /// Get number of rows - inline int getNumRows() const - { return numRows_;} - - /// Get number of nonzero elements - inline int getNumElements() const - { return numElements_;} - - /// Get number of integer variables - inline int getNumIntegers() const - { return numIntegers_;} - - /// Get pointer to array[getNumCols()] of column lower bounds - inline const double * getColLower() const - { return colLower_;} - - /// Get pointer to array[getNumCols()] of column upper bounds - inline const double * getColUpper() const - { return colUpper_;} - - /// Get pointer to array[getNumRows()] of row lower bounds - inline const double * getRowLower() const - { return rowLower_;} - - /// Get pointer to array[getNumRows()] of row upper bounds - inline const double * getRowUpper() const - { return rowUpper_;} - - /** Get pointer to array[getNumRows()] of row right-hand sides - This gives same results as OsiSolverInterface for useful cases - If getRowUpper()[i] != infinity then - getRightHandSide()[i] == getRowUpper()[i] - else - getRightHandSide()[i] == getRowLower()[i] - */ - inline const double * getRightHandSide() const - { return rightHandSide_;} - - /// Get pointer to array[getNumCols()] of objective function coefficients - inline const double * getObjCoefficients() const - { return objCoefficients_;} - - /// Get objective function sense (1 for min (default), -1 for max) - inline double getObjSense() const - { return objSense_;} - - /// Return true if variable is continuous - inline bool isContinuous(int colIndex) const - { return colType_[colIndex]=='C';} - - /// Return true if variable is binary - inline bool isBinary(int colIndex) const - { return colType_[colIndex]=='B';} - - /// Return true if column is integer. - inline bool isInteger(int colIndex) const - { return colType_[colIndex]=='B'||colType_[colIndex]=='I';} - - /// Return true if variable is general integer - inline bool isIntegerNonBinary(int colIndex) const - { return colType_[colIndex]=='I';} - - /// Return true if variable is binary and not fixed at either bound - inline bool isFreeBinary(int colIndex) const - { return colType_[colIndex]=='B'&&colUpper_[colIndex]>colLower_[colIndex];} - - /// Get colType array ('B', 'I', or 'C' for Binary, Integer and Continuous) - inline const char * getColType() const - { return colType_;} - - /// Get pointer to row-wise copy of current matrix - inline const CoinPackedMatrix * getMatrixByRow() const - { return matrixByRow_;} - - /// Get pointer to column-wise copy of current matrix - inline const CoinPackedMatrix * getMatrixByCol() const - { return matrixByCol_;} - - /// Get pointer to row-wise copy of "original" matrix - inline const CoinPackedMatrix * getOriginalMatrixByRow() const - { return originalMatrixByRow_;} - - /// Get pointer to column-wise copy of "original" matrix - inline const CoinPackedMatrix * getOriginalMatrixByCol() const - { return originalMatrixByCol_;} - //@} - - /**@name Solution query methods */ - //@{ - /// Get pointer to array[getNumCols()] of primal variable values - inline const double * getColSolution() const - { return colSolution_;} - - /// Get pointer to array[getNumRows()] of dual variable values - inline const double * getRowPrice() const - { return rowPrice_;} - - /// Get a pointer to array[getNumCols()] of reduced costs - inline const double * getReducedCost() const - { return reducedCost_;} - - /// Get pointer to array[getNumRows()] of row activity levels (constraint matrix times the solution vector). - inline const double * getRowActivity() const - { return rowActivity_;} - - /// Get pointer to array[getNumCols()] of primal variable values which should not be separated (for debug) - inline const double * getDoNotSeparateThis() const - { return doNotSeparateThis_;} - //@} - - /**@name Other scalar get methods */ - //@{ - /// Get solver's value for infinity - inline double getInfinity() const - { return infinity_;} - - /** Get objective function value - includinbg any offset i.e. - sum c sub j * x subj - objValue = objOffset */ - inline double getObjValue() const - { return objValue_;} - - /// Get objective offset i.e. sum c sub j * x subj -objValue = objOffset - inline double getObjOffset() const - { return objOffset_;} - - /// Get dual tolerance - inline double getDualTolerance() const - { return dualTolerance_;} - - /// Get primal tolerance - inline double getPrimalTolerance() const - { return primalTolerance_;} - - /// Get integer tolerance - inline double getIntegerTolerance() const - { return integerTolerance_;} - - /// Get integer upper bound i.e. best solution * getObjSense - inline double getIntegerUpperBound() const - { return integerUpperBound_;} - - /// Get integer lower bound i.e. best possible solution * getObjSense - inline double getIntegerLowerBound() const - { return integerLowerBound_;} - //@} - - //--------------------------------------------------------------------------- - - /**@name Method to input a problem */ - //@{ - /** Load in an problem by copying the arguments (the constraints on the - rows are given by lower and upper bounds). If a pointer is NULL then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - All solution type arrays will be deleted - */ - void loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - bool makeRowCopy=false); - - //@} - - //--------------------------------------------------------------------------- - - /**@name Methods to set data */ - //@{ - /// Set number of columns - inline void setNumCols(int value) - { numCols_ = value;} - - /// Set number of rows - inline void setNumRows(int value) - { numRows_ = value;} - - /// Set number of nonzero elements - inline void setNumElements(int value) - { numElements_ = value;} - - /// Set number of integer variables - inline void setNumIntegers(int value) - { numIntegers_ = value;} - - /// Set pointer to array[getNumCols()] of column lower bounds - void setColLower(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumCols()] of column upper bounds - void setColUpper(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumRows()] of row lower bounds - void setRowLower(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumRows()] of row upper bounds - void setRowUpper(const double * array, bool copyIn=true); - - /** Set pointer to array[getNumRows()] of row right-hand sides - This gives same results as OsiSolverInterface for useful cases - If getRowUpper()[i] != infinity then - getRightHandSide()[i] == getRowUpper()[i] - else - getRightHandSide()[i] == getRowLower()[i] - */ - void setRightHandSide(const double * array, bool copyIn=true); - - /** Create array[getNumRows()] of row right-hand sides - using existing information - This gives same results as OsiSolverInterface for useful cases - If getRowUpper()[i] != infinity then - getRightHandSide()[i] == getRowUpper()[i] - else - getRightHandSide()[i] == getRowLower()[i] - */ - void createRightHandSide(); - - /// Set pointer to array[getNumCols()] of objective function coefficients - void setObjCoefficients(const double * array, bool copyIn=true); - - /// Set objective function sense (1 for min (default), -1 for max) - inline void setObjSense(double value) - { objSense_ = value;} - - /// Set colType array ('B', 'I', or 'C' for Binary, Integer and Continuous) - void setColType(const char *array, bool copyIn=true); - - /// Set pointer to row-wise copy of current matrix - void setMatrixByRow(const CoinPackedMatrix * matrix, bool copyIn=true); - - /// Create row-wise copy from MatrixByCol - void createMatrixByRow(); - - /// Set pointer to column-wise copy of current matrix - void setMatrixByCol(const CoinPackedMatrix * matrix, bool copyIn=true); - - /// Set pointer to row-wise copy of "original" matrix - void setOriginalMatrixByRow(const CoinPackedMatrix * matrix, bool copyIn=true); - - /// Set pointer to column-wise copy of "original" matrix - void setOriginalMatrixByCol(const CoinPackedMatrix * matrix, bool copyIn=true); - - /// Set pointer to array[getNumCols()] of primal variable values - void setColSolution(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumRows()] of dual variable values - void setRowPrice(const double * array, bool copyIn=true); - - /// Set a pointer to array[getNumCols()] of reduced costs - void setReducedCost(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumRows()] of row activity levels (constraint matrix times the solution vector). - void setRowActivity(const double * array, bool copyIn=true); - - /// Set pointer to array[getNumCols()] of primal variable values which should not be separated (for debug) - void setDoNotSeparateThis(const double * array, bool copyIn=true); - - /// Set solver's value for infinity - inline void setInfinity(double value) - { infinity_ = value;} - - /// Set objective function value (including any rhs offset) - inline void setObjValue(double value) - { objValue_ = value;} - - /// Set objective offset i.e. sum c sub j * x subj -objValue = objOffset - inline void setObjOffset(double value) - { objOffset_ = value;} - - /// Set dual tolerance - inline void setDualTolerance(double value) - { dualTolerance_ = value;} - - /// Set primal tolerance - inline void setPrimalTolerance(double value) - { primalTolerance_ = value;} - - /// Set integer tolerance - inline void setIntegerTolerance(double value) - { integerTolerance_ = value;} - - /// Set integer upper bound i.e. best solution * getObjSense - inline void setIntegerUpperBound(double value) - { integerUpperBound_ = value;} - - /// Set integer lower bound i.e. best possible solution * getObjSense - inline void setIntegerLowerBound(double value) - { integerLowerBound_ = value;} - //@} - - //--------------------------------------------------------------------------- - - ///@name Constructors and destructors - //@{ - /// Default Constructor - CoinSnapshot(); - - /// Copy constructor - CoinSnapshot(const CoinSnapshot &); - - /// Assignment operator - CoinSnapshot & operator=(const CoinSnapshot& rhs); - - /// Destructor - virtual ~CoinSnapshot (); - - //@} - -private: - ///@name private functions - //@{ - /** Does main work of destructor - type (or'ed) - 1 - NULLify pointers - 2 - delete pointers - 4 - initialize scalars (tolerances etc) - 8 - initialize scalars (objValue etc0 - */ - void gutsOfDestructor(int type); - /// Does main work of copy - void gutsOfCopy(const CoinSnapshot & rhs); - //@} - - ///@name Private member data - - /// objective function sense (1 for min (default), -1 for max) - double objSense_; - - /// solver's value for infinity - double infinity_; - - /// objective function value (including any rhs offset) - double objValue_; - - /// objective offset i.e. sum c sub j * x subj -objValue = objOffset - double objOffset_; - - /// dual tolerance - double dualTolerance_; - - /// primal tolerance - double primalTolerance_; - - /// integer tolerance - double integerTolerance_; - - /// integer upper bound i.e. best solution * getObjSense - double integerUpperBound_; - - /// integer lower bound i.e. best possible solution * getObjSense - double integerLowerBound_; - - /// pointer to array[getNumCols()] of column lower bounds - const double * colLower_; - - /// pointer to array[getNumCols()] of column upper bounds - const double * colUpper_; - - /// pointer to array[getNumRows()] of row lower bounds - const double * rowLower_; - - /// pointer to array[getNumRows()] of row upper bounds - const double * rowUpper_; - - /// pointer to array[getNumRows()] of rhs side values - const double * rightHandSide_; - - /// pointer to array[getNumCols()] of objective function coefficients - const double * objCoefficients_; - - /// colType array ('B', 'I', or 'C' for Binary, Integer and Continuous) - const char * colType_; - - /// pointer to row-wise copy of current matrix - const CoinPackedMatrix * matrixByRow_; - - /// pointer to column-wise copy of current matrix - const CoinPackedMatrix * matrixByCol_; - - /// pointer to row-wise copy of "original" matrix - const CoinPackedMatrix * originalMatrixByRow_; - - /// pointer to column-wise copy of "original" matrix - const CoinPackedMatrix * originalMatrixByCol_; - - /// pointer to array[getNumCols()] of primal variable values - const double * colSolution_; - - /// pointer to array[getNumRows()] of dual variable values - const double * rowPrice_; - - /// a pointer to array[getNumCols()] of reduced costs - const double * reducedCost_; - - /// pointer to array[getNumRows()] of row activity levels (constraint matrix times the solution vector). - const double * rowActivity_; - - /// pointer to array[getNumCols()] of primal variable values which should not be separated (for debug) - const double * doNotSeparateThis_; - - /// number of columns - int numCols_; - - /// number of rows - int numRows_; - - /// number of nonzero elements - int numElements_; - - /// number of integer variables - int numIntegers_; - - /// To say whether arrays etc are owned by CoinSnapshot - typedef struct { - unsigned int colLower:1; - unsigned int colUpper:1; - unsigned int rowLower:1; - unsigned int rowUpper:1; - unsigned int rightHandSide:1; - unsigned int objCoefficients:1; - unsigned int colType:1; - unsigned int matrixByRow:1; - unsigned int matrixByCol:1; - unsigned int originalMatrixByRow:1; - unsigned int originalMatrixByCol:1; - unsigned int colSolution:1; - unsigned int rowPrice:1; - unsigned int reducedCost:1; - unsigned int rowActivity:1; - unsigned int doNotSeparateThis:1; - } coinOwned; - coinOwned owned_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinSort.hpp b/thirdparty/linux/include/coin1/CoinSort.hpp deleted file mode 100644 index 259fb351..00000000 --- a/thirdparty/linux/include/coin1/CoinSort.hpp +++ /dev/null @@ -1,678 +0,0 @@ -/* $Id: CoinSort.hpp 1594 2013-04-19 14:33:00Z forrest $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinSort_H -#define CoinSort_H - -#include -#include -#include -#include "CoinDistance.hpp" - -// Uncomment the next three lines to get thorough initialisation of memory. -// #ifndef ZEROFAULT -// #define ZEROFAULT -// #endif - -#ifdef COIN_FAST_CODE -#ifndef COIN_USE_EKK_SORT -#define COIN_USE_EKK_SORT -#endif -#endif - -//############################################################################# - -/** An ordered pair. It's the same as std::pair, just this way it'll have the - same look as the triple sorting. */ -template -struct CoinPair { -public: - /// First member of pair - S first; - /// Second member of pair - T second; -public: - /// Construct from ordered pair - CoinPair(const S& s, const T& t) : first(s), second(t) {} -}; - -//############################################################################# - -/**@name Comparisons on first element of two ordered pairs */ -//@{ -/** Function operator. - Returns true if t1.first < t2.first (i.e., increasing). */ -template < class S, class T> -class CoinFirstLess_2 { -public: - /// Compare function - inline bool operator()(const CoinPair& t1, - const CoinPair& t2) const - { return t1.first < t2.first; } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if t1.first > t2.first (i.e, decreasing). */ -template < class S, class T> -class CoinFirstGreater_2 { -public: - /// Compare function - inline bool operator()(const CoinPair& t1, - const CoinPair& t2) const - { return t1.first > t2.first; } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if abs(t1.first) < abs(t2.first) (i.e., increasing). */ -template < class S, class T> -class CoinFirstAbsLess_2 { -public: - /// Compare function - inline bool operator()(const CoinPair& t1, - const CoinPair& t2) const - { - const T t1Abs = t1.first < static_cast(0) ? -t1.first : t1.first; - const T t2Abs = t2.first < static_cast(0) ? -t2.first : t2.first; - return t1Abs < t2Abs; - } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if abs(t1.first) > abs(t2.first) (i.e., decreasing). */ -template < class S, class T> -class CoinFirstAbsGreater_2 { -public: - /// Compare function - inline bool operator()(CoinPair t1, CoinPair t2) const - { - const T t1Abs = t1.first < static_cast(0) ? -t1.first : t1.first; - const T t2Abs = t2.first < static_cast(0) ? -t2.first : t2.first; - return t1Abs > t2Abs; - } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Compare based on the entries of an external vector, i.e., returns true if - vec[t1.first < vec[t2.first] (i.e., increasing wrt. vec). Note that to - use this comparison operator .first must be a data type automatically - convertible to int. */ -template < class S, class T, class V> -class CoinExternalVectorFirstLess_2 { -private: - CoinExternalVectorFirstLess_2(); -private: - const V* vec_; -public: - inline bool operator()(const CoinPair& t1, - const CoinPair& t2) const - { return vec_[t1.first] < vec_[t2.first]; } - CoinExternalVectorFirstLess_2(const V* v) : vec_(v) {} -}; -//----------------------------------------------------------------------------- -/** Function operator. - Compare based on the entries of an external vector, i.e., returns true if - vec[t1.first > vec[t2.first] (i.e., decreasing wrt. vec). Note that to - use this comparison operator .first must be a data type automatically - convertible to int. */ -template < class S, class T, class V> -class CoinExternalVectorFirstGreater_2 { -private: - CoinExternalVectorFirstGreater_2(); -private: - const V* vec_; -public: - inline bool operator()(const CoinPair& t1, - const CoinPair& t2) const - { return vec_[t1.first] > vec_[t2.first]; } - CoinExternalVectorFirstGreater_2(const V* v) : vec_(v) {} -}; -//@} - -//############################################################################# - -/** Sort a pair of containers.
      - - Iter_S - iterator for first container
      - Iter_T - iterator for 2nd container
      - CoinCompare2 - class comparing CoinPairs
      -*/ - -#ifdef COIN_SORT_ARBITRARY_CONTAINERS -template void -CoinSort_2(Iter_S sfirst, Iter_S slast, Iter_T tfirst, const CoinCompare2& pc) -{ - typedef typename std::iterator_traits::value_type S; - typedef typename std::iterator_traits::value_type T; - const size_t len = coinDistance(sfirst, slast); - if (len <= 1) - return; - - typedef CoinPair ST_pair; - ST_pair* x = static_cast(::operator new(len * sizeof(ST_pair))); -# ifdef ZEROFAULT - memset(x,0,(len*sizeof(ST_pair))) ; -# endif - - int i = 0; - Iter_S scurrent = sfirst; - Iter_T tcurrent = tfirst; - while (scurrent != slast) { - new (x+i++) ST_pair(*scurrent++, *tcurrent++); - } - - std::sort(x.begin(), x.end(), pc); - - scurrent = sfirst; - tcurrent = tfirst; - for (i = 0; i < len; ++i) { - *scurrent++ = x[i].first; - *tcurrent++ = x[i].second; - } - - ::operator delete(x); -} -//----------------------------------------------------------------------------- -template void -CoinSort_2(Iter_S sfirst, Iter_S slast, Iter_T tfirst) -{ - typedef typename std::iterator_traits::value_type S; - typedef typename std::iterator_traits::value_type T; - CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2()); -} - -#else //======================================================================= - -template void -CoinSort_2(S* sfirst, S* slast, T* tfirst, const CoinCompare2& pc) -{ - const size_t len = coinDistance(sfirst, slast); - if (len <= 1) - return; - - typedef CoinPair ST_pair; - ST_pair* x = static_cast(::operator new(len * sizeof(ST_pair))); -# ifdef ZEROFAULT - // Can show RUI errors on some systems due to copy of ST_pair with gaps. - // E.g., has 4 byte alignment gap on Solaris/SUNWspro. - memset(x,0,(len*sizeof(ST_pair))) ; -# endif - - size_t i = 0; - S* scurrent = sfirst; - T* tcurrent = tfirst; - while (scurrent != slast) { - new (x+i++) ST_pair(*scurrent++, *tcurrent++); - } - - std::sort(x, x + len, pc); - - scurrent = sfirst; - tcurrent = tfirst; - for (i = 0; i < len; ++i) { - *scurrent++ = x[i].first; - *tcurrent++ = x[i].second; - } - - ::operator delete(x); -} -template void -// This Always uses std::sort -CoinSort_2Std(S* sfirst, S* slast, T* tfirst) -{ - CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2()); -} -#ifndef COIN_USE_EKK_SORT -//----------------------------------------------------------------------------- -template void -CoinSort_2(S* sfirst, S* slast, T* tfirst) -{ - CoinSort_2(sfirst, slast, tfirst, CoinFirstLess_2()); -} -#else -//----------------------------------------------------------------------------- -extern int boundary_sort; -extern int boundary_sort2; -extern int boundary_sort3; -/// Sort without new and delete -template void -CoinSort_2(S* key, S* lastKey, T* array2) -{ - const size_t number = coinDistance(key, lastKey); - if (number <= 1) { - return; - } else if (number>10000) { - CoinSort_2Std(key, lastKey, array2); - return; - } -#if 0 - if (number==boundary_sort3) { - printf("before sort %d entries\n",number); - for (int j=0;j(number); - int sp; - S *v = key; - S *m, t; - S * ls[32] , * rs[32]; - S *l , *r , c; - T it; - int j; - /*check already sorted */ - S last=key[0]; - for (j=1;j=last) { - last=key[j]; - } else { - break; - } /* endif */ - } /* endfor */ - if (j==n) { - return; - } /* endif */ - sp = 0 ; ls[sp] = v ; rs[sp] = v + (n-1) ; - while( sp >= 0 ) - { - if ( rs[sp] - ls[sp] > minsize ) - { - l = ls[sp] ; r = rs[sp] ; m = l + (r-l)/2 ; - if ( *l > *m ) - { - t = *l ; *l = *m ; *m = t ; - it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ; - } - if ( *m > *r ) - { - t = *m ; *m = *r ; *r = t ; - it = array2[m-v] ; array2[m-v] = array2[r-v] ; array2[r-v] = it ; - if ( *l > *m ) - { - t = *l ; *l = *m ; *m = t ; - it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ; - } - } - c = *m ; - while ( r - l > 1 ) - { - while ( *(++l) < c ) ; - while ( *(--r) > c ) ; - t = *l ; *l = *r ; *r = t ; - it = array2[l-v] ; array2[l-v] = array2[r-v] ; array2[r-v] = it ; - } - l = r - 1 ; - if ( l < m ) - { ls[sp+1] = ls[sp] ; - rs[sp+1] = l ; - ls[sp ] = r ; - } - else - { ls[sp+1] = r ; - rs[sp+1] = rs[sp] ; - rs[sp ] = l ; - } - sp++ ; - } - else sp-- ; - } - for ( l = v , m = v + (n-1) ; l < m ; l++ ) - { if ( *l > *(l+1) ) - { - c = *(l+1) ; - it = array2[(l-v)+1] ; - for ( r = l ; r >= v && *r > c ; r-- ) - { - *(r+1) = *r ; - array2[(r-v)+1] = array2[(r-v)] ; - } - *(r+1) = c ; - array2[(r-v)+1] = it ; - } - } -#if 0 - if (number==boundary_sort3) { - printf("after sort %d entries\n",number); - for (int j=0;j void -CoinShortSort_2(S* key, S* lastKey, T* array2) -{ - const size_t number = coinDistance(key, lastKey); - if (number <= 2) { - if (number == 2 && key[0] > key[1]) { - S tempS = key[0]; - T tempT = array2[0]; - key[0] = key[1]; - array2[0] = array2[1]; - key[1] = tempS; - array2[1] = tempT; - } - return; - } else if (number>10000) { - CoinSort_2Std(key, lastKey, array2); - return; - } - int minsize=10; - size_t n = number; - int sp; - S *v = key; - S *m, t; - S * ls[32] , * rs[32]; - S *l , *r , c; - T it; - size_t j; - /*check already sorted */ - S last=key[0]; - for (j=1;j=last) { - last=key[j]; - } else { - break; - } /* endif */ - } /* endfor */ - if (j==n) { - return; - } /* endif */ - sp = 0 ; ls[sp] = v ; rs[sp] = v + (n-1) ; - while( sp >= 0 ) - { - if ( rs[sp] - ls[sp] > minsize ) - { - l = ls[sp] ; r = rs[sp] ; m = l + (r-l)/2 ; - if ( *l > *m ) - { - t = *l ; *l = *m ; *m = t ; - it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ; - } - if ( *m > *r ) - { - t = *m ; *m = *r ; *r = t ; - it = array2[m-v] ; array2[m-v] = array2[r-v] ; array2[r-v] = it ; - if ( *l > *m ) - { - t = *l ; *l = *m ; *m = t ; - it = array2[l-v] ; array2[l-v] = array2[m-v] ; array2[m-v] = it ; - } - } - c = *m ; - while ( r - l > 1 ) - { - while ( *(++l) < c ) ; - while ( *(--r) > c ) ; - t = *l ; *l = *r ; *r = t ; - it = array2[l-v] ; array2[l-v] = array2[r-v] ; array2[r-v] = it ; - } - l = r - 1 ; - if ( l < m ) - { ls[sp+1] = ls[sp] ; - rs[sp+1] = l ; - ls[sp ] = r ; - } - else - { ls[sp+1] = r ; - rs[sp+1] = rs[sp] ; - rs[sp ] = l ; - } - sp++ ; - } - else sp-- ; - } - for ( l = v , m = v + (n-1) ; l < m ; l++ ) - { if ( *l > *(l+1) ) - { - c = *(l+1) ; - it = array2[(l-v)+1] ; - for ( r = l ; r >= v && *r > c ; r-- ) - { - *(r+1) = *r ; - array2[(r-v)+1] = array2[(r-v)] ; - } - *(r+1) = c ; - array2[(r-v)+1] = it ; - } - } -} -//############################################################################# -//############################################################################# - -/**@name Ordered Triple Struct */ -template -class CoinTriple { -public: - /// First member of triple - S first; - /// Second member of triple - T second; - /// Third member of triple - U third; -public: - /// Construct from ordered triple - CoinTriple(const S& s, const T& t, const U& u):first(s),second(t),third(u) {} -}; - -//############################################################################# -/**@name Comparisons on first element of two ordered triples */ -//@{ -/** Function operator. - Returns true if t1.first < t2.first (i.e., increasing). */ -template < class S, class T, class U > -class CoinFirstLess_3 { -public: - /// Compare function - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { return t1.first < t2.first; } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if t1.first > t2.first (i.e, decreasing). */ -template < class S, class T, class U > -class CoinFirstGreater_3 { -public: - /// Compare function - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { return t1.first>t2.first; } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if abs(t1.first) < abs(t2.first) (i.e., increasing). */ -template < class S, class T, class U > -class CoinFirstAbsLess_3 { -public: - /// Compare function - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { - const T t1Abs = t1.first < static_cast(0) ? -t1.first : t1.first; - const T t2Abs = t2.first < static_cast(0) ? -t2.first : t2.first; - return t1Abs < t2Abs; - } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Returns true if abs(t1.first) > abs(t2.first) (i.e., decreasing). */ -template < class S, class T, class U > -class CoinFirstAbsGreater_3 { -public: - /// Compare function - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { - const T t1Abs = t1.first < static_cast(0) ? -t1.first : t1.first; - const T t2Abs = t2.first < static_cast(0) ? -t2.first : t2.first; - return t1Abs > t2Abs; - } -}; -//----------------------------------------------------------------------------- -/** Function operator. - Compare based on the entries of an external vector, i.e., returns true if - vec[t1.first < vec[t2.first] (i.e., increasing wrt. vec). Note that to - use this comparison operator .first must be a data type automatically - convertible to int. */ -template < class S, class T, class U, class V> -class CoinExternalVectorFirstLess_3 { -private: - CoinExternalVectorFirstLess_3(); -private: - const V* vec_; -public: - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { return vec_[t1.first] < vec_[t2.first]; } - CoinExternalVectorFirstLess_3(const V* v) : vec_(v) {} -}; -//----------------------------------------------------------------------------- -/** Function operator. - Compare based on the entries of an external vector, i.e., returns true if - vec[t1.first > vec[t2.first] (i.e., decreasing wrt. vec). Note that to - use this comparison operator .first must be a data type automatically - convertible to int. */ -template < class S, class T, class U, class V> -class CoinExternalVectorFirstGreater_3 { -private: - CoinExternalVectorFirstGreater_3(); -private: - const V* vec_; -public: - inline bool operator()(const CoinTriple& t1, - const CoinTriple& t2) const - { return vec_[t1.first] > vec_[t2.first]; } - CoinExternalVectorFirstGreater_3(const V* v) : vec_(v) {} -}; -//@} - -//############################################################################# - -/**@name Typedefs for sorting the entries of a packed vector based on an - external vector. */ -//@{ -/// Sort packed vector in increasing order of the external vector -typedef CoinExternalVectorFirstLess_3 -CoinIncrSolutionOrdered; -/// Sort packed vector in decreasing order of the external vector -typedef CoinExternalVectorFirstGreater_3 -CoinDecrSolutionOrdered; -//@} - -//############################################################################# - -/** Sort a triple of containers.
      - - Iter_S - iterator for first container
      - Iter_T - iterator for 2nd container
      - Iter_U - iterator for 3rd container
      - CoinCompare3 - class comparing CoinTriples
      -*/ -#ifdef COIN_SORT_ARBITRARY_CONTAINERS -template void -CoinSort_3(Iter_S sfirst, Iter_S slast, Iter_T tfirst, Iter_U, ufirst, - const CoinCompare3& tc) -{ - typedef typename std::iterator_traits::value_type S; - typedef typename std::iterator_traits::value_type T; - typedef typename std::iterator_traits::value_type U; - const size_t len = coinDistance(sfirst, slast); - if (len <= 1) - return; - - typedef CoinTriple STU_triple; - STU_triple* x = - static_cast(::operator new(len * sizeof(STU_triple))); - - int i = 0; - Iter_S scurrent = sfirst; - Iter_T tcurrent = tfirst; - Iter_U ucurrent = ufirst; - while (scurrent != slast) { - new (x+i++) STU_triple(*scurrent++, *tcurrent++, *ucurrent++); - } - - std::sort(x, x+len, tc); - - scurrent = sfirst; - tcurrent = tfirst; - ucurrent = ufirst; - for (i = 0; i < len; ++i) { - *scurrent++ = x[i].first; - *tcurrent++ = x[i].second; - *ucurrent++ = x[i].third; - } - - ::operator delete(x); -} -//----------------------------------------------------------------------------- -template void -CoinSort_3(Iter_S sfirst, Iter_S slast, Iter_T tfirst, Iter_U, ufirst) -{ - typedef typename std::iterator_traits::value_type S; - typedef typename std::iterator_traits::value_type T; - typedef typename std::iterator_traits::value_type U; - CoinSort_3(sfirts, slast, tfirst, ufirst, CoinFirstLess_3()); -} - -#else //======================================================================= - -template void -CoinSort_3(S* sfirst, S* slast, T* tfirst, U* ufirst, const CoinCompare3& tc) -{ - const size_t len = coinDistance(sfirst,slast); - if (len <= 1) - return; - - typedef CoinTriple STU_triple; - STU_triple* x = - static_cast(::operator new(len * sizeof(STU_triple))); - - size_t i = 0; - S* scurrent = sfirst; - T* tcurrent = tfirst; - U* ucurrent = ufirst; - while (scurrent != slast) { - new (x+i++) STU_triple(*scurrent++, *tcurrent++, *ucurrent++); - } - - std::sort(x, x+len, tc); - - scurrent = sfirst; - tcurrent = tfirst; - ucurrent = ufirst; - for (i = 0; i < len; ++i) { - *scurrent++ = x[i].first; - *tcurrent++ = x[i].second; - *ucurrent++ = x[i].third; - } - - ::operator delete(x); -} -//----------------------------------------------------------------------------- -template void -CoinSort_3(S* sfirst, S* slast, T* tfirst, U* ufirst) -{ - CoinSort_3(sfirst, slast, tfirst, ufirst, CoinFirstLess_3()); -} - -#endif - -//############################################################################# - -#endif diff --git a/thirdparty/linux/include/coin1/CoinStructuredModel.hpp b/thirdparty/linux/include/coin1/CoinStructuredModel.hpp deleted file mode 100644 index 19659b8f..00000000 --- a/thirdparty/linux/include/coin1/CoinStructuredModel.hpp +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: CoinStructuredModel.hpp 1691 2014-03-19 12:43:56Z forrest $ */ -// Copyright (C) 2008, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinStructuredModel_H -#define CoinStructuredModel_H - -#include "CoinModel.hpp" -#include - -/** - This is a model which is made up of Coin(Structured)Model blocks. -*/ - typedef struct CoinModelInfo2 { - int rowBlock; // Which row block - int columnBlock; // Which column block - char matrix; // nonzero if matrix exists - char rhs; // nonzero if non default rhs exists - char rowName; // nonzero if row names exists - char integer; // nonzero if integer information exists - char bounds; // nonzero if non default bounds/objective exists - char columnName; // nonzero if column names exists - CoinModelInfo2() : - rowBlock(0), - columnBlock(0), - matrix(0), - rhs(0), - rowName(0), - integer(0), - bounds(0), - columnName(0) - {} -} CoinModelBlockInfo; - -class CoinStructuredModel : public CoinBaseModel { - -public: - /**@name Useful methods for building model */ - //@{ - /** add a block from a CoinModel using names given as parameters - returns number of errors (e.g. both have objectives but not same) - */ - int addBlock(const std::string & rowBlock, - const std::string & columnBlock, - const CoinBaseModel & block); - /** add a block from a CoinModel with names in model - returns number of errors (e.g. both have objectives but not same) - */ - int addBlock(const CoinBaseModel & block); - /** add a block from a CoinModel using names given as parameters - returns number of errors (e.g. both have objectives but not same) - This passes in block - structured model takes ownership - */ - int addBlock(const std::string & rowBlock, - const std::string & columnBlock, - CoinBaseModel * block); - /** add a block using names - */ - int addBlock(const std::string & rowBlock, - const std::string & columnBlock, - const CoinPackedMatrix & matrix, - const double * rowLower, const double * rowUpper, - const double * columnLower, const double * columnUpper, - const double * objective); - - /** Write the problem in MPS format to a file with the given filename. - - \param compression can be set to three values to indicate what kind - of file should be written -
        -
      • 0: plain text (default) -
      • 1: gzip compressed (.gz is appended to \c filename) -
      • 2: bzip2 compressed (.bz2 is appended to \c filename) (TODO) -
      - If the library was not compiled with the requested compression then - writeMps falls back to writing a plain text file. - - \param formatType specifies the precision to used for values in the - MPS file -
        -
      • 0: normal precision (default) -
      • 1: extra accuracy -
      • 2: IEEE hex -
      - - \param numberAcross specifies whether 1 or 2 (default) values should be - specified on every data line in the MPS file. - - not const as may change model e.g. fill in default bounds - */ - int writeMps(const char *filename, int compression = 0, - int formatType = 0, int numberAcross = 2, bool keepStrings=false) ; - /// Read SMPS model - int readSmps(const char *filename, - bool keepNames = false, - bool ignoreErrors = false); - - /** Decompose a CoinModel - 1 - try D-W - 2 - try Benders - 3 - try Staircase - Returns number of blocks or zero if no structure - */ - int decompose(const CoinModel &model,int type, - int maxBlocks=50, const char ** starts=NULL); - /** Decompose a model specified as arrays + CoinPackedMatrix - 1 - try D-W - 2 - try Benders - 3 - try Staircase - Returns number of blocks or zero if no structure - */ - int decompose(const CoinPackedMatrix & matrix, - const double * rowLower, const double * rowUpper, - const double * columnLower, const double * columnUpper, - const double * objective, int type,int maxBlocks=50, - int * starts=NULL, - double objectiveOffset=0.0); - - //@} - - - /**@name For getting information */ - //@{ - /// Return number of row blocks - inline int numberRowBlocks() const - { return numberRowBlocks_;} - /// Return number of column blocks - inline int numberColumnBlocks() const - { return numberColumnBlocks_;} - /// Return number of elementBlocks - inline CoinBigIndex numberElementBlocks() const - { return numberElementBlocks_;} - /// Return number of elements - CoinBigIndex numberElements() const; - /// Return the i'th row block name - inline const std::string & getRowBlock(int i) const - { return rowBlockNames_[i];} - /// Set i'th row block name - inline void setRowBlock(int i,const std::string &name) - { rowBlockNames_[i] = name;} - /// Add or check a row block name and number of rows - int addRowBlock(int numberRows,const std::string &name) ; - /// Return a row block index given a row block name - int rowBlock(const std::string &name) const; - /// Return i'th the column block name - inline const std::string & getColumnBlock(int i) const - { return columnBlockNames_[i];} - /// Set i'th column block name - inline void setColumnBlock(int i,const std::string &name) - { columnBlockNames_[i] = name;} - /// Add or check a column block name and number of columns - int addColumnBlock(int numberColumns,const std::string &name) ; - /// Return a column block index given a column block name - int columnBlock(const std::string &name) const; - /// Return i'th block type - inline const CoinModelBlockInfo & blockType(int i) const - { return blockType_[i];} - /// Return i'th block - inline CoinBaseModel * block(int i) const - { return blocks_[i];} - /// Return block corresponding to row and column - const CoinBaseModel * block(int row,int column) const; - /// Return i'th block as CoinModel (or NULL) - CoinModel * coinBlock(int i) const; - /// Return block corresponding to row and column as CoinModel - const CoinBaseModel * coinBlock(int row,int column) const; - /// Return block number corresponding to row and column - int blockIndex(int row,int column) const; - /** Return model as a CoinModel block - and fill in info structure and update counts - */ - CoinModel * coinModelBlock(CoinModelBlockInfo & info) ; - /// Sets given block into coinModelBlocks_ - void setCoinModel(CoinModel * block, int iBlock); - /// Refresh info in blockType_ - void refresh(int iBlock); - /** Fill pointers corresponding to row and column */ - - CoinModelBlockInfo block(int row,int column, - const double * & rowLower, const double * & rowUpper, - const double * & columnLower, const double * & columnUpper, - const double * & objective) const; - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline double optimizationDirection() const { - return optimizationDirection_; - } - /// Set direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline void setOptimizationDirection(double value) - { optimizationDirection_=value;} - //@} - - /**@name Constructors, destructor */ - //@{ - /** Default constructor. */ - CoinStructuredModel(); - /** Read a problem in MPS format from the given filename. - May try and decompose - */ - CoinStructuredModel(const char *fileName,int decompose=0, - int maxBlocks=50); - /** Destructor */ - virtual ~CoinStructuredModel(); - //@} - - /**@name Copy method */ - //@{ - /** The copy constructor. */ - CoinStructuredModel(const CoinStructuredModel&); - /// = - CoinStructuredModel& operator=(const CoinStructuredModel&); - /// Clone - virtual CoinBaseModel * clone() const; - //@} - -private: - - /** Fill in info structure and update counts - Returns number of inconsistencies on border - */ - int fillInfo(CoinModelBlockInfo & info,const CoinModel * block); - /** Fill in info structure and update counts - */ - void fillInfo(CoinModelBlockInfo & info,const CoinStructuredModel * block); - /**@name Data members */ - //@{ - /// Current number of row blocks - int numberRowBlocks_; - /// Current number of column blocks - int numberColumnBlocks_; - /// Current number of element blocks - int numberElementBlocks_; - /// Maximum number of element blocks - int maximumElementBlocks_; - /// Rowblock name - std::vector rowBlockNames_; - /// Columnblock name - std::vector columnBlockNames_; - /// Blocks - CoinBaseModel ** blocks_; - /// CoinModel copies of blocks or NULL if original CoinModel - CoinModel ** coinModelBlocks_; - /// Which parts of model are set in block - CoinModelBlockInfo * blockType_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/CoinTime.hpp b/thirdparty/linux/include/coin1/CoinTime.hpp deleted file mode 100644 index 49e85071..00000000 --- a/thirdparty/linux/include/coin1/CoinTime.hpp +++ /dev/null @@ -1,310 +0,0 @@ -/* $Id: CoinTime.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef _CoinTime_hpp -#define _CoinTime_hpp - -// Uncomment the next three lines for thorough memory initialisation. -// #ifndef ZEROFAULT -// # define ZEROFAULT -// #endif - -//############################################################################# - -#include -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#else -// MacOS-X and FreeBSD needs sys/time.h -#if defined(__MACH__) || defined (__FreeBSD__) -#include -#endif -#if !defined(__MSVCRT__) -#include -#endif -#endif - -//############################################################################# - -#if defined(_MSC_VER) - -#if 0 // change this to 1 if want to use the win32 API -#include -#ifdef small -/* for some unfathomable reason (to me) rpcndr.h (pulled in by windows.h) does a - '#define small char' */ -#undef small -#endif -#define TWO_TO_THE_THIRTYTWO 4294967296.0 -#define DELTA_EPOCH_IN_SECS 11644473600.0 -inline double CoinGetTimeOfDay() -{ - FILETIME ft; - - GetSystemTimeAsFileTime(&ft); - double t = ft.dwHighDateTime * TWO_TO_THE_THIRTYTWO + ft.dwLowDateTime; - t = t/10000000.0 - DELTA_EPOCH_IN_SECS; - return t; -} -#else -#include -#include -inline double CoinGetTimeOfDay() -{ - struct _timeb timebuffer; -#pragma warning(disable:4996) - _ftime( &timebuffer ); // C4996 -#pragma warning(default:4996) - return timebuffer.time + timebuffer.millitm/1000.0; -} -#endif - -#else - -#include - -inline double CoinGetTimeOfDay() -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return static_cast(tv.tv_sec) + static_cast(tv.tv_usec)/1000000.0; -} - -#endif // _MSC_VER - -/** - Query the elapsed wallclock time since the first call to this function. If - a positive argument is passed to the function then the time of the first - call is set to that value (this kind of argument is allowed only at the - first call!). If a negative argument is passed to the function then it - returns the time when it was set. -*/ - -inline double CoinWallclockTime(double callType = 0) -{ - double callTime = CoinGetTimeOfDay(); - static const double firstCall = callType > 0 ? callType : callTime; - return callType < 0 ? firstCall : callTime - firstCall; -} - -//############################################################################# - -//#define HAVE_SDK // if SDK under Win32 is installed, for CPU instead of elapsed time under Win -#ifdef HAVE_SDK -#include -#ifdef small -/* for some unfathomable reason (to me) rpcndr.h (pulled in by windows.h) does a - '#define small char' */ -#undef small -#endif -#define TWO_TO_THE_THIRTYTWO 4294967296.0 -#endif - -static inline double CoinCpuTime() -{ - double cpu_temp; -#if defined(_MSC_VER) || defined(__MSVCRT__) -#ifdef HAVE_SDK - FILETIME creation; - FILETIME exit; - FILETIME kernel; - FILETIME user; - GetProcessTimes(GetCurrentProcess(), &creation, &exit, &kernel, &user); - double t = user.dwHighDateTime * TWO_TO_THE_THIRTYTWO + user.dwLowDateTime; - return t/10000000.0; -#else - unsigned int ticksnow; /* clock_t is same as int */ - ticksnow = (unsigned int)clock(); - cpu_temp = (double)((double)ticksnow/CLOCKS_PER_SEC); -#endif - -#else - struct rusage usage; -# ifdef ZEROFAULT - usage.ru_utime.tv_sec = 0 ; - usage.ru_utime.tv_usec = 0 ; -# endif - getrusage(RUSAGE_SELF,&usage); - cpu_temp = static_cast(usage.ru_utime.tv_sec); - cpu_temp += 1.0e-6*(static_cast (usage.ru_utime.tv_usec)); -#endif - return cpu_temp; -} - -//############################################################################# - - - -static inline double CoinSysTime() -{ - double sys_temp; -#if defined(_MSC_VER) || defined(__MSVCRT__) - sys_temp = 0.0; -#else - struct rusage usage; -# ifdef ZEROFAULT - usage.ru_utime.tv_sec = 0 ; - usage.ru_utime.tv_usec = 0 ; -# endif - getrusage(RUSAGE_SELF,&usage); - sys_temp = static_cast(usage.ru_stime.tv_sec); - sys_temp += 1.0e-6*(static_cast (usage.ru_stime.tv_usec)); -#endif - return sys_temp; -} - -//############################################################################# -// On most systems SELF seems to include children threads, This is for when it doesn't -static inline double CoinCpuTimeJustChildren() -{ - double cpu_temp; -#if defined(_MSC_VER) || defined(__MSVCRT__) - cpu_temp = 0.0; -#else - struct rusage usage; -# ifdef ZEROFAULT - usage.ru_utime.tv_sec = 0 ; - usage.ru_utime.tv_usec = 0 ; -# endif - getrusage(RUSAGE_CHILDREN,&usage); - cpu_temp = static_cast(usage.ru_utime.tv_sec); - cpu_temp += 1.0e-6*(static_cast (usage.ru_utime.tv_usec)); -#endif - return cpu_temp; -} -//############################################################################# - -#include - -/** - This class implements a timer that also implements a tracing functionality. - - The timer stores the start time of the timer, for how much time it was set to - and when does it expire (start + limit = end). Queries can be made that tell - whether the timer is expired, is past an absolute time, is past a percentage - of the length of the timer. All times are given in seconds, but as double - numbers, so there can be fractional values. - - The timer can also be initialized with a stream and a specification whether - to write to or read from the stream. In the former case the result of every - query is written into the stream, in the latter case timing is not tested at - all, rather the supposed result is read out from the stream. This makes it - possible to exactly retrace time sensitive program execution. -*/ -class CoinTimer -{ -private: - /// When the timer was initialized/reset/restarted - double start; - /// - double limit; - double end; -#ifdef COIN_COMPILE_WITH_TRACING - std::fstream* stream; - bool write_stream; -#endif - -private: -#ifdef COIN_COMPILE_WITH_TRACING - inline bool evaluate(bool b_tmp) const { - int i_tmp = b_tmp; - if (stream) { - if (write_stream) - (*stream) << i_tmp << "\n"; - else - (*stream) >> i_tmp; - } - return i_tmp; - } - inline double evaluate(double d_tmp) const { - if (stream) { - if (write_stream) - (*stream) << d_tmp << "\n"; - else - (*stream) >> d_tmp; - } - return d_tmp; - } -#else - inline bool evaluate(const bool b_tmp) const { - return b_tmp; - } - inline double evaluate(const double d_tmp) const { - return d_tmp; - } -#endif - -public: - /// Default constructor creates a timer with no time limit and no tracing - CoinTimer() : - start(0), limit(1e100), end(1e100) -#ifdef COIN_COMPILE_WITH_TRACING - , stream(0), write_stream(true) -#endif - {} - - /// Create a timer with the given time limit and with no tracing - CoinTimer(double lim) : - start(CoinCpuTime()), limit(lim), end(start+lim) -#ifdef COIN_COMPILE_WITH_TRACING - , stream(0), write_stream(true) -#endif - {} - -#ifdef COIN_COMPILE_WITH_TRACING - /** Create a timer with no time limit and with writing/reading the trace - to/from the given stream, depending on the argument \c write. */ - CoinTimer(std::fstream* s, bool write) : - start(0), limit(1e100), end(1e100), - stream(s), write_stream(write) {} - - /** Create a timer with the given time limit and with writing/reading the - trace to/from the given stream, depending on the argument \c write. */ - CoinTimer(double lim, std::fstream* s, bool w) : - start(CoinCpuTime()), limit(lim), end(start+lim), - stream(s), write_stream(w) {} -#endif - - /// Restart the timer (keeping the same time limit) - inline void restart() { start=CoinCpuTime(); end=start+limit; } - /// An alternate name for \c restart() - inline void reset() { restart(); } - /// Reset (and restart) the timer and change its time limit - inline void reset(double lim) { limit=lim; restart(); } - - /** Return whether the given percentage of the time limit has elapsed since - the timer was started */ - inline bool isPastPercent(double pct) const { - return evaluate(start + limit * pct < CoinCpuTime()); - } - /** Return whether the given amount of time has elapsed since the timer was - started */ - inline bool isPast(double lim) const { - return evaluate(start + lim < CoinCpuTime()); - } - /** Return whether the originally specified time limit has passed since the - timer was started */ - inline bool isExpired() const { - return evaluate(end < CoinCpuTime()); - } - - /** Return how much time is left on the timer */ - inline double timeLeft() const { - return evaluate(end - CoinCpuTime()); - } - - /** Return how much time has elapsed */ - inline double timeElapsed() const { - return evaluate(CoinCpuTime() - start); - } - - inline void setLimit(double l) { - limit = l; - return; - } -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinTypes.hpp b/thirdparty/linux/include/coin1/CoinTypes.hpp deleted file mode 100644 index 3adee2e3..00000000 --- a/thirdparty/linux/include/coin1/CoinTypes.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/* $Id: CoinTypes.hpp 1762 2014-12-29 20:37:12Z tkr $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef _CoinTypes_hpp -#define _CoinTypes_hpp - -#include "CoinUtilsConfig.h" -/* On some systems, we require stdint.h to have the 64bit integer type defined. */ -#ifdef COINUTILS_HAS_STDINT_H -#include -#endif -#ifdef COINUTILS_HAS_CSTDINT -#include -#endif - -#define CoinInt64 COIN_INT64_T -#define CoinUInt64 COIN_UINT64_T -#define CoinIntPtr COIN_INTPTR_T - -//============================================================================= -#ifndef COIN_BIG_INDEX -#define COIN_BIG_INDEX 0 -#endif - -#if COIN_BIG_INDEX==0 -typedef int CoinBigIndex; -#elif COIN_BIG_INDEX==1 -typedef long CoinBigIndex; -#else -typedef long long CoinBigIndex; -#endif - -//============================================================================= -#ifndef COIN_BIG_DOUBLE -#define COIN_BIG_DOUBLE 0 -#endif - -// See if we want the ability to have long double work arrays -#if COIN_BIG_DOUBLE==2 -#undef COIN_BIG_DOUBLE -#define COIN_BIG_DOUBLE 0 -#define COIN_LONG_WORK 1 -typedef long double CoinWorkDouble; -#elif COIN_BIG_DOUBLE==3 -#undef COIN_BIG_DOUBLE -#define COIN_BIG_DOUBLE 1 -#define COIN_LONG_WORK 1 -typedef long double CoinWorkDouble; -#else -#define COIN_LONG_WORK 0 -typedef double CoinWorkDouble; -#endif - -#if COIN_BIG_DOUBLE==0 -typedef double CoinFactorizationDouble; -#elif COIN_BIG_DOUBLE==1 -typedef long double CoinFactorizationDouble; -#else -typedef double CoinFactorizationDouble; -#endif - -#endif diff --git a/thirdparty/linux/include/coin1/CoinUtility.hpp b/thirdparty/linux/include/coin1/CoinUtility.hpp deleted file mode 100644 index 49a30e25..00000000 --- a/thirdparty/linux/include/coin1/CoinUtility.hpp +++ /dev/null @@ -1,19 +0,0 @@ -/* $Id: CoinUtility.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2004, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinUtility_h_ -#define CoinUtility_h_ - -#include "CoinSort.hpp" - -template -CoinPair CoinMakePair(const S& s, const T& t) -{ return CoinPair(s, t); } - -template -CoinTriple CoinMakeTriple(const S& s, const T& t, const U& u) -{ return CoinTriple(s, t, u); } - -#endif diff --git a/thirdparty/linux/include/coin1/CoinUtilsConfig.h b/thirdparty/linux/include/coin1/CoinUtilsConfig.h deleted file mode 100644 index 8d656d5a..00000000 --- a/thirdparty/linux/include/coin1/CoinUtilsConfig.h +++ /dev/null @@ -1,34 +0,0 @@ -/* src/config_coinutils.h. Generated by configure. */ -/* inc/config_coinutils.h.in. */ - -#ifndef __CONFIG_COINUTILS_H__ -#define __CONFIG_COINUTILS_H__ - -/* Define to 1 if stdint.h is available for CoinUtils */ -#define COINUTILS_HAS_STDINT_H 1 - -/* Define to 1 if stdint.h is available for CoinUtils */ -/* #undef COINUTILS_HAS_CSTDINT */ - -/* Version number of project */ -#define COINUTILS_VERSION "2.10.6" - -/* Major Version number of project */ -#define COINUTILS_VERSION_MAJOR 2 - -/* Minor Version number of project */ -#define COINUTILS_VERSION_MINOR 10 - -/* Release Version number of project */ -#define COINUTILS_VERSION_RELEASE 6 - -/* Define to 64bit integer type */ -#define COIN_INT64_T int64_t - -/* Define to integer type capturing pointer */ -#define COIN_INTPTR_T intptr_t - -/* Define to 64bit unsigned integer type */ -#define COIN_UINT64_T int64_t - -#endif diff --git a/thirdparty/linux/include/coin1/CoinWarmStart.hpp b/thirdparty/linux/include/coin1/CoinWarmStart.hpp deleted file mode 100644 index a7e28c85..00000000 --- a/thirdparty/linux/include/coin1/CoinWarmStart.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* $Id: CoinWarmStart.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinWarmStart_H -#define CoinWarmStart_H - -//############################################################################# - -class CoinWarmStartDiff; - -/** Abstract base class for warm start information. - - Really nothing can be generalized for warm start information --- all we - know is that it exists. Hence the abstract base class contains only a - virtual destructor and a virtual clone function (a virtual constructor), - so that derived classes can provide these functions. -*/ - -class CoinWarmStart { -public: - - /// Abstract destructor - virtual ~CoinWarmStart() {} - - /// `Virtual constructor' - virtual CoinWarmStart *clone() const = 0 ; - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const ) const { return 0; } - - - virtual void - applyDiff (const CoinWarmStartDiff *const ) {} - -}; - - -/*! \class CoinWarmStartDiff - \brief Abstract base class for warm start `diff' objects - - For those types of warm start objects where the notion of a `diff' makes - sense, this virtual base class is provided. As with CoinWarmStart, its sole - reason for existence is to make it possible to write solver-independent code. -*/ - -class CoinWarmStartDiff { -public: - - /// Abstract destructor - virtual ~CoinWarmStartDiff() {} - - /// `Virtual constructor' - virtual CoinWarmStartDiff *clone() const = 0 ; -}; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinWarmStartBasis.hpp b/thirdparty/linux/include/coin1/CoinWarmStartBasis.hpp deleted file mode 100644 index 272d3933..00000000 --- a/thirdparty/linux/include/coin1/CoinWarmStartBasis.hpp +++ /dev/null @@ -1,456 +0,0 @@ -/* $Id: CoinWarmStartBasis.hpp 1515 2011-12-10 23:38:04Z lou $ */ -/*! \legal - Copyright (C) 2000 -- 2003, International Business Machines Corporation - and others. All Rights Reserved. - This code is licensed under the terms of the Eclipse Public License (EPL). -*/ - -/*! \file CoinWarmStart.hpp - \brief Declaration of the generic simplex (basis-oriented) warm start - class. Also contains a basis diff class. -*/ - -#ifndef CoinWarmStartBasis_H -#define CoinWarmStartBasis_H - -#include - -#include "CoinSort.hpp" -#include "CoinHelperFunctions.hpp" -#include "CoinWarmStart.hpp" - -//############################################################################# - -/*! \class CoinWarmStartBasis - \brief The default COIN simplex (basis-oriented) warm start class - - CoinWarmStartBasis provides for a warm start object which contains the - status of each variable (structural and artificial). - - \todo Modify this class so that the number of status entries per byte - and bytes per status vector allocation unit are not hardcoded. - At the least, collect this into a couple of macros. - - \todo Consider separate fields for allocated capacity and actual basis - size. We could avoid some reallocation, at the price of retaining - more space than we need. Perhaps more important, we could do much - better sanity checks. -*/ - -class CoinWarmStartBasis : public virtual CoinWarmStart { -public: - - /*! \brief Enum for status of variables - - Matches CoinPrePostsolveMatrix::Status, without superBasic. Most code that - converts between CoinPrePostsolveMatrix::Status and - CoinWarmStartBasis::Status will break if this correspondence is broken. - - The status vectors are currently packed using two bits per status code, - four codes per byte. The location of the status information for - variable \c i is in byte i>>2 and occupies bits 0:1 - if i\%4 == 0, bits 2:3 if i\%4 == 1, etc. - The non-member functions getStatus(const char*,int) and - setStatus(char*,int,CoinWarmStartBasis::Status) are provided to hide - details of the packing. - */ - enum Status { - isFree = 0x00, ///< Nonbasic free variable - basic = 0x01, ///< Basic variable - atUpperBound = 0x02, ///< Nonbasic at upper bound - atLowerBound = 0x03 ///< Nonbasic at lower bound - }; - - /** \brief Transfer vector entry for - mergeBasis(const CoinWarmStartBasis*,const XferVec*,const XferVec*) - */ - typedef CoinTriple XferEntry ; - - /** \brief Transfer vector for - mergeBasis(const CoinWarmStartBasis*,const XferVec*,const XferVec*) - */ - typedef std::vector XferVec ; - -public: - -/*! \name Methods to get and set basis information. - - The status of variables is kept in a pair of arrays, one for structural - variables, and one for artificials (aka logicals and slacks). The status - is coded using the values of the Status enum. - - \sa CoinWarmStartBasis::Status for a description of the packing used in - the status arrays. -*/ -//@{ - /// Return the number of structural variables - inline int getNumStructural() const { return numStructural_; } - - /// Return the number of artificial variables - inline int getNumArtificial() const { return numArtificial_; } - - /** Return the number of basic structurals - - A fast test for an all-slack basis. - */ - int numberBasicStructurals() const ; - - /// Return the status of the specified structural variable. - inline Status getStructStatus(int i) const { - const int st = (structuralStatus_[i>>2] >> ((i&3)<<1)) & 3; - return static_cast(st); - } - - /// Set the status of the specified structural variable. - inline void setStructStatus(int i, Status st) { - char& st_byte = structuralStatus_[i>>2]; - st_byte = static_cast(st_byte & ~(3 << ((i&3)<<1))) ; - st_byte = static_cast(st_byte | (st << ((i&3)<<1))) ; - } - - /** Return the status array for the structural variables - - The status information is stored using the codes defined in the - Status enum, 2 bits per variable, packed 4 variables per byte. - */ - inline char * getStructuralStatus() { return structuralStatus_; } - - /** \c const overload for - \link CoinWarmStartBasis::getStructuralStatus() - getStructuralStatus() - \endlink - */ - inline const char * getStructuralStatus() const { return structuralStatus_; } - - /** As for \link getStructuralStatus() getStructuralStatus \endlink, - but returns the status array for the artificial variables. - */ - inline char * getArtificialStatus() { return artificialStatus_; } - - /// Return the status of the specified artificial variable. - inline Status getArtifStatus(int i) const { - const int st = (artificialStatus_[i>>2] >> ((i&3)<<1)) & 3; - return static_cast(st); - } - - /// Set the status of the specified artificial variable. - inline void setArtifStatus(int i, Status st) { - char& st_byte = artificialStatus_[i>>2]; - st_byte = static_cast(st_byte & ~(3 << ((i&3)<<1))) ; - st_byte = static_cast(st_byte | (st << ((i&3)<<1))) ; - } - - /** \c const overload for - \link CoinWarmStartBasis::getArtificialStatus() - getArtificialStatus() - \endlink - */ - inline const char * getArtificialStatus() const { return artificialStatus_; } - -//@} - -/*! \name Basis `diff' methods */ -//@{ - - /*! \brief Generate a `diff' that can convert the warm start basis passed as - a parameter to the warm start basis specified by \c this. - - The capabilities are limited: the basis passed as a parameter can be no - larger than the basis pointed to by \c this. - */ - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const oldCWS) const ; - - /*! \brief Apply \p diff to this basis - - Update this basis by applying \p diff. It's assumed that the allocated - capacity of the basis is sufficiently large. - */ - - virtual void - applyDiff (const CoinWarmStartDiff *const cwsdDiff) ; - -//@} - - -/*! \name Methods to modify the warm start object */ -//@{ - - /*! \brief Set basis capacity; existing basis is discarded. - - After execution of this routine, the warm start object does not describe - a valid basis: all structural and artificial variables have status isFree. - */ - virtual void setSize(int ns, int na) ; - - /*! \brief Set basis capacity; existing basis is maintained. - - After execution of this routine, the warm start object describes a valid - basis: the status of new structural variables (added columns) is set to - nonbasic at lower bound, and the status of new artificial variables - (added rows) is set to basic. (The basis can be invalid if new structural - variables do not have a finite lower bound.) - */ - virtual void resize (int newNumberRows, int newNumberColumns); - - /** \brief Delete a set of rows from the basis - - \warning - This routine assumes that the set of indices to be deleted is sorted in - ascending order and contains no duplicates. Use deleteRows() if this is - not the case. - - \warning - The resulting basis is guaranteed valid only if all deleted - constraints are slack (hence the associated logicals are basic). - - Removal of a tight constraint with a nonbasic logical implies that - some basic variable must be made nonbasic. This correction is left to - the client. - */ - - virtual void compressRows (int tgtCnt, const int *tgts) ; - - /** \brief Delete a set of rows from the basis - - \warning - The resulting basis is guaranteed valid only if all deleted - constraints are slack (hence the associated logicals are basic). - - Removal of a tight constraint with a nonbasic logical implies that - some basic variable must be made nonbasic. This correction is left to - the client. - */ - - virtual void deleteRows(int rawTgtCnt, const int *rawTgts) ; - - /** \brief Delete a set of columns from the basis - - \warning - The resulting basis is guaranteed valid only if all deleted variables - are nonbasic. - - Removal of a basic variable implies that some nonbasic variable must be - made basic. This correction is left to the client. - */ - - virtual void deleteColumns(int number, const int * which); - - /** \brief Merge entries from a source basis into this basis. - - \warning - It's the client's responsibility to ensure validity of the merged basis, - if that's important to the application. - - The vector xferCols (xferRows) specifies runs of entries to be taken from - the source basis and placed in this basis. Each entry is a CoinTriple, - with first specifying the starting source index of a run, second - specifying the starting destination index, and third specifying the run - length. - */ - virtual void mergeBasis(const CoinWarmStartBasis *src, - const XferVec *xferRows, - const XferVec *xferCols) ; - -//@} - -/*! \name Constructors, destructors, and related functions */ - -//@{ - - /** Default constructor - - Creates a warm start object representing an empty basis - (0 rows, 0 columns). - */ - CoinWarmStartBasis(); - - /** Constructs a warm start object with the specified status vectors. - - The parameters are copied. - Consider assignBasisStatus(int,int,char*&,char*&) if the object should - assume ownership. - - \sa CoinWarmStartBasis::Status for a description of the packing used in - the status arrays. - */ - CoinWarmStartBasis(int ns, int na, const char* sStat, const char* aStat) ; - - /** Copy constructor */ - CoinWarmStartBasis(const CoinWarmStartBasis& ws) ; - - /** `Virtual constructor' */ - virtual CoinWarmStart *clone() const - { - return new CoinWarmStartBasis(*this); - } - - /** Destructor */ - virtual ~CoinWarmStartBasis(); - - /** Assignment */ - - virtual CoinWarmStartBasis& operator=(const CoinWarmStartBasis& rhs) ; - - /** Assign the status vectors to be the warm start information. - - In this method the CoinWarmStartBasis object assumes ownership of the - pointers and upon return the argument pointers will be NULL. - If copying is desirable, use the - \link CoinWarmStartBasis(int,int,const char*,const char*) - array constructor \endlink - or the - \link operator=(const CoinWarmStartBasis&) - assignment operator \endlink. - - \note - The pointers passed to this method will be - freed using delete[], so they must be created using new[]. - */ - virtual void assignBasisStatus(int ns, int na, char*& sStat, char*& aStat) ; -//@} - -/*! \name Miscellaneous methods */ -//@{ - - /// Prints in readable format (for debug) - virtual void print() const; - /// Returns true if full basis (for debug) - bool fullBasis() const; - /// Returns true if full basis and fixes up (for debug) - bool fixFullBasis(); - -//@} - -protected: - /** \name Protected data members - - \sa CoinWarmStartBasis::Status for a description of the packing used in - the status arrays. - */ - //@{ - /// The number of structural variables - int numStructural_; - /// The number of artificial variables - int numArtificial_; - /// The maximum sise (in ints - actually 4*char) (so resize does not need to do new) - int maxSize_; - /** The status of the structural variables. */ - char * structuralStatus_; - /** The status of the artificial variables. */ - char * artificialStatus_; - //@} -}; - - -/*! \relates CoinWarmStartBasis - \brief Get the status of the specified variable in the given status array. -*/ - -inline CoinWarmStartBasis::Status getStatus(const char *array, int i) { - const int st = (array[i>>2] >> ((i&3)<<1)) & 3; - return static_cast(st); -} - -/*! \relates CoinWarmStartBasis - \brief Set the status of the specified variable in the given status array. -*/ - -inline void setStatus(char * array, int i, CoinWarmStartBasis::Status st) { - char& st_byte = array[i>>2]; - st_byte = static_cast(st_byte & ~(3 << ((i&3)<<1))) ; - st_byte = static_cast(st_byte | (st << ((i&3)<<1))) ; -} - -/*! \relates CoinWarmStartBasis - \brief Generate a print string for a status code -*/ -const char *statusName(CoinWarmStartBasis::Status status) ; - - -/*! \class CoinWarmStartBasisDiff - \brief A `diff' between two CoinWarmStartBasis objects - - This class exists in order to hide from the world the details of - calculating and representing a `diff' between two CoinWarmStartBasis - objects. For convenience, assignment, cloning, and deletion are visible to - the world, and default and copy constructors are made available to derived - classes. Knowledge of the rest of this structure, and of generating and - applying diffs, is restricted to the friend functions - CoinWarmStartBasis::generateDiff() and CoinWarmStartBasis::applyDiff(). - - The actual data structure is an unsigned int vector, #difference_ which - starts with indices of changed and then has values starting after #sze_ - - \todo This is a pretty generic structure, and vector diff is a pretty generic - activity. We should be able to convert this to a template. - - \todo Using unsigned int as the data type for the diff vectors might help - to contain the damage when this code is inevitably compiled for 64 bit - architectures. But the notion of int as 4 bytes is hardwired into - CoinWarmStartBasis, so changes are definitely required. -*/ - -class CoinWarmStartBasisDiff : public virtual CoinWarmStartDiff -{ public: - - /*! \brief `Virtual constructor' */ - virtual CoinWarmStartDiff *clone() const - { CoinWarmStartBasisDiff *cwsbd = new CoinWarmStartBasisDiff(*this) ; - return (dynamic_cast(cwsbd)) ; } - - /*! \brief Assignment */ - virtual - CoinWarmStartBasisDiff &operator= (const CoinWarmStartBasisDiff &rhs) ; - - /*! \brief Destructor */ - virtual ~CoinWarmStartBasisDiff(); - - protected: - - /*! \brief Default constructor - - This is protected (rather than private) so that derived classes can - see it when they make their default constructor protected or - private. - */ - CoinWarmStartBasisDiff () : sze_(0), difference_(0) { } - - /*! \brief Copy constructor - - For convenience when copying objects containing CoinWarmStartBasisDiff - objects. But consider whether you should be using #clone() to retain - polymorphism. - - This is protected (rather than private) so that derived classes can - see it when they make their copy constructor protected or - private. - */ - CoinWarmStartBasisDiff (const CoinWarmStartBasisDiff &cwsbd) ; - - /*! \brief Standard constructor */ - CoinWarmStartBasisDiff (int sze, const unsigned int *const diffNdxs, - const unsigned int *const diffVals) ; - - /*! \brief Constructor when full is smaller than diff!*/ - CoinWarmStartBasisDiff (const CoinWarmStartBasis * rhs); - - private: - - friend CoinWarmStartDiff* - CoinWarmStartBasis::generateDiff(const CoinWarmStart *const oldCWS) const ; - friend void - CoinWarmStartBasis::applyDiff(const CoinWarmStartDiff *const diff) ; - - /*! \brief Number of entries (and allocated capacity), in units of \c int. */ - int sze_ ; - - /*! \brief Array of diff indices and diff values */ - - unsigned int *difference_ ; - -} ; - - -#endif diff --git a/thirdparty/linux/include/coin1/CoinWarmStartDual.hpp b/thirdparty/linux/include/coin1/CoinWarmStartDual.hpp deleted file mode 100644 index 3e60d116..00000000 --- a/thirdparty/linux/include/coin1/CoinWarmStartDual.hpp +++ /dev/null @@ -1,166 +0,0 @@ -/* $Id: CoinWarmStartDual.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinWarmStartDual_H -#define CoinWarmStartDual_H - -#include "CoinHelperFunctions.hpp" -#include "CoinWarmStart.hpp" -#include "CoinWarmStartVector.hpp" - - -//############################################################################# - -/** WarmStart information that is only a dual vector */ - -class CoinWarmStartDual : public virtual CoinWarmStart { -public: - /// return the size of the dual vector - inline int size() const { return dual_.size(); } - /// return a pointer to the array of duals - inline const double * dual() const { return dual_.values(); } - - /** Assign the dual vector to be the warmstart information. In this method - the object assumes ownership of the pointer and upon return "dual" will - be a NULL pointer. If copying is desirable use the constructor. */ - inline void assignDual(int size, double *& dual) - { dual_.assignVector(size, dual); } - - CoinWarmStartDual() {} - - CoinWarmStartDual(int size, const double * dual) : dual_(size, dual) {} - - CoinWarmStartDual(const CoinWarmStartDual& rhs) : dual_(rhs.dual_) {} - - CoinWarmStartDual& operator=(const CoinWarmStartDual& rhs) { - if (this != &rhs) { - dual_ = rhs.dual_; - } - return *this; - } - - /** `Virtual constructor' */ - virtual CoinWarmStart *clone() const { - return new CoinWarmStartDual(*this); - } - - virtual ~CoinWarmStartDual() {} - -/*! \name Dual warm start `diff' methods */ -//@{ - - /*! \brief Generate a `diff' that can convert the warm start passed as a - parameter to the warm start specified by \c this. - - The capabilities are limited: the basis passed as a parameter can be no - larger than the basis pointed to by \c this. - */ - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const oldCWS) const ; - - /*! \brief Apply \p diff to this warm start. - - Update this warm start by applying \p diff. It's assumed that the - allocated capacity of the warm start is sufficiently large. - */ - - virtual void applyDiff (const CoinWarmStartDiff *const cwsdDiff) ; - -#if 0 -protected: - inline const CoinWarmStartVector& warmStartVector() const { return dual_; } -#endif - -//@} - -private: - ///@name Private data members - CoinWarmStartVector dual_; -}; - -//############################################################################# - -/*! \class CoinWarmStartDualDiff - \brief A `diff' between two CoinWarmStartDual objects - - This class exists in order to hide from the world the details of - calculating and representing a `diff' between two CoinWarmStartDual - objects. For convenience, assignment, cloning, and deletion are visible to - the world, and default and copy constructors are made available to derived - classes. Knowledge of the rest of this structure, and of generating and - applying diffs, is restricted to the friend functions - CoinWarmStartDual::generateDiff() and CoinWarmStartDual::applyDiff(). - - The actual data structure is a pair of vectors, #diffNdxs_ and #diffVals_. - -*/ - -class CoinWarmStartDualDiff : public virtual CoinWarmStartDiff -{ public: - - /*! \brief `Virtual constructor' */ - virtual CoinWarmStartDiff *clone() const - { - return new CoinWarmStartDualDiff(*this) ; - } - - /*! \brief Assignment */ - virtual CoinWarmStartDualDiff &operator= (const CoinWarmStartDualDiff &rhs) - { - if (this != &rhs) { - diff_ = rhs.diff_; - } - return *this; - } - - /*! \brief Destructor */ - virtual ~CoinWarmStartDualDiff() {} - - protected: - - /*! \brief Default constructor - - This is protected (rather than private) so that derived classes can - see it when they make their default constructor protected or - private. - */ - CoinWarmStartDualDiff () : diff_() {} - - /*! \brief Copy constructor - - For convenience when copying objects containing CoinWarmStartDualDiff - objects. But consider whether you should be using #clone() to retain - polymorphism. - - This is protected (rather than private) so that derived classes can - see it when the make their copy constructor protected or - private. - */ - CoinWarmStartDualDiff (const CoinWarmStartDualDiff &rhs) : - diff_(rhs.diff_) {} - - private: - - friend CoinWarmStartDiff* - CoinWarmStartDual::generateDiff(const CoinWarmStart *const oldCWS) const ; - friend void - CoinWarmStartDual::applyDiff(const CoinWarmStartDiff *const diff) ; - - /*! \brief Standard constructor */ - CoinWarmStartDualDiff (int sze, const unsigned int *const diffNdxs, - const double *const diffVals) : - diff_(sze, diffNdxs, diffVals) {} - - /*! - \brief The difference in the dual vector is simply the difference in a - vector. - */ - CoinWarmStartVectorDiff diff_; -}; - - -#endif - diff --git a/thirdparty/linux/include/coin1/CoinWarmStartPrimalDual.hpp b/thirdparty/linux/include/coin1/CoinWarmStartPrimalDual.hpp deleted file mode 100644 index c98d4235..00000000 --- a/thirdparty/linux/include/coin1/CoinWarmStartPrimalDual.hpp +++ /dev/null @@ -1,211 +0,0 @@ -/* $Id: CoinWarmStartPrimalDual.hpp 1372 2011-01-03 23:31:00Z lou $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinWarmStartPrimalDual_H -#define CoinWarmStartPrimalDual_H - -#include "CoinHelperFunctions.hpp" -#include "CoinWarmStart.hpp" -#include "CoinWarmStartVector.hpp" - - -//############################################################################# - -/** WarmStart information that is only a dual vector */ - -class CoinWarmStartPrimalDual : public virtual CoinWarmStart { -public: - /// return the size of the dual vector - inline int dualSize() const { return dual_.size(); } - /// return a pointer to the array of duals - inline const double * dual() const { return dual_.values(); } - - /// return the size of the primal vector - inline int primalSize() const { return primal_.size(); } - /// return a pointer to the array of primals - inline const double * primal() const { return primal_.values(); } - - /** Assign the primal/dual vectors to be the warmstart information. In this - method the object assumes ownership of the pointers and upon return \c - primal and \c dual will be a NULL pointers. If copying is desirable use - the constructor. - - NOTE: \c primal and \c dual must have been allocated by new double[], - because they will be freed by delete[] upon the desructtion of this - object... - */ - void assign(int primalSize, int dualSize, double*& primal, double *& dual) { - primal_.assignVector(primalSize, primal); - dual_.assignVector(dualSize, dual); - } - - CoinWarmStartPrimalDual() : primal_(), dual_() {} - - CoinWarmStartPrimalDual(int primalSize, int dualSize, - const double* primal, const double * dual) : - primal_(primalSize, primal), dual_(dualSize, dual) {} - - CoinWarmStartPrimalDual(const CoinWarmStartPrimalDual& rhs) : - primal_(rhs.primal_), dual_(rhs.dual_) {} - - CoinWarmStartPrimalDual& operator=(const CoinWarmStartPrimalDual& rhs) { - if (this != &rhs) { - primal_ = rhs.primal_; - dual_ = rhs.dual_; - } - return *this; - } - - /*! \brief Clear the data - - Make it appear as if the warmstart was just created using the default - constructor. - */ - inline void clear() { - primal_.clear(); - dual_.clear(); - } - - inline void swap(CoinWarmStartPrimalDual& rhs) { - if (this != &rhs) { - primal_.swap(rhs.primal_); - dual_.swap(rhs.dual_); - } - } - - /** `Virtual constructor' */ - virtual CoinWarmStart *clone() const { - return new CoinWarmStartPrimalDual(*this); - } - - virtual ~CoinWarmStartPrimalDual() {} - - /*! \name PrimalDual warm start `diff' methods */ - //@{ - - /*! \brief Generate a `diff' that can convert the warm start passed as a - parameter to the warm start specified by \c this. - - The capabilities are limited: the basis passed as a parameter can be no - larger than the basis pointed to by \c this. - */ - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const oldCWS) const ; - - /*! \brief Apply \p diff to this warm start. - - Update this warm start by applying \p diff. It's assumed that the - allocated capacity of the warm start is sufficiently large. - */ - - virtual void applyDiff (const CoinWarmStartDiff *const cwsdDiff) ; - - //@} - -#if 0 -protected: - inline const CoinWarmStartVector& primalWarmStartVector() const - { return primal_; } - inline const CoinWarmStartVector& dualWarmStartVector() const - { return dual_; } -#endif - -private: - ///@name Private data members - //@{ - CoinWarmStartVector primal_; - CoinWarmStartVector dual_; - //@} -}; - -//############################################################################# - -/*! \class CoinWarmStartPrimalDualDiff - \brief A `diff' between two CoinWarmStartPrimalDual objects - - This class exists in order to hide from the world the details of calculating - and representing a `diff' between two CoinWarmStartPrimalDual objects. For - convenience, assignment, cloning, and deletion are visible to the world, and - default and copy constructors are made available to derived classes. - Knowledge of the rest of this structure, and of generating and applying - diffs, is restricted to the friend functions - CoinWarmStartPrimalDual::generateDiff() and - CoinWarmStartPrimalDual::applyDiff(). - - The actual data structure is a pair of vectors, #diffNdxs_ and #diffVals_. - -*/ - -class CoinWarmStartPrimalDualDiff : public virtual CoinWarmStartDiff -{ - friend CoinWarmStartDiff* - CoinWarmStartPrimalDual::generateDiff(const CoinWarmStart *const oldCWS) const; - friend void - CoinWarmStartPrimalDual::applyDiff(const CoinWarmStartDiff *const diff) ; - -public: - - /*! \brief `Virtual constructor'. To be used when retaining polymorphism is - important */ - virtual CoinWarmStartDiff *clone() const - { - return new CoinWarmStartPrimalDualDiff(*this); - } - - /*! \brief Destructor */ - virtual ~CoinWarmStartPrimalDualDiff() {} - -protected: - - /*! \brief Default constructor - - This is protected (rather than private) so that derived classes can - see it when they make their default constructor protected or - private. - */ - CoinWarmStartPrimalDualDiff () : primalDiff_(), dualDiff_() {} - - /*! \brief Copy constructor - - For convenience when copying objects containing - CoinWarmStartPrimalDualDiff objects. But consider whether you should be - using #clone() to retain polymorphism. - - This is protected (rather than private) so that derived classes can - see it when the make their copy constructor protected or - private. - */ - CoinWarmStartPrimalDualDiff (const CoinWarmStartPrimalDualDiff &rhs) : - primalDiff_(rhs.primalDiff_), dualDiff_(rhs.dualDiff_) {} - - /*! \brief Clear the data - - Make it appear as if the diff was just created using the default - constructor. - */ - inline void clear() { - primalDiff_.clear(); - dualDiff_.clear(); - } - - inline void swap(CoinWarmStartPrimalDualDiff& rhs) { - if (this != &rhs) { - primalDiff_.swap(rhs.primalDiff_); - dualDiff_.swap(rhs.dualDiff_); - } - } - -private: - - /*! - \brief These two differences describe the differences in the primal and - in the dual vector. - */ - CoinWarmStartVectorDiff primalDiff_; - CoinWarmStartVectorDiff dualDiff_; -} ; - -#endif diff --git a/thirdparty/linux/include/coin1/CoinWarmStartVector.hpp b/thirdparty/linux/include/coin1/CoinWarmStartVector.hpp deleted file mode 100644 index e43ea104..00000000 --- a/thirdparty/linux/include/coin1/CoinWarmStartVector.hpp +++ /dev/null @@ -1,488 +0,0 @@ -/* $Id: CoinWarmStartVector.hpp 1498 2011-11-02 15:25:35Z mjs $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinWarmStartVector_H -#define CoinWarmStartVector_H - -#if defined(_MSC_VER) -// Turn off compiler warning about long names -# pragma warning(disable:4786) -#endif - -#include -#include - -#include "CoinHelperFunctions.hpp" -#include "CoinWarmStart.hpp" - - -//############################################################################# - -/** WarmStart information that is only a vector */ - -template -class CoinWarmStartVector : public virtual CoinWarmStart -{ -protected: - inline void gutsOfDestructor() { - delete[] values_; - } - inline void gutsOfCopy(const CoinWarmStartVector& rhs) { - size_ = rhs.size_; - values_ = new T[size_]; - CoinDisjointCopyN(rhs.values_, size_, values_); - } - -public: - /// return the size of the vector - int size() const { return size_; } - /// return a pointer to the array of vectors - const T* values() const { return values_; } - - /** Assign the vector to be the warmstart information. In this method - the object assumes ownership of the pointer and upon return #vector will - be a NULL pointer. If copying is desirable use the constructor. */ - void assignVector(int size, T*& vec) { - size_ = size; - delete[] values_; - values_ = vec; - vec = NULL; - } - - CoinWarmStartVector() : size_(0), values_(NULL) {} - - CoinWarmStartVector(int size, const T* vec) : - size_(size), values_(new T[size]) { - CoinDisjointCopyN(vec, size, values_); - } - - CoinWarmStartVector(const CoinWarmStartVector& rhs) { - gutsOfCopy(rhs); - } - - CoinWarmStartVector& operator=(const CoinWarmStartVector& rhs) { - if (this != &rhs) { - gutsOfDestructor(); - gutsOfCopy(rhs); - } - return *this; - } - - inline void swap(CoinWarmStartVector& rhs) { - if (this != &rhs) { - std::swap(size_, rhs.size_); - std::swap(values_, rhs.values_); - } - } - - /** `Virtual constructor' */ - virtual CoinWarmStart *clone() const { - return new CoinWarmStartVector(*this); - } - - virtual ~CoinWarmStartVector() { - gutsOfDestructor(); - } - - /*! \brief Clear the data - - Make it appear as if the warmstart was just created using the default - constructor. - */ - inline void clear() { - size_ = 0; - delete[] values_; - values_ = NULL; - } - - /*! \name Vector warm start `diff' methods */ - //@{ - - /*! \brief Generate a `diff' that can convert the warm start passed as a - parameter to the warm start specified by \c this. - - The capabilities are limited: the basis passed as a parameter can be no - larger than the basis pointed to by \c this. - */ - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const oldCWS) const ; - - /*! \brief Apply \p diff to this warm start. - - Update this warm start by applying \p diff. It's assumed that the - allocated capacity of the warm start is sufficiently large. - */ - - virtual void applyDiff (const CoinWarmStartDiff *const cwsdDiff) ; - - //@} - -private: - ///@name Private data members - //@{ - /// the size of the vector - int size_; - /// the vector itself - T* values_; - //@} -}; - -//============================================================================= - -/*! \class CoinWarmStartVectorDiff - \brief A `diff' between two CoinWarmStartVector objects - - This class exists in order to hide from the world the details of calculating - and representing a `diff' between two CoinWarmStartVector objects. For - convenience, assignment, cloning, and deletion are visible to the world, and - default and copy constructors are made available to derived classes. - Knowledge of the rest of this structure, and of generating and applying - diffs, is restricted to the friend functions - CoinWarmStartVector::generateDiff() and CoinWarmStartVector::applyDiff(). - - The actual data structure is a pair of vectors, #diffNdxs_ and #diffVals_. - -*/ - -template -class CoinWarmStartVectorDiff : public virtual CoinWarmStartDiff -{ - friend CoinWarmStartDiff* - CoinWarmStartVector::generateDiff(const CoinWarmStart *const oldCWS) const; - friend void - CoinWarmStartVector::applyDiff(const CoinWarmStartDiff *const diff) ; - -public: - - /*! \brief `Virtual constructor' */ - virtual CoinWarmStartDiff * clone() const { - return new CoinWarmStartVectorDiff(*this) ; - } - - /*! \brief Assignment */ - virtual CoinWarmStartVectorDiff & - operator= (const CoinWarmStartVectorDiff& rhs) ; - - /*! \brief Destructor */ - virtual ~CoinWarmStartVectorDiff() { - delete[] diffNdxs_ ; - delete[] diffVals_ ; - } - - inline void swap(CoinWarmStartVectorDiff& rhs) { - if (this != &rhs) { - std::swap(sze_, rhs.sze_); - std::swap(diffNdxs_, rhs.diffNdxs_); - std::swap(diffVals_, rhs.diffVals_); - } - } - - /*! \brief Default constructor - */ - CoinWarmStartVectorDiff () : sze_(0), diffNdxs_(0), diffVals_(NULL) {} - - /*! \brief Copy constructor - - For convenience when copying objects containing CoinWarmStartVectorDiff - objects. But consider whether you should be using #clone() to retain - polymorphism. - */ - CoinWarmStartVectorDiff(const CoinWarmStartVectorDiff& rhs) ; - - /*! \brief Standard constructor */ - CoinWarmStartVectorDiff(int sze, const unsigned int* const diffNdxs, - const T* const diffVals) ; - - /*! \brief Clear the data - - Make it appear as if the diff was just created using the default - constructor. - */ - inline void clear() { - sze_ = 0; - delete[] diffNdxs_; diffNdxs_ = NULL; - delete[] diffVals_; diffVals_ = NULL; - } - -private: - - /*! - \brief Number of entries (and allocated capacity), in units of \c T. - */ - int sze_ ; - - /*! \brief Array of diff indices */ - - unsigned int* diffNdxs_ ; - - /*! \brief Array of diff values */ - - T* diffVals_ ; -}; - -//############################################################################## - -template -class CoinWarmStartVectorPair : public virtual CoinWarmStart -{ -private: - CoinWarmStartVector t_; - CoinWarmStartVector u_; - -public: - inline int size0() const { return t_.size(); } - inline int size1() const { return u_.size(); } - inline const T* values0() const { return t_.values(); } - inline const U* values1() const { return u_.values(); } - - inline void assignVector0(int size, T*& vec) { t_.assignVector(size, vec); } - inline void assignVector1(int size, U*& vec) { u_.assignVector(size, vec); } - - CoinWarmStartVectorPair() {} - CoinWarmStartVectorPair(int s0, const T* v0, int s1, const U* v1) : - t_(s0, v0), u_(s1, v1) {} - - CoinWarmStartVectorPair(const CoinWarmStartVectorPair& rhs) : - t_(rhs.t_), u_(rhs.u_) {} - CoinWarmStartVectorPair& operator=(const CoinWarmStartVectorPair& rhs) { - if (this != &rhs) { - t_ = rhs.t_; - u_ = rhs.u_; - } - return *this; - } - - inline void swap(CoinWarmStartVectorPair& rhs) { - t_.swap(rhs.t_); - u_.swap(rhs.u_); - } - - virtual CoinWarmStart *clone() const { - return new CoinWarmStartVectorPair(*this); - } - - virtual ~CoinWarmStartVectorPair() {} - - inline void clear() { - t_.clear(); - u_.clear(); - } - - virtual CoinWarmStartDiff* - generateDiff (const CoinWarmStart *const oldCWS) const ; - - virtual void applyDiff (const CoinWarmStartDiff *const cwsdDiff) ; -}; - -//============================================================================= - -template -class CoinWarmStartVectorPairDiff : public virtual CoinWarmStartDiff -{ - friend CoinWarmStartDiff* - CoinWarmStartVectorPair::generateDiff(const CoinWarmStart *const oldCWS) const; - friend void - CoinWarmStartVectorPair::applyDiff(const CoinWarmStartDiff *const diff) ; - -private: - CoinWarmStartVectorDiff tdiff_; - CoinWarmStartVectorDiff udiff_; - -public: - CoinWarmStartVectorPairDiff() {} - CoinWarmStartVectorPairDiff(const CoinWarmStartVectorPairDiff& rhs) : - tdiff_(rhs.tdiff_), udiff_(rhs.udiff_) {} - virtual ~CoinWarmStartVectorPairDiff() {} - - virtual CoinWarmStartVectorPairDiff& - operator=(const CoinWarmStartVectorPairDiff& rhs) { - if (this != &rhs) { - tdiff_ = rhs.tdiff_; - udiff_ = rhs.udiff_; - } - return *this; - } - - virtual CoinWarmStartDiff * clone() const { - return new CoinWarmStartVectorPairDiff(*this) ; - } - - inline void swap(CoinWarmStartVectorPairDiff& rhs) { - tdiff_.swap(rhs.tdiff_); - udiff_.swap(rhs.udiff_); - } - - inline void clear() { - tdiff_.clear(); - udiff_.clear(); - } -}; - -//############################################################################## -//############################################################################# - -/* - Generate a `diff' that can convert the warm start passed as a parameter to - the warm start specified by this. - - The capabilities are limited: the basis passed as a parameter can be no - larger than the basis pointed to by this. -*/ - -template CoinWarmStartDiff* -CoinWarmStartVector::generateDiff(const CoinWarmStart *const oldCWS) const -{ -/* - Make sure the parameter is CoinWarmStartVector or derived class. -*/ - const CoinWarmStartVector* oldVector = - dynamic_cast*>(oldCWS); - if (!oldVector) - { throw CoinError("Old warm start not derived from CoinWarmStartVector.", - "generateDiff","CoinWarmStartVector") ; } - const CoinWarmStartVector* newVector = this ; - /* - Make sure newVector is equal or bigger than oldVector. Calculate the worst - case number of diffs and allocate vectors to hold them. - */ - const int oldCnt = oldVector->size() ; - const int newCnt = newVector->size() ; - - assert(newCnt >= oldCnt) ; - - unsigned int *diffNdx = new unsigned int [newCnt]; - T* diffVal = new T[newCnt]; - /* - Scan the vector vectors. For the portion of the vectors which overlap, - create diffs. Then add any additional entries from newVector. - */ - const T*oldVal = oldVector->values() ; - const T*newVal = newVector->values() ; - int numberChanged = 0 ; - int i ; - for (i = 0 ; i < oldCnt ; i++) { - if (oldVal[i] != newVal[i]) { - diffNdx[numberChanged] = i ; - diffVal[numberChanged++] = newVal[i] ; - } - } - for ( ; i < newCnt ; i++) { - diffNdx[numberChanged] = i ; - diffVal[numberChanged++] = newVal[i] ; - } - /* - Create the object of our desire. - */ - CoinWarmStartVectorDiff *diff = - new CoinWarmStartVectorDiff(numberChanged,diffNdx,diffVal) ; - /* - Clean up and return. - */ - delete[] diffNdx ; - delete[] diffVal ; - - return diff; - // return (dynamic_cast*>(diff)) ; -} - - -/* - Apply diff to this warm start. - - Update this warm start by applying diff. It's assumed that the - allocated capacity of the warm start is sufficiently large. -*/ - -template void -CoinWarmStartVector::applyDiff (const CoinWarmStartDiff *const cwsdDiff) -{ - /* - Make sure we have a CoinWarmStartVectorDiff - */ - const CoinWarmStartVectorDiff* diff = - dynamic_cast*>(cwsdDiff) ; - if (!diff) { - throw CoinError("Diff not derived from CoinWarmStartVectorDiff.", - "applyDiff","CoinWarmStartVector") ; - } - /* - Application is by straighforward replacement of words in the vector vector. - */ - const int numberChanges = diff->sze_ ; - const unsigned int *diffNdxs = diff->diffNdxs_ ; - const T* diffVals = diff->diffVals_ ; - T* vals = this->values_ ; - - for (int i = 0 ; i < numberChanges ; i++) { - unsigned int diffNdx = diffNdxs[i] ; - T diffVal = diffVals[i] ; - vals[diffNdx] = diffVal ; - } -} - -//############################################################################# - - -// Assignment - -template CoinWarmStartVectorDiff& -CoinWarmStartVectorDiff::operator=(const CoinWarmStartVectorDiff &rhs) -{ - if (this != &rhs) { - if (sze_ > 0) { - delete[] diffNdxs_ ; - delete[] diffVals_ ; - } - sze_ = rhs.sze_ ; - if (sze_ > 0) { - diffNdxs_ = new unsigned int[sze_] ; - memcpy(diffNdxs_,rhs.diffNdxs_,sze_*sizeof(unsigned int)) ; - diffVals_ = new T[sze_] ; - memcpy(diffVals_,rhs.diffVals_,sze_*sizeof(T)) ; - } else { - diffNdxs_ = 0 ; - diffVals_ = 0 ; - } - } - - return (*this) ; -} - - -// Copy constructor - -template -CoinWarmStartVectorDiff::CoinWarmStartVectorDiff(const CoinWarmStartVectorDiff &rhs) - : sze_(rhs.sze_), - diffNdxs_(0), - diffVals_(0) -{ - if (sze_ > 0) { - diffNdxs_ = new unsigned int[sze_] ; - memcpy(diffNdxs_,rhs.diffNdxs_,sze_*sizeof(unsigned int)) ; - diffVals_ = new T[sze_] ; - memcpy(diffVals_,rhs.diffVals_,sze_*sizeof(T)) ; - } -} - -/// Standard constructor - -template -CoinWarmStartVectorDiff::CoinWarmStartVectorDiff -(int sze, const unsigned int *const diffNdxs, const T *const diffVals) - : sze_(sze), - diffNdxs_(0), - diffVals_(0) -{ - if (sze > 0) { - diffNdxs_ = new unsigned int[sze] ; - memcpy(diffNdxs_,diffNdxs,sze*sizeof(unsigned int)) ; - diffVals_ = new T[sze] ; - memcpy(diffVals_,diffVals,sze*sizeof(T)) ; - } -} - -#endif diff --git a/thirdparty/linux/include/coin1/Coin_C_defines.h b/thirdparty/linux/include/coin1/Coin_C_defines.h deleted file mode 100644 index 5c43aaac..00000000 --- a/thirdparty/linux/include/coin1/Coin_C_defines.h +++ /dev/null @@ -1,115 +0,0 @@ -/* $Id: Coin_C_defines.h 1690 2014-03-13 17:45:21Z mlubin $ */ -/* - Copyright (C) 2002, 2003 International Business Machines Corporation - and others. All Rights Reserved. - - This code is licensed under the terms of the Eclipse Public License (EPL). -*/ -#ifndef CoinCDefine_H -#define CoinCDefine_H - -/** This has #defines etc for the "C" interface to Coin. - If COIN_EXTERN_C defined then an extra extern C -*/ - -#if defined (CLP_EXTERN_C) -#define COIN_EXTERN_C -#define COIN_NO_SBB -#define COIN_NO_CBC -#endif -#if defined (SBB_EXTERN_C) -#define COIN_EXTERN_C -#define COIN_NO_CLP -#endif -#if defined (CBC_EXTERN_C) -#define COIN_EXTERN_C -#define COIN_NO_CLP -#endif -/* We need to allow for Microsoft */ -#ifndef COINLIBAPI - -#if defined(CBCCINTERFACEDLL_EXPORTS) || defined(CLPMSDLL) -#if defined (COIN_EXTERN_C) -# define COINLIBAPI __declspec(dllexport) -#else -# define COINLIBAPI __declspec(dllexport) -#endif -# define COINLINKAGE __stdcall -# define COINLINKAGE_CB __cdecl -#else -#if defined (COIN_EXTERN_C) -# define COINLIBAPI extern "C" -#else -# define COINLIBAPI -#endif -# define COINLINKAGE -# define COINLINKAGE_CB -#endif - -#endif -/** User does not need to see structure of model but C++ code does */ -#if defined (CLP_EXTERN_C) -/* Real typedef for structure */ -class CMessageHandler; -typedef struct { - ClpSimplex * model_; - CMessageHandler * handler_; -} Clp_Simplex; -#else -typedef void Clp_Simplex; -#endif - -#ifndef COIN_NO_CLP -/** typedef for user call back. - The cvec are constructed so don't need to be const*/ -typedef void (COINLINKAGE_CB *clp_callback) (Clp_Simplex * model,int msgno, int ndouble, - const double * dvec, int nint, const int * ivec, - int nchar, char ** cvec); -#endif -/** User does not need to see structure of model but C++ code does */ -#if defined (SBB_EXTERN_C) -/* Real typedef for structure */ -class Sbb_MessageHandler; -typedef struct { - OsiClpSolverInterface * solver_; - SbbModel * model_; - Sbb_MessageHandler * handler_; - char * information_; -} Sbb_Model; -#else -typedef void Sbb_Model; -#endif -#if defined (CBC_EXTERN_C) -/* Real typedef for structure */ -class Cbc_MessageHandler; -typedef struct { - OsiClpSolverInterface * solver_; - CbcModel * model_; - Cbc_MessageHandler * handler_; - std::vector cmdargs_; -} Cbc_Model; -#else -typedef void Cbc_Model; -#endif -#ifndef COIN_NO_SBB -/** typedef for user call back. - The cvec are constructed so don't need to be const*/ -typedef void (COINLINKAGE_CB *sbb_callback) (Sbb_Model * model,int msgno, int ndouble, - const double * dvec, int nint, const int * ivec, - int nchar, char ** cvec); -typedef void (COINLINKAGE_CB *cbc_callback) (Cbc_Model * model,int msgno, int ndouble, - const double * dvec, int nint, const int * ivec, - int nchar, char ** cvec); -#endif -#if COIN_BIG_INDEX==0 -typedef int CoinBigIndex; -#elif COIN_BIG_INDEX==1 -typedef long CoinBigIndex; -#else -typedef long long CoinBigIndex; -#endif -/* just in case used somewhere */ -#undef COIN_NO_CLP -#undef COIN_NO_SBB -#undef COIN_NO_CBC -#endif diff --git a/thirdparty/linux/include/coin1/HSLLoader.h b/thirdparty/linux/include/coin1/HSLLoader.h deleted file mode 100644 index c38915cb..00000000 --- a/thirdparty/linux/include/coin1/HSLLoader.h +++ /dev/null @@ -1,378 +0,0 @@ -/* Copyright (C) 2008, 2011 GAMS Development and others - All Rights Reserved. - This code is published under the Eclipse Public License. - - $Id: HSLLoader.h 2317 2013-06-01 13:16:07Z stefan $ - - Author: Stefan Vigerske -*/ - -#ifndef HSLLOADER_H_ -#define HSLLOADER_H_ - -#include "IpoptConfig.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef ma77_default_control -#define ma77_control ma77_control_d -#define ma77_info ma77_info_d -#define ma77_default_control ma77_default_control_d -#define ma77_open_nelt ma77_open_nelt_d -#define ma77_open ma77_open_d -#define ma77_input_vars ma77_input_vars_d -#define ma77_input_reals ma77_input_reals_d -#define ma77_analyse ma77_analyse_d -#define ma77_factor ma77_factor_d -#define ma77_factor_solve ma77_factor_solve_d -#define ma77_solve ma77_solve_d -#define ma77_resid ma77_resid_d -#define ma77_scale ma77_scale_d -#define ma77_enquire_posdef ma77_enquire_posdef_d -#define ma77_enquire_indef ma77_enquire_indef_d -#define ma77_alter ma77_alter_d -#define ma77_restart ma77_restart_d -#define ma77_finalise ma77_finalise_d -#endif - -struct ma77_control; -struct ma77_info; -typedef double ma77pkgtype_d_; - - -#ifndef ma86_default_control -#define ma86_control ma86_control_d -#define ma86_info ma86_info_d -#define ma86_default_control ma86_default_control_d -#define ma86_analyse ma86_analyse_d -#define ma86_factor ma86_factor_d -#define ma86_factor_solve ma86_factor_solve_d -#define ma86_solve ma86_solve_d -#define ma86_finalise ma86_finalise_d -#endif - -struct ma86_control; -struct ma86_info; -typedef double ma86pkgtype_d_; -typedef double ma86realtype_d_; - -#ifndef ma97_default_control -#define ma97_control ma97_control_d -#define ma97_info ma97_info_d -#define ma97_default_control ma97_default_control_d -#define ma97_analyse ma97_analyse_d -#define ma97_factor ma97_factor_d -#define ma97_factor_solve ma97_factor_solve_d -#define ma97_solve ma97_solve_d -#define ma97_finalise ma97_finalise_d -#define ma97_free_akeep ma97_free_akeep_d -#endif - -struct ma97_control; -struct ma97_info; -typedef double ma97pkgtype_d_; -typedef double ma97realtype_d_; - -struct mc68_control_i; -struct mc68_info_i; - -#ifndef __IPTYPES_HPP__ -/* Type of Fortran integer translated into C */ -typedef FORTRAN_INTEGER_TYPE ipfint; -#endif - -typedef void (*ma27ad_t)(ipfint *N, ipfint *NZ, const ipfint *IRN, const ipfint* ICN, - ipfint *IW, ipfint* LIW, ipfint* IKEEP, ipfint *IW1, - ipfint* NSTEPS, ipfint* IFLAG, ipfint* ICNTL, - double* CNTL, ipfint *INFO, double* OPS); -typedef void (*ma27bd_t)(ipfint *N, ipfint *NZ, const ipfint *IRN, const ipfint* ICN, - double* A, ipfint* LA, ipfint* IW, ipfint* LIW, - ipfint* IKEEP, ipfint* NSTEPS, ipfint* MAXFRT, - ipfint* IW1, ipfint* ICNTL, double* CNTL, - ipfint* INFO); -typedef void (*ma27cd_t)(ipfint *N, double* A, ipfint* LA, ipfint* IW, - ipfint* LIW, double* W, ipfint* MAXFRT, - double* RHS, ipfint* IW1, ipfint* NSTEPS, - ipfint* ICNTL, double* CNTL); -typedef void (*ma27id_t)(ipfint* ICNTL, double* CNTL); - -typedef void (*ma28ad_t)(void* nsize, void* nz, void* rw, void* licn, void* iw, - void* lirn, void* iw2, void* pivtol, void* iw3, void* iw4, void* rw2, void* iflag); - -typedef void (*ma57ad_t) ( - ipfint *n, /* Order of matrix. */ - ipfint *ne, /* Number of entries. */ - const ipfint *irn, /* Matrix nonzero row structure */ - const ipfint *jcn, /* Matrix nonzero column structure */ - ipfint *lkeep, /* Workspace for the pivot order of lenght 3*n */ - ipfint *keep, /* Workspace for the pivot order of lenght 3*n */ - /* Automatically iflag = 0; ikeep pivot order iflag = 1 */ - ipfint *iwork, /* Integer work space. */ - ipfint *icntl, /* Integer Control parameter of length 30*/ - ipfint *info, /* Statistical Information; Integer array of length 20 */ - double *rinfo); /* Double Control parameter of length 5 */ - -typedef void (*ma57bd_t) ( - ipfint *n, /* Order of matrix. */ - ipfint *ne, /* Number of entries. */ - double *a, /* Numerical values. */ - double *fact, /* Entries of factors. */ - ipfint *lfact, /* Length of array `fact'. */ - ipfint *ifact, /* Indexing info for factors. */ - ipfint *lifact, /* Length of array `ifact'. */ - ipfint *lkeep, /* Length of array `keep'. */ - ipfint *keep, /* Integer array. */ - ipfint *iwork, /* Workspace of length `n'. */ - ipfint *icntl, /* Integer Control parameter of length 20. */ - double *cntl, /* Double Control parameter of length 5. */ - ipfint *info, /* Statistical Information; Integer array of length 40. */ - double *rinfo); /* Statistical Information; Real array of length 20. */ - -typedef void (*ma57cd_t) ( - ipfint *job, /* Solution job. Solve for... */ - ipfint *n, /* Order of matrix. */ - double *fact, /* Entries of factors. */ - ipfint *lfact, /* Length of array `fact'. */ - ipfint *ifact, /* Indexing info for factors. */ - ipfint *lifact, /* Length of array `ifact'. */ - ipfint *nrhs, /* Number of right hand sides. */ - double *rhs, /* Numerical Values. */ - ipfint *lrhs, /* Leading dimensions of `rhs'. */ - double *work, /* Real workspace. */ - ipfint *lwork, /* Length of `work', >= N*NRHS. */ - ipfint *iwork, /* Integer array of length `n'. */ - ipfint *icntl, /* Integer Control parameter array of length 20. */ - ipfint *info); /* Statistical Information; Integer array of length 40. */ - -typedef void (*ma57ed_t) ( - ipfint *n, - ipfint *ic, /* 0: copy real array. >=1: copy integer array. */ - ipfint *keep, - double *fact, - ipfint *lfact, - double *newfac, - ipfint *lnew, - ipfint *ifact, - ipfint *lifact, - ipfint *newifc, - ipfint *linew, - ipfint *info); - -typedef void (*ma57id_t) (double *cntl, ipfint *icntl); - -typedef void (*ma77_default_control_t)(struct ma77_control_d *control); -typedef void (*ma77_open_nelt_t)(const int n, const char* fname1, const char* fname2, - const char *fname3, const char *fname4, void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info, - const int nelt); -typedef void (*ma77_open_t)(const int n, const char* fname1, const char* fname2, - const char *fname3, const char *fname4, void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_input_vars_t)(const int idx, const int nvar, const int list[], - void **keep, const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_input_reals_t)(const int idx, const int length, - const double reals[], void **keep, const struct ma77_control_d *control, - struct ma77_info_d *info); -typedef void (*ma77_analyse_t)(const int order[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_factor_t)(const int posdef, void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info, - const double *scale); -typedef void (*ma77_factor_solve_t)(const int posdef, void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info, - const double *scale, const int nrhs, const int lx, - double rhs[]); -typedef void (*ma77_solve_t)(const int job, const int nrhs, const int lx, double x[], - void **keep, const struct ma77_control_d *control, struct ma77_info_d *info, - const double *scale); -typedef void (*ma77_resid_t)(const int nrhs, const int lx, const double x[], - const int lresid, double resid[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info, - double *anorm_bnd); -typedef void (*ma77_scale_t)(double scale[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info, - double *anorm); -typedef void (*ma77_enquire_posdef_t)(double d[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_enquire_indef_t)(int piv_order[], double d[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_alter_t)(const double d[], void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_restart_t)(const char *restart_file, const char *fname1, - const char *fname2, const char *fname3, const char *fname4, void **keep, - const struct ma77_control_d *control, struct ma77_info_d *info); -typedef void (*ma77_finalise_t)(void **keep, const struct ma77_control_d *control, - struct ma77_info_d *info); - -typedef void (*ma86_default_control_t)(struct ma86_control *control); -typedef void (*ma86_analyse_t)(const int n, const int ptr[], const int row[], - int order[], void **keep, const struct ma86_control *control, - struct ma86_info *info); -typedef void (*ma86_factor_t)(const int n, const int ptr[], const int row[], - const ma86pkgtype_d_ val[], const int order[], void **keep, - const struct ma86_control *control, struct ma86_info *info, - const ma86pkgtype_d_ scale[]); -typedef void (*ma86_factor_solve_t)(const int n, const int ptr[], - const int row[], const ma86pkgtype_d_ val[], const int order[], void **keep, - const struct ma86_control *control, struct ma86_info *info, const int nrhs, - const int ldx, ma86pkgtype_d_ x[], const ma86pkgtype_d_ scale[]); -typedef void (*ma86_solve_t)(const int job, const int nrhs, const int ldx, - ma86pkgtype_d_ *x, const int order[], void **keep, - const struct ma86_control *control, struct ma86_info *info, - const ma86pkgtype_d_ scale[]); -typedef void (*ma86_finalise_t)(void **keep, - const struct ma86_control *control); - -typedef void (*ma97_default_control_t)(struct ma97_control *control); -typedef void (*ma97_analyse_t)(const int check, const int n, const int ptr[], - const int row[], ma97pkgtype_d_ val[], void **akeep, - const struct ma97_control *control, struct ma97_info *info, int order[]); -typedef void (*ma97_factor_t)(const int matrix_type, const int ptr[], - const int row[], const ma97pkgtype_d_ val[], void **akeep, void **fkeep, - const struct ma97_control *control, struct ma97_info *info, - const ma97pkgtype_d_ scale[]); -typedef void (*ma97_factor_solve_t)(const int matrix_type, const int ptr[], - const int row[], const ma97pkgtype_d_ val[], const int nrhs, - ma97pkgtype_d_ x[], const int ldx, void **akeep, void **fkeep, - const struct ma97_control *control, struct ma97_info *info, - const ma97pkgtype_d_ scale[]); -typedef void (*ma97_solve_t)(const int job, const int nrhs, ma97pkgtype_d_ *x, - const int ldx, void **akeep, void **fkeep, - const struct ma97_control *control, struct ma97_info *info); -typedef void (*ma97_finalise_t)(void **akeep, void **fkeep); -typedef void (*ma97_free_akeep_t)(void **akeep); - -typedef void (*mc19ad_t)(ipfint *N, ipfint *NZ, double* A, ipfint *IRN, ipfint* ICN, float* R, float* C, float* W); - -typedef void (*mc68_default_control_t)(struct mc68_control_i *control); -typedef void (*mc68_order_t)(int ord, int n, const int ptr[], - const int row[], int perm[], const struct mc68_control_i *control, - struct mc68_info_i *info); - - /** Tries to load a dynamically linked library with HSL routines. - * Also tries to load symbols for those HSL routines that are not linked into Ipopt, i.e., HAVE_... is not defined. - * Return a failure if the library cannot be loaded, but not if a symbol is not found. - * @see LSL_isMA27available - * @see LSL_isMA28available - * @see LSL_isMA57available - * @see LSL_isMA77available - * @see LSL_isMA86available - * @see LSL_isMA97available - * @see LSL_isMC19available - * @param libname The name under which the HSL lib can be found, or NULL to use a default name (libhsl.SHAREDLIBEXT). - * @param msgbuf A buffer where we can store a failure message. Assumed to be NOT NULL! - * @param msglen Length of the message buffer. - * @return Zero on success, nonzero on failure. - */ - int LSL_loadHSL(const char* libname, char* msgbuf, int msglen); - - /** Unloads a loaded HSL library. - * @return Zero on success, nonzero on failure. - */ - int LSL_unloadHSL(); - - /** Indicates whether a HSL library has been loaded. - * @return Zero if not loaded, nonzero if handle is loaded - */ - int LSL_isHSLLoaded(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use MA27 have been found. - * @return Zero if not available, nonzero if MA27 is available in the loaded library. - */ - int LSL_isMA27available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use MA28 have been found. - * @return Zero if not available, nonzero if MA28 is available in the loaded library. - */ - int LSL_isMA28available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use MA57 have been found. - * @return Zero if not available, nonzero if MA57 is available in the loaded library. - */ - int LSL_isMA57available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use MA77 have been found. - * @return Zero if not available, nonzero if HSL_MA77 is available in the loaded library. - */ - int LSL_isMA77available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use HSL_MA86 have been found. - * @return Zero if not available, nonzero if HSL_MA86 is available in the loaded library. - */ - int LSL_isMA86available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use HSL_MA97 have been found. - * @return Zero if not available, nonzero if HSL_MA97 is available in the loaded library. - */ - int LSL_isMA97available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use MA57 have been found. - * @return Zero if not available, nonzero if MC19 is available in the loaded library. - */ - int LSL_isMC19available(); - - /** Indicates whether a HSL library is loaded and all symbols necessary to use HSL_MC68 have been found. - * @return Zero if not available, nonzero if MC68 is available in the loaded library. - */ - int LSL_isMC68available(); - - /** Returns name of the shared library that should contain HSL */ - char* LSL_HSLLibraryName(); - - /** sets pointers to MA27 functions */ - void LSL_setMA27(ma27ad_t ma27ad, ma27bd_t ma27bd, ma27cd_t ma27cd, ma27id_t ma27id); - - /** sets pointers to MA28 functions */ - void LSL_setMA28(ma28ad_t ma28ad); - - /** sets pointers to MA57 functions */ - void LSL_setMA57(ma57ad_t ma57ad, ma57bd_t ma57bd, ma57cd_t ma57cd, ma57ed_t ma57ed, ma57id_t ma57id); - - /** sets pointers to MA77 functions */ - void LSL_setMA77(ma77_default_control_t ma77_default_control, - ma77_open_nelt_t ma77_open_nelt, - ma77_open_t ma77_open, - ma77_input_vars_t ma77_input_vars, - ma77_input_reals_t ma77_input_reals, - ma77_analyse_t ma77_analyse, - ma77_factor_t ma77_factor, - ma77_factor_solve_t ma77_factor_solve, - ma77_solve_t ma77_solve, - ma77_resid_t ma77_resid, - ma77_scale_t ma77_scale, - ma77_enquire_posdef_t ma77_enquire_posdef, - ma77_enquire_indef_t ma77_enquire_indef, - ma77_alter_t ma77_alter, - ma77_restart_t ma77_restart, - ma77_finalise_t ma77_finalise); - - /** sets pointers to MA86 functions */ - void LSL_setMA86(ma86_default_control_t ma86_default_control, - ma86_analyse_t ma86_analyse, - ma86_factor_t ma86_factor, - ma86_factor_solve_t ma86_factor_solve, - ma86_solve_t ma86_solve, - ma86_finalise_t ma86_finalise); - - /** sets pointers to MA97 functions */ - void LSL_setMA97(ma97_default_control_t ma97_default_control, - ma97_analyse_t ma97_analyse, - ma97_factor_t ma97_factor, - ma97_factor_solve_t ma97_factor_solve, - ma97_solve_t ma97_solve, - ma97_finalise_t ma97_finalise, - ma97_free_akeep_t ma97_free_akeep); - - /** sets pointer to MC19 function */ - void LSL_setMC19(mc19ad_t mc19ad); - - /** sets pointers to MC68 functions */ - void LSL_setMC68(mc68_default_control_t mc68_default_control, mc68_order_t mc68_order); - -#ifdef __cplusplus -} -#endif - -#endif /*HSLLOADER_H_*/ diff --git a/thirdparty/linux/include/coin1/Idiot.hpp b/thirdparty/linux/include/coin1/Idiot.hpp deleted file mode 100644 index a3d7891c..00000000 --- a/thirdparty/linux/include/coin1/Idiot.hpp +++ /dev/null @@ -1,297 +0,0 @@ -/* $Id: Idiot.hpp 2078 2015-01-05 12:39:49Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -// "Idiot" as the name of this algorithm is copylefted. If you want to change -// the name then it should be something equally stupid (but not "Stupid") or -// even better something witty. - -#ifndef Idiot_H -#define Idiot_H -#ifndef OSI_IDIOT -#include "ClpSimplex.hpp" -#define OsiSolverInterface ClpSimplex -#else -#include "OsiSolverInterface.hpp" -typedef int CoinBigIndex; -#endif -class CoinMessageHandler; -class CoinMessages; -/// for use internally -typedef struct { - double infeas; - double objval; - double dropThis; - double weighted; - double sumSquared; - double djAtBeginning; - double djAtEnd; - int iteration; -} IdiotResult; -/** This class implements a very silly algorithm. It has no merit - apart from the fact that it gets an approximate solution to - some classes of problems. Better if vaguely homogeneous. - It works on problems where volume algorithm works and often - gets a better primal solution but it has no dual solution. - - It can also be used as a "crash" to get a problem started. This - is probably its most useful function. - - It is based on the idea that algorithms with terrible convergence - properties may be okay at first. Throw in some random dubious tricks - and the resulting code may be worth keeping as long as you don't - look at it. - -*/ - -class Idiot { - -public: - - /**@name Constructors and destructor - Just a pointer to model is kept - */ - //@{ - /// Default constructor - Idiot ( ); - /// Constructor with model - Idiot ( OsiSolverInterface & model ); - - /// Copy constructor. - Idiot(const Idiot &); - /// Assignment operator. This copies the data - Idiot & operator=(const Idiot & rhs); - /// Destructor - ~Idiot ( ); - //@} - - - /**@name Algorithmic calls - */ - //@{ - /// Get an approximate solution with the idiot code - void solve(); - /// Lightweight "crash" - void crash(int numberPass, CoinMessageHandler * handler, - const CoinMessages * messages, bool doCrossover = true); - /** Use simplex to get an optimal solution - mode is how many steps the simplex crossover should take to - arrive to an extreme point: - 0 - chosen,all ever used, all - 1 - chosen, all - 2 - all - 3 - do not do anything - maybe basis - + 16 do presolves - */ - void crossOver(int mode); - //@} - - - /**@name Gets and sets of most useful data - */ - //@{ - /** Starting weight - small emphasizes feasibility, - default 1.0e-4 */ - inline double getStartingWeight() const { - return mu_; - } - inline void setStartingWeight(double value) { - mu_ = value; - } - /** Weight factor - weight multiplied by this when changes, - default 0.333 */ - inline double getWeightFactor() const { - return muFactor_; - } - inline void setWeightFactor(double value) { - muFactor_ = value; - } - /** Feasibility tolerance - problem essentially feasible if - individual infeasibilities less than this. - default 0.1 */ - inline double getFeasibilityTolerance() const { - return smallInfeas_; - } - inline void setFeasibilityTolerance(double value) { - smallInfeas_ = value; - } - /** Reasonably feasible. Dubious method concentrates more on - objective when sum of infeasibilities less than this. - Very dubious default value of (Number of rows)/20 */ - inline double getReasonablyFeasible() const { - return reasonableInfeas_; - } - inline void setReasonablyFeasible(double value) { - reasonableInfeas_ = value; - } - /** Exit infeasibility - exit if sum of infeasibilities less than this. - Default -1.0 (i.e. switched off) */ - inline double getExitInfeasibility() const { - return exitFeasibility_; - } - inline void setExitInfeasibility(double value) { - exitFeasibility_ = value; - } - /** Major iterations. stop after this number. - Default 30. Use 2-5 for "crash" 50-100 for serious crunching */ - inline int getMajorIterations() const { - return majorIterations_; - } - inline void setMajorIterations(int value) { - majorIterations_ = value; - } - /** Minor iterations. Do this number of tiny steps before - deciding whether to change weights etc. - Default - dubious sqrt(Number of Rows). - Good numbers 105 to 405 say (5 is dubious method of making sure - idiot is not trying to be clever which it may do every 10 minor - iterations) */ - inline int getMinorIterations() const { - return maxIts2_; - } - inline void setMinorIterations(int value) { - maxIts2_ = value; - } - // minor iterations for first time - inline int getMinorIterations0() const { - return maxIts_; - } - inline void setMinorIterations0(int value) { - maxIts_ = value; - } - /** Reduce weight after this many major iterations. It may - get reduced before this but this is a maximum. - Default 3. 3-10 plausible. */ - inline int getReduceIterations() const { - return maxBigIts_; - } - inline void setReduceIterations(int value) { - maxBigIts_ = value; - } - /// Amount of information - default of 1 should be okay - inline int getLogLevel() const { - return logLevel_; - } - inline void setLogLevel(int value) { - logLevel_ = value; - } - /// How lightweight - 0 not, 1 yes, 2 very lightweight - inline int getLightweight() const { - return lightWeight_; - } - inline void setLightweight(int value) { - lightWeight_ = value; - } - /// strategy - inline int getStrategy() const { - return strategy_; - } - inline void setStrategy(int value) { - strategy_ = value; - } - /// Fine tuning - okay if feasibility drop this factor - inline double getDropEnoughFeasibility() const { - return dropEnoughFeasibility_; - } - inline void setDropEnoughFeasibility(double value) { - dropEnoughFeasibility_ = value; - } - /// Fine tuning - okay if weighted obj drop this factor - inline double getDropEnoughWeighted() const { - return dropEnoughWeighted_; - } - inline void setDropEnoughWeighted(double value) { - dropEnoughWeighted_ = value; - } - /// Set model - inline void setModel(OsiSolverInterface * model) { - model_ = model; - }; - //@} - - -/// Stuff for internal use -private: - - /// Does actual work - // allow public! -public: - void solve2(CoinMessageHandler * handler, const CoinMessages *messages); -private: - IdiotResult IdiSolve( - int nrows, int ncols, double * rowsol , double * colsol, - double * pi, double * djs, const double * origcost , - double * rowlower, - double * rowupper, const double * lower, - const double * upper, const double * element, - const int * row, const CoinBigIndex * colcc, - const int * length, double * lambda, - int maxIts, double mu, double drop, - double maxmin, double offset, - int strategy, double djTol, double djExit, double djFlag, - CoinThreadRandom * randomNumberGenerator); - int dropping(IdiotResult result, - double tolerance, - double small, - int *nbad); - IdiotResult objval(int nrows, int ncols, double * rowsol , double * colsol, - double * pi, double * djs, const double * cost , - const double * rowlower, - const double * rowupper, const double * lower, - const double * upper, const double * elemnt, - const int * row, const CoinBigIndex * columnStart, - const int * length, int extraBlock, int * rowExtra, - double * solExtra, double * elemExtra, double * upperExtra, - double * costExtra, double weight); - // Deals with whenUsed and slacks - int cleanIteration(int iteration, int ordinaryStart, int ordinaryEnd, - double * colsol, const double * lower, const double * upper, - const double * rowLower, const double * rowUpper, - const double * cost, const double * element, double fixTolerance, double & objChange, - double & infChange, double & maxInfeasibility); -private: - /// Underlying model - OsiSolverInterface * model_; - - double djTolerance_; - double mu_; /* starting mu */ - double drop_; /* exit if drop over 5 checks less than this */ - double muFactor_; /* reduce mu by this */ - double stopMu_; /* exit if mu gets smaller than this */ - double smallInfeas_; /* feasibility tolerance */ - double reasonableInfeas_; /* use lambdas if feasibility less than this */ - double exitDrop_; /* candidate for stopping after a major iteration */ - double muAtExit_; /* mu on exit */ - double exitFeasibility_; /* exit if infeasibility less than this */ - double dropEnoughFeasibility_; /* okay if feasibility drop this factor */ - double dropEnoughWeighted_; /* okay if weighted obj drop this factor */ - int * whenUsed_; /* array to say what was used */ - int maxBigIts_; /* always reduce mu after this */ - int maxIts_; /* do this many iterations on first go */ - int majorIterations_; - int logLevel_; - int logFreq_; - int checkFrequency_; /* can exit after 5 * this iterations (on drop) */ - int lambdaIterations_; /* do at least this many lambda iterations */ - int maxIts2_; /* do this many iterations on subsequent goes */ - int strategy_; /* 0 - default strategy - 1 - do accelerator step but be cautious - 2 - do not do accelerator step - 4 - drop, exitDrop and djTolerance all relative - 8 - keep accelerator step to theta=10.0 - - 32 - Scale - 512 - crossover - 2048 - keep lambda across mu change - 4096 - return best solution (not last found) - 8192 - always do a presolve in crossover - 16384 - costed slacks found - so whenUsed_ longer - 32768 - experimental 1 - 65536 - experimental 2 - 131072 - experimental 3 - 262144 - just values pass etc */ - - int lightWeight_; // 0 - normal, 1 lightweight -}; -#endif diff --git a/thirdparty/linux/include/coin1/IpAlgBuilder.hpp b/thirdparty/linux/include/coin1/IpAlgBuilder.hpp deleted file mode 100644 index 05692bbc..00000000 --- a/thirdparty/linux/include/coin1/IpAlgBuilder.hpp +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (C) 2004, 2007 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpAlgBuilder.hpp 2666 2016-07-20 16:02:55Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-09-29 - -#ifndef __IPALGBUILDER_HPP__ -#define __IPALGBUILDER_HPP__ - -#include "IpIpoptAlg.hpp" -#include "IpReferenced.hpp" -#include "IpAugSystemSolver.hpp" -#include "IpPDSystemSolver.hpp" - -namespace Ipopt -{ - - // forward declarations - class IterationOutput; - class HessianUpdater; - class ConvergenceCheck; - class SearchDirectionCalculator; - class EqMultiplierCalculator; - class IterateInitializer; - class LineSearch; - class MuUpdate; - - /** Builder for creating a complete IpoptAlg object. This object - * contains all subelements (such as line search objects etc). How - * the resulting IpoptAlg object is built can be influenced by the - * options. - * - * More advanced customization can be achieved by subclassing this - * class and overloading the virtual methods that build the - * individual parts. The advantage of doing this is that it allows - * one to reuse the extensive amount of options processing that - * takes place, for instance, when generating the symmetric linear - * system solver. Another method for customizing the algorithm is - * using the optional custom_solver argument, which allows the - * expert user to provide a specialized linear solver for the - * augmented system (e.g., type GenAugSystemSolver), possibly for - * user-defined matrix objects. The optional custom_solver constructor - * argument is likely obsolete, however, as more control over this - * this process can be achieved by implementing a subclass of this - * AlgBuilder (e.g., by overloading the AugSystemSolverFactory method). - */ - class AlgorithmBuilder : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - AlgorithmBuilder(SmartPtr custom_solver=NULL); - - /** Destructor */ - virtual ~AlgorithmBuilder() - {} - - //@} - - /** Methods for IpoptTypeInfo */ - //@{ - /** register the options used by the algorithm builder */ - static void RegisterOptions(SmartPtr roptions); - //@} - - /** @name Convenience methods for building solvers without having - * to duplicate the significant amount of preprocessor flag and - * option checking that takes place. These solvers are used to - * create a number of core algorithm components across the - * different Build* methods, but depending on what options are - * chosen, the first method requiring the solver to be used can - * vary. Therefore, each of the Factory methods below is paired - * with a Getter method, which is called by all parts of this - * algorithm builder to ensure the Factory is only called once. */ - //@{ - - /** Create a solver that can be used to solve a symmetric linear - * system. - * Dependencies: None - */ - virtual SmartPtr - SymLinearSolverFactory(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Get the symmetric linear system solver for this - * algorithm. This method will call the SymLinearSolverFactory - * exactly once (the first time it is used), and store its - * instance on SymSolver_ for use in subsequent calls. - */ - SmartPtr GetSymLinearSolver(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Create a solver that can be used to solve an - * augmented system. - * Dependencies: - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr - AugSystemSolverFactory(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Get the augmented system solver for this algorithm. This - * method will call the AugSystemSolverFactory exactly once (the - * first time it is used), and store its instance on AugSolver_ - * for use in subsequent calls. - */ - SmartPtr GetAugSystemSolver(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Create a solver that can be used to solve a - * primal-dual system. - * Dependencies: - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr - PDSystemSolverFactory(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Get the primal-dual system solver for this algorithm. This - * method will call the PDSystemSolverFactory exactly once (the - * first time it is used), and store its instance on PDSolver_ - * for use in subsequent calls. - */ - SmartPtr GetPDSystemSolver(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - //@} - - /** @name Methods to build parts of the algorithm */ - //@{ - /** Allocates memory for the IpoptNLP, IpoptData, and - * IpoptCalculatedQuanties arguments. - * Dependencies: None - */ - virtual void BuildIpoptObjects(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix, - const SmartPtr& nlp, - SmartPtr& ip_nlp, - SmartPtr& ip_data, - SmartPtr& ip_cq); - - /** Creates an instance of the IpoptAlgorithm class by building - * each of its required constructor arguments piece-by-piece. The - * default algorithm can be customized by overloading this method - * or by overloading one or more of the Build* methods called in - * this method's default implementation. Additional control can - * be achieved by overloading any of the *SolverFactory methods. - * This method will call (in this order): - * -> BuildIterationOutput() - * -> BuildHessianUpdater() - * -> BuildConvergenceCheck() - * -> BuildSearchDirectionCalculator() - * -> BuildEqMultiplierCalculator() - * -> BuildIterateInitializer() - * -> BuildLineSearch() - * -> BuildMuUpdate() - */ - virtual SmartPtr BuildBasicAlgorithm(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the IterationOutput class. This method - * is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: None - */ - virtual SmartPtr - BuildIterationOutput(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the HessianUpdater class. This method - * is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: None - */ - virtual SmartPtr - BuildHessianUpdater(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the ConvergenceCheck class. This method - * is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: None - */ - virtual SmartPtr - BuildConvergenceCheck(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the SearchDirectionCalculator - * class. This method is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: - * -> GetPDSystemSolver() - * -> PDSystemSolverFactory() - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr - BuildSearchDirectionCalculator(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the EqMultiplierCalculator class. This - * method is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr - BuildEqMultiplierCalculator(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the IterateInitializer class. This - * method is called in the default implementation of - * BuildBasicAlgorithm. It can be overloaded to customize that - * portion the default algorithm. - * Dependencies: - * -> EqMultCalculator_ - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr - BuildIterateInitializer(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the LineSearch class. This method is - * called in the default implementation of BuildBasicAlgorithm. - * It can be overloaded to customize that portion the default - * algorithm. - * Dependencies: - * -> EqMultCalculator_ - * -> ConvCheck_ - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - * -> GetPDSystemSolver() - * -> PDSystemSolverFactory() - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr BuildLineSearch(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Creates an instance of the MuUpdate class. This method is - * called in the default implementation of BuildBasicAlgorithm. - * It can be overloaded to customize that portion the default - * algorithm. - * Dependencies: - * -> LineSearch_ - * -> EqMultCalculator_ - * -> ConvCheck_ - * -> GetPDSystemSolver() - * -> PDSystemSolverFactory() - * -> GetAugSystemSolver() - * -> AugSystemSolverFactory() - * -> GetSymLinearSolver() - * -> SymLinearSolverFactory() - * -> custom_solver_ - */ - virtual SmartPtr BuildMuUpdate(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - //AlgorithmBuilder(); - - /** Copy Constructor */ - AlgorithmBuilder(const AlgorithmBuilder&); - - /** Overloaded Equals Operator */ - void operator=(const AlgorithmBuilder&); - //@} - - /** @name IpoptAlgorithm constructor arguments. - * These components are built in separate Build - * methods in the order defined by BuildBasicAlgorithm. - * A single core component may require one or more - * other core components in its constructor, so the - * this class holds pointers to each component for use - * between the separate Build methods. */ - //@{ - SmartPtr IterOutput_; - SmartPtr HessUpdater_; - SmartPtr ConvCheck_; - SmartPtr SearchDirCalc_; - SmartPtr EqMultCalculator_; - SmartPtr IterInitializer_; - SmartPtr LineSearch_; - SmartPtr MuUpdate_; - //@} - - /** @name Commonly used solver components - * for building core algorithm components. Each - * of these members is paired with a Factory/Getter - * method. */ - //@{ - SmartPtr SymSolver_; - SmartPtr AugSolver_; - SmartPtr PDSolver_; - //@} - - /** Optional pointer to AugSystemSolver. If this is set in the - * contructor, we will use this to solve the linear systems. */ - SmartPtr custom_solver_; - - }; -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpAlgStrategy.hpp b/thirdparty/linux/include/coin1/IpAlgStrategy.hpp deleted file mode 100644 index 746a9684..00000000 --- a/thirdparty/linux/include/coin1/IpAlgStrategy.hpp +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpAlgStrategy.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPALGSTRATEGY_HPP__ -#define __IPALGSTRATEGY_HPP__ - -#include "IpOptionsList.hpp" -#include "IpJournalist.hpp" -#include "IpIpoptCalculatedQuantities.hpp" -#include "IpIpoptNLP.hpp" -#include "IpIpoptData.hpp" - -namespace Ipopt -{ - - /** This is the base class for all algorithm strategy objects. The - * AlgorithmStrategyObject base class implements a common interface - * for all algorithm strategy objects. A strategy object is a - * component of the algorithm for which different alternatives or - * implementations exists. It allows to compose the algorithm - * before execution for a particular configuration, without the - * need to call alternatives based on enums. For example, the - * LineSearch object is a strategy object, since different line - * search options might be used for different runs. - * - * This interface is used for - * things that are done to all strategy objects, like - * initialization and setting options. - */ - class AlgorithmStrategyObject : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - AlgorithmStrategyObject() - : - initialize_called_(false) - {} - - /** Default Destructor */ - virtual ~AlgorithmStrategyObject() - {} - //@} - - /** This method is called every time the algorithm starts again - - * it is used to reset any internal state. The pointers to the - * Journalist, as well as to the IpoptNLP, IpoptData, and - * IpoptCalculatedQuantities objects should be stored in the - * instanciation of this base class. This method is also used to - * get all required user options from the OptionsList. Here, if - * prefix is given, each tag (identifying the options) is first - * looked for with the prefix in front, and if not found, without - * the prefix. Note: you should not cue off of the iteration - * count to indicate the "start" of an algorithm! - * - * Do not overload this method, since it does some general - * initialization that is common for all strategy objects. - * Overload the protected InitializeImpl method instead. - */ - bool Initialize(const Journalist& jnlst, - IpoptNLP& ip_nlp, - IpoptData& ip_data, - IpoptCalculatedQuantities& ip_cq, - const OptionsList& options, - const std::string& prefix) - { - initialize_called_ = true; - // Copy the pointers for the problem defining objects - jnlst_ = &jnlst; - ip_nlp_ = &ip_nlp; - ip_data_ = &ip_data; - ip_cq_ = &ip_cq; - - bool retval = InitializeImpl(options, prefix); - if (!retval) { - initialize_called_ = false; - } - - return retval; - } - - /** Reduced version of the Initialize method, which does not - * require special Ipopt information. This is useful for - * algorithm objects that could be used outside Ipopt, such as - * linear solvers. */ - bool ReducedInitialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) - { - initialize_called_ = true; - // Copy the pointers for the problem defining objects - jnlst_ = &jnlst; - ip_nlp_ = NULL; - ip_data_ = NULL; - ip_cq_ = NULL; - - bool retval = InitializeImpl(options, prefix); - if (!retval) { - initialize_called_ = false; - } - - return retval; - } - - protected: - /** Implementation of the initialization method that has to be - * overloaded by for each derived class. */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix)=0; - - /** @name Accessor methods for the problem defining objects. - * Those should be used by the derived classes. */ - //@{ - const Journalist& Jnlst() const - { - DBG_ASSERT(initialize_called_); - return *jnlst_; - } - IpoptNLP& IpNLP() const - { - DBG_ASSERT(initialize_called_); - DBG_ASSERT(IsValid(ip_nlp_)); - return *ip_nlp_; - } - IpoptData& IpData() const - { - DBG_ASSERT(initialize_called_); - DBG_ASSERT(IsValid(ip_data_)); - return *ip_data_; - } - IpoptCalculatedQuantities& IpCq() const - { - DBG_ASSERT(initialize_called_); - DBG_ASSERT(IsValid(ip_cq_)); - return *ip_cq_; - } - bool HaveIpData() const - { - return IsValid(ip_data_); - } - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - //AlgorithmStrategyObject(); - - - /** Copy Constructor */ - AlgorithmStrategyObject(const AlgorithmStrategyObject&); - - /** Overloaded Equals Operator */ - void operator=(const AlgorithmStrategyObject&); - //@} - - /** @name Pointers to objects defining a particular optimization - * problem */ - //@{ - SmartPtr jnlst_; - SmartPtr ip_nlp_; - SmartPtr ip_data_; - SmartPtr ip_cq_; - //@} - - /** flag indicating if Initialize method has been called (for - * debugging) */ - bool initialize_called_; - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpAlgTypes.hpp b/thirdparty/linux/include/coin1/IpAlgTypes.hpp deleted file mode 100644 index 53e8ea54..00000000 --- a/thirdparty/linux/include/coin1/IpAlgTypes.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2005, 2010 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpAlgTypes.hpp 2551 2015-02-13 02:51:47Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2005-07-19 - -#ifndef __IPALGTYPES_HPP__ -#define __IPALGTYPES_HPP__ - -#include "IpTypes.hpp" -#include "IpException.hpp" - -namespace Ipopt -{ - - /**@name Enumerations */ - //@{ - /** enum for the return from the optimize algorithm - * (obviously we need to add more) */ - enum SolverReturn { - SUCCESS, - MAXITER_EXCEEDED, - CPUTIME_EXCEEDED, - STOP_AT_TINY_STEP, - STOP_AT_ACCEPTABLE_POINT, - LOCAL_INFEASIBILITY, - USER_REQUESTED_STOP, - FEASIBLE_POINT_FOUND, - DIVERGING_ITERATES, - RESTORATION_FAILURE, - ERROR_IN_STEP_COMPUTATION, - INVALID_NUMBER_DETECTED, - TOO_FEW_DEGREES_OF_FREEDOM, - INVALID_OPTION, - OUT_OF_MEMORY, - INTERNAL_ERROR, - UNASSIGNED - }; - //@} - - /** @name Some exceptions used in multiple places */ - //@{ - DECLARE_STD_EXCEPTION(LOCALLY_INFEASIBLE); - DECLARE_STD_EXCEPTION(TOO_FEW_DOF); - DECLARE_STD_EXCEPTION(TINY_STEP_DETECTED); - DECLARE_STD_EXCEPTION(ACCEPTABLE_POINT_REACHED); - DECLARE_STD_EXCEPTION(FEASIBILITY_PROBLEM_SOLVED); - DECLARE_STD_EXCEPTION(INVALID_WARMSTART); - DECLARE_STD_EXCEPTION(INTERNAL_ABORT); - DECLARE_STD_EXCEPTION(NO_FREE_VARIABLES_BUT_FEASIBLE); - DECLARE_STD_EXCEPTION(NO_FREE_VARIABLES_AND_INFEASIBLE); - DECLARE_STD_EXCEPTION(INCONSISTENT_BOUNDS); - /** Exception FAILED_INITIALIZATION for problem during - * initialization of a strategy object (or other problems). This - * is thrown by a strategy object, if a problem arises during - * initialization, such as a value out of a feasible range. - */ - DECLARE_STD_EXCEPTION(FAILED_INITIALIZATION); - //@} - - -} - -#endif diff --git a/thirdparty/linux/include/coin1/IpAugSystemSolver.hpp b/thirdparty/linux/include/coin1/IpAugSystemSolver.hpp deleted file mode 100644 index 1396ce44..00000000 --- a/thirdparty/linux/include/coin1/IpAugSystemSolver.hpp +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpAugSystemSolver.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IP_AUGSYSTEMSOLVER_HPP__ -#define __IP_AUGSYSTEMSOLVER_HPP__ - -#include "IpSymMatrix.hpp" -#include "IpSymLinearSolver.hpp" -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - DECLARE_STD_EXCEPTION(FATAL_ERROR_IN_LINEAR_SOLVER); - - /** Base class for Solver for the augmented system. This is the - * base class for linear solvers that solve the augmented system, - * which is defined as - * - * \f$\left[\begin{array}{cccc} - * W + D_x + \delta_xI & 0 & J_c^T & J_d^T\\ - * 0 & D_s + \delta_sI & 0 & -I \\ - * J_c & 0 & D_c - \delta_cI & 0\\ - * J_d & -I & 0 & D_d - \delta_dI - * \end{array}\right] - * \left(\begin{array}{c}sol_x\\sol_s\\sol_c\\sol_d\end{array}\right)= - * \left(\begin{array}{c}rhs_x\\rhs_s\\rhs_c\\rhs_d\end{array}\right)\f$ - * - * Since this system might be solved repeatedly for different right - * hand sides, it is desirable to step the factorization of a - * direct linear solver if possible. - */ - class AugSystemSolver: public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor. */ - AugSystemSolver() - {} - /** Default destructor */ - virtual ~AugSystemSolver() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Set up the augmented system and solve it for a given right hand - * side. If desired (i.e. if check_NegEVals is true), then the - * solution is only computed if the number of negative eigenvalues - * matches numberOfNegEVals. - * - * The return value is the return value of the linear solver object. - */ - virtual ESymSolverStatus Solve( - const SymMatrix* W, - double W_factor, - const Vector* D_x, - double delta_x, - const Vector* D_s, - double delta_s, - const Matrix* J_c, - const Vector* D_c, - double delta_c, - const Matrix* J_d, - const Vector* D_d, - double delta_d, - const Vector& rhs_x, - const Vector& rhs_s, - const Vector& rhs_c, - const Vector& rhs_d, - Vector& sol_x, - Vector& sol_s, - Vector& sol_c, - Vector& sol_d, - bool check_NegEVals, - Index numberOfNegEVals) - { - std::vector > rhs_xV(1); - rhs_xV[0] = &rhs_x; - std::vector > rhs_sV(1); - rhs_sV[0] = &rhs_s; - std::vector > rhs_cV(1); - rhs_cV[0] = &rhs_c; - std::vector > rhs_dV(1); - rhs_dV[0] = &rhs_d; - std::vector > sol_xV(1); - sol_xV[0] = &sol_x; - std::vector > sol_sV(1); - sol_sV[0] = &sol_s; - std::vector > sol_cV(1); - sol_cV[0] = &sol_c; - std::vector > sol_dV(1); - sol_dV[0] = &sol_d; - return MultiSolve(W, W_factor, D_x, delta_x, D_s, delta_s, J_c, D_c, delta_c, - J_d, D_d, delta_d, rhs_xV, rhs_sV, rhs_cV, rhs_dV, - sol_xV, sol_sV, sol_cV, sol_dV, check_NegEVals, - numberOfNegEVals); - } - - /** Like Solve, but for multiple right hand sides. The inheriting - * class has to be overload at least one of Solve and - * MultiSolve. */ - virtual ESymSolverStatus MultiSolve( - const SymMatrix* W, - double W_factor, - const Vector* D_x, - double delta_x, - const Vector* D_s, - double delta_s, - const Matrix* J_c, - const Vector* D_c, - double delta_c, - const Matrix* J_d, - const Vector* D_d, - double delta_d, - std::vector >& rhs_xV, - std::vector >& rhs_sV, - std::vector >& rhs_cV, - std::vector >& rhs_dV, - std::vector >& sol_xV, - std::vector >& sol_sV, - std::vector >& sol_cV, - std::vector >& sol_dV, - bool check_NegEVals, - Index numberOfNegEVals) - { - // Solve for one right hand side after the other - Index nrhs = (Index)rhs_xV.size(); - DBG_ASSERT(nrhs>0); - DBG_ASSERT(nrhs==(Index)rhs_sV.size()); - DBG_ASSERT(nrhs==(Index)rhs_cV.size()); - DBG_ASSERT(nrhs==(Index)rhs_dV.size()); - DBG_ASSERT(nrhs==(Index)sol_xV.size()); - DBG_ASSERT(nrhs==(Index)sol_sV.size()); - DBG_ASSERT(nrhs==(Index)sol_cV.size()); - DBG_ASSERT(nrhs==(Index)sol_dV.size()); - - ESymSolverStatus retval=SYMSOLVER_SUCCESS; - for (Index i=0; i -#include -#include - -namespace Ipopt -{ - -#if COIN_IPOPT_CHECKLEVEL > 2 -# define IP_DEBUG_CACHE -#endif -#ifdef IP_DEBUG_CACHE -# include "IpDebug.hpp" -#endif - - // Forward Declarations - - template - class DependentResult; - - // AW: I'm taking this out, since this is by far the most used - // class. We should keep it as simple as possible. - // /** Cache Priority Enum */ - // enum CachePriority - // { - // CP_Lowest, - // CP_Standard, - // CP_Trial, - // CP_Iterate - // }; - - /** Templated class for Cached Results. This class stores up to a - * given number of "results", entities that are stored here - * together with identifiers, that can be used to later retrieve the - * information again. - * - * Typically, T is a SmartPtr for some calculated quantity that - * should be stored (such as a Vector). The identifiers (or - * dependencies) are a (possibly varying) number of Tags from - * TaggedObjects, and a number of Numbers. Results are added to - * the cache using the AddCachedResults methods, and the can be - * retrieved with the GetCachedResults methods. The second set of - * methods checks whether a result has been cached for the given - * identifiers. If a corresponding result is found, a copy of it - * is returned and the method evaluates to true, otherwise it - * evaluates to false. - * - * Note that cached results can become "stale", namely when a - * TaggedObject that is used to identify this CachedResult is - * changed. When this happens, the cached result can never be - * asked for again, so that there is no point in storing it any - * longer. For this purpose, a cached result, which is stored as a - * DependentResult, inherits off an Observer. This Observer - * retrieves notification whenever a TaggedObject dependency has - * changed. Stale results are later removed from the cache. - */ - template - class CachedResults - { - public: -#ifdef IP_DEBUG_CACHE - /** (Only if compiled in DEBUG mode): debug verbosity level */ - static const Index dbg_verbosity; -#endif - - /** @name Constructors and Destructors. */ - //@{ - /** Constructor, where max_cache_size is the maximal number of - * results that should be cached. If max_cache_size is negative, - * we allow an infinite amount of cache. - */ - CachedResults(Int max_cache_size); - - /** Destructor */ - virtual ~CachedResults(); - //@} - - /** @name Generic methods for adding and retrieving cached results. */ - //@{ - /** Generic method for adding a result to the cache, given a - * std::vector of TaggesObjects and a std::vector of Numbers. - */ - void AddCachedResult(const T& result, - const std::vector& dependents, - const std::vector& scalar_dependents); - - /** Generic method for retrieving a cached results, given the - * dependencies as a std::vector of TaggesObjects and a - * std::vector of Numbers. - */ - bool GetCachedResult(T& retResult, - const std::vector& dependents, - const std::vector& scalar_dependents) const; - - /** Method for adding a result, providing only a std::vector of - * TaggedObjects. - */ - void AddCachedResult(const T& result, - const std::vector& dependents); - - /** Method for retrieving a cached result, providing only a - * std::vector of TaggedObjects. - */ - bool GetCachedResult(T& retResult, - const std::vector& dependents) const; - //@} - - /** @name Pointer-based methods for adding and retrieving cached - * results, providing dependencies explicitly. - */ - //@{ - /** Method for adding a result to the cache, proving one - * dependency as a TaggedObject explicitly. - */ - void AddCachedResult1Dep(const T& result, - const TaggedObject* dependent1); - - /** Method for retrieving a cached result, proving one dependency - * as a TaggedObject explicitly. - */ - bool GetCachedResult1Dep(T& retResult, const TaggedObject* dependent1); - - /** Method for adding a result to the cache, proving two - * dependencies as a TaggedObject explicitly. - */ - void AddCachedResult2Dep(const T& result, - const TaggedObject* dependent1, - const TaggedObject* dependent2); - - /** Method for retrieving a cached result, proving two - * dependencies as a TaggedObject explicitly. - */ - bool GetCachedResult2Dep(T& retResult, - const TaggedObject* dependent1, - const TaggedObject* dependent2); - - /** Method for adding a result to the cache, proving three - * dependencies as a TaggedObject explicitly. - */ - void AddCachedResult3Dep(const T& result, - const TaggedObject* dependent1, - const TaggedObject* dependent2, - const TaggedObject* dependent3); - - /** Method for retrieving a cached result, proving three - * dependencies as a TaggedObject explicitly. - */ - bool GetCachedResult3Dep(T& retResult, - const TaggedObject* dependent1, - const TaggedObject* dependent2, - const TaggedObject* dependent3); - - /** @name Pointer-free version of the Add and Get methods */ - //@{ - bool GetCachedResult1Dep(T& retResult, const TaggedObject& dependent1) - { - return GetCachedResult1Dep(retResult, &dependent1); - } - bool GetCachedResult2Dep(T& retResult, - const TaggedObject& dependent1, - const TaggedObject& dependent2) - { - return GetCachedResult2Dep(retResult, &dependent1, &dependent2); - } - bool GetCachedResult3Dep(T& retResult, - const TaggedObject& dependent1, - const TaggedObject& dependent2, - const TaggedObject& dependent3) - { - return GetCachedResult3Dep(retResult, &dependent1, &dependent2, &dependent3); - } - void AddCachedResult1Dep(const T& result, - const TaggedObject& dependent1) - { - AddCachedResult1Dep(result, &dependent1); - } - void AddCachedResult2Dep(const T& result, - const TaggedObject& dependent1, - const TaggedObject& dependent2) - { - AddCachedResult2Dep(result, &dependent1, &dependent2); - } - void AddCachedResult3Dep(const T& result, - const TaggedObject& dependent1, - const TaggedObject& dependent2, - const TaggedObject& dependent3) - { - AddCachedResult3Dep(result, &dependent1, &dependent2, &dependent3); - } - //@} - - /** Invalidates the result for given dependencies. Sets the stale - * flag for the corresponding cached result to true if it is - * found. Returns true, if the result was found. */ - bool InvalidateResult(const std::vector& dependents, - const std::vector& scalar_dependents); - - /** Invalidates all cached results */ - void Clear(); - - /** Invalidate all cached results and changes max_cache_size */ - void Clear(Int max_cache_size); - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - CachedResults(); - - /** Copy Constructor */ - CachedResults(const CachedResults&); - - /** Overloaded Equals Operator */ - void operator=(const CachedResults&); - //@} - - /** maximum number of cached results */ - Int max_cache_size_; - - /** list of currently cached results. */ - mutable std::list*>* cached_results_; - - /** internal method for removing stale DependentResults from the - * list. It is called at the beginning of every - * GetDependentResult method. - */ - void CleanupInvalidatedResults() const; - - /** Print list of currently cached results */ - void DebugPrintCachedResults() const; - }; - - /** Templated class which stores one entry for the CachedResult - * class. It stores the result (of type T), together with its - * dependencies (vector of TaggedObjects and vector of Numbers). - * It also stores a priority. - */ - template - class DependentResult : public Observer - { - public: - -#ifdef IP_DEBUG_CACHE - static const Index dbg_verbosity; -#endif - - /** @name Constructor, Destructors */ - //@{ - /** Constructor, given all information about the result. */ - DependentResult(const T& result, const std::vector& dependents, - const std::vector& scalar_dependents); - - /** Destructor. */ - ~DependentResult(); - //@} - - /** @name Accessor method. */ - //@{ - /** This returns true, if the DependentResult is no longer valid. */ - bool IsStale() const; - - /** Invalidates the cached result. */ - void Invalidate(); - - /** Returns the cached result. */ - const T& GetResult() const; - //@} - - /** This method returns true if the dependencies provided to this - * function are identical to the ones stored with the - * DependentResult. - */ - bool DependentsIdentical(const std::vector& dependents, - const std::vector& scalar_dependents) const; - - /** Print information about this DependentResults. */ - void DebugPrint() const; - - protected: - /** This method is overloading the pure virtual method from the - * Observer base class. This method is called when a Subject - * registered for this Observer sends a notification. In this - * particular case, if this method is called with - * notify_type==NT_Changed or NT_BeingDeleted, then this results - * is marked as stale. - */ - virtual void RecieveNotification(NotifyType notify_type, const Subject* subject); - - private: - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - DependentResult(); - - /** Copy Constructor */ - DependentResult(const DependentResult&); - - /** Overloaded Equals Operator */ - void operator=(const DependentResult&); - //@} - - /** Flag indicating, if the cached result is still valid. A - result becomes invalid, if the RecieveNotification method is - called with NT_Changed */ - bool stale_; - /** The value of the dependent results */ - const T result_; - /** Dependencies in form of TaggedObjects */ - std::vector dependent_tags_; - /** Dependencies in form a Numbers */ - std::vector scalar_dependents_; - }; - -#ifdef IP_DEBUG_CACHE - template - const Index CachedResults::dbg_verbosity = 0; - - template - const Index DependentResult::dbg_verbosity = 0; -#endif - - template - DependentResult::DependentResult( - const T& result, - const std::vector& dependents, - const std::vector& scalar_dependents) - : - stale_(false), - result_(result), - dependent_tags_(dependents.size()), - scalar_dependents_(scalar_dependents) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::DependentResult()", dbg_verbosity); -#endif - - for (Index i=0; i<(Index)dependents.size(); i++) { - if (dependents[i]) { - // Call the RequestAttach method of the Observer base class. - // This will add this dependent result in the Observer list - // for the Subject dependents[i]. As a consequence, the - // RecieveNotification method of this DependentResult will be - // called with notify_type=NT_Changed, whenever the - // TaggedResult dependents[i] is changed (i.e. its HasChanged - // method is called). - RequestAttach(NT_Changed, dependents[i]); - dependent_tags_[i] = dependents[i]->GetTag(); - } - else { - dependent_tags_[i] = 0; - } - } - } - - template - DependentResult::~DependentResult() - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::~DependentResult()", dbg_verbosity); - //DBG_ASSERT(stale_ == true); -#endif - // Nothing to be done here, destructor - // of T should sufficiently remove - // any memory, etc. - } - - template - bool DependentResult::IsStale() const - { - return stale_; - } - - template - void DependentResult::Invalidate() - { - stale_ = true; - } - - template - void DependentResult::RecieveNotification(NotifyType notify_type, const Subject* subject) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::RecieveNotification", dbg_verbosity); -#endif - - if (notify_type == NT_Changed || notify_type==NT_BeingDestroyed) { - stale_ = true; - // technically, I could unregister the notifications here, but they - // aren't really hurting anything - } - } - - template - bool DependentResult::DependentsIdentical(const std::vector& dependents, - const std::vector& scalar_dependents) const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::DependentsIdentical", dbg_verbosity); - DBG_ASSERT(stale_ == false); - DBG_ASSERT(dependents.size() == dependent_tags_.size()); -#endif - - bool retVal = true; - - if (dependents.size() != dependent_tags_.size() - || scalar_dependents.size() != scalar_dependents_.size()) { - retVal = false; - } - else { - for (Index i=0; i<(Index)dependents.size(); i++) { - if ( (dependents[i] && dependents[i]->GetTag() != dependent_tags_[i]) - || (!dependents[i] && dependent_tags_[i] != 0) ) { - retVal = false; - break; - } - } - if (retVal) { - for (Index i=0; i<(Index)scalar_dependents.size(); i++) { - if (scalar_dependents[i] != scalar_dependents_[i]) { - retVal = false; - break; - } - } - } - } - - return retVal; - } - - template - const T& DependentResult::GetResult() const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::GetResult()", dbg_verbosity); - DBG_ASSERT(stale_ == false); -#endif - - return result_; - } - - template - void DependentResult::DebugPrint() const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("DependentResult::DebugPrint", dbg_verbosity); -#endif - - } - - template - CachedResults::CachedResults(Int max_cache_size) - : - max_cache_size_(max_cache_size), - cached_results_(NULL) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::CachedResults", dbg_verbosity); -#endif - - } - - template - CachedResults::~CachedResults() - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::!CachedResults()", dbg_verbosity); -#endif - - if (cached_results_) { - for (typename std::list< DependentResult* >::iterator iter = cached_results_-> - begin(); - iter != cached_results_->end(); - iter++) { - delete *iter; - } - delete cached_results_; - } - /* - while (!cached_results_.empty()) { - DependentResult* result = cached_results_.back(); - cached_results_.pop_back(); - delete result; - } - */ - } - - template - void CachedResults::AddCachedResult(const T& result, - const std::vector& dependents, - const std::vector& scalar_dependents) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::AddCachedResult", dbg_verbosity); -#endif - - CleanupInvalidatedResults(); - - // insert the new one here - DependentResult* newResult = new DependentResult(result, dependents, scalar_dependents); - if (!cached_results_) { - cached_results_ = new std::list*>; - } - cached_results_->push_front(newResult); - - // keep the list small enough - if (max_cache_size_ >= 0) { // if negative, allow infinite cache - // non-negative - limit size of list to max_cache_size - DBG_ASSERT((Int)cached_results_->size()<=max_cache_size_+1); - if ((Int)cached_results_->size() > max_cache_size_) { - delete cached_results_->back(); - cached_results_->pop_back(); - } - } - -#ifdef IP_DEBUG_CACHE - DBG_EXEC(2, DebugPrintCachedResults()); -#endif - - } - - template - void CachedResults::AddCachedResult(const T& result, - const std::vector& dependents) - { - std::vector scalar_dependents; - AddCachedResult(result, dependents, scalar_dependents); - } - - template - bool CachedResults::GetCachedResult(T& retResult, const std::vector& dependents, - const std::vector& scalar_dependents) const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::GetCachedResult", dbg_verbosity); -#endif - - if (!cached_results_) - return false; - - CleanupInvalidatedResults(); - - bool retValue = false; - typename std::list< DependentResult* >::const_iterator iter; - for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) { - if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) { - retResult = (*iter)->GetResult(); - retValue = true; - break; - } - } - -#ifdef IP_DEBUG_CACHE - DBG_EXEC(2, DebugPrintCachedResults()); -#endif - - return retValue; - } - - template - bool CachedResults::GetCachedResult( - T& retResult, const std::vector& dependents) const - { - std::vector scalar_dependents; - return GetCachedResult(retResult, dependents, scalar_dependents); - } - - template - void CachedResults::AddCachedResult1Dep(const T& result, - const TaggedObject* dependent1) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::AddCachedResult1Dep", dbg_verbosity); -#endif - - std::vector dependents(1); - dependents[0] = dependent1; - - AddCachedResult(result, dependents); - } - - template - bool CachedResults::GetCachedResult1Dep(T& retResult, const TaggedObject* dependent1) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::GetCachedResult1Dep", dbg_verbosity); -#endif - - std::vector dependents(1); - dependents[0] = dependent1; - - return GetCachedResult(retResult, dependents); - } - - template - void CachedResults::AddCachedResult2Dep(const T& result, const TaggedObject* dependent1, - const TaggedObject* dependent2) - - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::AddCachedResult2dDep", dbg_verbosity); -#endif - - std::vector dependents(2); - dependents[0] = dependent1; - dependents[1] = dependent2; - - AddCachedResult(result, dependents); - } - - template - bool CachedResults::GetCachedResult2Dep(T& retResult, const TaggedObject* dependent1, const TaggedObject* dependent2) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::GetCachedResult2Dep", dbg_verbosity); -#endif - - std::vector dependents(2); - dependents[0] = dependent1; - dependents[1] = dependent2; - - return GetCachedResult(retResult, dependents); - } - - template - void CachedResults::AddCachedResult3Dep(const T& result, const TaggedObject* dependent1, - const TaggedObject* dependent2, - const TaggedObject* dependent3) - - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::AddCachedResult2dDep", dbg_verbosity); -#endif - - std::vector dependents(3); - dependents[0] = dependent1; - dependents[1] = dependent2; - dependents[2] = dependent3; - - AddCachedResult(result, dependents); - } - - template - bool CachedResults::GetCachedResult3Dep(T& retResult, const TaggedObject* dependent1, - const TaggedObject* dependent2, - const TaggedObject* dependent3) - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::GetCachedResult2Dep", dbg_verbosity); -#endif - - std::vector dependents(3); - dependents[0] = dependent1; - dependents[1] = dependent2; - dependents[2] = dependent3; - - return GetCachedResult(retResult, dependents); - } - - template - bool CachedResults::InvalidateResult(const std::vector& dependents, - const std::vector& scalar_dependents) - { - if (!cached_results_) - return false; - - CleanupInvalidatedResults(); - - bool retValue = false; - typename std::list< DependentResult* >::const_iterator iter; - for (iter = cached_results_->begin(); iter != cached_results_->end(); - iter++) { - if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) { - (*iter)->Invalidate(); - retValue = true; - break; - } - } - - return retValue; - } - - template - void CachedResults::Clear() - { - if (!cached_results_) - return; - - typename std::list< DependentResult* >::const_iterator iter; - for (iter = cached_results_->begin(); iter != cached_results_->end(); - iter++) { - (*iter)->Invalidate(); - } - - CleanupInvalidatedResults(); - } - - template - void CachedResults::Clear(Int max_cache_size) - { - Clear(); - max_cache_size_ = max_cache_size; - } - - template - void CachedResults::CleanupInvalidatedResults() const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::CleanupInvalidatedResults", dbg_verbosity); -#endif - - if (!cached_results_) - return; - - typename std::list< DependentResult* >::iterator iter; - iter = cached_results_->begin(); - while (iter != cached_results_->end()) { - if ((*iter)->IsStale()) { - typename std::list< DependentResult* >::iterator - iter_to_remove = iter; - iter++; - DependentResult* result_to_delete = (*iter_to_remove); - cached_results_->erase(iter_to_remove); - delete result_to_delete; - } - else { - iter++; - } - } - } - - template - void CachedResults::DebugPrintCachedResults() const - { -#ifdef IP_DEBUG_CACHE - DBG_START_METH("CachedResults::DebugPrintCachedResults", dbg_verbosity); - if (DBG_VERBOSITY()>=2 ) { - if (!cached_results_) { - DBG_PRINT((2,"Currentlt no cached results:\n")); - } - else { - typename std::list< DependentResult* >::const_iterator iter; - DBG_PRINT((2,"Current set of cached results:\n")); - for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) { - DBG_PRINT((2," DependentResult:0x%x\n", (*iter))); - } - } - } -#endif - - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpCompoundMatrix.hpp b/thirdparty/linux/include/coin1/IpCompoundMatrix.hpp deleted file mode 100644 index 03e2e2a4..00000000 --- a/thirdparty/linux/include/coin1/IpCompoundMatrix.hpp +++ /dev/null @@ -1,340 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpCompoundMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPCOMPOUNDMATRIX_HPP__ -#define __IPCOMPOUNDMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class CompoundMatrixSpace; - - /** Class for Matrices consisting of other matrices. This matrix is - * a matrix that consists of zero, one or more Matrices's which are - * arranged like this: \f$ M_{\rm compound} = - * \left(\begin{array}{cccc}M_{00} & M_{01} & \ldots & M_{0,{\rm - * ncomp\_cols}-1} \\ \dots &&&\dots \\ M_{{\rm ncomp\_rows}-1,0} & - * M_{{\rm ncomp\_rows}-1,1} & \dots & M_{{\rm ncomp\_rows}-1,{\rm - * ncomp\_cols}-1}\end{array}\right)\f$. The individual components - * can be associated to different MatrixSpaces. The individual - * components can also be const and non-const Matrices. If a - * component is not set (i.e., it's pointer is NULL), then this - * components is treated like a zero-matrix of appropriate - * dimensions. - */ - class CompoundMatrix : public Matrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the owner_space. The owner_space has to - * be defined, so that at each block row and column contain at - * least one non-NULL component. The individual components can - * be set afterwards with the SeteComp and SetCompNonConst - * methods. - */ - CompoundMatrix(const CompoundMatrixSpace* owner_space); - - /** Destructor */ - virtual ~CompoundMatrix(); - //@} - - /** Method for setting an individual component at position (irow, - * icol) in the compound matrix. The counting of indices starts - * at 0. */ - void SetComp(Index irow, Index jcol, const Matrix& matrix); - - /** Method to set a non-const Matrix entry */ - void SetCompNonConst(Index irow, Index jcol, Matrix& matrix); - - /** Method to create a new matrix from the space for this block */ - void CreateBlockFromSpace(Index irow, Index jcol); - - /** Method for retrieving one block from the compound matrix as a - * const Matrix. - */ - SmartPtr GetComp(Index irow, Index jcol) const - { - return ConstComp(irow, jcol); - } - - /** Method for retrieving one block from the compound matrix as a - * non-const Matrix. Note that calling this method with mark the - * CompoundMatrix as changed. Therefore, only use this method if - * you are intending to change the Matrix that you receive. */ - SmartPtr GetCompNonConst(Index irow, Index jcol) - { - ObjectChanged(); - return Comp(irow, jcol); - } - - /** Number of block rows of this compound matrix. */ - inline Index NComps_Rows() const; - /** Number of block colmuns of this compound matrix. */ - inline Index NComps_Cols() const; - - protected: - /**@name Methods overloaded from Matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - virtual void TransMultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** X = beta*X + alpha*(Matrix S^{-1} Z). Specialized implementation. - */ - virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z, - Vector& X) const; - - /** X = S^{-1} (r + alpha*Z*M^Td). Specialized implementation. - */ - virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S, - const Vector& R, const Vector& Z, - const Vector& D, Vector& X) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - CompoundMatrix(); - - /** Copy Constructor */ - CompoundMatrix(const CompoundMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const CompoundMatrix&); - //@} - - /** Matrix of matrix's containing the components */ - std::vector > > comps_; - - /** Matrix of const matrix's containing the components */ - std::vector > > const_comps_; - - /** Copy of the owner_space ptr as a CompoundMatrixSpace instead - * of MatrixSpace */ - const CompoundMatrixSpace* owner_space_; - - /** boolean indicating if the compound matrix is in a "valid" state */ - mutable bool matrices_valid_; - - /** Method to check whether or not the matrices are valid */ - bool MatricesValid() const; - - inline const Matrix* ConstComp(Index irow, Index jcol) const; - - inline Matrix* Comp(Index irow, Index jcol); - }; - - /** This is the matrix space for CompoundMatrix. Before a CompoundMatrix - * can be created, at least one MatrixSpace has to be set per block - * row and column. Individual component MatrixSpace's can be set - * with the SetComp method. - */ - class CompoundMatrixSpace : public MatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of row and columns blocks, as - * well as the totel number of rows and columns. - */ - CompoundMatrixSpace(Index ncomps_rows, - Index ncomps_cols, - Index total_nRows, - Index total_nCols); - - /** Destructor */ - ~CompoundMatrixSpace() - {} - //@} - - /** @name Methods for setting information about the components. */ - //@{ - /** Set the number nrows of rows in row-block number irow. */ - void SetBlockRows(Index irow, Index nrows); - - /** Set the number ncols of columns in column-block number jcol. */ - void SetBlockCols(Index jcol, Index ncols); - - /** Get the number nrows of rows in row-block number irow. */ - Index GetBlockRows(Index irow) const; - - /** Set the number ncols of columns in column-block number jcol. */ - Index GetBlockCols(Index jcol) const; - - /** Set the component MatrixSpace. If auto_allocate is true, then - * a new CompoundMatrix created later with MakeNew will have this - * component automatically created with the Matrix's MakeNew. - * Otherwise, the corresponding component will be NULL and has to - * be set with the SetComp methods of the CompoundMatrix. - */ - void SetCompSpace(Index irow, Index jcol, - const MatrixSpace& mat_space, - bool auto_allocate = false); - //@} - - /** Obtain the component MatrixSpace in block row irow and block - * column jcol. - */ - SmartPtr GetCompSpace(Index irow, Index jcol) const - { - DBG_ASSERT(irow > > comp_spaces_; - - /** 2-dim std::vector of booleans deciding whether to - * allocate a new matrix for the blocks automagically */ - std::vector > allocate_block_; - - /** Vector of the number of rows in each comp column */ - std::vector block_rows_; - - /** Vector of the number of cols in each comp row */ - std::vector block_cols_; - - /** true if the CompoundMatrixSpace only has Matrix spaces along the diagonal. - * this means that the CompoundMatrix will only have matrices along the - * diagonal and it could make some operations more efficient - */ - bool diagonal_; - - /** Auxilliary function for debugging to set if all block - * dimensions have been set. */ - bool DimensionsSet() const; - }; - - /* inline methods */ - inline - Index CompoundMatrix::NComps_Rows() const - { - return owner_space_->NComps_Rows(); - } - - inline - Index CompoundMatrix::NComps_Cols() const - { - return owner_space_->NComps_Cols(); - } - - inline - const Matrix* CompoundMatrix::ConstComp(Index irow, Index jcol) const - { - DBG_ASSERT(irow < NComps_Rows()); - DBG_ASSERT(jcol < NComps_Cols()); - if (IsValid(comps_[irow][jcol])) { - return GetRawPtr(comps_[irow][jcol]); - } - else if (IsValid(const_comps_[irow][jcol])) { - return GetRawPtr(const_comps_[irow][jcol]); - } - - return NULL; - } - - inline - Matrix* CompoundMatrix::Comp(Index irow, Index jcol) - { - DBG_ASSERT(irow < NComps_Rows()); - DBG_ASSERT(jcol < NComps_Cols()); - return GetRawPtr(comps_[irow][jcol]); - } - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpCompoundSymMatrix.hpp b/thirdparty/linux/include/coin1/IpCompoundSymMatrix.hpp deleted file mode 100644 index 4ca18fe9..00000000 --- a/thirdparty/linux/include/coin1/IpCompoundSymMatrix.hpp +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpCompoundSymMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPCOMPOUNDSYMMATRIX_HPP__ -#define __IPCOMPOUNDSYMMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class CompoundSymMatrixSpace; - - /** Class for symmetric matrices consisting of other matrices. - * Here, the lower left block of the matrix is stored. - */ - class CompoundSymMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking only the number for block components into the - * row and column direction. The owner_space has to be defined, so - * that at each block row and column contain at least one non-NULL - * component. - */ - CompoundSymMatrix(const CompoundSymMatrixSpace* owner_space); - - /** Destructor */ - ~CompoundSymMatrix(); - //@} - - /** Method for setting an individual component at position (irow, - * icol) in the compound matrix. The counting of indices starts - * at 0. Since this only the lower left components are stored, we need - * to have jcol<=irow, and if irow==jcol, the matrix must be a SymMatrix */ - void SetComp(Index irow, Index jcol, const Matrix& matrix); - - /** Non const version of the same method */ - void SetCompNonConst(Index irow, Index jcol, Matrix& matrix); - - /** Method for retrieving one block from the compound matrix. - * Since this only the lower left components are stored, we need - * to have jcol<=irow */ - SmartPtr GetComp(Index irow, Index jcol) const - { - return ConstComp(irow,jcol); - } - - /** Non const version of GetComp. You should only use this method - * if you are intending to change the matrix you receive, since - * this CompoundSymMatrix will be marked as changed. */ - SmartPtr GetCompNonConst(Index irow, Index jcol) - { - ObjectChanged(); - return Comp(irow,jcol); - } - - /** Method for creating a new matrix of this specific type. */ - SmartPtr MakeNewCompoundSymMatrix() const; - - // The following don't seem to be necessary - /* Number of block rows of this compound matrix. */ - // Index NComps_NRows() const { return NComps_Dim(); } - - /* Number of block colmuns of this compound matrix. */ - // Index NComps_NCols() const { return NComps_Dim(); } - - /** Number of block rows and columns */ - Index NComps_Dim() const; - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - CompoundSymMatrix(); - - /** Copy Constructor */ - CompoundSymMatrix(const CompoundSymMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const CompoundSymMatrix&); - //@} - - /** Vector of vectors containing the components */ - std::vector > > comps_; - - /** Vector of vectors containing the const components */ - std::vector > > const_comps_; - - /** Copy of the owner_space ptr as a CompoundSymMatrixSpace */ - const CompoundSymMatrixSpace* owner_space_; - - /** boolean indicating if the compound matrix is in a "valid" state */ - mutable bool matrices_valid_; - - /** method to check wether or not the matrices are valid */ - bool MatricesValid() const; - - /** Internal method to return a const pointer to one of the comps */ - const Matrix* ConstComp(Index irow, Index jcol) const - { - DBG_ASSERT(irow < NComps_Dim()); - DBG_ASSERT(jcol <= irow); - if (IsValid(comps_[irow][jcol])) { - return GetRawPtr(comps_[irow][jcol]); - } - else if (IsValid(const_comps_[irow][jcol])) { - return GetRawPtr(const_comps_[irow][jcol]); - } - - return NULL; - } - - /** Internal method to return a non-const pointer to one of the comps */ - Matrix* Comp(Index irow, Index jcol) - { - DBG_ASSERT(irow < NComps_Dim()); - DBG_ASSERT(jcol <= irow); - // We shouldn't be asking for a non-const if this entry holds a - // const one... - DBG_ASSERT(IsNull(const_comps_[irow][jcol])); - if (IsValid(comps_[irow][jcol])) { - return GetRawPtr(comps_[irow][jcol]); - } - - return NULL; - } - }; - - /** This is the matrix space for CompoundSymMatrix. Before a - * CompoundSymMatrix can be created, at least one SymMatrixSpace has - * to be set per block row and column. Individual component - * SymMatrixSpace's can be set with the SetComp method. - */ - class CompoundSymMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of blocks (same for rows and - * columns), as well as the total dimension of the matrix. - */ - CompoundSymMatrixSpace(Index ncomp_spaces, Index total_dim); - - /** Destructor */ - ~CompoundSymMatrixSpace() - {} - //@} - - /** @name Methods for setting information about the components. */ - //@{ - /** Set the dimension dim for block row (or column) irow_jcol */ - void SetBlockDim(Index irow_jcol, Index dim); - - /** Get the dimension dim for block row (or column) irow_jcol */ - Index GetBlockDim(Index irow_jcol) const; - - /** Set the component SymMatrixSpace. If auto_allocate is true, then - * a new CompoundSymMatrix created later with MakeNew will have this - * component automatically created with the SymMatrix's MakeNew. - * Otherwise, the corresponding component will be NULL and has to - * be set with the SetComp methods of the CompoundSymMatrix. - */ - void SetCompSpace(Index irow, Index jcol, - const MatrixSpace& mat_space, - bool auto_allocate = false); - //@} - - /** Obtain the component MatrixSpace in block row irow and block - * column jcol. - */ - SmartPtr GetCompSpace(Index irow, Index jcol) const - { - DBG_ASSERT(irow block_dim_; - - /** 2-dim std::vector of matrix spaces for the components. Only - * the lower right part is stored. */ - std::vector > > comp_spaces_; - - /** 2-dim std::vector of booleans deciding whether to - * allocate a new matrix for the blocks automagically */ - std::vector > allocate_block_; - - /** boolean indicating if the compound matrix space is in a "valid" state */ - mutable bool dimensions_set_; - - /** Method to check whether or not the spaces are valid */ - bool DimensionsSet() const; - }; - - inline - SmartPtr CompoundSymMatrix::MakeNewCompoundSymMatrix() const - { - return owner_space_->MakeNewCompoundSymMatrix(); - } - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpCompoundVector.hpp b/thirdparty/linux/include/coin1/IpCompoundVector.hpp deleted file mode 100644 index a4c52abd..00000000 --- a/thirdparty/linux/include/coin1/IpCompoundVector.hpp +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpCompoundVector.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPCOMPOUNDVECTOR_HPP__ -#define __IPCOMPOUNDVECTOR_HPP__ - -#include "IpUtils.hpp" -#include "IpVector.hpp" -#include - -namespace Ipopt -{ - - /* forward declarations */ - class CompoundVectorSpace; - - /** Class of Vectors consisting of other vectors. This vector is a - * vector that consists of zero, one or more Vector's which are - * stacked on each others: \f$ x_{\rm compound} = - * \left(\begin{array}{c}x_0\\\dots\\x_{{\rm - * ncomps} - 1}\end{array}\right)\f$. The individual components can be - * associated to different VectorSpaces. The individual components - * can also be const and non-const Vectors. - */ - class CompoundVector : public Vector - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor, given the corresponding CompoundVectorSpace. - * Before this constructor can be called, all components of the - * CompoundVectorSpace have to be set, so that the constructors - * for the individual components can be called. If the flag - * create_new is true, then the individual components of the new - * CompoundVector are initialized with the MakeNew methods of - * each VectorSpace (and are non-const). Otherwise, the - * individual components can later be set using the SetComp and - * SetCompNonConst method. - */ - CompoundVector(const CompoundVectorSpace* owner_space, bool create_new); - - /** Default destructor */ - virtual ~CompoundVector(); - //@} - - /** Method for setting the pointer for a component that is a const - * Vector - */ - void SetComp(Index icomp, const Vector& vec); - - /** Method for setting the pointer for a component that is a - * non-const Vector - */ - void SetCompNonConst(Index icomp, Vector& vec); - - /** Number of components of this compound vector */ - inline Index NComps() const; - - /** Check if a particular component is const or not */ - bool IsCompConst(Index i) const - { - DBG_ASSERT(i > 0 && i < NComps()); - DBG_ASSERT(IsValid(comps_[i]) || IsValid(const_comps_[i])); - if (IsValid(const_comps_[i])) { - return true; - } - return false; - } - - /** Check if a particular component is null or not */ - bool IsCompNull(Index i) const - { - DBG_ASSERT(i >= 0 && i < NComps()); - if (IsValid(comps_[i]) || IsValid(const_comps_[i])) { - return false; - } - return true; - } - - /** Return a particular component (const version) */ - SmartPtr GetComp(Index i) const - { - return ConstComp(i); - } - - /** Return a particular component (non-const version). Note that - * calling this method with mark the CompoundVector as changed. - * Therefore, only use this method if you are intending to change - * the Vector that you receive. - */ - SmartPtr GetCompNonConst(Index i) - { - ObjectChanged(); - return Comp(i); - } - - protected: - /** @name Overloaded methods from Vector base class */ - //@{ - /** Copy the data of the vector x into this vector (DCOPY). */ - virtual void CopyImpl(const Vector& x); - - /** Scales the vector by scalar alpha (DSCAL) */ - virtual void ScalImpl(Number alpha); - - /** Add the multiple alpha of vector x to this vector (DAXPY) */ - virtual void AxpyImpl(Number alpha, const Vector &x); - - /** Computes inner product of vector x with this (DDOT) */ - virtual Number DotImpl(const Vector &x) const; - - /** Computes the 2-norm of this vector (DNRM2) */ - virtual Number Nrm2Impl() const; - - /** Computes the 1-norm of this vector (DASUM) */ - virtual Number AsumImpl() const; - - /** Computes the max-norm of this vector (based on IDAMAX) */ - virtual Number AmaxImpl() const; - - /** Set each element in the vector to the scalar alpha. */ - virtual void SetImpl(Number value); - - /** Element-wise division \f$y_i \gets y_i/x_i\f$.*/ - virtual void ElementWiseDivideImpl(const Vector& x); - - /** Element-wise multiplication \f$y_i \gets y_i*x_i\f$.*/ - virtual void ElementWiseMultiplyImpl(const Vector& x); - - /** Element-wise max against entries in x */ - virtual void ElementWiseMaxImpl(const Vector& x); - - /** Element-wise min against entries in x */ - virtual void ElementWiseMinImpl(const Vector& x); - - /** Element-wise reciprocal */ - virtual void ElementWiseReciprocalImpl(); - - /** Element-wise absolute values */ - virtual void ElementWiseAbsImpl(); - - /** Element-wise square-root */ - virtual void ElementWiseSqrtImpl(); - - /** Replaces entries with sgn of the entry */ - virtual void ElementWiseSgnImpl(); - - /** Add scalar to every component of the vector.*/ - virtual void AddScalarImpl(Number scalar); - - /** Max value in the vector */ - virtual Number MaxImpl() const; - - /** Min value in the vector */ - virtual Number MinImpl() const; - - /** Computes the sum of the lements of vector */ - virtual Number SumImpl() const; - - /** Computes the sum of the logs of the elements of vector */ - virtual Number SumLogsImpl() const; - - /** @name Implemented specialized functions */ - //@{ - /** Add two vectors (a * v1 + b * v2). Result is stored in this - vector. */ - void AddTwoVectorsImpl(Number a, const Vector& v1, - Number b, const Vector& v2, Number c); - /** Fraction to the boundary parameter. */ - Number FracToBoundImpl(const Vector& delta, Number tau) const; - /** Add the quotient of two vectors, y = a * z/s + c * y. */ - void AddVectorQuotientImpl(Number a, const Vector& z, const Vector& s, - Number c); - //@} - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - /** @name Output methods */ - //@{ - /* Print the entire vector with padding */ - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. - */ - //@{ - /** Default Constructor */ - CompoundVector(); - - /** Copy Constructor */ - CompoundVector(const CompoundVector&); - - /** Overloaded Equals Operator */ - void operator=(const CompoundVector&); - //@} - - /** Components of the compound vector. The components - * are stored by SmartPtrs in a std::vector - */ - std::vector< SmartPtr > comps_; - std::vector< SmartPtr > const_comps_; - - const CompoundVectorSpace* owner_space_; - - bool vectors_valid_; - - bool VectorsValid(); - - inline const Vector* ConstComp(Index i) const; - - inline Vector* Comp(Index i); - }; - - /** This vectors space is the vector space for CompoundVector. - * Before a CompoundVector can be created, all components of this - * CompoundVectorSpace have to be set. When calling the constructor, - * the number of component has to be specified. The individual - * VectorSpaces can be set with the SetComp method. - */ - class CompoundVectorSpace : public VectorSpace - { - public: - /** @name Constructors/Destructors. */ - //@{ - /** Constructor, has to be given the number of components and the - * total dimension of all components combined. */ - CompoundVectorSpace(Index ncomp_spaces, Index total_dim); - - /** Destructor */ - ~CompoundVectorSpace() - {} - //@} - - /** Method for setting the individual component VectorSpaces */ - virtual void SetCompSpace(Index icomp /** Number of the component to be set */ , - const VectorSpace& vec_space /** VectorSpace for component icomp */ - ); - - /** Method for obtaining an individual component VectorSpace */ - SmartPtr GetCompSpace(Index icomp) const; - - /** Accessor method to obtain the number of components */ - Index NCompSpaces() const - { - return ncomp_spaces_; - } - - /** Method for creating a new vector of this specific type. */ - virtual CompoundVector* MakeNewCompoundVector(bool create_new = true) const - { - return new CompoundVector(this, create_new); - } - - /** Overloaded MakeNew method for the VectorSpace base class. - */ - virtual Vector* MakeNew() const - { - return MakeNewCompoundVector(); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default constructor */ - CompoundVectorSpace(); - - /** Copy Constructor */ - CompoundVectorSpace(const CompoundVectorSpace&); - - /** Overloaded Equals Operator */ - CompoundVectorSpace& operator=(const CompoundVectorSpace&); - //@} - - /** Number of components */ - const Index ncomp_spaces_; - - /** std::vector of vector spaces for the components */ - std::vector< SmartPtr > comp_spaces_; - }; - - /* inline methods */ - inline - Index CompoundVector::NComps() const - { - return owner_space_->NCompSpaces(); - } - - inline - const Vector* CompoundVector::ConstComp(Index i) const - { - DBG_ASSERT(i < NComps()); - DBG_ASSERT(IsValid(comps_[i]) || IsValid(const_comps_[i])); - if (IsValid(comps_[i])) { - return GetRawPtr(comps_[i]); - } - else if (IsValid(const_comps_[i])) { - return GetRawPtr(const_comps_[i]); - } - - DBG_ASSERT(false && "shouldn't be here"); - return NULL; - } - - inline - Vector* CompoundVector::Comp(Index i) - { - DBG_ASSERT(i < NComps()); - DBG_ASSERT(IsValid(comps_[i])); - return GetRawPtr(comps_[i]); - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpConvCheck.hpp b/thirdparty/linux/include/coin1/IpConvCheck.hpp deleted file mode 100644 index 033fce4a..00000000 --- a/thirdparty/linux/include/coin1/IpConvCheck.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpConvCheck.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPCONVCHECK_HPP__ -#define __IPCONVCHECK_HPP__ - -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - - /** Base class for checking the algorithm - * termination criteria. - */ - class ConvergenceCheck : public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - ConvergenceCheck() - {} - - /** Default destructor */ - virtual ~ConvergenceCheck() - {} - //@} - - /** Convergence return enum */ - enum ConvergenceStatus { - CONTINUE, - CONVERGED, - CONVERGED_TO_ACCEPTABLE_POINT, - MAXITER_EXCEEDED, - CPUTIME_EXCEEDED, - DIVERGING, - USER_STOP, - FAILED - }; - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Pure virtual method for performing the convergence test. If - * call_intermediate_callback is true, the user callback method - * in the NLP should be called in order to see if the user - * requests an early termination. */ - virtual ConvergenceStatus - CheckConvergence(bool call_intermediate_callback = true) = 0; - - /** Method for testing if the current iterate is considered to - * satisfy the "accptable level" of accuracy. The idea is that - * if the desired convergence tolerance cannot be achieved, the - * algorithm might stop after a number of acceptable points have - * been encountered. */ - virtual bool CurrentIsAcceptable()=0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - // ConvergenceCheck(); - - /** Copy Constructor */ - ConvergenceCheck(const ConvergenceCheck&); - - /** Overloaded Equals Operator */ - void operator=(const ConvergenceCheck&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpDebug.hpp b/thirdparty/linux/include/coin1/IpDebug.hpp deleted file mode 100644 index b8aae13c..00000000 --- a/thirdparty/linux/include/coin1/IpDebug.hpp +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (C) 2004, 2007 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpDebug.hpp 2005 2011-06-06 12:55:16Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPDEBUG_HPP__ -#define __IPDEBUG_HPP__ - -#include "IpoptConfig.h" -#include "IpTypes.hpp" - -#ifdef COIN_IPOPT_CHECKLEVEL -#ifdef HAVE_CASSERT -# include -#else -# ifdef HAVE_ASSERT_H -# include -# else -# error "don't have header file for assert" -# endif -#endif -#else -#define COIN_IPOPT_CHECKLEVEL 0 -#endif - -#if COIN_IPOPT_CHECKLEVEL > 0 -# ifdef NDEBUG -# undef NDEBUG -# endif -# define DBG_ASSERT(test) assert(test) -# define DBG_ASSERT_EXCEPTION(__condition, __except_type, __msg) \ - ASSERT_EXCEPTION( (__condition), __except_type, __msg); -# define DBG_DO(__cmd) __cmd -#else -# define DBG_ASSERT(test) -# define DBG_ASSERT_EXCEPTION(__condition, __except_type, __msg) -# define DBG_DO(__cmd) -#endif - -#ifndef COIN_IPOPT_VERBOSITY -#define COIN_IPOPT_VERBOSITY 0 -#endif - -#if COIN_IPOPT_VERBOSITY < 1 -# define DBG_START_FUN(__func_name, __verbose_level) -# define DBG_START_METH(__func_name, __verbose_level) -# define DBG_PRINT(__printf_args) -# define DBG_PRINT_VECTOR(__verbose_level, __vec_name, __vec) -# define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) -# define DBG_EXEC(__verbosity, __cmd) -# define DBG_VERBOSITY() 0 -#else -#include - -namespace Ipopt -{ - // forward definition - class Journalist; - - /** Class that lives throughout the execution of a method or - * function for which debug output is to be generated. The output - * is sent to the unique debug journalist that is set with - * SetJournalist at the beginning of program execution. */ - class DebugJournalistWrapper - { - public: - /** @name Constructors/Destructors. */ - //@{ - DebugJournalistWrapper(std::string func_name, Index verbose_level); - DebugJournalistWrapper(std::string func_name, Index verbose_level, - const void* const method_owner); - ~DebugJournalistWrapper(); - //@} - - /** @name accessor methods */ - //@{ - Index Verbosity() - { - return verbose_level_; - } - const Journalist* Jnlst() - { - return jrnl_; - } - Index IndentationLevel() - { - return indentation_level_; - } - //@} - - /** Printing */ - void DebugPrintf(Index verbosity, const char* pformat, ...); - - /* Method for initialization of the static GLOBAL journalist, - * through with all debug printout is to be written. This needs - * to be set before any debug printout can be done. */ - static void SetJournalist(Journalist* jrnl); - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** default constructor */ - DebugJournalistWrapper(); - - /** copy contructor */ - DebugJournalistWrapper(const DebugJournalistWrapper&); - - /** Overloaded Equals Operator */ - DebugJournalistWrapper& operator=(const DebugJournalistWrapper&); - //@} - - static Index indentation_level_; - std::string func_name_; - Index verbose_level_; - const void* method_owner_; - - static Journalist* jrnl_; - }; -} - -# define DBG_START_FUN(__func_name, __verbose_level) \ - DebugJournalistWrapper dbg_jrnl((__func_name), (__verbose_level)); \ - -# define DBG_START_METH(__func_name, __verbose_level) \ - DebugJournalistWrapper dbg_jrnl((__func_name), (__verbose_level), this); - -# define DBG_PRINT(__args) \ - dbg_jrnl.DebugPrintf __args; - -# define DBG_EXEC(__verbose_level, __cmd) \ - if (dbg_jrnl.Verbosity() >= (__verbose_level)) { \ - (__cmd); \ - } - -# define DBG_VERBOSITY() \ - dbg_jrnl.Verbosity() - -#endif - - -#endif diff --git a/thirdparty/linux/include/coin1/IpDenseVector.hpp b/thirdparty/linux/include/coin1/IpDenseVector.hpp deleted file mode 100644 index 380a06c0..00000000 --- a/thirdparty/linux/include/coin1/IpDenseVector.hpp +++ /dev/null @@ -1,550 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpDenseVector.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPDENSEVECTOR_HPP__ -#define __IPDENSEVECTOR_HPP__ - -#include "IpUtils.hpp" -#include "IpVector.hpp" -#include - -namespace Ipopt -{ - - /* forward declarations */ - class DenseVectorSpace; - - /** @name Exceptions */ - //@{ - DECLARE_STD_EXCEPTION(METADATA_ERROR); - //@} - - /** Dense Vector Implementation. This is the default Vector class - * in Ipopt. It stores vectors in contiguous Number arrays, unless - * the vector has the same value in all entires. In the latter - * case, we call the vector "homogeneous", and we store only the - * values that is repeated in all elements. If you want to obtain - * the values of vector, use the IsHomogeneous() method to find out - * what status the vector is in, and then use either Values() const - * or Scalar() const methods to get the values. To set the values - * of a homogeneous method, use the Set method. To set the values - * of a non-homogeneous vector, use the SetValues method, or use - * the non-const Values method to get an array that you can - * overwrite. In the latter case, storage is ensured. - */ - class DenseVector : public Vector - { - public: - - /**@name Constructors / Destructors */ - //@{ - /** Default Constructor - */ - DenseVector(const DenseVectorSpace* owner_space); - - /** Destructor - */ - virtual ~DenseVector(); - //@} - - /** @name Additional public methods not in Vector base class. */ - //@{ - /** Create a new DenseVector from same VectorSpace */ - SmartPtr MakeNewDenseVector() const; - - /** Set elements in the vector to the Number array x. */ - void SetValues(const Number *x); - - /** Obtain pointer to the internal Number array with vector - * elements with the indention to change the vector data (USE - * WITH CARE!). This does not produce a copy, and lifetime is not - * guaranteed!. - */ - inline Number* Values(); - - /** Obtain pointer to the internal Number array with vector - * elements without the intention to change the vector data (USE - * WITH CARE!). This does not produce a copy, and lifetime is not - * guaranteed! IMPORTANT: If this method is currently - * homogeneous (i.e. IsHomogeneous returns true), then you cannot - * call this method. Instead, you need to use the Scalar() - * method. - */ - inline const Number* Values() const; - - /** The same as the const version of Values, but we ensure that we - * always return a valid array, even if IsHomogeneous returns - * true. */ - const Number* ExpandedValues() const; - - /** This is the same as Values, but we add it here so that - * ExpandedValues can also be used for the non-const case. */ - inline Number* ExpandedValues() - { - return Values(); - } - - /** Indicates if the vector is homogeneous (i.e., all entries have - * the value Scalar() */ - bool IsHomogeneous() const - { - return homogeneous_; - } - - /** Scalar value of all entries in a homogeneous vector */ - Number Scalar() const - { - DBG_ASSERT(homogeneous_); - return scalar_; - } - //@} - - /** @name Modifying subranges of the vector. */ - //@{ - /** Copy the data in x into the subrange of this vector starting - * at position Pos in this vector. Position count starts at 0. - */ - void CopyToPos(Index Pos, const Vector& x); - /** Copy a subrange of x, starting at Pos, into the full data of - * this vector. Position count starts at 0. - */ - void CopyFromPos(Index Pos, const Vector& x); - //@} - - protected: - /** @name Overloaded methods from Vector base class */ - //@{ - /** Copy the data of the vector x into this vector (DCOPY). */ - virtual void CopyImpl(const Vector& x); - - /** Scales the vector by scalar alpha (DSCAL) */ - virtual void ScalImpl(Number alpha); - - /** Add the multiple alpha of vector x to this vector (DAXPY) */ - virtual void AxpyImpl(Number alpha, const Vector &x); - - /** Computes inner product of vector x with this (DDOT) */ - virtual Number DotImpl(const Vector &x) const; - - /** Computes the 2-norm of this vector (DNRM2) */ - virtual Number Nrm2Impl() const; - - /** Computes the 1-norm of this vector (DASUM) */ - virtual Number AsumImpl() const; - - /** Computes the max-norm of this vector (based on IDAMAX) */ - virtual Number AmaxImpl() const; - - /** Set each element in the vector to the scalar alpha. */ - virtual void SetImpl(Number value); - - /** Element-wise division \f$y_i \gets y_i/x_i\f$.*/ - virtual void ElementWiseDivideImpl(const Vector& x); - - /** Element-wise multiplication \f$y_i \gets y_i*x_i\f$.*/ - virtual void ElementWiseMultiplyImpl(const Vector& x); - - /** Set entry to max of itself and the corresponding element in x */ - virtual void ElementWiseMaxImpl(const Vector& x); - - /** Set entry to min of itself and the corresponding element in x */ - virtual void ElementWiseMinImpl(const Vector& x); - - /** reciprocates the elements of the vector */ - virtual void ElementWiseReciprocalImpl(); - - /** take abs of the elements of the vector */ - virtual void ElementWiseAbsImpl(); - - /** take square-root of the elements of the vector */ - virtual void ElementWiseSqrtImpl(); - - /** Changes each entry in the vector to its sgn value */ - virtual void ElementWiseSgnImpl(); - - /** Add scalar to every component of the vector.*/ - virtual void AddScalarImpl(Number scalar); - - /** Max value in the vector */ - virtual Number MaxImpl() const; - - /** Min value in the vector */ - virtual Number MinImpl() const; - - /** Computes the sum of the lements of vector */ - virtual Number SumImpl() const; - - /** Computes the sum of the logs of the elements of vector */ - virtual Number SumLogsImpl() const; - - /** @name Implemented specialized functions */ - //@{ - /** Add two vectors (a * v1 + b * v2). Result is stored in this - vector. */ - void AddTwoVectorsImpl(Number a, const Vector& v1, - Number b, const Vector& v2, Number c); - /** Fraction to the boundary parameter. */ - Number FracToBoundImpl(const Vector& delta, Number tau) const; - /** Add the quotient of two vectors, y = a * z/s + c * y. */ - void AddVectorQuotientImpl(Number a, const Vector& z, const Vector& s, - Number c); - //@} - - /** @name Output methods */ - //@{ - /* Print the entire vector with padding */ - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const - { - PrintImplOffset(jnlst, level, category, name, indent, prefix, 1); - } - /* Print the entire vector with padding, and start counting with - an offset. */ - void PrintImplOffset(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix, - Index offset) const; - //@} - friend class ParVector; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - DenseVector(); - - /** Copy Constructor */ - DenseVector(const DenseVector&); - - /** Overloaded Equals Operator */ - void operator=(const DenseVector&); - //@} - - /** Copy of the owner_space ptr as a DenseVectorSpace instead - * of a VectorSpace - */ - const DenseVectorSpace* owner_space_; - - /** Dense Number array of vector values. */ - Number* values_; - - /** Dense Number array pointer that is used for ExpandedValues */ - mutable Number* expanded_values_; - - /** Method of getting the internal values array, making sure that - * memory has been allocated */ - inline - Number* values_allocated(); - - /** Flag for Initialization. This flag is false, if the data has - not yet been initialized. */ - bool initialized_; - - /** Flag indicating whether the vector is currently homogeneous - * (that is, all elements have the same value). This flag is used - * to determine whether the elements of the vector are stored in - * values_ or in scalar_ */ - bool homogeneous_; - - /** Homogeneous value of all elements if the vector is currently - * homogenous */ - Number scalar_; - - /** Auxilliary method for setting explicitly all elements in - * values_ to the current scalar value. */ - void set_values_from_scalar(); - }; - - /** typedefs for the map variables that define meta data for the - * DenseVectorSpace - */ - typedef std::map > StringMetaDataMapType; - typedef std::map > IntegerMetaDataMapType; - typedef std::map > NumericMetaDataMapType; - - /** This vectors space is the vector space for DenseVector. - */ - class DenseVectorSpace : public VectorSpace - { - public: - /** @name Constructors/Destructors. */ - //@{ - /** Constructor, requires dimension of all vector for this - * VectorSpace - */ - DenseVectorSpace(Index dim) - : - VectorSpace(dim) - {} - - /** Destructor */ - ~DenseVectorSpace() - {} - //@} - - /** Method for creating a new vector of this specific type. */ - inline - DenseVector* MakeNewDenseVector() const - { - return new DenseVector(this); - } - - /** Instantiation of the generate MakeNew method for the - * VectorSpace base class. - */ - virtual Vector* MakeNew() const - { - return MakeNewDenseVector(); - } - - /**@name Methods called by DenseVector for memory management. - * This could allow to have sophisticated memory management in the - * VectorSpace. - */ - //@{ - /** Allocate internal storage for the DenseVector */ - inline - Number* AllocateInternalStorage() const; - - /** Deallocate internal storage for the DenseVector */ - inline - void FreeInternalStorage(Number* values) const; - //@} - - /**@name Methods for dealing with meta data on the vector - */ - //@{ - /** Check if string meta exists for tag */ - inline - bool HasStringMetaData(const std::string tag) const; - - /** Check if Integer meta exists for tag */ - inline - bool HasIntegerMetaData(const std::string tag) const; - - /** Check if Numeric meta exists for tag */ - inline - bool HasNumericMetaData(const std::string tag) const; - - /** Get meta data of type std::string by tag */ - inline - const std::vector& GetStringMetaData(const std::string& tag) const; - - /** Get meta data of type Index by tag */ - inline - const std::vector& GetIntegerMetaData(const std::string& tag) const; - - /** Get meta data of type Number by tag */ - inline - const std::vector& GetNumericMetaData(const std::string& tag) const; - - /** Set meta data of type std::string by tag */ - inline - void SetStringMetaData(std::string tag, std::vector meta_data); - - /** Set meta data of type Index by tag */ - inline - void SetIntegerMetaData(std::string tag, std::vector meta_data); - - /** Set meta data of type Number by tag */ - inline - void SetNumericMetaData(std::string tag, std::vector meta_data); - - /** Get map of meta data of type Number */ - inline - const StringMetaDataMapType& GetStringMetaData() const; - - /** Get map of meta data of type Number */ - inline - const IntegerMetaDataMapType& GetIntegerMetaData() const; - - /** Get map of meta data of type Number */ - inline - const NumericMetaDataMapType& GetNumericMetaData() const; - //@} - - private: - // variables to store vector meta data - StringMetaDataMapType string_meta_data_; - IntegerMetaDataMapType integer_meta_data_; - NumericMetaDataMapType numeric_meta_data_; - - }; - - // inline functions - inline Number* DenseVector::Values() - { - // Here we assume that every time someone requests this direct raw - // pointer, the data is going to change and the Tag for this - // vector has to be updated. - - if (initialized_ && homogeneous_) { - // If currently the vector is a homogeneous vector, set all elements - // explicitly to this value - set_values_from_scalar(); - } - ObjectChanged(); - initialized_= true; - homogeneous_ = false; - return values_allocated(); - } - - inline const Number* DenseVector::Values() const - { - DBG_ASSERT(initialized_ && (Dim()==0 || values_)); - return values_; - } - - inline Number* DenseVector::values_allocated() - { - if (values_==NULL) { - values_ = owner_space_->AllocateInternalStorage(); - } - return values_; - } - - inline - Number* DenseVectorSpace::AllocateInternalStorage() const - { - if (Dim()>0) { - return new Number[Dim()]; - } - else { - return NULL; - } - } - - inline - void DenseVectorSpace::FreeInternalStorage(Number* values) const - { - delete [] values; - } - - inline - SmartPtr DenseVector::MakeNewDenseVector() const - { - return owner_space_->MakeNewDenseVector(); - } - - inline - bool DenseVectorSpace::HasStringMetaData(const std::string tag) const - { - StringMetaDataMapType::const_iterator iter; - iter = string_meta_data_.find(tag); - - if (iter != string_meta_data_.end()) { - return true; - } - - return false; - } - - inline - bool DenseVectorSpace::HasIntegerMetaData(const std::string tag) const - { - IntegerMetaDataMapType::const_iterator iter; - iter = integer_meta_data_.find(tag); - - if (iter != integer_meta_data_.end()) { - return true; - } - - return false; - } - - inline - bool DenseVectorSpace::HasNumericMetaData(const std::string tag) const - { - NumericMetaDataMapType::const_iterator iter; - iter = numeric_meta_data_.find(tag); - - if (iter != numeric_meta_data_.end()) { - return true; - } - - return false; - } - - inline - const std::vector& DenseVectorSpace::GetStringMetaData(const std::string& tag) const - { - DBG_ASSERT(HasStringMetaData(tag)); - StringMetaDataMapType::const_iterator iter; - iter = string_meta_data_.find(tag); - return iter->second; - } - - inline - const std::vector& DenseVectorSpace::GetIntegerMetaData(const std::string& tag) const - { - DBG_ASSERT(HasIntegerMetaData(tag)); - IntegerMetaDataMapType::const_iterator iter; - iter = integer_meta_data_.find(tag); - return iter->second; - } - - inline - const std::vector& DenseVectorSpace::GetNumericMetaData(const std::string& tag) const - { - DBG_ASSERT(HasNumericMetaData(tag)); - NumericMetaDataMapType::const_iterator iter; - iter = numeric_meta_data_.find(tag); - return iter->second; - } - - inline - void DenseVectorSpace::SetStringMetaData(std::string tag, std::vector meta_data) - { - string_meta_data_[tag] = meta_data; - } - - inline - void DenseVectorSpace::SetIntegerMetaData(std::string tag, std::vector meta_data) - { - integer_meta_data_[tag] = meta_data; - } - - inline - void DenseVectorSpace::SetNumericMetaData(std::string tag, std::vector meta_data) - { - numeric_meta_data_[tag] = meta_data; - } - - inline - const StringMetaDataMapType& DenseVectorSpace::GetStringMetaData() const - { - return string_meta_data_; - } - - inline - const IntegerMetaDataMapType& DenseVectorSpace::GetIntegerMetaData() const - { - return integer_meta_data_; - } - - inline - const NumericMetaDataMapType& DenseVectorSpace::GetNumericMetaData() const - { - return numeric_meta_data_; - } - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpDiagMatrix.hpp b/thirdparty/linux/include/coin1/IpDiagMatrix.hpp deleted file mode 100644 index d912e772..00000000 --- a/thirdparty/linux/include/coin1/IpDiagMatrix.hpp +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpDiagMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPDIAGMATRIX_HPP__ -#define __IPDIAGMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /** Class for diagonal matrices. The diagonal is stored as a - * Vector. */ - class DiagMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, given the corresponding matrix space. */ - DiagMatrix(const SymMatrixSpace* owner_space); - - /** Destructor */ - ~DiagMatrix(); - //@} - - /** Method for setting the diagonal elements (as a Vector). */ - void SetDiag(const Vector& diag) - { - diag_ = &diag; - } - - /** Method for setting the diagonal elements. */ - SmartPtr GetDiag() const - { - return diag_; - } - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - DiagMatrix(); - - /** Copy Constructor */ - DiagMatrix(const DiagMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const DiagMatrix&); - //@} - - /** Vector storing the diagonal elements */ - SmartPtr diag_; - }; - - /** This is the matrix space for DiagMatrix. */ - class DiagMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the dimension of the matrix. */ - DiagMatrixSpace(Index dim) - : - SymMatrixSpace(dim) - {} - - /** Destructor */ - virtual ~DiagMatrixSpace() - {} - //@} - - /** Overloaded MakeNew method for the SymMatrixSpace base class. - */ - virtual SymMatrix* MakeNewSymMatrix() const - { - return MakeNewDiagMatrix(); - } - - /** Method for creating a new matrix of this specific type. */ - DiagMatrix* MakeNewDiagMatrix() const - { - return new DiagMatrix(this); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - DiagMatrixSpace(); - - /** Copy Constructor */ - DiagMatrixSpace(const DiagMatrixSpace&); - - /** Overloaded Equals Operator */ - void operator=(const DiagMatrixSpace&); - //@} - - }; - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpEqMultCalculator.hpp b/thirdparty/linux/include/coin1/IpEqMultCalculator.hpp deleted file mode 100644 index 7c3cb200..00000000 --- a/thirdparty/linux/include/coin1/IpEqMultCalculator.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpEqMultCalculator.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-09-23 - -#ifndef __IPEQMULTCALCULATOR_HPP__ -#define __IPEQMULTCALCULATOR_HPP__ - -#include "IpUtils.hpp" -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - /** Base Class for objects that compute estimates for the equality - * constraint multipliers y_c and y_d. For example, this is the - * base class for objects for computing least square multipliers or - * coordinate multipliers. */ - class EqMultiplierCalculator: public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor. */ - EqMultiplierCalculator() - {} - /** Default destructor */ - virtual ~EqMultiplierCalculator() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** This method computes the estimates for y_c and y_d at the - * current point. If the estimates cannot be computed (e.g. some - * linear system is singular), the return value of this method is - * false. */ - virtual bool CalculateMultipliers(Vector& y_c, - Vector& y_d) = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - EqMultiplierCalculator(const EqMultiplierCalculator&); - - /** Overloaded Equals Operator */ - void operator=(const EqMultiplierCalculator&); - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpException.hpp b/thirdparty/linux/include/coin1/IpException.hpp deleted file mode 100644 index e64226f3..00000000 --- a/thirdparty/linux/include/coin1/IpException.hpp +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpException.hpp 2023 2011-06-18 18:49:49Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPEXCEPTION_HPP__ -#define __IPEXCEPTION_HPP__ - -#include "IpUtils.hpp" -#include "IpJournalist.hpp" - -/* This file contains a base class for all exceptions - * and a set of macros to help with exceptions - */ - -namespace Ipopt -{ - - /** This is the base class for all exceptions. The easiest way to - * use this class is by means of the following macros: - * - * \verbatim - - DECLARE_STD_EXCEPTION(ExceptionType); - \endverbatim - * - * This macro defines a new class with the name ExceptionType, - * inherited from the base class IpoptException. After this, - * exceptions of this type can be thrown using - * - * \verbatim - - THROW_EXCEPTION(ExceptionType, Message); - \endverbatim - * - * where Message is a std::string with a message that gives an - * indication of what caused the exception. Exceptions can also be - * thrown using the macro - * - * \verbatim - - ASSERT_EXCEPTION(Condition, ExceptionType, Message); - \endverbatim - * - * where Conditions is an expression. If Condition evaluates to - * false, then the exception of the type ExceptionType is thrown - * with Message. - * - * When an exception is caught, the method ReportException can be - * used to write the information about the exception to the - * Journalist, using the level J_ERROR and the category J_MAIN. - * - */ - class IpoptException - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - IpoptException(std::string msg, std::string file_name, Index line_number, std::string type="IpoptException") - : - msg_(msg), - file_name_(file_name), - line_number_(line_number), - type_(type) - {} - - /** Copy Constructor */ - IpoptException(const IpoptException& copy) - : - msg_(copy.msg_), - file_name_(copy.file_name_), - line_number_(copy.line_number_), - type_(copy.type_) - {} - - /** Default destructor */ - virtual ~IpoptException() - {} - //@} - - /** Method to report the exception to a journalist */ - void ReportException(const Journalist& jnlst, - EJournalLevel level = J_ERROR) const - { - jnlst.Printf(level, J_MAIN, - "Exception of type: %s in file \"%s\" at line %d:\n Exception message: %s\n", - type_.c_str(), file_name_.c_str(), line_number_, msg_.c_str()); - } - - const std::string& Message() const - { - return msg_; - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - IpoptException(); - - /** Overloaded Equals Operator */ - void operator=(const IpoptException&); - //@} - - std::string msg_; - std::string file_name_; - Index line_number_; - std::string type_; - }; - -} // namespace Ipopt - -#define THROW_EXCEPTION(__except_type, __msg) \ - throw __except_type( (__msg), (__FILE__), (__LINE__) ); - -#define ASSERT_EXCEPTION(__condition, __except_type, __msg) \ - if (! (__condition) ) { \ - std::string newmsg = #__condition; \ - newmsg += " evaluated false: "; \ - newmsg += __msg; \ - throw __except_type( (newmsg), (__FILE__), (__LINE__) ); \ - } - -#define DECLARE_STD_EXCEPTION(__except_type) \ - class __except_type : public Ipopt::IpoptException \ - { \ - public: \ - __except_type(std::string msg, std::string fname, Ipopt::Index line) \ - : Ipopt::IpoptException(msg,fname,line, #__except_type) {} \ - __except_type(const __except_type& copy) \ - : Ipopt::IpoptException(copy) {} \ - private: \ - __except_type(); \ - void operator=(const __except_type&); \ - } - -#endif diff --git a/thirdparty/linux/include/coin1/IpExpansionMatrix.hpp b/thirdparty/linux/include/coin1/IpExpansionMatrix.hpp deleted file mode 100644 index cbb9a99c..00000000 --- a/thirdparty/linux/include/coin1/IpExpansionMatrix.hpp +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpExpansionMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPEXPANSIONMATRIX_HPP__ -#define __IPEXPANSIONMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpMatrix.hpp" - -namespace Ipopt -{ - - /** forward declarations */ - class ExpansionMatrixSpace; - - /** Class for expansion/projection matrices. These matrices allow - * to lift a vector to a vector with larger dimension, keeping - * some elements of the larger vector zero. This operation is achieved - * by the MultVector operation. The transpose operation then - * filters some elements from a large vector into a smaller vector. - */ - class ExpansionMatrix : public Matrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the owner_space. - */ - ExpansionMatrix(const ExpansionMatrixSpace* owner_space); - - /** Destructor */ - ~ExpansionMatrix(); - //@} - - /** Return the vector of indices marking the expanded position. - * The result is the Index array (of length NSmallVec=NCols()) - * that stores the mapping from the small vector to the large - * vector. For each element i=0,..,NSmallVec in the small - * vector, ExpandedPosIndices()[i] give the corresponding index - * in the large vector. - */ - const Index* ExpandedPosIndices() const; - - /** Return the vector of indices marking the compressed position. - * The result is the Index array (of length NLargeVec=NRows()) - * that stores the mapping from the large vector to the small - * vector. For each element i=0,..,NLargeVec in the large - * vector, CompressedPosIndices()[i] gives the corresponding - * index in the small vector, unless CompressedPosIndices()[i] is - * negative. - */ - const Index* CompressedPosIndices() const; - - protected: - /**@name Overloaded methods from Matrix base class*/ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta, - Vector &y) const; - - virtual void TransMultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** X = beta*X + alpha*(Matrix S^{-1} Z). Specialized implementation. - */ - virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z, - Vector& X) const; - - /** X = S^{-1} (r + alpha*Z*M^Td). Specialized implementation. - */ - virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S, - const Vector& R, const Vector& Z, - const Vector& D, Vector& X) const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const - { - PrintImplOffset(jnlst, level, category, name, indent, prefix, 1, 1); - } - //@} - - void PrintImplOffset(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix, - Index row_offset, - Index col_offset) const; - - friend class ParExpansionMatrix; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - ExpansionMatrix(); - - /** Copy Constructor */ - ExpansionMatrix(const ExpansionMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const ExpansionMatrix&); - //@} - - const ExpansionMatrixSpace* owner_space_; - - }; - - /** This is the matrix space for ExpansionMatrix. - */ - class ExpansionMatrixSpace : public MatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the list of elements of the large vector - * (of size NLargeVec) to be filtered into the small vector (of - * size NSmallVec). For each i=0..NSmallVec-1 the i-th element - * of the small vector will be put into the ExpPos[i] position of - * the large vector. The position counting in the vector is - * assumed to start at 0 (C-like array notation). - */ - ExpansionMatrixSpace(Index NLargeVec, - Index NSmallVec, - const Index *ExpPos, - const int offset = 0); - - /** Destructor */ - ~ExpansionMatrixSpace() - { - delete [] compressed_pos_; - delete [] expanded_pos_; - } - //@} - - /** Method for creating a new matrix of this specific type. */ - ExpansionMatrix* MakeNewExpansionMatrix() const - { - return new ExpansionMatrix(this); - } - - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewExpansionMatrix(); - } - - /** Accessor Method to obtain the Index array (of length - * NSmallVec=NCols()) that stores the mapping from the small - * vector to the large vector. For each element i=0,..,NSmallVec - * in the small vector, ExpandedPosIndices()[i] give the - * corresponding index in the large vector. - */ - const Index* ExpandedPosIndices() const - { - return expanded_pos_; - } - - /** Accessor Method to obtain the Index array (of length - * NLargeVec=NRows()) that stores the mapping from the large - * vector to the small vector. For each element i=0,..,NLargeVec - * in the large vector, CompressedPosIndices()[i] gives the - * corresponding index in the small vector, unless - * CompressedPosIndices()[i] is negative. - */ - const Index* CompressedPosIndices() const - { - return compressed_pos_; - } - - private: - Index *expanded_pos_; - Index *compressed_pos_; - }; - - /* inline methods */ - inline - const Index* ExpansionMatrix::ExpandedPosIndices() const - { - return owner_space_->ExpandedPosIndices(); - } - - inline - const Index* ExpansionMatrix::CompressedPosIndices() const - { - return owner_space_->CompressedPosIndices(); - } - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpGenTMatrix.hpp b/thirdparty/linux/include/coin1/IpGenTMatrix.hpp deleted file mode 100644 index 059bfea5..00000000 --- a/thirdparty/linux/include/coin1/IpGenTMatrix.hpp +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpGenTMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPGENTMATRIX_HPP__ -#define __IPGENTMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class GenTMatrixSpace; - - /** Class for general matrices stored in triplet format. In the - * triplet format, the nonzeros elements of a general matrix is - * stored in three arrays, Irow, Jcol, and Values, all of length - * Nonzeros. The first two arrays indicate the location of a - * non-zero element (row and column indices), and the last array - * stores the value at that location. If nonzero elements are - * listed more than once, their values are added. - * - * The structure of the nonzeros (i.e. the arrays Irow and Jcol) - * cannot be changed after the matrix can been initialized. Only - * the values of the nonzero elements can be modified. - * - * Note that the first row and column of a matrix has index 1, not - * 0. - */ - class GenTMatrix : public Matrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the owner_space. - */ - GenTMatrix(const GenTMatrixSpace* owner_space); - - /** Destructor */ - ~GenTMatrix(); - //@} - - /**@name Changing the Values.*/ - //@{ - /** Set values of nonzero elements. The values of the nonzero - * elements are copied from the incoming Number array. Important: - * It is assume that the order of the values in Values - * corresponds to the one of Irn and Jcn given to one of the - * constructors above. */ - void SetValues(const Number* Values); - //@} - - /** @name Accessor Methods */ - //@{ - /** Number of nonzero entries */ - Index Nonzeros() const; - - /** Array with Row indices (counting starts at 1) */ - const Index* Irows() const; - - /** Array with Column indices (counting starts at 1) */ - const Index* Jcols() const; - - /** Array with nonzero values (const version). */ - const Number* Values() const - { - return values_; - } - - /** Array with the nonzero values of this matrix (non-const - * version). Use this method only if you are intending to change - * the values, because the GenTMatrix will be marked as changed. - */ - Number* Values() - { - ObjectChanged(); - initialized_ = true; - return values_; - } - //@} - - protected: - /**@name Overloaded methods from Matrix base class*/ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta, - Vector &y) const; - - virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta, - Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const - { - PrintImplOffset(jnlst, level, category, name, indent, prefix, 0); - } - //@} - - void PrintImplOffset(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix, - Index offset) const; - - friend class ParGenMatrix; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - GenTMatrix(); - - /** Copy Constructor */ - GenTMatrix(const GenTMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const GenTMatrix&); - //@} - - /** Copy of the owner space as a GenTMatrixSpace instead of - * a MatrixSpace - */ - const GenTMatrixSpace* owner_space_; - - /** Values of nonzeros */ - Number* values_; - - /** Flag for Initialization */ - bool initialized_; - - }; - - /** This is the matrix space for a GenTMatrix with fixed sparsity - * structure. The sparsity structure is stored here in the matrix - * space. - */ - class GenTMatrixSpace : public MatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of rows and columns, as well as - * the number of nonzeros and the position of the nonzero - * elements. Note that the counting of the nonzeros starts a 1, - * i.e., iRows[i]==1 and jCols[i]==1 refers to the first element - * in the first row. This is in accordance with the HSL data - * structure. - */ - GenTMatrixSpace(Index nRows, Index nCols, - Index nonZeros, - const Index* iRows, const Index* jCols); - - /** Destructor */ - ~GenTMatrixSpace() - { - delete [] iRows_; - delete [] jCols_; - } - //@} - - /** Method for creating a new matrix of this specific type. */ - GenTMatrix* MakeNewGenTMatrix() const - { - return new GenTMatrix(this); - } - - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewGenTMatrix(); - } - - /**@name Methods describing Matrix structure */ - //@{ - /** Number of non-zeros in the sparse matrix */ - Index Nonzeros() const - { - return nonZeros_; - } - - /** Row index of each non-zero element (counting starts at 1) */ - const Index* Irows() const - { - return iRows_; - } - - /** Column index of each non-zero element (counting starts at 1) */ - const Index* Jcols() const - { - return jCols_; - } - //@} - - private: - /** @name Sparsity structure of matrices generated by this matrix - * space. - */ - //@{ - const Index nonZeros_; - Index* jCols_; - Index* iRows_; - //@} - - /** This method is only for the GenTMatrix to call in order - * to allocate internal storage */ - Number* AllocateInternalStorage() const; - - /** This method is only for the GenTMatrix to call in order - * to de-allocate internal storage */ - void FreeInternalStorage(Number* values) const; - - friend class GenTMatrix; - }; - - /* inline methods */ - inline - Index GenTMatrix::Nonzeros() const - { - return owner_space_->Nonzeros(); - } - - inline - const Index* GenTMatrix::Irows() const - { - return owner_space_->Irows(); - } - - inline - const Index* GenTMatrix::Jcols() const - { - return owner_space_->Jcols(); - } - - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpHessianUpdater.hpp b/thirdparty/linux/include/coin1/IpHessianUpdater.hpp deleted file mode 100644 index a3912d61..00000000 --- a/thirdparty/linux/include/coin1/IpHessianUpdater.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2005, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpHessianUpdater.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Andreas Waechter IBM 2005-12-26 - -#ifndef __IPHESSIANUPDATER_HPP__ -#define __IPHESSIANUPDATER_HPP__ - -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - - /** Abstract base class for objects responsible for updating the - * Hessian information. This can be done using exact second - * derivatives from the NLP, or by a quasi-Newton Option. The - * result is put into the W field in IpData. - */ - class HessianUpdater : public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - HessianUpdater() - {} - - /** Default destructor */ - virtual ~HessianUpdater() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Update the Hessian based on the current information in IpData, - * and possibly on information from previous calls. - */ - virtual void UpdateHessian() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - HessianUpdater(const HessianUpdater&); - - /** Overloaded Equals Operator */ - void operator=(const HessianUpdater&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIdentityMatrix.hpp b/thirdparty/linux/include/coin1/IpIdentityMatrix.hpp deleted file mode 100644 index 80323064..00000000 --- a/thirdparty/linux/include/coin1/IpIdentityMatrix.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIdentityMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIDENTITYMATRIX_HPP__ -#define __IPIDENTITYMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /** Class for Matrices which are multiples of the identity matrix. - * - */ - class IdentityMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, initializing with dimensions of the matrix - * (true identity matrix). - */ - IdentityMatrix(const SymMatrixSpace* owner_space); - - /** Destructor */ - ~IdentityMatrix(); - //@} - - /** Method for setting the factor for the identity matrix. */ - void SetFactor(Number factor) - { - factor_ = factor; - } - - /** Method for getting the factor for the identity matrix. */ - Number GetFactor() const - { - return factor_; - } - - /** Method for obtaining the dimention of the matrix. */ - Index Dim() const; - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - virtual void AddMSinvZImpl(Number alpha, const Vector& S, - const Vector& Z, Vector& X) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - IdentityMatrix(); - - /** Copy Constructor */ - IdentityMatrix(const IdentityMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const IdentityMatrix&); - //@} - - /** Scaling factor for this identity matrix */ - Number factor_; - }; - - /** This is the matrix space for IdentityMatrix. */ - class IdentityMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the dimension of the matrix. */ - IdentityMatrixSpace(Index dim) - : - SymMatrixSpace(dim) - {} - - /** Destructor */ - virtual ~IdentityMatrixSpace() - {} - //@} - - /** Overloaded MakeNew method for the SymMatrixSpace base class. - */ - virtual SymMatrix* MakeNewSymMatrix() const - { - return MakeNewIdentityMatrix(); - } - - /** Method for creating a new matrix of this specific type. */ - IdentityMatrix* MakeNewIdentityMatrix() const - { - return new IdentityMatrix(this); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - IdentityMatrixSpace(); - - /** Copy Constructor */ - IdentityMatrixSpace(const IdentityMatrixSpace&); - - /** Overloaded Equals Operator */ - void operator=(const IdentityMatrixSpace&); - //@} - }; - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpIpoptAlg.hpp b/thirdparty/linux/include/coin1/IpIpoptAlg.hpp deleted file mode 100644 index 60e31475..00000000 --- a/thirdparty/linux/include/coin1/IpIpoptAlg.hpp +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright (C) 2004, 2010 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptAlg.hpp 2167 2013-03-08 11:15:38Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTALG_HPP__ -#define __IPIPOPTALG_HPP__ - -#include "IpIpoptNLP.hpp" -#include "IpAlgStrategy.hpp" -#include "IpSearchDirCalculator.hpp" -#include "IpLineSearch.hpp" -#include "IpMuUpdate.hpp" -#include "IpConvCheck.hpp" -#include "IpOptionsList.hpp" -#include "IpIterateInitializer.hpp" -#include "IpIterationOutput.hpp" -#include "IpAlgTypes.hpp" -#include "IpHessianUpdater.hpp" -#include "IpEqMultCalculator.hpp" - -namespace Ipopt -{ - - /** @name Exceptions */ - //@{ - DECLARE_STD_EXCEPTION(STEP_COMPUTATION_FAILED); - //@} - - /** The main ipopt algorithm class. - * Main Ipopt algorithm class, contains the main optimize method, - * handles the execution of the optimization. - * The constructor initializes the data structures through the nlp, - * and the Optimize method then assumes that everything is - * initialized and ready to go. - * After an optimization is complete, the user can access the - * solution through the passed in ip_data structure. - * Multiple calls to the Optimize method are allowed as long as the - * structure of the problem remains the same (i.e. starting point - * or nlp parameter changes only). - */ - class IpoptAlgorithm : public AlgorithmStrategyObject - { - public: - - /**@name Constructors/Destructors */ - //@{ - /** Constructor. (The IpoptAlgorithm uses smart pointers for these - * passed-in pieces to make sure that a user of IpoptAlgoroithm - * cannot pass in an object created on the stack!) - */ - IpoptAlgorithm(const SmartPtr& search_dir_calculator, - const SmartPtr& line_search, - const SmartPtr& mu_update, - const SmartPtr& conv_check, - const SmartPtr& iterate_initializer, - const SmartPtr& iter_output, - const SmartPtr& hessian_updater, - const SmartPtr& eq_multiplier_calculator = NULL); - - /** Default destructor */ - virtual ~IpoptAlgorithm(); - //@} - - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix); - - /** Main solve method. */ - SolverReturn Optimize(bool isResto = false); - - /** Methods for IpoptType */ - //@{ - static void RegisterOptions(SmartPtr roptions); - //@} - - /**@name Access to internal strategy objects */ - //@{ - SmartPtr SearchDirCalc() - { - return search_dir_calculator_; - } - //@} - - static void print_copyright_message(const Journalist& jnlst); - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - IpoptAlgorithm(); - - /** Copy Constructor */ - IpoptAlgorithm(const IpoptAlgorithm&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptAlgorithm&); - //@} - - /** @name Strategy objects */ - //@{ - SmartPtr search_dir_calculator_; - SmartPtr line_search_; - SmartPtr mu_update_; - SmartPtr conv_check_; - SmartPtr iterate_initializer_; - SmartPtr iter_output_; - SmartPtr hessian_updater_; - /** The multipler calculator (for y_c and y_d) has to be set only - * if option recalc_y is set to true */ - SmartPtr eq_multiplier_calculator_; - //@} - - /** @name Main steps of the algorthim */ - //@{ - /** Method for updating the current Hessian. This can either just - * evaluate the exact Hessian (based on the current iterate), or - * perform a quasi-Newton update. - */ - void UpdateHessian(); - - /** Method to update the barrier parameter. Returns false, if the - * algorithm can't continue with the regular procedure and needs - * to revert to a fallback mechanism in the line search (such as - * restoration phase) */ - bool UpdateBarrierParameter(); - - /** Method to setup the call to the PDSystemSolver. Returns - * false, if the algorithm can't continue with the regular - * procedure and needs to revert to a fallback mechanism in the - * line search (such as restoration phase) */ - bool ComputeSearchDirection(); - - /** Method computing the new iterate (usually vialine search). - * The acceptable point is the one in trial after return. - */ - void ComputeAcceptableTrialPoint(); - - /** Method for accepting the trial point as the new iteration, - * possibly after adjusting the variable bounds in the NLP. */ - void AcceptTrialPoint(); - - /** Do all the output for one iteration */ - void OutputIteration(); - - /** Sets up initial values for the iterates, - * Corrects the initial values for x and s (force in bounds) - */ - void InitializeIterates(); - - /** Print the problem size statistics */ - void PrintProblemStatistics(); - - /** Compute the Lagrangian multipliers for a feasibility problem*/ - void ComputeFeasibilityMultipliers(); - //@} - - /** @name internal flags */ - //@{ - /** Flag indicating if the statistic should not be printed */ - bool skip_print_problem_stats_; - //@} - - /** @name Algorithmic parameters */ - //@{ - /** safeguard factor for bound multipliers. If value >= 1, then - * the dual variables will never deviate from the primal estimate - * by more than the factors kappa_sigma and 1./kappa_sigma. - */ - Number kappa_sigma_; - /** Flag indicating whether the y multipliers should be - * recalculated with the eq_mutliplier_calculator object for each - * new point. */ - bool recalc_y_; - /** Feasibility threshold for recalc_y */ - Number recalc_y_feas_tol_; - /** Flag indicating if we want to do Mehrotras's algorithm. This - * means that a number of options are ignored, or have to be set - * (or are automatically set) to certain values. */ - bool mehrotra_algorithm_; - /** String specifying linear solver */ - std::string linear_solver_; - //@} - - /** @name auxiliary functions */ - //@{ - void calc_number_of_bounds( - const Vector& x, - const Vector& x_L, - const Vector& x_U, - const Matrix& Px_L, - const Matrix& Px_U, - Index& n_tot, - Index& n_only_lower, - Index& n_both, - Index& n_only_upper); - - /** Method for ensuring that the trial multipliers are not too far - * from the primal estime. If a correction is made, new_trial_z - * is a pointer to the corrected multiplier, and the return value - * of this method give the magnitutde of the largest correction - * that we done. If no correction was made, new_trial_z is just - * a pointer to trial_z, and the return value is zero. - */ - Number correct_bound_multiplier(const Vector& trial_z, - const Vector& trial_slack, - const Vector& trial_compl, - SmartPtr& new_trial_z); - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIpoptApplication.hpp b/thirdparty/linux/include/coin1/IpIpoptApplication.hpp deleted file mode 100644 index 0febc944..00000000 --- a/thirdparty/linux/include/coin1/IpIpoptApplication.hpp +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright (C) 2004, 2010 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptApplication.hpp 2617 2015-11-26 16:00:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTAPPLICATION_HPP__ -#define __IPIPOPTAPPLICATION_HPP__ - -#ifndef IPOPT_EXPORT -#ifdef _MSC_VER -#ifdef IPOPT_DLL -#define IPOPT_EXPORT(type) __declspec(dllexport) type __cdecl -#else -#define IPOPT_EXPORT(type) type __cdecl -#endif -#else -#define IPOPT_EXPORT(type) type -#endif -#endif - -#include - -#include "IpJournalist.hpp" -#include "IpTNLP.hpp" -#include "IpNLP.hpp" -/* Return codes for the Optimize call for an application */ -#include "IpReturnCodes.hpp" - -namespace Ipopt -{ - DECLARE_STD_EXCEPTION(IPOPT_APPLICATION_ERROR); - - /* forward declarations */ - class IpoptAlgorithm; - class IpoptNLP; - class IpoptData; - class IpoptCalculatedQuantities; - class AlgorithmBuilder; - class RegisteredOptions; - class OptionsList; - class SolveStatistics; - - /** This is the main application class for making calls to Ipopt. */ - class IpoptApplication : public ReferencedObject - { - public: - IpoptApplication(bool create_console_out = true, - bool create_empty = false); - - /** Another constructor that assumes that the code in the - * (default) constructor has already been executed */ - IpoptApplication(SmartPtr reg_options, - SmartPtr options, - SmartPtr jnlst); - - virtual ~IpoptApplication(); - - /** Method for creating a new IpoptApplication that uses the same - * journalist and registered options, and a copy of the options - list. */ - virtual SmartPtr clone(); - - /** Initialization method. This method reads options from the - * input stream and initializes the journalists. It returns - * something other than Solve_Succeeded if there was a - * problem in the initialization (such as an invalid option). - * You should call one of the initialization methods at some - * point before the first optimize call. - * Set @par allow_clobber to true if you want to allow - * overwriting options that are set by the input stream. - */ - virtual ApplicationReturnStatus Initialize(std::istream& is, bool allow_clobber = false); - /** Initialization method. This method reads options from the - * params file and initializes the journalists. It returns - * something other than Solve_Succeeded if there was a - * problem in the initialization (such as an invalid option). - * You should call one of the initialization methods at some - * point before the first optimize call. - * Note: You can skip the processing of a params file by - * setting params_file to "". - * Set @par allow_clobber to true if you want to allow - * overwriting options that are set by the params file. - */ - virtual ApplicationReturnStatus Initialize(std::string params_file, bool allow_clobber = false); - /** Initialization method. This method reads options from the - * params file and initializes the journalists. It returns - * something other than Solve_Succeeded if there was a - * problem in the initialization (such as an invalid option). - * You should call one of the initialization methods at some - * point before the first optimize call. - * Note: You can skip the processing of a params file by - * setting params_file to "". - * Set @par allow_clobber to true if you want to allow - * overwriting options that are set by the params file. - */ - virtual ApplicationReturnStatus Initialize(const char* params_file, bool allow_clobber = false) - { - return Initialize(std::string(params_file), allow_clobber); - } - /** Initialize method. This method reads the options file specified - * by the option_file_name option and initializes the journalists. - * You should call this method at some point before the first optimize - * call. - * It returns something other than Solve_Succeeded if there was a - * problem in the initialization (such as an invalid option). - * Set @par allow_clobber to true if you want to allow - * overwriting options that are set by the options file. - */ - virtual ApplicationReturnStatus Initialize(bool allow_clobber = false); - - /**@name Solve methods */ - //@{ - /** Solve a problem that inherits from TNLP */ - virtual ApplicationReturnStatus OptimizeTNLP(const SmartPtr& tnlp); - - /** Solve a problem that inherits from NLP */ - virtual ApplicationReturnStatus OptimizeNLP(const SmartPtr& nlp); - - /** Solve a problem that inherits from NLP */ - virtual ApplicationReturnStatus OptimizeNLP(const SmartPtr& nlp, SmartPtr& alg_builder); - - /** Solve a problem (that inherits from TNLP) for a repeated time. - * The OptimizeTNLP method must have been called before. The - * TNLP must be the same object, and the structure (number of - * variables and constraints and position of nonzeros in Jacobian - * and Hessian must be the same). */ - virtual ApplicationReturnStatus ReOptimizeTNLP(const SmartPtr& tnlp); - - /** Solve a problem (that inherits from NLP) for a repeated time. - * The OptimizeNLP method must have been called before. The - * NLP must be the same object, and the structure (number of - * variables and constraints and position of nonzeros in Jacobian - * and Hessian must be the same). */ - virtual ApplicationReturnStatus ReOptimizeNLP(const SmartPtr& nlp); - //@} - - /** Method for opening an output file with given print_level. - * Returns false if there was a problem. */ - virtual bool OpenOutputFile(std::string file_name, EJournalLevel print_level); - - /**@name Accessor methods */ - //@{ - /** Get the Journalist for printing output */ - virtual SmartPtr Jnlst() - { - return jnlst_; - } - - /** Get a pointer to RegisteredOptions object to - * add new options */ - virtual SmartPtr RegOptions() - { - return reg_options_; - } - - /** Get the options list for setting options */ - virtual SmartPtr Options() - { - return options_; - } - - /** Get the options list for setting options (const version) */ - virtual SmartPtr Options() const - { - return ConstPtr(options_); - } - - /** Get the object with the statistics about the most recent - * optimization run. */ - virtual SmartPtr Statistics(); - - /** Get the IpoptNLP Object */ - virtual SmartPtr IpoptNLPObject(); - - /** Get the IpoptData Object */ - SmartPtr IpoptDataObject(); - - /** Get the IpoptCQ Object */ - virtual SmartPtr IpoptCQObject(); - - /** Get the Algorithm Object */ - SmartPtr AlgorithmObject(); - //@} - - /** Method for printing Ipopt copyright message now instead of - * just before the optimization. If you want to have the copy - * right message printed earlier than by default, call this - * method at the convenient time. */ - void PrintCopyrightMessage(); - - /** Method to set whether non-ipopt non-bad_alloc exceptions - * are rethrown by Ipopt. - * By default, non-Ipopt and non-std::bad_alloc exceptions are - * caught by Ipopts initialization and optimization methods - * and the status NonIpopt_Exception_Thrown is returned. - * This function allows to enable rethrowing of such exceptions. - */ - void RethrowNonIpoptException(bool dorethrow) - { - rethrow_nonipoptexception_ = dorethrow; - } - - /** @name Methods for IpoptTypeInfo */ - //@{ - static void RegisterOptions(SmartPtr roptions); - //@} - - /** Method to registering all Ipopt options. */ - static void - RegisterAllIpoptOptions(const SmartPtr& roptions); - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - // IpoptApplication(); - - /** Copy Constructor */ - IpoptApplication(const IpoptApplication&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptApplication&); - //@} - - /** Method for the actual optimize call of the Ipopt algorithm. - * This is used both for Optimize and ReOptimize */ - ApplicationReturnStatus call_optimize(); - - /**@name Variables that customize the application behavior */ - //@{ - /** Decide whether or not the ipopt.opt file should be read */ - bool read_params_dat_; - - /** Decide whether non-ipopt non-bad_alloc exceptions should be rethrown */ - bool rethrow_nonipoptexception_; - //@} - - /** Journalist for reporting output */ - SmartPtr jnlst_; - - /** RegisteredOptions */ - SmartPtr reg_options_; - - /** OptionsList used for the application */ - SmartPtr options_; - - /** Object for storing statistics about the most recent - * optimization run. */ - SmartPtr statistics_; - - /** Object with the algorithm sceleton. - */ - SmartPtr alg_; - - /** IpoptNLP Object for the NLP. We keep this around for a - * ReOptimize warm start. */ - SmartPtr ip_nlp_; - - /** IpoptData Object for the NLP. We keep this around for a - * ReOptimize warm start. - */ - SmartPtr ip_data_; - - /** IpoptCalculatedQuantities Object for the NLP. We keep this - * around for a ReOptimize warm start. - */ - SmartPtr ip_cq_; - - /** Pointer to the TNLPAdapter used to convert the TNLP to an NLP. - * We keep this around for the ReOptimizerTNLP call. */ - SmartPtr nlp_adapter_; - - /** @name Algorithmic parameters */ - //@{ - /** Flag indicating if we are to use the inexact linear solver option */ - bool inexact_algorithm_; - /** Flag indicating if all bounds should be replaced by inequality - * constraints. This is necessary for the inexact algorithm. */ - bool replace_bounds_; - //@} - }; - -} // namespace Ipopt - -extern "C" IPOPT_EXPORT(class Ipopt::IpoptApplication *) IpoptApplicationFactory(); - -#endif diff --git a/thirdparty/linux/include/coin1/IpIpoptCalculatedQuantities.hpp b/thirdparty/linux/include/coin1/IpIpoptCalculatedQuantities.hpp deleted file mode 100644 index 3b60b165..00000000 --- a/thirdparty/linux/include/coin1/IpIpoptCalculatedQuantities.hpp +++ /dev/null @@ -1,751 +0,0 @@ -// Copyright (C) 2004, 2011 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptCalculatedQuantities.hpp 2020 2011-06-16 20:46:16Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTCALCULATEDQUANTITIES_HPP__ -#define __IPIPOPTCALCULATEDQUANTITIES_HPP__ - -#include "IpSmartPtr.hpp" -#include "IpCachedResults.hpp" - -#include - -namespace Ipopt -{ - class IpoptNLP; - class IpoptData; - class Vector; - class Matrix; - class SymMatrix; - class Journalist; - class OptionsList; - class RegisteredOptions; - - /** Norm types */ - enum ENormType { - NORM_1=0, - NORM_2, - NORM_MAX - }; - - /** Base class for additional calculated quantities that is special - * to a particular type of algorithm, such as the CG penalty - * function, or using iterative linear solvers. The regular - * IpoptCalculatedQuantities object should be given a derivation of - * this base class when it is created. */ - class IpoptAdditionalCq : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - IpoptAdditionalCq() - {} - - /** Default destructor */ - virtual ~IpoptAdditionalCq() - {} - //@} - - /** This method is called to initialize the global algorithmic - * parameters. The parameters are taken from the OptionsList - * object. */ - virtual bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IpoptAdditionalCq(const IpoptAdditionalCq&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptAdditionalCq&); - //@} - }; - - /** Class for all IPOPT specific calculated quantities. - * - */ - class IpoptCalculatedQuantities : public ReferencedObject - { - public: - - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - IpoptCalculatedQuantities(const SmartPtr& ip_nlp, - const SmartPtr& ip_data); - /** Default destructor */ - virtual ~IpoptCalculatedQuantities(); - //@} - - /** Method for setting pointer for additional calculated - * quantities. This needs to be called before Initialized. */ - void SetAddCq(SmartPtr add_cq) - { - DBG_ASSERT(!HaveAddCq()); - add_cq_ = add_cq; - } - - /** Method detecting if additional object for calculated - * quantities has already been set */ - bool HaveAddCq() - { - return IsValid(add_cq_); - } - - /** This method must be called to initialize the global - * algorithmic parameters. The parameters are taken from the - * OptionsList object. */ - bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** @name Slacks */ - //@{ - /** Slacks for x_L (at current iterate) */ - SmartPtr curr_slack_x_L(); - /** Slacks for x_U (at current iterate) */ - SmartPtr curr_slack_x_U(); - /** Slacks for s_L (at current iterate) */ - SmartPtr curr_slack_s_L(); - /** Slacks for s_U (at current iterate) */ - SmartPtr curr_slack_s_U(); - /** Slacks for x_L (at trial point) */ - SmartPtr trial_slack_x_L(); - /** Slacks for x_U (at trial point) */ - SmartPtr trial_slack_x_U(); - /** Slacks for s_L (at trial point) */ - SmartPtr trial_slack_s_L(); - /** Slacks for s_U (at trial point) */ - SmartPtr trial_slack_s_U(); - /** Indicating whether or not we "fudged" the slacks */ - Index AdjustedTrialSlacks(); - /** Reset the flags for "fudged" slacks */ - void ResetAdjustedTrialSlacks(); - //@} - - /** @name Objective function */ - //@{ - /** Value of objective function (at current point) */ - virtual Number curr_f(); - /** Unscaled value of the objective function (at the current point) */ - virtual Number unscaled_curr_f(); - /** Value of objective function (at trial point) */ - virtual Number trial_f(); - /** Unscaled value of the objective function (at the trial point) */ - virtual Number unscaled_trial_f(); - /** Gradient of objective function (at current point) */ - SmartPtr curr_grad_f(); - /** Gradient of objective function (at trial point) */ - SmartPtr trial_grad_f(); - //@} - - /** @name Barrier Objective Function */ - //@{ - /** Barrier Objective Function Value - * (at current iterate with current mu) - */ - virtual Number curr_barrier_obj(); - /** Barrier Objective Function Value - * (at trial point with current mu) - */ - virtual Number trial_barrier_obj(); - - /** Gradient of barrier objective function with respect to x - * (at current point with current mu) */ - SmartPtr curr_grad_barrier_obj_x(); - /** Gradient of barrier objective function with respect to s - * (at current point with current mu) */ - SmartPtr curr_grad_barrier_obj_s(); - - /** Gradient of the damping term with respect to x (times - * kappa_d) */ - SmartPtr grad_kappa_times_damping_x(); - /** Gradient of the damping term with respect to s (times - * kappa_d) */ - SmartPtr grad_kappa_times_damping_s(); - //@} - - /** @name Constraints */ - //@{ - /** c(x) (at current point) */ - SmartPtr curr_c(); - /** unscaled c(x) (at current point) */ - SmartPtr unscaled_curr_c(); - /** c(x) (at trial point) */ - SmartPtr trial_c(); - /** unscaled c(x) (at trial point) */ - SmartPtr unscaled_trial_c(); - /** d(x) (at current point) */ - SmartPtr curr_d(); - /** unscaled d(x) (at current point) */ - SmartPtr unscaled_curr_d(); - /** d(x) (at trial point) */ - SmartPtr trial_d(); - /** d(x) - s (at current point) */ - SmartPtr curr_d_minus_s(); - /** d(x) - s (at trial point) */ - SmartPtr trial_d_minus_s(); - /** Jacobian of c (at current point) */ - SmartPtr curr_jac_c(); - /** Jacobian of c (at trial point) */ - SmartPtr trial_jac_c(); - /** Jacobian of d (at current point) */ - SmartPtr curr_jac_d(); - /** Jacobian of d (at trial point) */ - SmartPtr trial_jac_d(); - /** Product of Jacobian (evaluated at current point) of C - * transpose with general vector */ - SmartPtr curr_jac_cT_times_vec(const Vector& vec); - /** Product of Jacobian (evaluated at trial point) of C - * transpose with general vector */ - SmartPtr trial_jac_cT_times_vec(const Vector& vec); - /** Product of Jacobian (evaluated at current point) of D - * transpose with general vector */ - SmartPtr curr_jac_dT_times_vec(const Vector& vec); - /** Product of Jacobian (evaluated at trial point) of D - * transpose with general vector */ - SmartPtr trial_jac_dT_times_vec(const Vector& vec); - /** Product of Jacobian (evaluated at current point) of C - * transpose with current y_c */ - SmartPtr curr_jac_cT_times_curr_y_c(); - /** Product of Jacobian (evaluated at trial point) of C - * transpose with trial y_c */ - SmartPtr trial_jac_cT_times_trial_y_c(); - /** Product of Jacobian (evaluated at current point) of D - * transpose with current y_d */ - SmartPtr curr_jac_dT_times_curr_y_d(); - /** Product of Jacobian (evaluated at trial point) of D - * transpose with trial y_d */ - SmartPtr trial_jac_dT_times_trial_y_d(); - /** Product of Jacobian (evaluated at current point) of C - * with general vector */ - SmartPtr curr_jac_c_times_vec(const Vector& vec); - /** Product of Jacobian (evaluated at current point) of D - * with general vector */ - SmartPtr curr_jac_d_times_vec(const Vector& vec); - /** Constraint Violation (at current iterate). This value should - * be used in the line search, and not curr_primal_infeasibility(). - * What type of norm is used depends on constr_viol_normtype */ - virtual Number curr_constraint_violation(); - /** Constraint Violation (at trial point). This value should - * be used in the line search, and not curr_primal_infeasibility(). - * What type of norm is used depends on constr_viol_normtype */ - virtual Number trial_constraint_violation(); - /** Real constraint violation in a given norm (at current - * iterate). This considers the inequality constraints without - * slacks. */ - virtual Number curr_nlp_constraint_violation(ENormType NormType); - /** Unscaled real constraint violation in a given norm (at current - * iterate). This considers the inequality constraints without - * slacks. */ - virtual Number unscaled_curr_nlp_constraint_violation(ENormType NormType); - /** Unscaled real constraint violation in a given norm (at trial - * iterate). This considers the inequality constraints without - * slacks. */ - virtual Number unscaled_trial_nlp_constraint_violation(ENormType NormType); - //@} - - /** @name Hessian matrices */ - //@{ - /** exact Hessian at current iterate (uncached) */ - SmartPtr curr_exact_hessian(); - //@} - - /** @name primal-dual error and its components */ - //@{ - /** x-part of gradient of Lagrangian function (at current point) */ - SmartPtr curr_grad_lag_x(); - /** x-part of gradient of Lagrangian function (at trial point) */ - SmartPtr trial_grad_lag_x(); - /** s-part of gradient of Lagrangian function (at current point) */ - SmartPtr curr_grad_lag_s(); - /** s-part of gradient of Lagrangian function (at trial point) */ - SmartPtr trial_grad_lag_s(); - /** x-part of gradient of Lagrangian function (at current point) - including linear damping term */ - SmartPtr curr_grad_lag_with_damping_x(); - /** s-part of gradient of Lagrangian function (at current point) - including linear damping term */ - SmartPtr curr_grad_lag_with_damping_s(); - /** Complementarity for x_L (for current iterate) */ - SmartPtr curr_compl_x_L(); - /** Complementarity for x_U (for current iterate) */ - SmartPtr curr_compl_x_U(); - /** Complementarity for s_L (for current iterate) */ - SmartPtr curr_compl_s_L(); - /** Complementarity for s_U (for current iterate) */ - SmartPtr curr_compl_s_U(); - /** Complementarity for x_L (for trial iterate) */ - SmartPtr trial_compl_x_L(); - /** Complementarity for x_U (for trial iterate) */ - SmartPtr trial_compl_x_U(); - /** Complementarity for s_L (for trial iterate) */ - SmartPtr trial_compl_s_L(); - /** Complementarity for s_U (for trial iterate) */ - SmartPtr trial_compl_s_U(); - /** Relaxed complementarity for x_L (for current iterate and current mu) */ - SmartPtr curr_relaxed_compl_x_L(); - /** Relaxed complementarity for x_U (for current iterate and current mu) */ - SmartPtr curr_relaxed_compl_x_U(); - /** Relaxed complementarity for s_L (for current iterate and current mu) */ - SmartPtr curr_relaxed_compl_s_L(); - /** Relaxed complementarity for s_U (for current iterate and current mu) */ - SmartPtr curr_relaxed_compl_s_U(); - - /** Primal infeasibility in a given norm (at current iterate). */ - virtual Number curr_primal_infeasibility(ENormType NormType); - /** Primal infeasibility in a given norm (at trial point) */ - virtual Number trial_primal_infeasibility(ENormType NormType); - - /** Dual infeasibility in a given norm (at current iterate) */ - virtual Number curr_dual_infeasibility(ENormType NormType); - /** Dual infeasibility in a given norm (at trial iterate) */ - virtual Number trial_dual_infeasibility(ENormType NormType); - /** Unscaled dual infeasibility in a given norm (at current iterate) */ - virtual Number unscaled_curr_dual_infeasibility(ENormType NormType); - - /** Complementarity (for all complementarity conditions together) - * in a given norm (at current iterate) */ - virtual Number curr_complementarity(Number mu, ENormType NormType); - /** Complementarity (for all complementarity conditions together) - * in a given norm (at trial iterate) */ - virtual Number trial_complementarity(Number mu, ENormType NormType); - /** Complementarity (for all complementarity conditions together) - * in a given norm (at current iterate) without NLP scaling. */ - virtual Number unscaled_curr_complementarity(Number mu, ENormType NormType); - - /** Centrality measure (in spirit of the -infinity-neighborhood. */ - Number CalcCentralityMeasure(const Vector& compl_x_L, - const Vector& compl_x_U, - const Vector& compl_s_L, - const Vector& compl_s_U); - /** Centrality measure at current point */ - virtual Number curr_centrality_measure(); - - /** Total optimality error for the original NLP at the current - * iterate, using scaling factors based on multipliers. Note - * that here the constraint violation is measured without slacks - * (nlp_constraint_violation) */ - virtual Number curr_nlp_error(); - /** Total optimality error for the original NLP at the current - * iterate, but using no scaling based on multipliers, and no - * scaling for the NLP. Note that here the constraint violation - * is measured without slacks (nlp_constraint_violation) */ - virtual Number unscaled_curr_nlp_error(); - - /** Total optimality error for the barrier problem at the - * current iterate, using scaling factors based on multipliers. */ - virtual Number curr_barrier_error(); - - /** Norm of the primal-dual system for a given mu (at current - * iterate). The norm is defined as the sum of the 1-norms of - * dual infeasibiliy, primal infeasibility, and complementarity, - * all divided by the number of elements of the vectors of which - * the norm is taken. - */ - virtual Number curr_primal_dual_system_error(Number mu); - /** Norm of the primal-dual system for a given mu (at trial - * iterate). The norm is defined as the sum of the 1-norms of - * dual infeasibiliy, primal infeasibility, and complementarity, - * all divided by the number of elements of the vectors of which - * the norm is taken. - */ - virtual Number trial_primal_dual_system_error(Number mu); - //@} - - /** @name Computing fraction-to-the-boundary step sizes */ - //@{ - /** Fraction to the boundary from (current) primal variables x and s - * for a given step */ - Number primal_frac_to_the_bound(Number tau, - const Vector& delta_x, - const Vector& delta_s); - /** Fraction to the boundary from (current) primal variables x and s - * for internal (current) step */ - Number curr_primal_frac_to_the_bound(Number tau); - /** Fraction to the boundary from (current) dual variables z and v - * for a given step */ - Number dual_frac_to_the_bound(Number tau, - const Vector& delta_z_L, - const Vector& delta_z_U, - const Vector& delta_v_L, - const Vector& delta_v_U); - /** Fraction to the boundary from (current) dual variables z and v - * for a given step, without caching */ - Number uncached_dual_frac_to_the_bound(Number tau, - const Vector& delta_z_L, - const Vector& delta_z_U, - const Vector& delta_v_L, - const Vector& delta_v_U); - /** Fraction to the boundary from (current) dual variables z and v - * for internal (current) step */ - Number curr_dual_frac_to_the_bound(Number tau); - /** Fraction to the boundary from (current) slacks for a given - * step in the slacks. Usually, one will use the - * primal_frac_to_the_bound method to compute the primal fraction - * to the boundary step size, but if it is cheaper to provide the - * steps in the slacks directly (e.g. when the primal step sizes - * are only temporary), the this method is more efficient. This - * method does not cache computations. */ - Number uncached_slack_frac_to_the_bound(Number tau, - const Vector& delta_x_L, - const Vector& delta_x_U, - const Vector& delta_s_L, - const Vector& delta_s_U); - //@} - - /** @name Sigma matrices */ - //@{ - SmartPtr curr_sigma_x(); - SmartPtr curr_sigma_s(); - //@} - - /** average of current values of the complementarities */ - Number curr_avrg_compl(); - /** average of trial values of the complementarities */ - Number trial_avrg_compl(); - - /** inner_product of current barrier obj. fn. gradient with - * current search direction */ - Number curr_gradBarrTDelta(); - - /** Compute the norm of a specific type of a set of vectors (uncached) */ - Number - CalcNormOfType(ENormType NormType, - std::vector > vecs); - - /** Compute the norm of a specific type of two vectors (uncached) */ - Number - CalcNormOfType(ENormType NormType, - const Vector& vec1, const Vector& vec2); - - /** Norm type used for calculating constraint violation */ - ENormType constr_viol_normtype() const - { - return constr_viol_normtype_; - } - - /** Method returning true if this is a square problem */ - bool IsSquareProblem() const; - - /** Method returning the IpoptNLP object. This should only be - * used with care! */ - SmartPtr& GetIpoptNLP() - { - return ip_nlp_; - } - - IpoptAdditionalCq& AdditionalCq() - { - DBG_ASSERT(IsValid(add_cq_)); - return *add_cq_; - } - - /** Methods for IpoptType */ - //@{ - /** Called by IpoptType to register the options */ - static void RegisterOptions(SmartPtr roptions); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - IpoptCalculatedQuantities(); - - /** Copy Constructor */ - IpoptCalculatedQuantities(const IpoptCalculatedQuantities&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptCalculatedQuantities&); - //@} - - /** @name Pointers for easy access to data and NLP information */ - //@{ - /** Ipopt NLP object */ - SmartPtr ip_nlp_; - /** Ipopt Data object */ - SmartPtr ip_data_; - /** Chen-Goldfarb specific calculated quantities */ - SmartPtr add_cq_; - //@} - - /** @name Algorithmic Parameters that can be set throught the - * options list. Those parameters are initialize by calling the - * Initialize method.*/ - //@{ - /** Parameter in formula for computing overall primal-dual - * optimality error */ - Number s_max_; - /** Weighting factor for the linear damping term added to the - * barrier objective funciton. */ - Number kappa_d_; - /** fractional movement allowed in bounds */ - Number slack_move_; - /** Norm type to be used when calculating the constraint violation */ - ENormType constr_viol_normtype_; - /** Flag indicating whether the TNLP with identical structure has - * already been solved before. */ - bool warm_start_same_structure_; - /** Desired value of the barrier parameter */ - Number mu_target_; - //@} - - /** @name Caches for slacks */ - //@{ - CachedResults< SmartPtr > curr_slack_x_L_cache_; - CachedResults< SmartPtr > curr_slack_x_U_cache_; - CachedResults< SmartPtr > curr_slack_s_L_cache_; - CachedResults< SmartPtr > curr_slack_s_U_cache_; - CachedResults< SmartPtr > trial_slack_x_L_cache_; - CachedResults< SmartPtr > trial_slack_x_U_cache_; - CachedResults< SmartPtr > trial_slack_s_L_cache_; - CachedResults< SmartPtr > trial_slack_s_U_cache_; - Index num_adjusted_slack_x_L_; - Index num_adjusted_slack_x_U_; - Index num_adjusted_slack_s_L_; - Index num_adjusted_slack_s_U_; - //@} - - /** @name Cached for objective function stuff */ - //@{ - CachedResults curr_f_cache_; - CachedResults trial_f_cache_; - CachedResults< SmartPtr > curr_grad_f_cache_; - CachedResults< SmartPtr > trial_grad_f_cache_; - //@} - - /** @name Caches for barrier function stuff */ - //@{ - CachedResults curr_barrier_obj_cache_; - CachedResults trial_barrier_obj_cache_; - CachedResults< SmartPtr > curr_grad_barrier_obj_x_cache_; - CachedResults< SmartPtr > curr_grad_barrier_obj_s_cache_; - CachedResults< SmartPtr > grad_kappa_times_damping_x_cache_; - CachedResults< SmartPtr > grad_kappa_times_damping_s_cache_; - //@} - - /** @name Caches for constraint stuff */ - //@{ - CachedResults< SmartPtr > curr_c_cache_; - CachedResults< SmartPtr > trial_c_cache_; - CachedResults< SmartPtr > curr_d_cache_; - CachedResults< SmartPtr > trial_d_cache_; - CachedResults< SmartPtr > curr_d_minus_s_cache_; - CachedResults< SmartPtr > trial_d_minus_s_cache_; - CachedResults< SmartPtr > curr_jac_c_cache_; - CachedResults< SmartPtr > trial_jac_c_cache_; - CachedResults< SmartPtr > curr_jac_d_cache_; - CachedResults< SmartPtr > trial_jac_d_cache_; - CachedResults< SmartPtr > curr_jac_cT_times_vec_cache_; - CachedResults< SmartPtr > trial_jac_cT_times_vec_cache_; - CachedResults< SmartPtr > curr_jac_dT_times_vec_cache_; - CachedResults< SmartPtr > trial_jac_dT_times_vec_cache_; - CachedResults< SmartPtr > curr_jac_c_times_vec_cache_; - CachedResults< SmartPtr > curr_jac_d_times_vec_cache_; - CachedResults curr_constraint_violation_cache_; - CachedResults trial_constraint_violation_cache_; - CachedResults curr_nlp_constraint_violation_cache_; - CachedResults unscaled_curr_nlp_constraint_violation_cache_; - CachedResults unscaled_trial_nlp_constraint_violation_cache_; - //@} - - /** Cache for the exact Hessian */ - CachedResults< SmartPtr > curr_exact_hessian_cache_; - - /** @name Components of primal-dual error */ - //@{ - CachedResults< SmartPtr > curr_grad_lag_x_cache_; - CachedResults< SmartPtr > trial_grad_lag_x_cache_; - CachedResults< SmartPtr > curr_grad_lag_s_cache_; - CachedResults< SmartPtr > trial_grad_lag_s_cache_; - CachedResults< SmartPtr > curr_grad_lag_with_damping_x_cache_; - CachedResults< SmartPtr > curr_grad_lag_with_damping_s_cache_; - CachedResults< SmartPtr > curr_compl_x_L_cache_; - CachedResults< SmartPtr > curr_compl_x_U_cache_; - CachedResults< SmartPtr > curr_compl_s_L_cache_; - CachedResults< SmartPtr > curr_compl_s_U_cache_; - CachedResults< SmartPtr > trial_compl_x_L_cache_; - CachedResults< SmartPtr > trial_compl_x_U_cache_; - CachedResults< SmartPtr > trial_compl_s_L_cache_; - CachedResults< SmartPtr > trial_compl_s_U_cache_; - CachedResults< SmartPtr > curr_relaxed_compl_x_L_cache_; - CachedResults< SmartPtr > curr_relaxed_compl_x_U_cache_; - CachedResults< SmartPtr > curr_relaxed_compl_s_L_cache_; - CachedResults< SmartPtr > curr_relaxed_compl_s_U_cache_; - CachedResults curr_primal_infeasibility_cache_; - CachedResults trial_primal_infeasibility_cache_; - CachedResults curr_dual_infeasibility_cache_; - CachedResults trial_dual_infeasibility_cache_; - CachedResults unscaled_curr_dual_infeasibility_cache_; - CachedResults curr_complementarity_cache_; - CachedResults trial_complementarity_cache_; - CachedResults curr_centrality_measure_cache_; - CachedResults curr_nlp_error_cache_; - CachedResults unscaled_curr_nlp_error_cache_; - CachedResults curr_barrier_error_cache_; - CachedResults curr_primal_dual_system_error_cache_; - CachedResults trial_primal_dual_system_error_cache_; - //@} - - /** @name Caches for fraction to the boundary step sizes */ - //@{ - CachedResults primal_frac_to_the_bound_cache_; - CachedResults dual_frac_to_the_bound_cache_; - //@} - - /** @name Caches for sigma matrices */ - //@{ - CachedResults< SmartPtr > curr_sigma_x_cache_; - CachedResults< SmartPtr > curr_sigma_s_cache_; - //@} - - /** Cache for average of current complementarity */ - CachedResults curr_avrg_compl_cache_; - /** Cache for average of trial complementarity */ - CachedResults trial_avrg_compl_cache_; - - /** Cache for grad barrier obj. fn inner product with step */ - CachedResults curr_gradBarrTDelta_cache_; - - /** @name Indicator vectors required for the linear damping terms - * to handle unbounded solution sets. */ - //@{ - /** Indicator vector for selecting the elements in x that have - * only lower bounds. */ - SmartPtr dampind_x_L_; - /** Indicator vector for selecting the elements in x that have - * only upper bounds. */ - SmartPtr dampind_x_U_; - /** Indicator vector for selecting the elements in s that have - * only lower bounds. */ - SmartPtr dampind_s_L_; - /** Indicator vector for selecting the elements in s that have - * only upper bounds. */ - SmartPtr dampind_s_U_; - //@} - - /** @name Temporary vectors for intermediate calcuations. We keep - * these around to avoid unnecessarily many new allocations of - * Vectors. */ - //@{ - SmartPtr tmp_x_; - SmartPtr tmp_s_; - SmartPtr tmp_c_; - SmartPtr tmp_d_; - SmartPtr tmp_x_L_; - SmartPtr tmp_x_U_; - SmartPtr tmp_s_L_; - SmartPtr tmp_s_U_; - - /** Accessor methods for the temporary vectors */ - Vector& Tmp_x(); - Vector& Tmp_s(); - Vector& Tmp_c(); - Vector& Tmp_d(); - Vector& Tmp_x_L(); - Vector& Tmp_x_U(); - Vector& Tmp_s_L(); - Vector& Tmp_s_U(); - //@} - - /** flag indicating if Initialize method has been called (for - * debugging) */ - bool initialize_called_; - - /** @name Auxiliary functions */ - //@{ - /** Compute new vector containing the slack to a lower bound - * (uncached) - */ - SmartPtr CalcSlack_L(const Matrix& P, - const Vector& x, - const Vector& x_bound); - /** Compute new vector containing the slack to a upper bound - * (uncached) - */ - SmartPtr CalcSlack_U(const Matrix& P, - const Vector& x, - const Vector& x_bound); - /** Compute barrier term at given point - * (uncached) - */ - Number CalcBarrierTerm(Number mu, - const Vector& slack_x_L, - const Vector& slack_x_U, - const Vector& slack_s_L, - const Vector& slack_s_U); - - /** Compute complementarity for slack / multiplier pair */ - SmartPtr CalcCompl(const Vector& slack, - const Vector& mult); - - /** Compute fraction to the boundary parameter for lower and upper bounds */ - Number CalcFracToBound(const Vector& slack_L, - Vector& tmp_L, - const Matrix& P_L, - const Vector& slack_U, - Vector& tmp_U, - const Matrix& P_U, - const Vector& delta, - Number tau); - - /** Compute the scaling factors for the optimality error. */ - void ComputeOptimalityErrorScaling(const Vector& y_c, const Vector& y_d, - const Vector& z_L, const Vector& z_U, - const Vector& v_L, const Vector& v_U, - Number s_max, - Number& s_d, Number& s_c); - - /** Check if slacks are becoming too small. If slacks are - * becoming too small, they are change. The return value is the - * number of corrected slacks. */ - Index CalculateSafeSlack(SmartPtr& slack, - const SmartPtr& bound, - const SmartPtr& curr_point, - const SmartPtr& multiplier); - - /** Computes the indicator vectors that can be used to filter out - * those entries in the slack_... variables, that correspond to - * variables with only lower and upper bounds. This is required - * for the linear damping term in the barrier objective function - * to handle unbounded solution sets. */ - void ComputeDampingIndicators(SmartPtr& dampind_x_L, - SmartPtr& dampind_x_U, - SmartPtr& dampind_s_L, - SmartPtr& dampind_s_U); - - /** Check if we are in the restoration phase. Returns true, if the - * ip_nlp is of the type RestoIpoptNLP. ToDo: We probably want to - * handle this more elegant and don't have an explicit dependency - * here. Now I added this because otherwise the caching doesn't - * work properly since the restoration phase objective function - * depends on the current barrier parameter. */ - bool in_restoration_phase(); - - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIpoptData.hpp b/thirdparty/linux/include/coin1/IpIpoptData.hpp deleted file mode 100644 index 6973bab6..00000000 --- a/thirdparty/linux/include/coin1/IpIpoptData.hpp +++ /dev/null @@ -1,819 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptData.hpp 2472 2014-04-05 17:47:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTDATA_HPP__ -#define __IPIPOPTDATA_HPP__ - -#include "IpSymMatrix.hpp" -#include "IpOptionsList.hpp" -#include "IpIteratesVector.hpp" -#include "IpRegOptions.hpp" -#include "IpTimingStatistics.hpp" - -namespace Ipopt -{ - - /* Forward declaration */ - class IpoptNLP; - - /** Base class for additional data that is special to a particular - * type of algorithm, such as the CG penalty function, or using - * iterative linear solvers. The regular IpoptData object should - * be given a derivation of this base class when it is created. */ - class IpoptAdditionalData : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - IpoptAdditionalData() - {} - - /** Default destructor */ - virtual ~IpoptAdditionalData() - {} - //@} - - /** This method is called to initialize the global algorithmic - * parameters. The parameters are taken from the OptionsList - * object. */ - virtual bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) = 0; - - /** Initialize Data Structures at the beginning. */ - virtual bool InitializeDataStructures() = 0; - - /** Do whatever is necessary to accept a trial point as current - * iterate. This is also used to finish an iteration, i.e., to - * release memory, and to reset any flags for a new iteration. */ - virtual void AcceptTrialPoint() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IpoptAdditionalData(const IpoptAdditionalData&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptAdditionalData&); - //@} - }; - - /** Class to organize all the data required by the algorithm. - * Internally, once this Data object has been initialized, all - * internal curr_ vectors must always be set (so that prototyes are - * available). The current values can only be set from the trial - * values. The trial values can be set by copying from a vector or - * by adding some fraction of a step to the current values. This - * object also stores steps, which allows to easily communicate the - * step from the step computation object to the line search object. - */ - class IpoptData : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - IpoptData(SmartPtr add_data = NULL, - Number cpu_time_start = -1.); - - /** Default destructor */ - virtual ~IpoptData(); - //@} - - /** Initialize Data Structures */ - bool InitializeDataStructures(IpoptNLP& ip_nlp, - bool want_x, - bool want_y_c, - bool want_y_d, - bool want_z_L, - bool want_z_U); - - /** This method must be called to initialize the global - * algorithmic parameters. The parameters are taken from the - * OptionsList object. */ - bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** @name Get Methods for Iterates */ - //@{ - /** Current point */ - inline - SmartPtr curr() const; - - /** Get the current point in a copied container that is non-const. - The entries in the container cannot be modified, but - the container can be modified to point to new entries. - */ - // SmartPtr curr_container() const; - - /** Get Trial point */ - inline - SmartPtr trial() const; - - /** Get Trial point in a copied container that is non-const. - * The entries in the container can not be modified, but - * the container can be modified to point to new entries. - */ - //SmartPtr trial_container() const; - - /** Set the trial point - this method copies the pointer for - * efficiency (no copy and to keep cache tags the same) so - * after you call set you cannot modify the data again - */ - inline - void set_trial(SmartPtr& trial); - - /** Set the values of the primal trial variables (x and s) from - * provided Step with step length alpha. - */ - void SetTrialPrimalVariablesFromStep(Number alpha, - const Vector& delta_x, - const Vector& delta_s); - /** Set the values of the trial values for the equality constraint - * multipliers (y_c and y_d) from provided step with step length - * alpha. - */ - void SetTrialEqMultipliersFromStep(Number alpha, - const Vector& delta_y_c, - const Vector& delta_y_d); - /** Set the value of the trial values for the bound multipliers - * (z_L, z_U, v_L, v_U) from provided step with step length - * alpha. - */ - void SetTrialBoundMultipliersFromStep(Number alpha, - const Vector& delta_z_L, - const Vector& delta_z_U, - const Vector& delta_v_L, - const Vector& delta_v_U); - - /** ToDo: I may need to add versions of set_trial like the - * following, but I am not sure - */ - // void set_trial(const SmartPtr& trial_iterates); - // void set_trial(SmartPtr& trial_iterates); - - /** get the current delta */ - inline - SmartPtr delta() const; - - /** Set the current delta - like the trial point, this method copies - * the pointer for efficiency (no copy and to keep cache tags the - * same) so after you call set, you cannot modify the data - */ - inline - void set_delta(SmartPtr& delta); - - /** Set the current delta - like the trial point, this method - * copies the pointer for efficiency (no copy and to keep cache - * tags the same) so after you call set, you cannot modify the - * data. This is the version that is happy with a pointer to - * const IteratesVector. - */ - inline - void set_delta(SmartPtr& delta); - - /** Affine Delta */ - inline - SmartPtr delta_aff() const; - - /** Set the affine delta - like the trial point, this method copies - * the pointer for efficiency (no copy and to keep cache tags the - * same) so after you call set, you cannot modify the data - */ - inline - void set_delta_aff(SmartPtr& delta_aff); - - /** Hessian or Hessian approximation (do not hold on to it, it might be changed) */ - SmartPtr W() - { - DBG_ASSERT(IsValid(W_)); - return W_; - } - - /** Set Hessian approximation */ - void Set_W(SmartPtr W) - { - W_ = W; - } - - /** @name ("Main") Primal-dual search direction. Those fields are - * used to store the search directions computed from solving the - * primal-dual system, and can be used in the line search. They - * are overwritten in every iteration, so do not hold on to the - * pointers (make copies instead) */ - //@{ - - /** Returns true, if the primal-dual step have been already - * computed for the current iteration. This flag is reset after - * every call of AcceptTrialPoint(). If the search direction is - * computed during the computation of the barrier parameter, the - * method computing the barrier parameter should call - * SetHaveDeltas(true) to tell the IpoptAlgorithm object that it - * doesn't need to recompute the primal-dual step. */ - bool HaveDeltas() const - { - return have_deltas_; - } - - /** Method for setting the HaveDeltas flag. This method should be - * called if some method computes the primal-dual step (and - * stores it in the delta_ fields of IpoptData) at an early part - * of the iteration. If that flag is set to true, the - * IpoptAlgorithm object will not recompute the step. */ - void SetHaveDeltas(bool have_deltas) - { - have_deltas_ = have_deltas; - } - //@} - - /** @name Affine-scaling step. Those fields can be used to store - * the affine scaling step. For example, if the method for - * computing the current barrier parameter computes the affine - * scaling steps, then the corrector step in the line search does - * not have to recompute those solutions of the linear system. */ - //@{ - - /** Returns true, if the affine-scaling step have been already - * computed for the current iteration. This flag is reset after - * every call of AcceptTrialPoint(). If the search direction is - * computed during the computation of the barrier parameter, the - * method computing the barrier parameter should call - * SetHaveDeltas(true) to tell the line search does not have to - * recompute them in case it wants to do a corrector step. */ - bool HaveAffineDeltas() const - { - return have_affine_deltas_; - } - - /** Method for setting the HaveDeltas flag. This method should be - * called if some method computes the primal-dual step (and - * stores it in the delta_ fields of IpoptData) at an early part - * of the iteration. If that flag is set to true, the - * IpoptAlgorithm object will not recompute the step. */ - void SetHaveAffineDeltas(bool have_affine_deltas) - { - have_affine_deltas_ = have_affine_deltas; - } - //@} - - /** @name Public Methods for updating iterates */ - //@{ - /** Copy the trial values to the current values */ - inline - void CopyTrialToCurrent(); - - /** Set the current iterate values from the - * trial values. */ - void AcceptTrialPoint(); - //@} - - /** @name General algorithmic data */ - //@{ - Index iter_count() const - { - return iter_count_; - } - void Set_iter_count(Index iter_count) - { - iter_count_ = iter_count; - } - - Number curr_mu() const - { - DBG_ASSERT(mu_initialized_); - return curr_mu_; - } - void Set_mu(Number mu) - { - curr_mu_ = mu; - mu_initialized_ = true; - } - bool MuInitialized() const - { - return mu_initialized_; - } - - Number curr_tau() const - { - DBG_ASSERT(tau_initialized_); - return curr_tau_; - } - void Set_tau(Number tau) - { - curr_tau_ = tau; - tau_initialized_ = true; - } - bool TauInitialized() const - { - return tau_initialized_; - } - - void SetFreeMuMode(bool free_mu_mode) - { - free_mu_mode_ = free_mu_mode; - } - bool FreeMuMode() const - { - return free_mu_mode_; - } - - /** Setting the flag that indicates if a tiny step (below machine - * precision) has been detected */ - void Set_tiny_step_flag(bool flag) - { - tiny_step_flag_ = flag; - } - bool tiny_step_flag() - { - return tiny_step_flag_; - } - //@} - - /** Overall convergence tolerance. It is used in the convergence - * test, but also in some other parts of the algorithm that - * depend on the specified tolerance, such as the minimum value - * for the barrier parameter. */ - //@{ - /** Obtain the tolerance. */ - Number tol() const - { - DBG_ASSERT(initialize_called_); - return tol_; - } - /** Set a new value for the tolerance. One should be very careful - * when using this, since changing the predefined tolerance might - * have unexpected consequences. This method is for example used - * in the restoration convergence checker to tighten the - * restoration phase convergence tolerance, if the restoration - * phase converged to a point that has not a large value for the - * constraint violation. */ - void Set_tol(Number tol) - { - tol_ = tol; - } - //@} - - /** Cpu time counter at the beginning of the optimization. This - * is useful to see how much CPU time has been spent in this - * optimization run. */ - Number cpu_time_start() const - { - return cpu_time_start_; - } - - /** @name Information gathered for iteration output */ - //@{ - Number info_regu_x() const - { - return info_regu_x_; - } - void Set_info_regu_x(Number regu_x) - { - info_regu_x_ = regu_x; - } - Number info_alpha_primal() const - { - return info_alpha_primal_; - } - void Set_info_alpha_primal(Number alpha_primal) - { - info_alpha_primal_ = alpha_primal; - } - char info_alpha_primal_char() const - { - return info_alpha_primal_char_; - } - void Set_info_alpha_primal_char(char info_alpha_primal_char) - { - info_alpha_primal_char_ = info_alpha_primal_char; - } - Number info_alpha_dual() const - { - return info_alpha_dual_; - } - void Set_info_alpha_dual(Number alpha_dual) - { - info_alpha_dual_ = alpha_dual; - } - Index info_ls_count() const - { - return info_ls_count_; - } - void Set_info_ls_count(Index ls_count) - { - info_ls_count_ = ls_count; - } - bool info_skip_output() const - { - return info_skip_output_; - } - void Append_info_string(const std::string& add_str) - { - info_string_ += add_str; - } - const std::string& info_string() const - { - return info_string_; - } - /** Set this to true, if the next time when output is written, the - * summary line should not be printed. */ - void Set_info_skip_output(bool info_skip_output) - { - info_skip_output_ = info_skip_output; - } - - /** gives time when the last summary output line was printed */ - Number info_last_output() - { - return info_last_output_; - } - /** sets time when the last summary output line was printed */ - void Set_info_last_output(Number info_last_output) - { - info_last_output_ = info_last_output; - } - - /** gives number of iteration summaries actually printed - * since last summary header was printed */ - int info_iters_since_header() - { - return info_iters_since_header_; - } - /** increases number of iteration summaries actually printed - * since last summary header was printed */ - void Inc_info_iters_since_header() - { - info_iters_since_header_++; - } - /** sets number of iteration summaries actually printed - * since last summary header was printed */ - void Set_info_iters_since_header(int info_iters_since_header) - { - info_iters_since_header_ = info_iters_since_header; - } - - /** Reset all info fields */ - void ResetInfo() - { - info_regu_x_ = 0; - info_alpha_primal_ = 0; - info_alpha_dual_ = 0.; - info_alpha_primal_char_ = ' '; - info_skip_output_ = false; - info_string_.erase(); - } - //@} - - /** Return Timing Statistics Object */ - TimingStatistics& TimingStats() - { - return timing_statistics_; - } - - /** Check if additional data has been set */ - bool HaveAddData() - { - return IsValid(add_data_); - } - - /** Get access to additional data object */ - IpoptAdditionalData& AdditionalData() - { - return *add_data_; - } - - /** Set a new pointer for additional Ipopt data */ - void SetAddData(SmartPtr add_data) - { - DBG_ASSERT(!HaveAddData()); - add_data_ = add_data; - } - - /** Set the perturbation of the primal-dual system */ - void setPDPert(Number pd_pert_x, Number pd_pert_s, - Number pd_pert_c, Number pd_pert_d) - { - pd_pert_x_ = pd_pert_x; - pd_pert_s_ = pd_pert_s; - pd_pert_c_ = pd_pert_c; - pd_pert_d_ = pd_pert_d; - } - - /** Get the current perturbation of the primal-dual system */ - void getPDPert(Number& pd_pert_x, Number& pd_pert_s, - Number& pd_pert_c, Number& pd_pert_d) - { - pd_pert_x = pd_pert_x_; - pd_pert_s = pd_pert_s_; - pd_pert_c = pd_pert_c_; - pd_pert_d = pd_pert_d_; - } - - /** Methods for IpoptType */ - //@{ - static void RegisterOptions(const SmartPtr& roptions); - //@} - - private: - /** @name Iterates */ - //@{ - /** Main iteration variables - * (current iteration) */ - SmartPtr curr_; - - /** Main iteration variables - * (trial calculations) */ - SmartPtr trial_; - - /** Hessian (approximation) - might be changed elsewhere! */ - SmartPtr W_; - - /** @name Primal-dual Step */ - //@{ - SmartPtr delta_; - /** The following flag is set to true, if some other part of the - * algorithm (like the method for computing the barrier - * parameter) has already computed the primal-dual search - * direction. This flag is reset when the AcceptTrialPoint - * method is called. - * ToDo: we could cue off of a null delta_; - */ - bool have_deltas_; - //@} - - /** @name Affine-scaling step. This used to transfer the - * information about the affine-scaling step from the computation - * of the barrier parameter to the corrector (in the line - * search). */ - //@{ - SmartPtr delta_aff_; - /** The following flag is set to true, if some other part of the - * algorithm (like the method for computing the barrier - * parameter) has already computed the affine-scaling step. This - * flag is reset when the AcceptTrialPoint method is called. - * ToDo: we could cue off of a null delta_aff_; - */ - bool have_affine_deltas_; - //@} - - /** iteration count */ - Index iter_count_; - - /** current barrier parameter */ - Number curr_mu_; - bool mu_initialized_; - - /** current fraction to the boundary parameter */ - Number curr_tau_; - bool tau_initialized_; - - /** flag indicating if Initialize method has been called (for - * debugging) */ - bool initialize_called_; - - /** flag for debugging whether we have already curr_ values - * available (from which new Vectors can be generated */ - bool have_prototypes_; - - /** @name Global algorithm parameters. Those are options that can - * be modified by the user and appear at different places in the - * algorithm. They are set using an OptionsList object in the - * Initialize method. */ - //@{ - /** Overall convergence tolerance */ - Number tol_; - //@} - - /** @name Status data **/ - //@{ - /** flag indicating whether the algorithm is in the free mu mode */ - bool free_mu_mode_; - /** flag indicating if a tiny step has been detected */ - bool tiny_step_flag_; - //@} - - /** @name Gathered information for iteration output */ - //@{ - /** Size of regularization for the Hessian */ - Number info_regu_x_; - /** Primal step size */ - Number info_alpha_primal_; - /** Info character for primal step size */ - char info_alpha_primal_char_; - /** Dual step size */ - Number info_alpha_dual_; - /** Number of backtracking trial steps */ - Index info_ls_count_; - /** true, if next summary output line should not be printed (eg - * after restoration phase. */ - bool info_skip_output_; - /** any string of characters for the end of the output line */ - std::string info_string_; - /** time when the last summary output line was printed */ - Number info_last_output_; - /** number of iteration summaries actually printed since last - * summary header was printed */ - int info_iters_since_header_; - //@} - - /** VectorSpace for all the iterates */ - SmartPtr iterates_space_; - - /** TimingStatistics object collecting all Ipopt timing - * statistics */ - TimingStatistics timing_statistics_; - - /** CPU time counter at initialization. */ - Number cpu_time_start_; - - /** Object for the data specific for the Chen-Goldfarb penalty - * method algorithm */ - SmartPtr add_data_; - - /** @name Information about the perturbation of the primal-dual - * system */ - //@{ - Number pd_pert_x_; - Number pd_pert_s_; - Number pd_pert_c_; - Number pd_pert_d_; - //@} - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IpoptData(const IpoptData&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptData&); - //@} - -#if COIN_IPOPT_CHECKLEVEL > 0 - /** Some debug flags to make sure vectors are not changed - * behind the IpoptData's back - */ - //@{ - TaggedObject::Tag debug_curr_tag_; - TaggedObject::Tag debug_trial_tag_; - TaggedObject::Tag debug_delta_tag_; - TaggedObject::Tag debug_delta_aff_tag_; - TaggedObject::Tag debug_curr_tag_sum_; - TaggedObject::Tag debug_trial_tag_sum_; - TaggedObject::Tag debug_delta_tag_sum_; - TaggedObject::Tag debug_delta_aff_tag_sum_; - //@} -#endif - - }; - - inline - SmartPtr IpoptData::curr() const - { - DBG_ASSERT(IsNull(curr_) || (curr_->GetTag() == debug_curr_tag_ && curr_->GetTagSum() == debug_curr_tag_sum_) ); - - return curr_; - } - - inline - SmartPtr IpoptData::trial() const - { - DBG_ASSERT(IsNull(trial_) || (trial_->GetTag() == debug_trial_tag_ && trial_->GetTagSum() == debug_trial_tag_sum_) ); - - return trial_; - } - - inline - SmartPtr IpoptData::delta() const - { - DBG_ASSERT(IsNull(delta_) || (delta_->GetTag() == debug_delta_tag_ && delta_->GetTagSum() == debug_delta_tag_sum_) ); - - return delta_; - } - - inline - SmartPtr IpoptData::delta_aff() const - { - DBG_ASSERT(IsNull(delta_aff_) || (delta_aff_->GetTag() == debug_delta_aff_tag_ && delta_aff_->GetTagSum() == debug_delta_aff_tag_sum_) ); - - return delta_aff_; - } - - inline - void IpoptData::CopyTrialToCurrent() - { - curr_ = trial_; -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(curr_)) { - debug_curr_tag_ = curr_->GetTag(); - debug_curr_tag_sum_ = curr_->GetTagSum(); - } - else { - debug_curr_tag_ = 0; - debug_curr_tag_sum_ = 0; - } -#endif - - } - - inline - void IpoptData::set_trial(SmartPtr& trial) - { - trial_ = ConstPtr(trial); - -#if COIN_IPOPT_CHECKLEVEL > 0 - // verify the correct space - DBG_ASSERT(trial_->OwnerSpace() == (VectorSpace*)GetRawPtr(iterates_space_)); - if (IsValid(trial)) { - debug_trial_tag_ = trial->GetTag(); - debug_trial_tag_sum_ = trial->GetTagSum(); - } - else { - debug_trial_tag_ = 0; - debug_trial_tag_sum_ = 0; - } -#endif - - trial = NULL; - } - - inline - void IpoptData::set_delta(SmartPtr& delta) - { - delta_ = ConstPtr(delta); -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta)) { - debug_delta_tag_ = delta->GetTag(); - debug_delta_tag_sum_ = delta->GetTagSum(); - } - else { - debug_delta_tag_ = 0; - debug_delta_tag_sum_ = 0; - } -#endif - - delta = NULL; - } - - inline - void IpoptData::set_delta(SmartPtr& delta) - { - delta_ = delta; -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta)) { - debug_delta_tag_ = delta->GetTag(); - debug_delta_tag_sum_ = delta->GetTagSum(); - } - else { - debug_delta_tag_ = 0; - debug_delta_tag_sum_ = 0; - } -#endif - - delta = NULL; - } - - inline - void IpoptData::set_delta_aff(SmartPtr& delta_aff) - { - delta_aff_ = ConstPtr(delta_aff); -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta_aff)) { - debug_delta_aff_tag_ = delta_aff->GetTag(); - debug_delta_aff_tag_sum_ = delta_aff->GetTagSum(); - } - else { - debug_delta_aff_tag_ = 0; - debug_delta_aff_tag_sum_ = delta_aff->GetTagSum(); - } -#endif - - delta_aff = NULL; - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIpoptNLP.hpp b/thirdparty/linux/include/coin1/IpIpoptNLP.hpp deleted file mode 100644 index 21951c35..00000000 --- a/thirdparty/linux/include/coin1/IpIpoptNLP.hpp +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptNLP.hpp 2594 2015-08-09 14:31:05Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTNLP_HPP__ -#define __IPIPOPTNLP_HPP__ - -#include "IpNLP.hpp" -#include "IpJournalist.hpp" -#include "IpNLPScaling.hpp" - -namespace Ipopt -{ - // forward declarations - class IteratesVector; - - /** This is the abstract base class for classes that map - * the traditional NLP into - * something that is more useful by Ipopt. - * This class takes care of storing the - * calculated model results, handles cacheing, - * and (some day) takes care of addition of slacks. - */ - class IpoptNLP : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - IpoptNLP(const SmartPtr nlp_scaling) - : - nlp_scaling_(nlp_scaling) - {} - - /** Default destructor */ - virtual ~IpoptNLP() - {} - //@} - - /** Initialization method. Set the internal options and - * initialize internal data structures. */ - virtual bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) - { - bool ret = true; - if (IsValid(nlp_scaling_)) { - ret = nlp_scaling_->Initialize(jnlst, options, prefix); - } - return ret; - } - - /**@name Possible Exceptions */ - //@{ - /** thrown if there is any error evaluating values from the nlp */ - DECLARE_STD_EXCEPTION(Eval_Error); - //@} - /** Initialize (create) structures for - * the iteration data */ - virtual bool InitializeStructures(SmartPtr& x, - bool init_x, - SmartPtr& y_c, - bool init_y_c, - SmartPtr& y_d, - bool init_y_d, - SmartPtr& z_L, - bool init_z_L, - SmartPtr& z_U, - bool init_z_U, - SmartPtr& v_L, - SmartPtr& v_U - ) = 0; - - /** Method accessing the GetWarmStartIterate of the NLP */ - virtual bool GetWarmStartIterate(IteratesVector& warm_start_iterate)=0; - - /** Accessor methods for model data */ - //@{ - /** Objective value */ - virtual Number f(const Vector& x) = 0; - - /** Gradient of the objective */ - virtual SmartPtr grad_f(const Vector& x) = 0; - - /** Equality constraint residual */ - virtual SmartPtr c(const Vector& x) = 0; - - /** Jacobian Matrix for equality constraints */ - virtual SmartPtr jac_c(const Vector& x) = 0; - - /** Inequality constraint residual (reformulated - * as equalities with slacks */ - virtual SmartPtr d(const Vector& x) = 0; - - /** Jacobian Matrix for inequality constraints */ - virtual SmartPtr jac_d(const Vector& x) = 0; - - /** Hessian of the Lagrangian */ - virtual SmartPtr h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd - ) = 0; - - /** Lower bounds on x */ - virtual SmartPtr x_L() const = 0; - - /** Permutation matrix (x_L_ -> x) */ - virtual SmartPtr Px_L() const = 0; - - /** Upper bounds on x */ - virtual SmartPtr x_U() const = 0; - - /** Permutation matrix (x_U_ -> x */ - virtual SmartPtr Px_U() const = 0; - - /** Lower bounds on d */ - virtual SmartPtr d_L() const = 0; - - /** Permutation matrix (d_L_ -> d) */ - virtual SmartPtr Pd_L() const = 0; - - /** Upper bounds on d */ - virtual SmartPtr d_U() const = 0; - - /** Permutation matrix (d_U_ -> d */ - virtual SmartPtr Pd_U() const = 0; - - /** x_space */ - virtual SmartPtr x_space() const = 0; - - /** Accessor method to obtain the MatrixSpace for the Hessian - * matrix (or it's approximation) */ - virtual SmartPtr HessianMatrixSpace() const = 0; - //@} - - /** Accessor method for vector/matrix spaces pointers. */ - virtual void GetSpaces(SmartPtr& x_space, - SmartPtr& c_space, - SmartPtr& d_space, - SmartPtr& x_l_space, - SmartPtr& px_l_space, - SmartPtr& x_u_space, - SmartPtr& px_u_space, - SmartPtr& d_l_space, - SmartPtr& pd_l_space, - SmartPtr& d_u_space, - SmartPtr& pd_u_space, - SmartPtr& Jac_c_space, - SmartPtr& Jac_d_space, - SmartPtr& Hess_lagrangian_space) = 0; - - /** Method for adapting the variable bounds. This is called if - * slacks are becoming too small */ - virtual void AdjustVariableBounds(const Vector& new_x_L, - const Vector& new_x_U, - const Vector& new_d_L, - const Vector& new_d_U)=0; - - /** @name Counters for the number of function evaluations. */ - //@{ - virtual Index f_evals() const = 0; - virtual Index grad_f_evals() const = 0; - virtual Index c_evals() const = 0; - virtual Index jac_c_evals() const = 0; - virtual Index d_evals() const = 0; - virtual Index jac_d_evals() const = 0; - virtual Index h_evals() const = 0; - //@} - - /** @name Special method for dealing with the fact that the - * restoration phase objective function depends on the barrier - * parameter */ - //@{ - /** Method for telling the IpoptCalculatedQuantities class whether - * the objective function depends on the barrier function. This - * is only used for the restoration phase NLP - * formulation. Probably only RestoIpoptNLP should overwrite - * this. */ - virtual bool objective_depends_on_mu() const - { - return false; - } - - /** Replacement for the default objective function method which - * knows about the barrier parameter */ - virtual Number f(const Vector& x, Number mu) = 0; - - /** Replacement for the default objective gradient method which - * knows about the barrier parameter */ - virtual SmartPtr grad_f(const Vector& x, Number mu) = 0; - - /** Replacement for the default Lagrangian Hessian method which - * knows about the barrier parameter */ - virtual SmartPtr h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd, - Number mu) = 0; - - /** Provides a Hessian matrix from the correct matrix space with - * uninitialized values. This can be used in LeastSquareMults to - * obtain a "zero Hessian". */ - virtual SmartPtr uninitialized_h() = 0; - //@} - - /**@name solution routines */ - //@{ - virtual void FinalizeSolution(SolverReturn status, - const Vector& x, const Vector& z_L, const Vector& z_U, - const Vector& c, const Vector& d, - const Vector& y_c, const Vector& y_d, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq)=0; - - virtual bool IntermediateCallBack(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - SmartPtr ip_data, - SmartPtr ip_cq)=0; - //@} - - /** Returns the scaling strategy object */ - SmartPtr NLP_scaling() const - { - DBG_ASSERT(IsValid(nlp_scaling_)); - return nlp_scaling_; - } - - private: - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - - /** Copy Constructor */ - IpoptNLP(const IpoptNLP&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptNLP&); - //@} - - SmartPtr nlp_scaling_; - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIterateInitializer.hpp b/thirdparty/linux/include/coin1/IpIterateInitializer.hpp deleted file mode 100644 index d1796516..00000000 --- a/thirdparty/linux/include/coin1/IpIterateInitializer.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIterateInitializer.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-09-24 - -#ifndef __IPITERATEINITIALIZER_HPP__ -#define __IPITERATEINITIALIZER_HPP__ - -#include "IpAlgStrategy.hpp" -#include "IpIpoptNLP.hpp" -#include "IpIpoptData.hpp" -#include "IpIpoptCalculatedQuantities.hpp" - -namespace Ipopt -{ - - /** Base class for all methods for initializing the iterates. - */ - class IterateInitializer: public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - IterateInitializer() - {} - - /** Default destructor */ - virtual ~IterateInitializer() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Compute the initial iterates and set the into the curr field - * of the ip_data object. */ - virtual bool SetInitialIterates() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IterateInitializer(const IterateInitializer&); - - /** Overloaded Equals Operator */ - void operator=(const IterateInitializer&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIteratesVector.hpp b/thirdparty/linux/include/coin1/IpIteratesVector.hpp deleted file mode 100644 index 2ed75802..00000000 --- a/thirdparty/linux/include/coin1/IpIteratesVector.hpp +++ /dev/null @@ -1,689 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIteratesVector.hpp 2472 2014-04-05 17:47:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-06-06 - -#ifndef __IPITERATESVECTOR_HPP__ -#define __IPITERATESVECTOR_HPP__ - -#include "IpCompoundVector.hpp" - -namespace Ipopt -{ - /* forward declarations */ - class IteratesVectorSpace; - - /** Specialized CompoundVector class specifically for the algorithm - * iterates. This class inherits from CompoundVector and is a - * specialized class for handling the iterates of the Ipopt - * Algorithm, that is, x, s, y_c, y_d, z_L, z_U, v_L, and v_U. It - * inherits from CompoundVector so it can behave like a CV in most - * calculations, but it has fixed dimensions and cannot be - * customized - */ - class IteratesVector : public CompoundVector - { - public: - /** Constructors / Destructors */ - //@{ - IteratesVector(const IteratesVectorSpace* owner_space, bool create_new); - - virtual ~IteratesVector(); - //@} - - /** Make New methods */ - //@{ - /** Use this method to create a new iterates vector. The MakeNew - * method on the Vector class also works, but it does not give - * the create_new option. - */ - SmartPtr MakeNewIteratesVector(bool create_new = true) const; - - /** Use this method to create a new iterates vector with a copy of - * all the data. - */ - SmartPtr MakeNewIteratesVectorCopy() const - { - SmartPtr ret = MakeNewIteratesVector(true); - ret->Copy(*this); - return ret; - } - - /** Use this method to create a new iterates vector - * container. This creates a new NonConst container, but the - * elements inside the iterates vector may be const. Therefore, - * the container can be modified to point to new entries, but the - * existing entries may or may not be modifiable. - */ - SmartPtr MakeNewContainer() const; - //@} - - /** Iterates Set/Get Methods */ - //@{ - /** Get the x iterate (const) */ - SmartPtr x() const - { - return GetIterateFromComp(0); - } - - /** Get the x iterate (non-const) - this can only be called if the - * vector was created intenally, or the Set_x_NonConst method was - * used. */ - SmartPtr x_NonConst() - { - return GetNonConstIterateFromComp(0); - } - - /** Create a new vector in the x entry */ - inline - SmartPtr create_new_x(); - - /** Create a new vector in the x entry and copy the current values - * into it. */ - SmartPtr create_new_x_copy() - { - SmartPtr curr_x = GetComp(0); - Set_x_NonConst(*curr_x->MakeNew()); - x_NonConst()->Copy(*curr_x); - return x_NonConst(); - } - - /** Set the x iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_x(const Vector& vec) - { - SetComp(0, vec); - } - - /** Set the x iterate (non-const). Sets the pointer, does NOT copy - * data. */ - void Set_x_NonConst(Vector& vec) - { - SetCompNonConst(0, vec); - } - - /** Get the s iterate (const) */ - SmartPtr s() const - { - return GetIterateFromComp(1); - } - - /** Get the s iterate (non-const) - this can only be called if the - * vector was created intenally, or the Set_s_NonConst method was - * used. */ - SmartPtr s_NonConst() - { - return GetNonConstIterateFromComp(1); - } - - /** Create a new vector in the s entry */ - inline - SmartPtr create_new_s(); - - /** Create a new vector in the s entry and copy the current values - * into it. */ - SmartPtr create_new_s_copy() - { - SmartPtr curr_s = GetComp(1); - Set_s_NonConst(*curr_s->MakeNew()); - s_NonConst()->Copy(*curr_s); - return s_NonConst(); - } - - /** Set the s iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_s(const Vector& vec) - { - SetComp(1, vec); - } - - /** Set the s iterate (non-const). Sets the pointer, does NOT copy - * data. */ - void Set_s_NonConst(Vector& vec) - { - SetCompNonConst(1, vec); - } - - /** Get the y_c iterate (const) */ - SmartPtr y_c() const - { - return GetIterateFromComp(2); - } - - /** Get the y_c iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_y_c_NonConst - * method was used. */ - SmartPtr y_c_NonConst() - { - return GetNonConstIterateFromComp(2); - } - - /** Create a new vector in the y_c entry */ - inline - SmartPtr create_new_y_c(); - - /** Create a new vector in the y_c entry and copy the current - * values into it. */ - SmartPtr create_new_y_c_copy() - { - SmartPtr curr_y_c = GetComp(2); - Set_y_c_NonConst(*curr_y_c->MakeNew()); - y_c_NonConst()->Copy(*curr_y_c); - return y_c_NonConst(); - } - - /** Set the y_c iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_y_c(const Vector& vec) - { - SetComp(2, vec); - } - - /** Set the y_c iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_y_c_NonConst(Vector& vec) - { - SetCompNonConst(2, vec); - } - - /** Get the y_d iterate (const) */ - SmartPtr y_d() const - { - return GetIterateFromComp(3); - } - - /** Get the y_d iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_y_d_NonConst - * method was used. */ - SmartPtr y_d_NonConst() - { - return GetNonConstIterateFromComp(3); - } - - /** Create a new vector in the y_d entry */ - inline - SmartPtr create_new_y_d(); - - /** Create a new vector in the y_d entry and copy the current - * values into it. */ - SmartPtr create_new_y_d_copy() - { - SmartPtr curr_y_d = GetComp(3); - Set_y_d_NonConst(*curr_y_d->MakeNew()); - y_d_NonConst()->Copy(*curr_y_d); - return y_d_NonConst(); - } - - /** Set the y_d iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_y_d(const Vector& vec) - { - SetComp(3, vec); - } - - /** Set the y_d iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_y_d_NonConst(Vector& vec) - { - SetCompNonConst(3, vec); - } - - /** Get the z_L iterate (const) */ - SmartPtr z_L() const - { - return GetIterateFromComp(4); - } - - /** Get the z_L iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_z_L_NonConst - * method was used. */ - SmartPtr z_L_NonConst() - { - return GetNonConstIterateFromComp(4); - } - - /** Create a new vector in the z_L entry */ - inline - SmartPtr create_new_z_L(); - - /** Create a new vector in the z_L entry and copy the current - * values into it. */ - SmartPtr create_new_z_L_copy() - { - SmartPtr curr_z_L = GetComp(4); - Set_z_L_NonConst(*curr_z_L->MakeNew()); - z_L_NonConst()->Copy(*curr_z_L); - return z_L_NonConst(); - } - - /** Set the z_L iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_z_L(const Vector& vec) - { - SetComp(4, vec); - } - - /** Set the z_L iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_z_L_NonConst(Vector& vec) - { - SetCompNonConst(4, vec); - } - - /** Get the z_U iterate (const) */ - SmartPtr z_U() const - { - return GetIterateFromComp(5); - } - - /** Get the z_U iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_z_U_NonConst - * method was used. */ - SmartPtr z_U_NonConst() - { - return GetNonConstIterateFromComp(5); - } - - /** Create a new vector in the z_U entry */ - inline - SmartPtr create_new_z_U(); - - /** Create a new vector in the z_U entry and copy the current - * values into it. */ - SmartPtr create_new_z_U_copy() - { - SmartPtr curr_z_U = GetComp(5); - Set_z_U_NonConst(*curr_z_U->MakeNew()); - z_U_NonConst()->Copy(*curr_z_U); - return z_U_NonConst(); - } - - /** Set the z_U iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_z_U(const Vector& vec) - { - SetComp(5, vec); - } - - /** Set the z_U iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_z_U_NonConst(Vector& vec) - { - SetCompNonConst(5, vec); - } - - /** Get the v_L iterate (const) */ - SmartPtr v_L() const - { - return GetIterateFromComp(6); - } - - /** Get the v_L iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_v_L_NonConst - * method was used. */ - SmartPtr v_L_NonConst() - { - return GetNonConstIterateFromComp(6); - } - - /** Create a new vector in the v_L entry */ - inline - SmartPtr create_new_v_L(); - - /** Create a new vector in the v_L entry and copy the current - * values into it. */ - SmartPtr create_new_v_L_copy() - { - SmartPtr curr_v_L = GetComp(6); - Set_v_L_NonConst(*curr_v_L->MakeNew()); - v_L_NonConst()->Copy(*curr_v_L); - return v_L_NonConst(); - } - - /** Set the v_L iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_v_L(const Vector& vec) - { - SetComp(6, vec); - } - - /** Set the v_L iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_v_L_NonConst(Vector& vec) - { - SetCompNonConst(6, vec); - } - - /** Get the v_U iterate (const) */ - SmartPtr v_U() const - { - return GetIterateFromComp(7); - } - - /** Get the v_U iterate (non-const) - this can only be called if - * the vector was created intenally, or the Set_v_U_NonConst - * method was used. */ - SmartPtr v_U_NonConst() - { - return GetNonConstIterateFromComp(7); - } - - /** Create a new vector in the v_U entry */ - inline - SmartPtr create_new_v_U(); - - /** Create a new vector in the v_U entry and copy the current - * values into it. */ - SmartPtr create_new_v_U_copy() - { - SmartPtr curr_v_U = GetComp(7); - Set_v_U_NonConst(*curr_v_U->MakeNew()); - v_U_NonConst()->Copy(*curr_v_U); - return v_U_NonConst(); - } - - /** Set the v_U iterate (const). Sets the pointer, does NOT copy - * data. */ - void Set_v_U(const Vector& vec) - { - SetComp(7, vec); - } - - /** Set the v_U iterate (non-const). Sets the pointer, does NOT - * copy data. */ - void Set_v_U_NonConst(Vector& vec) - { - SetCompNonConst(7, vec); - } - - /** Set the primal variables all in one shot. Sets the pointers, - * does NOT copy data */ - void Set_primal(const Vector& x, const Vector& s) - { - SetComp(0, x); - SetComp(1, s); - } - void Set_primal_NonConst(Vector& x, Vector& s) - { - SetCompNonConst(0, x); - SetCompNonConst(1, s); - } - - /** Set the eq multipliers all in one shot. Sets the pointers, - * does not copy data. */ - void Set_eq_mult(const Vector& y_c, const Vector& y_d) - { - SetComp(2, y_c); - SetComp(3, y_d); - } - void Set_eq_mult_NonConst(Vector& y_c, Vector& y_d) - { - SetCompNonConst(2, y_c); - SetCompNonConst(3, y_d); - } - - /** Set the bound multipliers all in one shot. Sets the pointers, - * does not copy data. */ - void Set_bound_mult(const Vector& z_L, const Vector& z_U, const Vector& v_L, const Vector& v_U) - { - SetComp(4, z_L); - SetComp(5, z_U); - SetComp(6, v_L); - SetComp(7, v_U); - } - void Set_bound_mult_NonConst(Vector& z_L, Vector& z_U, Vector& v_L, Vector& v_U) - { - SetCompNonConst(4, z_L); - SetCompNonConst(5, z_U); - SetCompNonConst(6, v_L); - SetCompNonConst(7, v_U); - } - - /** Get a sum of the tags of the contained items. There is no - * guarantee that this is unique, but there is a high chance it - * is unique and it can be used for debug checks relatively - * reliably. - */ - TaggedObject::Tag GetTagSum() const - { - TaggedObject::Tag tag = 0; - - if (IsValid(x())) { - tag += x()->GetTag(); - } - if (IsValid(s())) { - tag += s()->GetTag(); - } - if (IsValid(y_c())) { - tag += y_c()->GetTag(); - } - if (IsValid(y_d())) { - tag += y_d()->GetTag(); - } - if (IsValid(z_L())) { - tag += z_L()->GetTag(); - } - if (IsValid(z_U())) { - tag += z_U()->GetTag(); - } - if (IsValid(v_L())) { - tag += v_L()->GetTag(); - } - if (IsValid(v_U())) { - tag += v_U()->GetTag(); - } - - return tag; - } - //@} - - private: - /**@name Default Compiler Generated Methods (Hidden to avoid - * implicit creation/calling). These methods are not implemented - * and we do not want the compiler to implement them for us, so we - * declare them private and do not define them. This ensures that - * they will not be implicitly created/called. - */ - //@{ - /** Default Constructor */ - IteratesVector(); - - /** Copy Constructor */ - IteratesVector(const IteratesVector&); - - /** Overloaded Equals Operator */ - void operator=(const IteratesVector&); - //@} - - const IteratesVectorSpace* owner_space_; - - /** private method to return the const element from the compound - * vector. This method will return NULL if none is currently - * set. - */ - SmartPtr GetIterateFromComp(Index i) const - { - if (IsCompNull(i)) { - return NULL; - } - return GetComp(i); - } - - /** private method to return the non-const element from the - * compound vector. This method will return NULL if none is - * currently set. - */ - SmartPtr GetNonConstIterateFromComp(Index i) - { - if (IsCompNull(i)) { - return NULL; - } - return GetCompNonConst(i); - } - - }; - - /** Vector Space for the IteratesVector class. This is a - * specialized vector space for the IteratesVector class. - */ - class IteratesVectorSpace : public CompoundVectorSpace - { - public: - /** @name Constructors/Destructors. */ - //@{ - /** Constructor that takes the spaces for each of the iterates. - * Warning! None of these can be NULL ! - */ - IteratesVectorSpace(const VectorSpace& x_space, const VectorSpace& s_space, - const VectorSpace& y_c_space, const VectorSpace& y_d_space, - const VectorSpace& z_L_space, const VectorSpace& z_U_space, - const VectorSpace& v_L_space, const VectorSpace& v_U_space - ); - - virtual ~IteratesVectorSpace(); - //@} - - /** Method for creating vectors . */ - //@{ - /** Use this to create a new IteratesVector. You can pass-in - * create_new = false if you only want a container and do not - * want vectors allocated. - */ - virtual IteratesVector* MakeNewIteratesVector(bool create_new = true) const - { - return new IteratesVector(this, create_new); - } - - /** Use this method to create a new const IteratesVector. You must pass in - * valid pointers for all of the entries. - */ - const SmartPtr MakeNewIteratesVector(const Vector& x, const Vector& s, - const Vector& y_c, const Vector& y_d, - const Vector& z_L, const Vector& z_U, - const Vector& v_L, const Vector& v_U) - { - SmartPtr newvec = MakeNewIteratesVector(false); - newvec->Set_x(x); - newvec->Set_s(s); - newvec->Set_y_c(y_c); - newvec->Set_y_d(y_d); - newvec->Set_z_L(z_L); - newvec->Set_z_U(z_U); - newvec->Set_v_L(v_L); - newvec->Set_v_U(v_U); - return ConstPtr(newvec); - } - - - /** This method overloads - * ComooundVectorSpace::MakeNewCompoundVector to make sure that - * we get a vector of the correct type - */ - virtual CompoundVector* MakeNewCompoundVector(bool create_new = true) const - { - return MakeNewIteratesVector(create_new); - } - - /** This method creates a new vector (and allocates space in all - * the contained vectors. This is really only used for code that - * does not know what type of vector it is dealing with - for - * example, this method is called from Vector::MakeNew() - */ - virtual Vector* MakeNew() const - { - return MakeNewIteratesVector(); - } - //@} - - /** This method hides the CompoundVectorSpace::SetCompSpace method - * since the components of the Iterates are fixed at - * construction. - */ - virtual void SetCompSpace(Index icomp, const VectorSpace& vec_space) - { - DBG_ASSERT(false && "This is an IteratesVectorSpace - a special compound vector for Ipopt iterates. The contained spaces should not be modified."); - } - - private: - /**@name Default Compiler Generated Methods (Hidden to avoid - * implicit creation/calling). These methods are not implemented - * and we do not want the compiler to implement them for us, so we - * declare them private and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default constructor */ - IteratesVectorSpace(); - - /** Copy Constructor */ - IteratesVectorSpace(const IteratesVectorSpace&); - - /** Overloaded Equals Operator */ - IteratesVectorSpace& operator=(const IteratesVectorSpace&); - //@} - - /** Contained Spaces */ - SmartPtr x_space_; - SmartPtr s_space_; - SmartPtr y_c_space_; - SmartPtr y_d_space_; - SmartPtr z_L_space_; - SmartPtr z_U_space_; - SmartPtr v_L_space_; - SmartPtr v_U_space_; - }; - - - inline - SmartPtr IteratesVector::create_new_x() - { - Set_x_NonConst(*owner_space_->GetCompSpace(0)->MakeNew()); - return x_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_s() - { - Set_s_NonConst(*owner_space_->GetCompSpace(1)->MakeNew()); - return s_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_y_c() - { - Set_y_c_NonConst(*owner_space_->GetCompSpace(2)->MakeNew()); - return y_c_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_y_d() - { - Set_y_d_NonConst(*owner_space_->GetCompSpace(3)->MakeNew()); - return y_d_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_z_L() - { - Set_z_L_NonConst(*owner_space_->GetCompSpace(4)->MakeNew()); - return z_L_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_z_U() - { - Set_z_U_NonConst(*owner_space_->GetCompSpace(5)->MakeNew()); - return z_U_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_v_L() - { - Set_v_L_NonConst(*owner_space_->GetCompSpace(6)->MakeNew()); - return v_L_NonConst(); - } - inline - SmartPtr IteratesVector::create_new_v_U() - { - Set_v_U_NonConst(*owner_space_->GetCompSpace(7)->MakeNew()); - return v_U_NonConst(); - } -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpIterationOutput.hpp b/thirdparty/linux/include/coin1/IpIterationOutput.hpp deleted file mode 100644 index 95fd6508..00000000 --- a/thirdparty/linux/include/coin1/IpIterationOutput.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2004, 2011 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIterationOutput.hpp 2020 2011-06-16 20:46:16Z andreasw $ -// -// Authors: Andreas Waechter, Carl Laird IBM 2004-09-27 - -#ifndef __IPITERATIONOUTPUT_HPP__ -#define __IPITERATIONOUTPUT_HPP__ - -#include "IpAlgStrategy.hpp" -#include "IpIpoptNLP.hpp" -#include "IpIpoptData.hpp" -#include "IpIpoptCalculatedQuantities.hpp" - -namespace Ipopt -{ - - /** Base class for objects that do the output summary per iteration. - */ - class IterationOutput: public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - IterationOutput() - {} - - /** Default destructor */ - virtual ~IterationOutput() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Method to do all the summary output per iteration. This - * include the one-line summary output as well as writing the - * details about the iterates if desired */ - virtual void WriteOutput() = 0; - - protected: - /** enumeration for different inf_pr output options */ - enum InfPrOutput - { - INTERNAL=0, - ORIGINAL - }; - - private: - /**@name Default Compiler Generated Methods (Hidden to avoid - * implicit creation/calling). These methods are not implemented - * and we do not want the compiler to implement them for us, so we - * declare them private and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IterationOutput(const IterationOutput&); - - /** Overloaded Equals Operator */ - void operator=(const IterationOutput&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpJournalist.hpp b/thirdparty/linux/include/coin1/IpJournalist.hpp deleted file mode 100644 index 266130a0..00000000 --- a/thirdparty/linux/include/coin1/IpJournalist.hpp +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpJournalist.hpp 2204 2013-04-13 13:49:26Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPJOURNALIST_HPP__ -#define __IPJOURNALIST_HPP__ - -#include "IpoptConfig.h" -#include "IpTypes.hpp" -#include "IpReferenced.hpp" -#include "IpSmartPtr.hpp" - -#ifdef HAVE_CSTDARG -# include -#else -# ifdef HAVE_STDARG_H -# include -# else -# include // if this header is included by someone who does not define HAVE_CSTDARG or HAVE_STDARG, let's hope that cstdarg is available -# endif -#endif - -#ifdef HAVE_CSTDIO -# include -#else -# ifdef HAVE_STDIO_H -# include -# else -# include // if this header is included by someone who does not define HAVE_CSTDIO or HAVE_STDIO, let's hope that cstdio is available -# endif -#endif - -#include -#include -#include - -namespace Ipopt -{ - - // forward declarations - class Journal; - class FileJournal; - - /**@name Journalist Enumerations. */ - //@{ - /** Print Level Enum. */ - enum EJournalLevel { - J_INSUPPRESSIBLE=-1, - J_NONE=0, - J_ERROR, - J_STRONGWARNING, - J_SUMMARY, - J_WARNING, - J_ITERSUMMARY, - J_DETAILED, - J_MOREDETAILED, - J_VECTOR, - J_MOREVECTOR, - J_MATRIX, - J_MOREMATRIX, - J_ALL, - J_LAST_LEVEL - }; - - /** Category Selection Enum. */ - enum EJournalCategory { - J_DBG=0, - J_STATISTICS, - J_MAIN, - J_INITIALIZATION, - J_BARRIER_UPDATE, - J_SOLVE_PD_SYSTEM, - J_FRAC_TO_BOUND, - J_LINEAR_ALGEBRA, - J_LINE_SEARCH, - J_HESSIAN_APPROXIMATION, - J_SOLUTION, - J_DOCUMENTATION, - J_NLP, - J_TIMING_STATISTICS, - J_USER_APPLICATION /** This can be used by the user's application*/ , - J_USER1 /** This can be used by the user's application*/ , - J_USER2 /** This can be used by the user's application*/ , - J_USER3 /** This can be used by the user's application*/ , - J_USER4 /** This can be used by the user's application*/ , - J_USER5 /** This can be used by the user's application*/ , - J_USER6 /** This can be used by the user's application*/ , - J_USER7 /** This can be used by the user's application*/ , - J_USER8 /** This can be used by the user's application*/ , - J_USER9 /** This can be used by the user's application*/ , - J_USER10 /** This can be used by the user's application*/ , - J_USER11 /** This can be used by the user's application*/ , - J_USER12 /** This can be used by the user's application*/ , - J_USER13 /** This can be used by the user's application*/ , - J_USER14 /** This can be used by the user's application*/ , - J_USER15 /** This can be used by the user's application*/ , - J_USER16 /** This can be used by the user's application*/ , - J_USER17 /** This can be used by the user's application*/ , - J_LAST_CATEGORY - }; - //@} - - /** Class responsible for all message output. - * This class is responsible for all messaging and output. - * The "printing" code or "author" should send ALL messages to the - * Journalist, indicating an appropriate category and print level. - * The journalist then decides, based on reader specified - * acceptance criteria, which message is actually printed in which - * journals. - * This allows the printing code to send everything, while the - * "reader" can decide what they really want to see. - * - * Authors: - * Authors use the - * Journals: You can add as many Journals as you like to the - * Journalist with the AddJournal or the AddFileJournal methods. - * Each one represents a different printing location (or file). - * Then, you can call the "print" methods of the Journalist to output - * information to each of the journals. - * - * Acceptance Criteria: Each print message should be flagged - * appropriately with an EJournalCategory and EJournalLevel. - * - * The AddFileJournal - * method returns a pointer to the newly created Journal object - * (if successful) so you can set Acceptance criteria for that - * particular location. - * - */ - class Journalist : public ReferencedObject - { - public: - /**@name Constructor / Desructor. */ - //@{ - /** Constructor. */ - Journalist(); - - /** Destructor... */ - virtual ~Journalist(); - //@} - - /**@name Author Methods. - * These methods are used by authoring code, or code that wants - * to report some information. - */ - //@{ - /** Method to print a formatted string */ - virtual void Printf(EJournalLevel level, EJournalCategory category, - const char* format, ...) const; - - /** Method to print a long string including indentation. The - * string is printed starting at the current position. If the - * position (counting started at the current position) exceeds - * max_length, a new line is inserted, and indent_spaces many - * spaces are printed before the string is continued. This is - * for example used during the printing of the option - * documentation. */ - virtual void PrintStringOverLines(EJournalLevel level, EJournalCategory category, - Index indent_spaces, Index max_length, - const std::string& line) const; - - /** Method to print a formatted string with indentation */ - virtual void PrintfIndented(EJournalLevel level, - EJournalCategory category, - Index indent_level, - const char* format, ...) const; - - /** Method to print a formatted string - * using the va_list argument. */ - virtual void VPrintf(EJournalLevel level, - EJournalCategory category, - const char* pformat, - va_list ap) const; - - /** Method to print a formatted string with indentation, - * using the va_list argument. */ - virtual void VPrintfIndented(EJournalLevel level, - EJournalCategory category, - Index indent_level, - const char* pformat, - va_list ap) const; - - /** Method that returns true if there is a Journal that would - * write output for the given JournalLevel and JournalCategory. - * This is useful if expensive computation would be required for - * a particular output. The author code can check with this - * method if the computations are indeed required. - */ - virtual bool ProduceOutput(EJournalLevel level, - EJournalCategory category) const; - - - /** Method that flushes the current buffer for all Journalists. - Calling this method after one optimization run helps to avoid - cluttering output with that produced by other parts of the - program (e.g. written in Fortran) */ - virtual void FlushBuffer() const; - //@} - - /**@name Reader Methods. - * These methods are used by the reader. The reader will setup the - * journalist with each output file and the acceptance - * criteria for that file. - * - * Use these methods to setup the journals (files or other output). - * These are the internal objects that keep track of the print levels - * for each category. Then use the internal Journal objects to - * set specific print levels for each category (or keep defaults). - * - */ - //@{ - /** Add a new journal. The location_name is a string identifier, - * which can be used to obtain the pointer to the new Journal at - * a later point using the GetJournal method. - * The default_level is - * used to initialize the * printing level for all categories. - */ - virtual bool AddJournal(const SmartPtr jrnl); - - /** Add a new FileJournal. fname is the name - * of the * file to which this Journal corresponds. Use - * fname="stdout" * for stdout, and use fname="stderr" for - * stderr. This method * returns the Journal pointer so you can - * set specific acceptance criteria. It returns NULL if there - * was a problem creating a new Journal. - */ - virtual SmartPtr AddFileJournal( - const std::string& location_name, /**< journal identifier */ - const std::string& fname, /**< file name */ - EJournalLevel default_level = J_WARNING /**< default journal level */ - ); - - /** Get an existing journal. You can use this method to change - * the acceptance criteria at runtime. - */ - virtual SmartPtr GetJournal(const std::string& location_name); - - /** Delete all journals curently known by the journalist. */ - virtual void DeleteAllJournals(); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - Journalist(const Journalist&); - - /** Overloaded Equals Operator */ - void operator=(const Journalist&); - //@} - - //** Private Data Members. */ - //@{ - std::vector< SmartPtr > journals_; - //@} - }; - - /** Journal class (part of the Journalist implementation.). This - * class is the base class for all Journals. It controls the - * acceptance criteria for print statements etc. Derived classes - * like the FileJournal - output those messages to specific locations - */ - class Journal : public ReferencedObject - { - public: - /** Constructor. */ - Journal(const std::string& name, EJournalLevel default_level); - - /** Destructor. */ - virtual ~Journal(); - - /** Get the name of the Journal */ - virtual std::string Name(); - - /** Set the print level for a particular category. */ - virtual void SetPrintLevel( - EJournalCategory category, EJournalLevel level - ); - - /** Set the print level for all category. */ - virtual void SetAllPrintLevels( - EJournalLevel level - ); - - /**@name Journal Output Methods. These methods are called by the - * Journalist who first checks if the output print level and category - * are acceptable. - * Calling the Print methods explicitly (instead of through the - * Journalist will output the message regardless of print level - * and category. You should use the Journalist to print & flush instead - */ - //@{ - /** Ask if a particular print level/category is accepted by the - * journal. - */ - virtual bool IsAccepted( - EJournalCategory category, EJournalLevel level - ) const; - - /** Print to the designated output location */ - virtual void Print(EJournalCategory category, EJournalLevel level, - const char* str) - { - PrintImpl(category, level, str); - } - - /** Printf to the designated output location */ - virtual void Printf(EJournalCategory category, EJournalLevel level, - const char* pformat, va_list ap) - { - PrintfImpl(category, level, pformat, ap); - } - - /** Flush output buffer.*/ - virtual void FlushBuffer() - { - FlushBufferImpl(); - } - //@} - - protected: - /**@name Implementation version of Print methods. Derived classes - * should overload the Impl methods. - */ - //@{ - /** Print to the designated output location */ - virtual void PrintImpl(EJournalCategory category, EJournalLevel level, - const char* str)=0; - - /** Printf to the designated output location */ - virtual void PrintfImpl(EJournalCategory category, EJournalLevel level, - const char* pformat, va_list ap)=0; - - /** Flush output buffer.*/ - virtual void FlushBufferImpl()=0; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - Journal(); - - /** Copy Constructor */ - Journal(const Journal&); - - /** Overloaded Equals Operator */ - void operator=(const Journal&); - //@} - - /** Name of the output location */ - std::string name_; - - /** vector of integers indicating the level for each category */ - Index print_levels_[J_LAST_CATEGORY]; - }; - - - /** FileJournal class. This is a particular Journal implementation that - * writes to a file for output. It can write to (stdout, stderr, or disk) - * by using "stdout" and "stderr" as filenames. - */ - class FileJournal : public Journal - { - public: - /** Constructor. */ - FileJournal(const std::string& name, EJournalLevel default_level); - - /** Destructor. */ - virtual ~FileJournal(); - - /** Open a new file for the output location. - * Special Names: stdout means stdout, - * : stderr means stderr. - * - * Return code is false only if the file with the given name - * could not be opened. - */ - virtual bool Open(const char* fname); - - protected: - /**@name Implementation version of Print methods - Overloaded from - * Journal base class. - */ - //@{ - /** Print to the designated output location */ - virtual void PrintImpl(EJournalCategory category, EJournalLevel level, - const char* str); - - /** Printf to the designated output location */ - virtual void PrintfImpl(EJournalCategory category, EJournalLevel level, - const char* pformat, va_list ap); - - /** Flush output buffer.*/ - virtual void FlushBufferImpl(); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - FileJournal(); - - /** Copy Constructor */ - FileJournal(const FileJournal&); - - /** Overloaded Equals Operator */ - void operator=(const FileJournal&); - //@} - - /** FILE pointer for the output destination */ - FILE* file_; - }; - - /** StreamJournal class. This is a particular Journal implementation that - * writes to a stream for output. - */ - class StreamJournal : public Journal - { - public: - /** Constructor. */ - StreamJournal(const std::string& name, EJournalLevel default_level); - - /** Destructor. */ - virtual ~StreamJournal() - {} - - /** Setting the output stream pointer */ - void SetOutputStream(std::ostream* os); - - protected: - /**@name Implementation version of Print methods - Overloaded from - * Journal base class. - */ - //@{ - /** Print to the designated output location */ - virtual void PrintImpl(EJournalCategory category, EJournalLevel level, - const char* str); - - /** Printf to the designated output location */ - virtual void PrintfImpl(EJournalCategory category, EJournalLevel level, - const char* pformat, va_list ap); - - /** Flush output buffer.*/ - virtual void FlushBufferImpl(); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - StreamJournal(); - - /** Copy Constructor */ - StreamJournal(const StreamJournal&); - - /** Overloaded Equals Operator */ - void operator=(const StreamJournal&); - //@} - - /** pointer to output stream for the output destination */ - std::ostream* os_; - - /** buffer for sprintf. Being generous in size here... */ - char buffer_[32768]; - }; -} - -#endif diff --git a/thirdparty/linux/include/coin1/IpLapack.hpp b/thirdparty/linux/include/coin1/IpLapack.hpp deleted file mode 100644 index ef8883cc..00000000 --- a/thirdparty/linux/include/coin1/IpLapack.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2005, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpLapack.hpp 2449 2013-12-16 00:25:42Z ghackebeil $ -// -// Authors: Andreas Waechter IBM 2005-12-25 - -#ifndef __IPLAPACK_HPP__ -#define __IPLAPACK_HPP__ - -#include "IpUtils.hpp" -#include "IpException.hpp" - -namespace Ipopt -{ - DECLARE_STD_EXCEPTION(LAPACK_NOT_INCLUDED); - - /** Wrapper for LAPACK subroutine DPOTRS. Solving a linear system - * given a Cholesky factorization. We assume that the Cholesky - * factor is lower traiangular. */ - void IpLapackDpotrs(Index ndim, Index nrhs, const Number *a, Index lda, - Number *b, Index ldb); - - /** Wrapper for LAPACK subroutine DPOTRF. Compute Cholesky - * factorization (lower triangular factor). info is the return - * value from the LAPACK routine. */ - void IpLapackDpotrf(Index ndim, Number *a, Index lda, Index& info); - - /** Wrapper for LAPACK subroutine DSYEV. Compute the Eigenvalue - * decomposition for a given matrix. If compute_eigenvectors is - * true, a will contain the eigenvectors in its columns on - * return. */ - void IpLapackDsyev(bool compute_eigenvectors, Index ndim, Number *a, - Index lda, Number *w, Index& info); - - /** Wrapper for LAPACK subroutine DGETRF. Compute LU factorization. - * info is the return value from the LAPACK routine. */ - void IpLapackDgetrf(Index ndim, Number *a, Index* pivot, Index lda, - Index& info); - - /** Wrapper for LAPACK subroutine DGETRS. Solving a linear system - * given a LU factorization. */ - void IpLapackDgetrs(Index ndim, Index nrhs, const Number *a, Index lda, - Index* ipiv, Number *b, Index ldb); - - /** Wrapper for LAPACK subroutine DPPSV. Solves a symmetric positive - * definite linear system in packed storage format (upper triangular). - * info is the return value from the LAPACK routine. */ - void IpLapackDppsv(Index ndim, Index nrhs, const Number *a, - Number *b, Index ldb, Index& info); - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpLineSearch.hpp b/thirdparty/linux/include/coin1/IpLineSearch.hpp deleted file mode 100644 index 70c11f16..00000000 --- a/thirdparty/linux/include/coin1/IpLineSearch.hpp +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpLineSearch.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPLINESEARCH_HPP__ -#define __IPLINESEARCH_HPP__ - -#include "IpAlgStrategy.hpp" -#include "IpIpoptCalculatedQuantities.hpp" - -namespace Ipopt -{ - - /** Base class for line search objects. - */ - class LineSearch : public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - LineSearch() - {} - - /** Default destructor */ - virtual ~LineSearch() - {} - //@} - - /** Perform the line search. As search direction the delta - * in the data object is used - */ - virtual void FindAcceptableTrialPoint() = 0; - - /** Reset the line search. - * This function should be called if all previous information - * should be discarded when the line search is performed the - * next time. For example, this method should be called after - * the barrier parameter is changed. - */ - virtual void Reset() = 0; - - /** Set flag indicating whether a very rigorous line search should - * be performed. If this flag is set to true, the line search - * algorithm might decide to abort the line search and not to - * accept a new iterate. If the line search decided not to - * accept a new iterate, the return value of - * CheckSkippedLineSearch() is true at the next call. For - * example, in the non-monotone barrier parameter update - * procedure, the filter algorithm should not switch to the - * restoration phase in the free mode; instead, the algorithm - * should swtich to the fixed mode. - */ - virtual void SetRigorousLineSearch(bool rigorous) = 0; - - /** Check if the line search procedure didn't accept a new iterate - * during the last call of FindAcceptableTrialPoint(). - * - */ - virtual bool CheckSkippedLineSearch() = 0; - - /** This method should be called if the optimization process - * requires the line search object to switch to some fallback - * mechanism (like the restoration phase), when the regular - * optimization procedure cannot be continued (for example, - * because the search direction could not be computed). This - * will cause the line search object to immediately proceed with - * this mechanism when FindAcceptableTrialPoint() is call. This - * method returns false if no fallback mechanism is available. */ - virtual bool ActivateFallbackMechanism() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - LineSearch(const LineSearch&); - - /** Overloaded Equals Operator */ - void operator=(const LineSearch&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpMatrix.hpp b/thirdparty/linux/include/coin1/IpMatrix.hpp deleted file mode 100644 index 79018da8..00000000 --- a/thirdparty/linux/include/coin1/IpMatrix.hpp +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpMatrix.hpp 2472 2014-04-05 17:47:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPMATRIX_HPP__ -#define __IPMATRIX_HPP__ - -#include "IpVector.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class MatrixSpace; - - /** Matrix Base Class. This is the base class for all derived matrix - * types. All Matrices, such as Jacobian and Hessian matrices, as - * well as possibly the iteration matrices needed for the step - * computation, are of this type. - * - * Deriving from Matrix: Overload the protected XXX_Impl method. - */ - class Matrix : public TaggedObject - { - public: - /** @name Constructor/Destructor */ - //@{ - /** Constructor. It has to be given a pointer to the - * corresponding MatrixSpace. - */ - Matrix(const MatrixSpace* owner_space) - : - TaggedObject(), - owner_space_(owner_space), - valid_cache_tag_(0) - {} - - /** Destructor */ - virtual ~Matrix() - {} - //@} - - /**@name Operations of the Matrix on a Vector */ - //@{ - /** Matrix-vector multiply. Computes y = alpha * Matrix * x + - * beta * y. Do not overload. Overload MultVectorImpl instead. - */ - void MultVector(Number alpha, const Vector& x, Number beta, - Vector& y) const - { - MultVectorImpl(alpha, x, beta, y); - } - - /** Matrix(transpose) vector multiply. Computes y = alpha * - * Matrix^T * x + beta * y. Do not overload. Overload - * TransMultVectorImpl instead. - */ - void TransMultVector(Number alpha, const Vector& x, Number beta, - Vector& y) const - { - TransMultVectorImpl(alpha, x, beta, y); - } - //@} - - /** @name Methods for specialized operations. A prototype - * implementation is provided, but for efficient implementation - * those should be specially implemented. - */ - //@{ - /** X = X + alpha*(Matrix S^{-1} Z). Should be implemented - * efficiently for the ExansionMatrix - */ - void AddMSinvZ(Number alpha, const Vector& S, const Vector& Z, - Vector& X) const; - - /** X = S^{-1} (r + alpha*Z*M^Td). Should be implemented - * efficiently for the ExansionMatrix - */ - void SinvBlrmZMTdBr(Number alpha, const Vector& S, - const Vector& R, const Vector& Z, - const Vector& D, Vector& X) const; - //@} - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - bool HasValidNumbers() const; - - /** @name Information about the size of the matrix */ - //@{ - /** Number of rows */ - inline - Index NRows() const; - - /** Number of columns */ - inline - Index NCols() const; - //@} - - /** @name Norms of the individual rows and columns */ - //@{ - /** Compute the max-norm of the rows in the matrix. The result is - * stored in rows_norms. The vector is assumed to be initialized - * of init is false. */ - void ComputeRowAMax(Vector& rows_norms, bool init=true) const - { - DBG_ASSERT(NRows() == rows_norms.Dim()); - if (init) rows_norms.Set(0.); - ComputeRowAMaxImpl(rows_norms, init); - } - /** Compute the max-norm of the columns in the matrix. The result - * is stored in cols_norms The vector is assumed to be initialized - * of init is false. */ - void ComputeColAMax(Vector& cols_norms, bool init=true) const - { - DBG_ASSERT(NCols() == cols_norms.Dim()); - if (init) cols_norms.Set(0.); - ComputeColAMaxImpl(cols_norms, init); - } - //@} - - /** Print detailed information about the matrix. Do not overload. - * Overload PrintImpl instead. - */ - //@{ - virtual void Print(SmartPtr jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent=0, - const std::string& prefix="") const; - virtual void Print(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent=0, - const std::string& prefix="") const; - //@} - - /** Return the owner MatrixSpace*/ - inline - SmartPtr OwnerSpace() const; - - protected: - /** @name implementation methods (derived classes MUST - * overload these pure virtual protected methods. - */ - //@{ - /** Matrix-vector multiply. Computes y = alpha * Matrix * x + - * beta * y - */ - virtual void MultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0; - - /** Matrix(transpose) vector multiply. - * Computes y = alpha * Matrix^T * x + beta * y - */ - virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0; - - /** X = X + alpha*(Matrix S^{-1} Z). Prototype for this - * specialize method is provided, but for efficient - * implementation it should be overloaded for the expansion matrix. - */ - virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z, - Vector& X) const; - - /** X = S^{-1} (r + alpha*Z*M^Td). Should be implemented - * efficiently for the ExpansionMatrix. - */ - virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S, - const Vector& R, const Vector& Z, - const Vector& D, Vector& X) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). A default implementation always returning true - * is provided, but if possible it should be implemented. */ - virtual bool HasValidNumbersImpl() const - { - return true; - } - - /** Compute the max-norm of the rows in the matrix. The result is - * stored in rows_norms. The vector is assumed to be - * initialized. */ - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const = 0; - /** Compute the max-norm of the columns in the matrix. The result - * is stored in cols_norms. The vector is assumed to be - * initialized. */ - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const = 0; - - /** Print detailed information about the matrix. */ - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const =0; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** default constructor */ - Matrix(); - - /** Copy constructor */ - Matrix(const Matrix&); - - /** Overloaded Equals Operator */ - Matrix& operator=(const Matrix&); - //@} - - const SmartPtr owner_space_; - - /**@name CachedResults data members */ - //@{ - mutable TaggedObject::Tag valid_cache_tag_; - mutable bool cached_valid_; - //@} - }; - - - /** MatrixSpace base class, corresponding to the Matrix base class. - * For each Matrix implementation, a corresponding MatrixSpace has - * to be implemented. A MatrixSpace is able to create new Matrices - * of a specific type. The MatrixSpace should also store - * information that is common to all Matrices of that type. For - * example, the dimensions of a Matrix is stored in the MatrixSpace - * base class. - */ - class MatrixSpace : public ReferencedObject - { - public: - /** @name Constructors/Destructors */ - //@{ - /** Constructor, given the number rows and columns of all matrices - * generated by this MatrixSpace. - */ - MatrixSpace(Index nRows, Index nCols) - : - nRows_(nRows), - nCols_(nCols) - {} - - /** Destructor */ - virtual ~MatrixSpace() - {} - //@} - - /** Pure virtual method for creating a new Matrix of the - * corresponding type. - */ - virtual Matrix* MakeNew() const=0; - - /** Accessor function for the number of rows. */ - Index NRows() const - { - return nRows_; - } - /** Accessor function for the number of columns. */ - Index NCols() const - { - return nCols_; - } - - /** Method to test if a given matrix belongs to a particular - * matrix space. - */ - bool IsMatrixFromSpace(const Matrix& matrix) const - { - return (matrix.OwnerSpace() == this); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** default constructor */ - MatrixSpace(); - - /** Copy constructor */ - MatrixSpace(const MatrixSpace&); - - /** Overloaded Equals Operator */ - MatrixSpace& operator=(const MatrixSpace&); - //@} - - /** Number of rows for all matrices of this type. */ - const Index nRows_; - /** Number of columns for all matrices of this type. */ - const Index nCols_; - }; - - - /* Inline Methods */ - inline - Index Matrix::NRows() const - { - return owner_space_->NRows(); - } - - inline - Index Matrix::NCols() const - { - return owner_space_->NCols(); - } - - inline - SmartPtr Matrix::OwnerSpace() const - { - return owner_space_; - } - -} // namespace Ipopt - -// Macro definitions for debugging matrices -#if COIN_IPOPT_VERBOSITY == 0 -# define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) -#else -# define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) \ - if (dbg_jrnl.Verbosity() >= (__verbose_level)) { \ - if (dbg_jrnl.Jnlst()!=NULL) { \ - (__mat).Print(dbg_jrnl.Jnlst(), \ - J_ERROR, J_DBG, \ - __mat_name, \ - dbg_jrnl.IndentationLevel()*2, \ - "# "); \ - } \ - } -#endif // #if COIN_IPOPT_VERBOSITY == 0 - -#endif diff --git a/thirdparty/linux/include/coin1/IpMuUpdate.hpp b/thirdparty/linux/include/coin1/IpMuUpdate.hpp deleted file mode 100644 index b6c1d9c1..00000000 --- a/thirdparty/linux/include/coin1/IpMuUpdate.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpMuUpdate.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPMUUPDATE_HPP__ -#define __IPMUUPDATE_HPP__ - -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - /** Abstract Base Class for classes that implement methods for computing - * the barrier and fraction-to-the-boundary rule parameter for the - * current iteration. - */ - class MuUpdate : public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - MuUpdate() - {} - - /** Default destructor */ - virtual ~MuUpdate() - {} - //@} - - /** Initialize method - overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Method for determining the barrier parameter for the next - * iteration. A LineSearch object is passed, so that this method - * can call the Reset method in the LineSearch object, for - * example when then barrier parameter is changed. This method is - * also responsible for setting the fraction-to-the-boundary - * parameter tau. This method returns false if the update could - * not be performed and the algorithm should revert to an - * emergency fallback mechanism. */ - virtual bool UpdateBarrierParameter() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - - /** Copy Constructor */ - MuUpdate(const MuUpdate&); - - /** Overloaded Equals Operator */ - void operator=(const MuUpdate&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpNLP.hpp b/thirdparty/linux/include/coin1/IpNLP.hpp deleted file mode 100644 index 1063c01b..00000000 --- a/thirdparty/linux/include/coin1/IpNLP.hpp +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpNLP.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPNLP_HPP__ -#define __IPNLP_HPP__ - -#include "IpUtils.hpp" -#include "IpVector.hpp" -#include "IpSmartPtr.hpp" -#include "IpMatrix.hpp" -#include "IpSymMatrix.hpp" -#include "IpOptionsList.hpp" -#include "IpAlgTypes.hpp" -#include "IpReturnCodes.hpp" - -namespace Ipopt -{ - // forward declarations - class IpoptData; - class IpoptCalculatedQuantities; - class IteratesVector; - - /** Brief Class Description. - * Detailed Class Description. - */ - class NLP : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor */ - NLP() - {} - - /** Default destructor */ - virtual ~NLP() - {} - //@} - - /** Exceptions */ - //@{ - DECLARE_STD_EXCEPTION(USER_SCALING_NOT_IMPLEMENTED); - DECLARE_STD_EXCEPTION(INVALID_NLP); - //@} - - /** @name NLP Initialization (overload in - * derived classes).*/ - //@{ - /** Overload if you want the chance to process options or parameters that - * may be specific to the NLP */ - virtual bool ProcessOptions(const OptionsList& options, - const std::string& prefix) - { - return true; - } - - /** Method for creating the derived vector / matrix types. The - * Hess_lagrangian_space pointer can be NULL if a quasi-Newton - * options is chosen. */ - virtual bool GetSpaces(SmartPtr& x_space, - SmartPtr& c_space, - SmartPtr& d_space, - SmartPtr& x_l_space, - SmartPtr& px_l_space, - SmartPtr& x_u_space, - SmartPtr& px_u_space, - SmartPtr& d_l_space, - SmartPtr& pd_l_space, - SmartPtr& d_u_space, - SmartPtr& pd_u_space, - SmartPtr& Jac_c_space, - SmartPtr& Jac_d_space, - SmartPtr& Hess_lagrangian_space)=0; - - /** Method for obtaining the bounds information */ - virtual bool GetBoundsInformation(const Matrix& Px_L, - Vector& x_L, - const Matrix& Px_U, - Vector& x_U, - const Matrix& Pd_L, - Vector& d_L, - const Matrix& Pd_U, - Vector& d_U)=0; - - /** Method for obtaining the starting point for all the - * iterates. ToDo it might not make sense to ask for initial - * values for v_L and v_U? */ - virtual bool GetStartingPoint( - SmartPtr x, - bool need_x, - SmartPtr y_c, - bool need_y_c, - SmartPtr y_d, - bool need_y_d, - SmartPtr z_L, - bool need_z_L, - SmartPtr z_U, - bool need_z_U - )=0; - - /** Method for obtaining an entire iterate as a warmstart point. - * The incoming IteratesVector has to be filled. The default - * dummy implementation returns false. */ - virtual bool GetWarmStartIterate(IteratesVector& warm_start_iterate) - { - return false; - } - //@} - - /** @name NLP evaluation routines (overload - * in derived classes. */ - //@{ - virtual bool Eval_f(const Vector& x, Number& f) = 0; - - virtual bool Eval_grad_f(const Vector& x, Vector& g_f) = 0; - - virtual bool Eval_c(const Vector& x, Vector& c) = 0; - - virtual bool Eval_jac_c(const Vector& x, Matrix& jac_c) = 0; - - virtual bool Eval_d(const Vector& x, Vector& d) = 0; - - virtual bool Eval_jac_d(const Vector& x, Matrix& jac_d) = 0; - - virtual bool Eval_h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd, - SymMatrix& h) = 0; - //@} - - /** @name NLP solution routines. Have default dummy - * implementations that can be overloaded. */ - //@{ - /** This method is called at the very end of the optimization. It - * provides the final iterate to the user, so that it can be - * stored as the solution. The status flag indicates the outcome - * of the optimization, where SolverReturn is defined in - * IpAlgTypes.hpp. */ - virtual void FinalizeSolution(SolverReturn status, - const Vector& x, const Vector& z_L, - const Vector& z_U, - const Vector& c, const Vector& d, - const Vector& y_c, const Vector& y_d, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq) - {} - - /** This method is called once per iteration, after the iteration - * summary output has been printed. It provides the current - * information to the user to do with it anything she wants. It - * also allows the user to ask for a premature termination of the - * optimization by returning false, in which case Ipopt will - * terminate with a corresponding return status. The basic - * information provided in the argument list has the quantities - * values printed in the iteration summary line. If more - * information is required, a user can obtain it from the IpData - * and IpCalculatedQuantities objects. However, note that the - * provided quantities are all for the problem that Ipopt sees, - * i.e., the quantities might be scaled, fixed variables might be - * sorted out, etc. The status indicates things like whether the - * algorithm is in the restoration phase... In the restoration - * phase, the dual variables are probably not not changing. */ - virtual bool IntermediateCallBack(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq) - { - return true; - } - //@} - - /** Routines to get the scaling parameters. These do not need to - * be overloaded unless the options are set for User scaling - */ - //@{ - virtual void GetScalingParameters( - const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - Number& obj_scaling, - SmartPtr& x_scaling, - SmartPtr& c_scaling, - SmartPtr& d_scaling) const - { - THROW_EXCEPTION(USER_SCALING_NOT_IMPLEMENTED, - "You have set options for user provided scaling, but have" - " not implemented GetScalingParameters in the NLP interface"); - } - //@} - - /** Method for obtaining the subspace in which the limited-memory - * Hessian approximation should be done. This is only called if - * the limited-memory Hessian approximation is chosen. Since the - * Hessian is zero in the space of all variables that appear in - * the problem functions only linearly, this allows the user to - * provide a VectorSpace for all nonlinear variables, and an - * ExpansionMatrix to lift from this VectorSpace to the - * VectorSpace of the primal variables x. If the returned values - * are NULL, it is assumed that the Hessian is to be approximated - * in the space of all x variables. The default instantiation of - * this method returns NULL, and a user only has to overwrite - * this method if the approximation is to be done only in a - * subspace. */ - virtual void - GetQuasiNewtonApproximationSpaces(SmartPtr& approx_space, - SmartPtr& P_approx) - { - approx_space = NULL; - P_approx = NULL; - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - NLP(const NLP&); - - /** Overloaded Equals Operator */ - void operator=(const NLP&); - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpNLPScaling.hpp b/thirdparty/linux/include/coin1/IpNLPScaling.hpp deleted file mode 100644 index be5f13d4..00000000 --- a/thirdparty/linux/include/coin1/IpNLPScaling.hpp +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright (C) 2004, 2007 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpNLPScaling.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPNLPSCALING_HPP__ -#define __IPNLPSCALING_HPP__ - -#include "IpOptionsList.hpp" -#include "IpRegOptions.hpp" - -namespace Ipopt -{ - // forward declarations - class Vector; - class VectorSpace; - class Matrix; - class MatrixSpace; - class SymMatrix; - class SymMatrixSpace; - class ScaledMatrixSpace; - class SymScaledMatrixSpace; - - /** This is the abstract base class for problem scaling. - * It is repsonsible for determining the scaling factors - * and mapping quantities in and out of scaled and unscaled - * versions - */ - class NLPScalingObject : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - NLPScalingObject(); - - /** Default destructor */ - virtual ~NLPScalingObject(); - //@} - - /** Method to initialize the options */ - bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) - { - jnlst_ = &jnlst; - return InitializeImpl(options, prefix); - } - - /** Methods to map scaled and unscaled matrices */ - //@{ - /** Returns an obj-scaled version of the given scalar */ - virtual Number apply_obj_scaling(const Number& f)=0; - /** Returns an obj-unscaled version of the given scalar */ - virtual Number unapply_obj_scaling(const Number& f)=0; - /** Returns an x-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_x_NonConst(const SmartPtr& v)=0; - /** Returns an x-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_x(const SmartPtr& v)=0; - /** Returns an x-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_x_NonConst(const SmartPtr& v)=0; - /** Returns an x-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_x(const SmartPtr& v)=0; - /** Returns an c-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_c(const SmartPtr& v)=0; - /** Returns an c-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_c(const SmartPtr& v)=0; - /** Returns an c-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_c_NonConst(const SmartPtr& v)=0; - /** Returns an c-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_c_NonConst(const SmartPtr& v)=0; - /** Returns an d-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_d(const SmartPtr& v)=0; - /** Returns an d-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_d(const SmartPtr& v)=0; - /** Returns an d-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_d_NonConst(const SmartPtr& v)=0; - /** Returns an d-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_d_NonConst(const SmartPtr& v)=0; - /** Returns a scaled version of the jacobian for c. If the - * overloaded method does not make a new matrix, make sure to set - * the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_jac_c_scaling(SmartPtr matrix)=0; - /** Returns a scaled version of the jacobian for d If the - * overloaded method does not create a new matrix, make sure to - * set the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_jac_d_scaling(SmartPtr matrix)=0; - /** Returns a scaled version of the hessian of the lagrangian If - * the overloaded method does not create a new matrix, make sure - * to set the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_hessian_scaling(SmartPtr matrix)=0; - //@} - - /** Methods for scaling bounds - these wrap those above */ - //@{ - /** Returns an x-scaled vector in the x_L or x_U space */ - SmartPtr apply_vector_scaling_x_LU_NonConst( - const Matrix& Px_LU, - const SmartPtr& lu, - const VectorSpace& x_space); - /** Returns an x-scaled vector in the x_L or x_U space */ - SmartPtr apply_vector_scaling_x_LU( - const Matrix& Px_LU, - const SmartPtr& lu, - const VectorSpace& x_space); - /** Returns an d-scaled vector in the d_L or d_U space */ - SmartPtr apply_vector_scaling_d_LU_NonConst( - const Matrix& Pd_LU, - const SmartPtr& lu, - const VectorSpace& d_space); - /** Returns an d-scaled vector in the d_L or d_U space */ - SmartPtr apply_vector_scaling_d_LU( - const Matrix& Pd_LU, - const SmartPtr& lu, - const VectorSpace& d_space); - /** Returns an d-unscaled vector in the d_L or d_U space */ - SmartPtr unapply_vector_scaling_d_LU_NonConst( - const Matrix& Pd_LU, - const SmartPtr& lu, - const VectorSpace& d_space); - /** Returns an d-unscaled vector in the d_L or d_U space */ - SmartPtr unapply_vector_scaling_d_LU( - const Matrix& Pd_LU, - const SmartPtr& lu, - const VectorSpace& d_space); - //@} - - /** Methods for scaling the gradient of the objective - wraps the - * virtual methods above - */ - //@{ - /** Returns a grad_f scaled version (d_f * D_x^{-1}) of the given vector */ - virtual SmartPtr - apply_grad_obj_scaling_NonConst(const SmartPtr& v); - /** Returns a grad_f scaled version (d_f * D_x^{-1}) of the given vector */ - virtual SmartPtr - apply_grad_obj_scaling(const SmartPtr& v); - /** Returns a grad_f unscaled version (d_f * D_x^{-1}) of the - * given vector */ - virtual SmartPtr - unapply_grad_obj_scaling_NonConst(const SmartPtr& v); - /** Returns a grad_f unscaled version (d_f * D_x^{-1}) of the - * given vector */ - virtual SmartPtr - unapply_grad_obj_scaling(const SmartPtr& v); - //@} - - /** @name Methods for determining whether scaling for entities is - * done */ - //@{ - /** Returns true if the primal x variables are scaled. */ - virtual bool have_x_scaling()=0; - /** Returns true if the equality constraints are scaled. */ - virtual bool have_c_scaling()=0; - /** Returns true if the inequality constraints are scaled. */ - virtual bool have_d_scaling()=0; - //@} - - /** This method is called by the IpoptNLP's at a convenient time to - * compute and/or read scaling factors - */ - virtual void DetermineScaling(const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - const SmartPtr jac_c_space, - const SmartPtr jac_d_space, - const SmartPtr h_space, - SmartPtr& new_jac_c_space, - SmartPtr& new_jac_d_space, - SmartPtr& new_h_space, - const Matrix& Px_L, const Vector& x_L, - const Matrix& Px_U, const Vector& x_U)=0; - protected: - /** Implementation of the initialization method that has to be - * overloaded by for each derived class. */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix)=0; - - /** Accessor method for the journalist */ - const Journalist& Jnlst() const - { - return *jnlst_; - } - private: - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - - /** Copy Constructor */ - NLPScalingObject(const NLPScalingObject&); - - /** Overloaded Equals Operator */ - void operator=(const NLPScalingObject&); - //@} - - SmartPtr jnlst_; - }; - - /** This is a base class for many standard scaling - * techniques. The overloaded classes only need to - * provide the scaling parameters - */ - class StandardScalingBase : public NLPScalingObject - { - public: - /**@name Constructors/Destructors */ - //@{ - StandardScalingBase(); - - /** Default destructor */ - virtual ~StandardScalingBase(); - //@} - - /** Methods to map scaled and unscaled matrices */ - //@{ - /** Returns an obj-scaled version of the given scalar */ - virtual Number apply_obj_scaling(const Number& f); - /** Returns an obj-unscaled version of the given scalar */ - virtual Number unapply_obj_scaling(const Number& f); - /** Returns an x-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_x_NonConst(const SmartPtr& v); - /** Returns an x-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_x(const SmartPtr& v); - /** Returns an x-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_x_NonConst(const SmartPtr& v); - /** Returns an x-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_x(const SmartPtr& v); - /** Returns an c-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_c(const SmartPtr& v); - /** Returns an c-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_c(const SmartPtr& v); - /** Returns an c-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_c_NonConst(const SmartPtr& v); - /** Returns an c-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_c_NonConst(const SmartPtr& v); - /** Returns an d-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_d(const SmartPtr& v); - /** Returns an d-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_d(const SmartPtr& v); - /** Returns an d-scaled version of the given vector */ - virtual SmartPtr - apply_vector_scaling_d_NonConst(const SmartPtr& v); - /** Returns an d-unscaled version of the given vector */ - virtual SmartPtr - unapply_vector_scaling_d_NonConst(const SmartPtr& v); - /** Returns a scaled version of the jacobian for c. If the - * overloaded method does not make a new matrix, make sure to set - * the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_jac_c_scaling(SmartPtr matrix); - /** Returns a scaled version of the jacobian for d If the - * overloaded method does not create a new matrix, make sure to - * set the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_jac_d_scaling(SmartPtr matrix); - /** Returns a scaled version of the hessian of the lagrangian If - * the overloaded method does not create a new matrix, make sure - * to set the matrix ptr passed in to NULL. - */ - virtual SmartPtr - apply_hessian_scaling(SmartPtr matrix); - //@} - - /** @name Methods for determining whether scaling for entities is - * done */ - //@{ - virtual bool have_x_scaling(); - virtual bool have_c_scaling(); - virtual bool have_d_scaling(); - //@} - - /** This method is called by the IpoptNLP's at a convenient time to - * compute and/or read scaling factors - */ - virtual void DetermineScaling(const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - const SmartPtr jac_c_space, - const SmartPtr jac_d_space, - const SmartPtr h_space, - SmartPtr& new_jac_c_space, - SmartPtr& new_jac_d_space, - SmartPtr& new_h_space, - const Matrix& Px_L, const Vector& x_L, - const Matrix& Px_U, const Vector& x_U); - - /** Methods for IpoptType */ - //@{ - static void RegisterOptions(SmartPtr roptions); - //@} - - protected: - /** Overloaded initialization method */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix); - - /** This is the method that has to be overloaded by a particular - * scaling method that somehow computes the scaling vectors dx, - * dc, and dd. The pointers to those vectors can be NULL, in - * which case no scaling for that item will be done later. */ - virtual void DetermineScalingParametersImpl( - const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - const SmartPtr jac_c_space, - const SmartPtr jac_d_space, - const SmartPtr h_space, - const Matrix& Px_L, const Vector& x_L, - const Matrix& Px_U, const Vector& x_U, - Number& df, - SmartPtr& dx, - SmartPtr& dc, - SmartPtr& dd)=0; - - private: - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - - /** Copy Constructor */ - StandardScalingBase(const StandardScalingBase&); - - /** Overloaded Equals Operator */ - void operator=(const StandardScalingBase&); - //@} - - /** Scaling parameters - we only need to keep copies of - * the objective scaling and the x scaling - the others we can - * get from the scaled matrix spaces. - */ - //@{ - /** objective scaling parameter */ - Number df_; - /** x scaling */ - SmartPtr dx_; - //@} - - /** Scaled Matrix Spaces */ - //@{ - /** Scaled jacobian of c space */ - SmartPtr scaled_jac_c_space_; - /** Scaled jacobian of d space */ - SmartPtr scaled_jac_d_space_; - /** Scaled hessian of lagrangian spacea */ - SmartPtr scaled_h_space_; - //@} - - /** @name Algorithmic parameters */ - //@{ - /** Additional scaling value for the objective function */ - Number obj_scaling_factor_; - //@} - }; - - /** Class implementing the scaling object that doesn't to any scaling */ - class NoNLPScalingObject : public StandardScalingBase - { - public: - /**@name Constructors/Destructors */ - //@{ - NoNLPScalingObject() - {} - - /** Default destructor */ - virtual ~NoNLPScalingObject() - {} - //@} - - - protected: - /** Overloaded from StandardScalingBase */ - virtual void DetermineScalingParametersImpl( - const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - const SmartPtr jac_c_space, - const SmartPtr jac_d_space, - const SmartPtr h_space, - const Matrix& Px_L, const Vector& x_L, - const Matrix& Px_U, const Vector& x_U, - Number& df, - SmartPtr& dx, - SmartPtr& dc, - SmartPtr& dd); - - private: - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - - /** Copy Constructor */ - NoNLPScalingObject(const NoNLPScalingObject&); - - /** Overloaded Equals Operator */ - void operator=(const NoNLPScalingObject&); - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpObserver.hpp b/thirdparty/linux/include/coin1/IpObserver.hpp deleted file mode 100644 index b16f5994..00000000 --- a/thirdparty/linux/include/coin1/IpObserver.hpp +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpObserver.hpp 2161 2013-01-01 20:39:05Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPOBSERVER_HPP__ -#define __IPOBSERVER_HPP__ - -#include "IpUtils.hpp" -#include -#include - -//#define IP_DEBUG_OBSERVER -#if COIN_IPOPT_CHECKLEVEL > 2 -# define IP_DEBUG_OBSERVER -#endif -#ifdef IP_DEBUG_OBSERVER -# include "IpDebug.hpp" -#endif - -namespace Ipopt -{ - /** Forward declarations */ - class Subject; - - /** Slight Variation of the Observer Design Pattern. - * This class implements the Observer class of the - * Observer Design Pattern. An Observer "Attach"es - * to a Subject, indicating that it would like to - * be notified of changes in the Subject. - * Any derived class wishing to recieve notifications - * from a Subject should inherit off of - * Observer and overload the protected method, - * RecieveNotification_(...). - */ - class Observer - { - public: -#ifdef IP_DEBUG_OBSERVER - - static const Index dbg_verbosity; -#endif - - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - Observer() - {} - - /** Default destructor */ - inline - virtual ~Observer(); - //@} - - /** Enumeration specifying the type of notification */ - enum NotifyType - { - NT_All, - NT_BeingDestroyed, - NT_Changed - }; - - protected: - /** Derived classes should call this method - * to request an "Attach" to a Subject. Do - * not call "Attach" explicitly on the Subject - * since further processing is done here - */ - inline - void RequestAttach(NotifyType notify_type, const Subject* subject); - - /** Derived classes should call this method - * to request a "Detach" to a Subject. Do - * not call "Detach" explicitly on the Subject - * since further processing is done here - */ - inline - void RequestDetach(NotifyType notify_type, const Subject* subject); - - /** Derived classes should overload this method to - * recieve the requested notification from - * attached Subjects - */ - virtual void RecieveNotification(NotifyType notify_type, const Subject* subject)=0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - Observer(const Observer&); - - /** Overloaded Equals Operator */ - void operator=(const Observer&); - //@} - - /** A list of the subjects currently being - * observed. */ - std::vector subjects_; - - /** Private Method for Recieving Notification - * should only be called by the friend class - * Subject. This method will, in turn, call - * the overloaded RecieveNotification method - * for the derived class to process. - */ - inline - void ProcessNotification(NotifyType notify_type, const Subject* subject); - - friend class Subject; - }; - - /** Slight Variation of the Observer Design Pattern (Subject part). - * This class implements the Subject class of the Observer Design - * Pattern. An Observer "Attach"es to a Subject, indicating that it - * would like to be notified of changes in the Subject. Any - * derived class that is to be observed has to inherit off the - * Subject base class. If the subject needs to notify the - * Observer, it calls the Notify method. - */ - class Subject - { - public: -#ifdef IP_DEBUG_OBSERVER - - static const Index dbg_verbosity; -#endif - - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - Subject() - {} - - /** Default destructor */ - inline - virtual ~Subject(); - //@} - - /**@name Methods to Add and Remove Observers. - * Currently, the notify_type flags are not used, - * and Observers are attached in general and will - * recieve all notifications (of the type requested - * and possibly of types not requested). It is - * up to the observer to ignore the types they - * are not interested in. The NotifyType in the - * parameter list is so a more efficient mechanism - * depending on type could be implemented later if - * necessary.*/ - //@{ - - /** Attach the specified observer - * (i.e., begin recieving notifications). */ - inline - void AttachObserver(Observer::NotifyType notify_type, Observer* observer) const; - - /** Detach the specified observer - * (i.e., no longer recieve notifications). */ - inline - void DetachObserver(Observer::NotifyType notify_type, Observer* observer) const; - //@} - - protected: - - inline - void Notify(Observer::NotifyType notify_type) const; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - Subject(const Subject&); - - /** Overloaded Equals Operator */ - void operator=(const Subject&); - //@} - - mutable std::vector observers_; - - }; - - /* inline methods */ - inline - Observer::~Observer() - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Observer::~Observer", dbg_verbosity); - if (DBG_VERBOSITY()>=1) { - for (Index i=0; i<(Index)subjects_.size(); i++) { - DBG_PRINT((1,"subjects_[%d] = 0x%x\n", i, subjects_[i])); - } - } -#endif - // Detach all subjects - for (Int i=(Int)(subjects_.size()-1); i>=0; i--) { -#ifdef IP_DEBUG_OBSERVER - DBG_PRINT((1,"About to detach subjects_[%d] = 0x%x\n", i, subjects_[i])); -#endif - - RequestDetach(NT_All, subjects_[i]); - } - } - - inline - void Observer::RequestAttach(NotifyType notify_type, const Subject* subject) - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Observer::RequestAttach", dbg_verbosity); - - // Add the subject to the list if it does not already exist - std::vector::iterator attached_subject; - attached_subject = std::find(subjects_.begin(), subjects_.end(), subject); - DBG_ASSERT(attached_subject == subjects_.end()); - DBG_ASSERT(subject); -#endif - - // add the subject to the list - subjects_.push_back(subject); - // Attach the observer to the subject - subject->AttachObserver(notify_type, this); - } - - inline - void Observer::RequestDetach(NotifyType notify_type, const Subject* subject) - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Observer::RequestDetach", dbg_verbosity); - DBG_PRINT((1, "Requesting detach of subject: 0x%x\n", subject)); - DBG_ASSERT(subject); -#endif - - if (subject) { - std::vector::iterator attached_subject; - attached_subject = std::find(subjects_.begin(), subjects_.end(), subject); -#ifdef IP_DEBUG_OBSERVER - - DBG_ASSERT(attached_subject != subjects_.end()); -#endif - - if (attached_subject != subjects_.end()) { -#ifdef IP_DEBUG_OBSERVER - DBG_PRINT((1, "Removing subject: 0x%x from the list\n", subject)); -#endif - - subjects_.erase(attached_subject); - } - - // Detach the observer from the subject - subject->DetachObserver(notify_type, this); - } - } - - inline - void Observer::ProcessNotification(NotifyType notify_type, const Subject* subject) - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Observer::ProcessNotification", dbg_verbosity); - DBG_ASSERT(subject); -#endif - - if (subject) { - std::vector::iterator attached_subject; - attached_subject = std::find(subjects_.begin(), subjects_.end(), subject); - - // We must be processing a notification for a - // subject that was previously attached. -#ifdef IP_DEBUG_OBSERVER - - DBG_ASSERT(attached_subject != subjects_.end()); -#endif - - this->RecieveNotification(notify_type, subject); - - if (notify_type == NT_BeingDestroyed) { - // the subject is going away, remove it from our list - subjects_.erase(attached_subject); - } - } - } - - inline - Subject::~Subject() - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Subject::~Subject", dbg_verbosity); -#endif - - std::vector::iterator iter; - for (iter = observers_.begin(); iter != observers_.end(); iter++) { - (*iter)->ProcessNotification(Observer::NT_BeingDestroyed, this); - } - } - - inline - void Subject::AttachObserver(Observer::NotifyType notify_type, Observer* observer) const - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Subject::AttachObserver", dbg_verbosity); - // current implementation notifies all observers of everything - // they must filter the notifications that they are not interested - // in (i.e. a hub, not a router) - DBG_ASSERT(observer); - - std::vector::iterator attached_observer; - attached_observer = std::find(observers_.begin(), observers_.end(), observer); - DBG_ASSERT(attached_observer == observers_.end()); - - DBG_ASSERT(observer); -#endif - - observers_.push_back(observer); - } - - inline - void Subject::DetachObserver(Observer::NotifyType notify_type, Observer* observer) const - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Subject::DetachObserver", dbg_verbosity); - DBG_ASSERT(observer); -#endif - - if (observer) { - std::vector::iterator attached_observer; - attached_observer = std::find(observers_.begin(), observers_.end(), observer); -#ifdef IP_DEBUG_OBSERVER - - DBG_ASSERT(attached_observer != observers_.end()); -#endif - - if (attached_observer != observers_.end()) { - observers_.erase(attached_observer); - } - } - } - - inline - void Subject::Notify(Observer::NotifyType notify_type) const - { -#ifdef IP_DEBUG_OBSERVER - DBG_START_METH("Subject::Notify", dbg_verbosity); -#endif - - std::vector::iterator iter; - for (iter = observers_.begin(); iter != observers_.end(); iter++) { - (*iter)->ProcessNotification(notify_type, this); - } - } - - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpOptionsList.hpp b/thirdparty/linux/include/coin1/IpOptionsList.hpp deleted file mode 100644 index a17863f7..00000000 --- a/thirdparty/linux/include/coin1/IpOptionsList.hpp +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpOptionsList.hpp 2613 2015-11-04 14:42:02Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPOPTLIST_HPP__ -#define __IPOPTLIST_HPP__ - -#include "IpUtils.hpp" -#include "IpReferenced.hpp" -#include "IpException.hpp" -#include "IpRegOptions.hpp" - -#include -#include - -namespace Ipopt -{ - /** Exception that can be used to indicate errors with options */ - DECLARE_STD_EXCEPTION(OPTION_INVALID); - - /** This class stores a list of user set options. Each options is - * identified by a case-insensitive keyword (tag). Its value is - * stored internally as a string (always lower case), but for - * convenience set and get methods are provided to obtain Index and - * Number type values. For each keyword we also keep track of how - * often the value of an option has been requested by a get method. - */ - class OptionsList : public ReferencedObject - { - /** Class for storing the value and counter for each option in - * OptionsList. */ - class OptionValue - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor (needed for the map) */ - OptionValue() - : - initialized_(false) - {} - - /** Constructor given the value */ - OptionValue(std::string value, bool allow_clobber, bool dont_print) - : - value_(value), - counter_(0), - initialized_(true), - allow_clobber_(allow_clobber), - dont_print_(dont_print) - {} - - /** Copy Constructor */ - OptionValue(const OptionValue& copy) - : - value_(copy.value_), - counter_(copy.counter_), - initialized_(copy.initialized_), - allow_clobber_(copy.allow_clobber_), - dont_print_(copy.dont_print_) - {} - - /** Equals operator */ - void operator=(const OptionValue& copy) - { - value_=copy.value_; - counter_=copy.counter_; - initialized_=copy.initialized_; - allow_clobber_=copy.allow_clobber_; - dont_print_=copy.dont_print_; - } - - /** Default Destructor */ - ~OptionValue() - {} - //@} - - /** Method for retrieving the value of an option. Calling this - * method will increase the counter by one. */ - std::string GetValue() const - { - DBG_ASSERT(initialized_); - counter_++; - return value_; - } - - /** Method for retrieving the value without increasing the - * counter */ - std::string Value() const - { - DBG_ASSERT(initialized_); - return value_; - } - - /** Method for accessing current value of the request counter */ - Index Counter() const - { - DBG_ASSERT(initialized_); - return counter_; - } - - /** True if the option can be overwritten */ - bool AllowClobber() const - { - DBG_ASSERT(initialized_); - return allow_clobber_; - } - - /** True if this option is not to show up in the - * print_user_options output */ - bool DontPrint() const - { - DBG_ASSERT(initialized_); - return dont_print_; - } - - private: - /** Value for this option */ - std::string value_; - - /** Counter for requests */ - mutable Index counter_; - - /** for debugging */ - bool initialized_; - - /** True if the option can be overwritten */ - bool allow_clobber_; - - /** True if this option is not to show up in the - * print_user_options output */ - bool dont_print_; - }; - - public: - /**@name Constructors/Destructors */ - //@{ - OptionsList(SmartPtr reg_options, SmartPtr jnlst) - : reg_options_(reg_options), jnlst_(jnlst) - {} - - OptionsList() - {} - - /** Copy Constructor */ - OptionsList(const OptionsList& copy) - { - // copy all the option strings and values - options_ = copy.options_; - // copy the registered options pointer - reg_options_ = copy.reg_options_; - } - - /** Default destructor */ - virtual ~OptionsList() - {} - - /** Overloaded Equals Operator */ - virtual void operator=(const OptionsList& source) - { - options_ = source.options_; - reg_options_ = source.reg_options_; - jnlst_ = source.jnlst_; - } - //@} - - /** Method for clearing all previously set options */ - virtual void clear() - { - options_.clear(); - } - - /** @name Get / Set Methods */ - //@{ - virtual void SetRegisteredOptions(const SmartPtr reg_options) - { - reg_options_ = reg_options; - } - virtual void SetJournalist(const SmartPtr jnlst) - { - jnlst_ = jnlst; - } - //@} - /** @name Methods for setting options */ - //@{ - virtual bool SetStringValue(const std::string& tag, const std::string& value, - bool allow_clobber = true, bool dont_print = false); - virtual bool SetNumericValue(const std::string& tag, Number value, - bool allow_clobber = true, bool dont_print = false); - virtual bool SetIntegerValue(const std::string& tag, Index value, - bool allow_clobber = true, bool dont_print = false); - //@} - - /** @name Methods for setting options only if they have not been - * set before*/ - //@{ - virtual bool SetStringValueIfUnset(const std::string& tag, const std::string& value, - bool allow_clobber = true, bool dont_print = false); - virtual bool SetNumericValueIfUnset(const std::string& tag, Number value, - bool allow_clobber = true, bool dont_print = false); - virtual bool SetIntegerValueIfUnset(const std::string& tag, Index value, - bool allow_clobber = true, bool dont_print = false); - //@} - - /** @name Methods for retrieving values from the options list. If - * a tag is not found, the methods return false, and value is set - * to the default value defined in the registered options. */ - //@{ - virtual bool GetStringValue(const std::string& tag, std::string& value, - const std::string& prefix) const; - virtual bool GetEnumValue(const std::string& tag, Index& value, - const std::string& prefix) const; - virtual bool GetBoolValue(const std::string& tag, bool& value, - const std::string& prefix) const; - virtual bool GetNumericValue(const std::string& tag, Number& value, - const std::string& prefix) const; - virtual bool GetIntegerValue(const std::string& tag, Index& value, - const std::string& prefix) const; - //@} - - /** Get a string with the list of all options (tag, value, counter) */ - virtual void PrintList(std::string& list) const; - - /** Get a string with the list of all options set by the user - * (tag, value, use/notused). Here, options with dont_print flag - * set to true are not printed. */ - virtual void PrintUserOptions(std::string& list) const; - - /** Read options from the stream is. Returns false if - * an error was encountered. */ - virtual bool ReadFromStream(const Journalist& jnlst, std::istream& is, bool allow_clobber = false); - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - // OptionsList(); - - //@} - - /** map for storing the options */ - std::map< std::string, OptionValue > options_; - - /** list of all the registered options to validate against */ - SmartPtr reg_options_; - - /** Journalist for writing error messages, etc. */ - SmartPtr jnlst_; - - /** auxilliary method for converting sting to all lower-case - * letters */ - const std::string& lowercase(const std::string tag) const; - - /** auxilliary method for finding the value for a tag in the - * options list. This method first looks for the concatenated - * string prefix+tag (if prefix is not ""), and if this is not - * found, it looks for tag. The return value is true iff - * prefix+tag or tag is found. In that case, the corresponding - * string value is copied into value. */ - bool find_tag(const std::string& tag, const std::string& prefix, - std::string& value) const; - - /** tells whether or not we can clobber a particular option. - * returns true if the option does not already exist, or if - * the option exists but is set to allow_clobber - */ - bool will_allow_clobber(const std::string& tag) const; - - /** read the next token from stream is. Returns false, if EOF was - * reached before a tokens was ecountered. */ - bool readnexttoken(std::istream& is, std::string& token); - - /** auxilliary string set by lowercase method */ - mutable std::string lowercase_buffer_; - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpOrigIpoptNLP.hpp b/thirdparty/linux/include/coin1/IpOrigIpoptNLP.hpp deleted file mode 100644 index 41b10fa2..00000000 --- a/thirdparty/linux/include/coin1/IpOrigIpoptNLP.hpp +++ /dev/null @@ -1,488 +0,0 @@ -// Copyright (C) 2004, 2010 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpOrigIpoptNLP.hpp 2594 2015-08-09 14:31:05Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPORIGIPOPTNLP_HPP__ -#define __IPORIGIPOPTNLP_HPP__ - -#include "IpIpoptNLP.hpp" -#include "IpException.hpp" -#include "IpTimingStatistics.hpp" - -namespace Ipopt -{ - - /** enumeration for the Hessian information type. */ - enum HessianApproximationType { - EXACT=0, - LIMITED_MEMORY - }; - - /** enumeration for the Hessian approximation space. */ - enum HessianApproximationSpace { - NONLINEAR_VARS=0, - ALL_VARS - }; - - /** This class maps the traditional NLP into - * something that is more useful by Ipopt. - * This class takes care of storing the - * calculated model results, handles caching, - * and (some day) takes care of addition of slacks. - */ - class OrigIpoptNLP : public IpoptNLP - { - public: - /**@name Constructors/Destructors */ - //@{ - OrigIpoptNLP(const SmartPtr& jnlst, - const SmartPtr& nlp, - const SmartPtr& nlp_scaling); - - /** Default destructor */ - virtual ~OrigIpoptNLP(); - //@} - - /** Initialize - overloaded from IpoptNLP */ - virtual bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** Initialize (create) structures for - * the iteration data */ - virtual bool InitializeStructures(SmartPtr& x, - bool init_x, - SmartPtr& y_c, - bool init_y_c, - SmartPtr& y_d, - bool init_y_d, - SmartPtr& z_L, - bool init_z_L, - SmartPtr& z_U, - bool init_z_U, - SmartPtr& v_L, - SmartPtr& v_U - ); - - /** Method accessing the GetWarmStartIterate of the NLP */ - virtual bool GetWarmStartIterate(IteratesVector& warm_start_iterate) - { - return nlp_->GetWarmStartIterate(warm_start_iterate); - } - /** Accessor methods for model data */ - //@{ - /** Objective value */ - virtual Number f(const Vector& x); - - /** Objective value (depending in mu) - incorrect version for - * OrigIpoptNLP */ - virtual Number f(const Vector& x, Number mu); - - /** Gradient of the objective */ - virtual SmartPtr grad_f(const Vector& x); - - /** Gradient of the objective (depending in mu) - incorrect - * version for OrigIpoptNLP */ - virtual SmartPtr grad_f(const Vector& x, Number mu); - - /** Equality constraint residual */ - virtual SmartPtr c(const Vector& x); - - /** Jacobian Matrix for equality constraints */ - virtual SmartPtr jac_c(const Vector& x); - - /** Inequality constraint residual (reformulated - * as equalities with slacks */ - virtual SmartPtr d(const Vector& x); - - /** Jacobian Matrix for inequality constraints*/ - virtual SmartPtr jac_d(const Vector& x); - - /** Hessian of the Lagrangian */ - virtual SmartPtr h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd - ); - - /** Hessian of the Lagrangian (depending in mu) - incorrect - * version for OrigIpoptNLP */ - virtual SmartPtr h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd, - Number mu); - - /** Provides a Hessian matrix from the correct matrix space with - * uninitialized values. This can be used in LeastSquareMults to - * obtain a "zero Hessian". */ - virtual SmartPtr uninitialized_h(); - - /** Lower bounds on x */ - virtual SmartPtr x_L() const - { - return x_L_; - } - - /** Permutation matrix (x_L_ -> x) */ - virtual SmartPtr Px_L() const - { - return Px_L_; - } - - /** Upper bounds on x */ - virtual SmartPtr x_U() const - { - return x_U_; - } - - /** Permutation matrix (x_U_ -> x */ - virtual SmartPtr Px_U() const - { - return Px_U_; - } - - /** Lower bounds on d */ - virtual SmartPtr d_L() const - { - return d_L_; - } - - /** Permutation matrix (d_L_ -> d) */ - virtual SmartPtr Pd_L() const - { - return Pd_L_; - } - - /** Upper bounds on d */ - virtual SmartPtr d_U() const - { - return d_U_; - } - - /** Permutation matrix (d_U_ -> d */ - virtual SmartPtr Pd_U() const - { - return Pd_U_; - } - - virtual SmartPtr HessianMatrixSpace() const - { - return h_space_; - } - - virtual SmartPtr x_space() const - { - return x_space_; - } - //@} - - /** Accessor method for vector/matrix spaces pointers */ - virtual void GetSpaces(SmartPtr& x_space, - SmartPtr& c_space, - SmartPtr& d_space, - SmartPtr& x_l_space, - SmartPtr& px_l_space, - SmartPtr& x_u_space, - SmartPtr& px_u_space, - SmartPtr& d_l_space, - SmartPtr& pd_l_space, - SmartPtr& d_u_space, - SmartPtr& pd_u_space, - SmartPtr& Jac_c_space, - SmartPtr& Jac_d_space, - SmartPtr& Hess_lagrangian_space); - - /** Method for adapting the variable bounds. This is called if - * slacks are becoming too small */ - virtual void AdjustVariableBounds(const Vector& new_x_L, - const Vector& new_x_U, - const Vector& new_d_L, - const Vector& new_d_U); - - /** @name Counters for the number of function evaluations. */ - //@{ - virtual Index f_evals() const - { - return f_evals_; - } - virtual Index grad_f_evals() const - { - return grad_f_evals_; - } - virtual Index c_evals() const - { - return c_evals_; - } - virtual Index jac_c_evals() const - { - return jac_c_evals_; - } - virtual Index d_evals() const - { - return d_evals_; - } - virtual Index jac_d_evals() const - { - return jac_d_evals_; - } - virtual Index h_evals() const - { - return h_evals_; - } - //@} - - /** Solution Routines - overloaded from IpoptNLP*/ - //@{ - void FinalizeSolution(SolverReturn status, - const Vector& x, const Vector& z_L, const Vector& z_U, - const Vector& c, const Vector& d, - const Vector& y_c, const Vector& y_d, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq); - bool IntermediateCallBack(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - SmartPtr ip_data, - SmartPtr ip_cq); - //@} - - /** @name Methods for IpoptType */ - //@{ - /** Called by IpoptType to register the options */ - static void RegisterOptions(SmartPtr roptions); - //@} - - /** Accessor method to the underlying NLP */ - SmartPtr nlp() - { - return nlp_; - } - - /**@name Methods related to function evaluation timing. */ - //@{ - - /** Reset the timing statistics */ - void ResetTimes(); - - void PrintTimingStatistics(Journalist& jnlst, - EJournalLevel level, - EJournalCategory category) const; - - const TimedTask& f_eval_time() const - { - return f_eval_time_; - } - const TimedTask& grad_f_eval_time() const - { - return grad_f_eval_time_; - } - const TimedTask& c_eval_time() const - { - return c_eval_time_; - } - const TimedTask& jac_c_eval_time() const - { - return jac_c_eval_time_; - } - const TimedTask& d_eval_time() const - { - return d_eval_time_; - } - const TimedTask& jac_d_eval_time() const - { - return jac_d_eval_time_; - } - const TimedTask& h_eval_time() const - { - return h_eval_time_; - } - - Number TotalFunctionEvaluationCpuTime() const; - Number TotalFunctionEvaluationSysTime() const; - Number TotalFunctionEvaluationWallclockTime() const; - //@} - - private: - /** journalist */ - SmartPtr jnlst_; - - /** Pointer to the NLP */ - SmartPtr nlp_; - - /** Necessary Vector/Matrix spaces */ - //@{ - SmartPtr x_space_; - SmartPtr c_space_; - SmartPtr d_space_; - SmartPtr x_l_space_; - SmartPtr px_l_space_; - SmartPtr x_u_space_; - SmartPtr px_u_space_; - SmartPtr d_l_space_; - SmartPtr pd_l_space_; - SmartPtr d_u_space_; - SmartPtr pd_u_space_; - SmartPtr jac_c_space_; - SmartPtr jac_d_space_; - SmartPtr h_space_; - - SmartPtr scaled_jac_c_space_; - SmartPtr scaled_jac_d_space_; - SmartPtr scaled_h_space_; - //@} - /**@name Storage for Model Quantities */ - //@{ - /** Objective function */ - CachedResults f_cache_; - - /** Gradient of the objective function */ - CachedResults > grad_f_cache_; - - /** Equality constraint residuals */ - CachedResults > c_cache_; - - /** Jacobian Matrix for equality constraints - * (current iteration) */ - CachedResults > jac_c_cache_; - - /** Inequality constraint residual (reformulated - * as equalities with slacks */ - CachedResults > d_cache_; - - /** Jacobian Matrix for inequality constraints - * (current iteration) */ - CachedResults > jac_d_cache_; - - /** Hessian of the lagrangian - * (current iteration) */ - CachedResults > h_cache_; - - /** Unscaled version of x vector */ - CachedResults > unscaled_x_cache_; - - /** Lower bounds on x */ - SmartPtr x_L_; - - /** Permutation matrix (x_L_ -> x) */ - SmartPtr Px_L_; - - /** Upper bounds on x */ - SmartPtr x_U_; - - /** Permutation matrix (x_U_ -> x */ - SmartPtr Px_U_; - - /** Lower bounds on d */ - SmartPtr d_L_; - - /** Permutation matrix (d_L_ -> d) */ - SmartPtr Pd_L_; - - /** Upper bounds on d */ - SmartPtr d_U_; - - /** Permutation matrix (d_U_ -> d */ - SmartPtr Pd_U_; - - /** Original unmodified lower bounds on x */ - SmartPtr orig_x_L_; - - /** Original unmodified upper bounds on x */ - SmartPtr orig_x_U_; - //@} - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - OrigIpoptNLP(); - - /** Copy Constructor */ - OrigIpoptNLP(const OrigIpoptNLP&); - - /** Overloaded Equals Operator */ - void operator=(const OrigIpoptNLP&); - //@} - - /** @name auxilliary functions */ - //@{ - /** relax the bounds by a relative move of relax_bound_factor. - * Here, relax_bound_factor should be negative (or zero) for - * lower bounds, and positive (or zero) for upper bounds. - */ - void relax_bounds(Number bound_relax_factor, Vector& bounds); - /** Method for getting the unscaled version of the x vector */ - SmartPtr get_unscaled_x(const Vector& x); - //@} - - /** @name Algorithmic parameters */ - //@{ - /** relaxation factor for the bounds */ - Number bound_relax_factor_; - /** Flag indicating whether the primal variables should be - * projected back into original bounds are optimization. */ - bool honor_original_bounds_; - /** Flag indicating whether the TNLP with identical structure has - * already been solved before. */ - bool warm_start_same_structure_; - /** Flag indicating what Hessian information is to be used. */ - HessianApproximationType hessian_approximation_; - /** Flag indicating in which space Hessian is to be approximated. */ - HessianApproximationSpace hessian_approximation_space_; - /** Flag indicating whether it is desired to check if there are - * Nan or Inf entries in first and second derivative matrices. */ - bool check_derivatives_for_naninf_; - /** Flag indicating if we need to ask for equality constraint - * Jacobians only once */ - bool jac_c_constant_; - /** Flag indicating if we need to ask for inequality constraint - * Jacobians only once */ - bool jac_d_constant_; - /** Flag indicating if we need to ask for Hessian only once */ - bool hessian_constant_; - //@} - - /** @name Counters for the function evaluations */ - //@{ - Index f_evals_; - Index grad_f_evals_; - Index c_evals_; - Index jac_c_evals_; - Index d_evals_; - Index jac_d_evals_; - Index h_evals_; - //@} - - /** Flag indicating if initialization method has been called */ - bool initialized_; - - /**@name Timing statistics for the function evaluations. */ - //@{ - TimedTask f_eval_time_; - TimedTask grad_f_eval_time_; - TimedTask c_eval_time_; - TimedTask jac_c_eval_time_; - TimedTask d_eval_time_; - TimedTask jac_d_eval_time_; - TimedTask h_eval_time_; - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpPDSystemSolver.hpp b/thirdparty/linux/include/coin1/IpPDSystemSolver.hpp deleted file mode 100644 index b436e678..00000000 --- a/thirdparty/linux/include/coin1/IpPDSystemSolver.hpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpPDSystemSolver.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPPDSYSTEMSOLVER_HPP__ -#define __IPPDSYSTEMSOLVER_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" -#include "IpAlgStrategy.hpp" -#include "IpIteratesVector.hpp" - -namespace Ipopt -{ - - /** Pure Primal Dual System Solver Base Class. - * This is the base class for all derived Primal-Dual System Solver Types. - * - * Here, we understand the primal-dual system as the following linear - * system: - * - * \f$ - * \left[\begin{array}{cccccccc} - * W & 0 & J_c^T & J_d^T & -P^x_L & P^x_U & 0 & 0 \\ - * 0 & 0 & 0 & -I & 0 & 0 & -P_L^d & P_U^d \\ - * J_c & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ - * J_d & -I & 0 & 0 & 0 & 0 & 0 & 0\\ - * Z_L(P_L^x)^T & 0 & 0 & 0 & Sl^x_L & 0 & 0 & 0\\ - * -Z_U(P_U^x)^T & 0 & 0 & 0 & 0 & Sl^x_U & 0 & 0\\ - * 0 & V_L(P_L^d)^T & 0 & 0 & 0 & 0 & Sl^s_L & 0 \\ - * 0 & -V_U(P_U^d)^T & 0 & 0 & 0 & 0 & 0 & Sl^s_U \\ - * \end{array}\right] - * \left(\begin{array}{c} - * sol_x\\ sol_s\\ sol_c\\ sol_d\\ sol^z_L\\ sol^z_U\\ sol^v_L\\ - * sol^v_U - * \end{array}\right) = - * \left(\begin{array}{c} - * rhs_x\\ rhs_s\\ rhs_c\\ rhs_d\\ rhs^z_L\\ rhs^z_U\\ rhs^v_L\\ - * rhs^v_U - * \end{array}\right) - * \f$ - * - * Here, \f$Sl^x_L = (P^x_L)^T x - x_L\f$, - * \f$Sl^x_U = x_U - (P^x_U)^T x\f$, \f$Sl^d_L = (P^d_L)^T d(x) - d_L\f$, - * \f$Sl^d_U = d_U - (P^d_U)^T d(x)\f$. The results returned to the - * caller is \f$res = \alpha * sol + \beta * res\f$. - * - * The solution of this linear system (in order to compute the search - * direction of the algorthim) usually requires a considerable amount of - * computation time. Therefore, it is important to tailor the solution - * of this system to the characteristics of the problem. The purpose of - * this base class is to provide a generic interface to the algorithm - * that it can use whenever it requires a solution of the above system. - * Particular implementation can then be written to provide the methods - * defined here. - * - * It is implicitly assumed here, that the upper left 2 by 2 block - * is possibly modified (implicitly or explicitly) so that its - * projection onto the null space of the overall constraint - * Jacobian \f$\left[\begin{array}{cc}J_c & 0\\J_d & - * -I\end{array}\right]\f$ is positive definite. This is necessary - * to guarantee certain descent properties of the resulting search - * direction. For example, in the full space implementation, a - * multiple of the identity might be added to the upper left 2 by 2 - * block. - * - * Note that the Solve method might be called several times for different - * right hand sides, but with identical data. Therefore, if possible, - * an implemetation of PDSystem should check whether the incoming data has - * changed, and not redo factorization etc. unless necessary. - */ - class PDSystemSolver: public AlgorithmStrategyObject - { - public: - /** @name /Destructor */ - //@{ - /** Default Constructor */ - PDSystemSolver() - {} - - /** Default destructor */ - virtual ~PDSystemSolver() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Solve the primal dual system, given one right hand side. If - * the flag allow_inexact is set to true, it is not necessary to - * solve the system to best accuracy; for example, we don't want - * iterative refinement during the computation of the second - * order correction. On the other hand, if improve_solution is - * true, the solution given in res should be improved (here beta - * has to be zero, and res is assume to be the solution for the - * system using rhs, without the factor alpha...). THe return - * value is false, if a solution could not be computed (for - * example, when the Hessian regularization parameter becomes too - * large.) - */ - virtual bool Solve(Number alpha, - Number beta, - const IteratesVector& rhs, - IteratesVector& res, - bool allow_inexact=false, - bool improve_solution=false) =0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Overloaded Equals Operator */ - PDSystemSolver& operator=(const PDSystemSolver&); - //@} - }; - - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpReferenced.hpp b/thirdparty/linux/include/coin1/IpReferenced.hpp deleted file mode 100644 index 996beda9..00000000 --- a/thirdparty/linux/include/coin1/IpReferenced.hpp +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpReferenced.hpp 2182 2013-03-30 20:02:18Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPREFERENCED_HPP__ -#define __IPREFERENCED_HPP__ - -#include "IpTypes.hpp" -#include "IpDebug.hpp" - -#include - -#if COIN_IPOPT_CHECKLEVEL > 3 - #define IP_DEBUG_REFERENCED -#endif - -namespace Ipopt -{ - - /** Psydo-class, from which everything has to inherit that wants to - * use be registered as a Referencer for a ReferencedObject. - */ - class Referencer - {} - ; - - /** ReferencedObject class. - * This is part of the implementation of an intrusive smart pointer - * design. This class stores the reference count of all the smart - * pointers that currently reference it. See the documentation for - * the SmartPtr class for more details. - * - * A SmartPtr behaves much like a raw pointer, but manages the lifetime - * of an object, deleting the object automatically. This class implements - * a reference-counting, intrusive smart pointer design, where all - * objects pointed to must inherit off of ReferencedObject, which - * stores the reference count. Although this is intrusive (native types - * and externally authored classes require wrappers to be referenced - * by smart pointers), it is a safer design. A more detailed discussion of - * these issues follows after the usage information. - * - * Usage Example: - * Note: to use the SmartPtr, all objects to which you point MUST - * inherit off of ReferencedObject. - * - * \verbatim - * - * In MyClass.hpp... - * - * #include "IpReferenced.hpp" - - * namespace Ipopt { - * - * class MyClass : public ReferencedObject // must derive from ReferencedObject - * { - * ... - * } - * } // namespace Ipopt - * - * - * In my_usage.cpp... - * - * #include "IpSmartPtr.hpp" - * #include "MyClass.hpp" - * - * void func(AnyObject& obj) - * { - * SmartPtr ptr_to_myclass = new MyClass(...); - * // ptr_to_myclass now points to a new MyClass, - * // and the reference count is 1 - * - * ... - * - * obj.SetMyClass(ptr_to_myclass); - * // Here, let's assume that AnyObject uses a - * // SmartPtr internally here. - * // Now, both ptr_to_myclass and the internal - * // SmartPtr in obj point to the same MyClass object - * // and its reference count is 2. - * - * ... - * - * // No need to delete ptr_to_myclass, this - * // will be done automatically when the - * // reference count drops to zero. - * - * } - * - * \endverbatim - * - * Other Notes: - * The SmartPtr implements both dereference operators -> & *. - * The SmartPtr does NOT implement a conversion operator to - * the raw pointer. Use the GetRawPtr() method when this - * is necessary. Make sure that the raw pointer is NOT - * deleted. - * The SmartPtr implements the comparison operators == & != - * for a variety of types. Use these instead of - * \verbatim - * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this - * \endverbatim - * SmartPtr's, as currently implemented, do NOT handle circular references. - * For example: consider a higher level object using SmartPtrs to point to - * A and B, but A and B also point to each other (i.e. A has a SmartPtr - * to B and B has a SmartPtr to A). In this scenario, when the higher - * level object is finished with A and B, their reference counts will - * never drop to zero (since they reference each other) and they - * will not be deleted. This can be detected by memory leak tools like - * valgrind. If the circular reference is necessary, the problem can be - * overcome by a number of techniques: - * - * 1) A and B can have a method that "releases" each other, that is - * they set their internal SmartPtrs to NULL. - * \verbatim - * void AClass::ReleaseCircularReferences() - * { - * smart_ptr_to_B = NULL; - * } - * \endverbatim - * Then, the higher level class can call these methods before - * it is done using A & B. - * - * 2) Raw pointers can be used in A and B to reference each other. - * Here, an implicit assumption is made that the lifetime is - * controlled by the higher level object and that A and B will - * both exist in a controlled manner. Although this seems - * dangerous, in many situations, this type of referencing - * is very controlled and this is reasonably safe. - * - * 3) This SmartPtr class could be redesigned with the Weak/Strong - * design concept. Here, the SmartPtr is identified as being - * Strong (controls lifetime of the object) or Weak (merely - * referencing the object). The Strong SmartPtr increments - * (and decrements) the reference count in ReferencedObject - * but the Weak SmartPtr does not. In the example above, - * the higher level object would have Strong SmartPtrs to - * A and B, but A and B would have Weak SmartPtrs to each - * other. Then, when the higher level object was done with - * A and B, they would be deleted. The Weak SmartPtrs in A - * and B would not decrement the reference count and would, - * of course, not delete the object. This idea is very similar - * to item (2), where it is implied that the sequence of events - * is controlled such that A and B will not call anything using - * their pointers following the higher level delete (i.e. in - * their destructors!). This is somehow safer, however, because - * code can be written (however expensive) to perform run-time - * detection of this situation. For example, the ReferencedObject - * could store pointers to all Weak SmartPtrs that are referencing - * it and, in its destructor, tell these pointers that it is - * dying. They could then set themselves to NULL, or set an - * internal flag to detect usage past this point. - * - * For every most derived object only one ReferencedObject may exist, - * that is multiple inheritance requires virtual inheritance, see also - * the 2nd point in ticket #162. - * - * Comments on Non-Intrusive Design: - * In a non-intrusive design, the reference count is stored somewhere other - * than the object being referenced. This means, unless the reference - * counting pointer is the first referencer, it must get a pointer to the - * referenced object from another smart pointer (so it has access to the - * reference count location). In this non-intrusive design, if we are - * pointing to an object with a smart pointer (or a number of smart - * pointers), and we then give another smart pointer the address through - * a RAW pointer, we will have two independent, AND INCORRECT, reference - * counts. To avoid this pitfall, we use an intrusive reference counting - * technique where the reference count is stored in the object being - * referenced. - */ - class ReferencedObject - { - public: - ReferencedObject() - : - reference_count_(0) - {} - - virtual ~ReferencedObject() - { - DBG_ASSERT(reference_count_ == 0); - } - - inline - Index ReferenceCount() const; - - inline - void AddRef(const Referencer* referencer) const; - - inline - void ReleaseRef(const Referencer* referencer) const; - - private: - mutable Index reference_count_; - -# ifdef IP_DEBUG_REFERENCED - mutable std::list referencers_; -# endif - - }; - - /* inline methods */ - inline - Index ReferencedObject::ReferenceCount() const - { - // DBG_START_METH("ReferencedObject::ReferenceCount()", 0); - // DBG_PRINT((1,"Returning reference_count_ = %d\n", reference_count_)); - return reference_count_; - } - - inline - void ReferencedObject::AddRef(const Referencer* referencer) const - { - // DBG_START_METH("ReferencedObject::AddRef(const Referencer* referencer)", 0); - reference_count_++; - // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_)); -# ifdef IP_DEBUG_REFERENCED - referencers_.push_back(referencer); -# endif - - } - - inline - void ReferencedObject::ReleaseRef(const Referencer* referencer) const - { - // DBG_START_METH("ReferencedObject::ReleaseRef(const Referencer* referencer)", - // 0); - reference_count_--; - // DBG_PRINT((1, "New reference_count_ = %d\n", reference_count_)); - -# ifdef IP_DEBUG_REFERENCED - - bool found = false; - std::list::iterator iter; - for (iter = referencers_.begin(); iter != referencers_.end(); iter++) { - if ((*iter) == referencer) { - found = true; - break; - } - } - - // cannot call release on a reference that was never added... - DBG_ASSERT(found); - - if (found) { - referencers_.erase(iter); - } -# endif - - } - - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpRegOptions.hpp b/thirdparty/linux/include/coin1/IpRegOptions.hpp deleted file mode 100644 index 5859493e..00000000 --- a/thirdparty/linux/include/coin1/IpRegOptions.hpp +++ /dev/null @@ -1,658 +0,0 @@ -// Copyright (C) 2004, 2007 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpRegOptions.hpp 2189 2013-03-31 15:06:11Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2005-06-18 - -#ifndef __IPREGOPTIONS_HPP__ -#define __IPREGOPTIONS_HPP__ - -#include "IpUtils.hpp" -#include "IpReferenced.hpp" -#include "IpException.hpp" -#include "IpSmartPtr.hpp" - -#include - -namespace Ipopt -{ - - enum RegisteredOptionType - { - OT_Number, - OT_Integer, - OT_String, - OT_Unknown - }; - - /** Base class for registered options. The derived types are more - * specific to a string option or a Number (real) option, etc. - */ - class RegisteredOption : public ReferencedObject - { - public: - /** class to hold the valid string settings for a string option */ - class string_entry - { - public: - string_entry(const std::string& value, const std::string& description) - : value_(value), description_(description) - {} - std::string value_; - std::string description_; - }; - - /** Constructors / Destructors */ - //@{ - RegisteredOption(Index counter) - : - type_(OT_Unknown), - has_lower_(false), - has_upper_(false), - counter_(counter) - {} - - RegisteredOption(const std::string& name, - const std::string& short_description, - const std::string& long_description, - const std::string& registering_category, - Index counter) - : - name_(name), - short_description_(short_description), - long_description_(long_description), - registering_category_(registering_category), - type_(OT_Unknown), - has_lower_(false), - has_upper_(false), - counter_(counter) - {} - - RegisteredOption(const RegisteredOption& copy) - : - name_(copy.name_), - short_description_(copy.short_description_), - long_description_(copy.long_description_), - registering_category_(copy.registering_category_), - type_(copy.type_), - has_lower_(copy.has_lower_), - lower_(copy.lower_), - has_upper_(copy.has_upper_), - upper_(copy.upper_), - valid_strings_(copy.valid_strings_), - counter_(copy.counter_) - {} - - virtual ~RegisteredOption() - {} - //@} - - DECLARE_STD_EXCEPTION(ERROR_CONVERTING_STRING_TO_ENUM); - - /** Standard Get / Set Methods */ - //@{ - /** Get the option's name (tag in the input file) */ - virtual const std::string& Name() const - { - return name_; - } - /** Set the option's name (tag in the input file) */ - virtual void SetName(const std::string& name) - { - name_ = name; - } - /** Get the short description */ - virtual const std::string& ShortDescription() const - { - return short_description_; - } - /** Get the long description */ - virtual const std::string& LongDescription() const - { - return long_description_; - } - /** Set the short description */ - virtual void SetShortDescription(const std::string& short_description) - { - short_description_ = short_description; - } - /** Set the long description */ - virtual void SetLongDescription(const std::string& long_description) - { - long_description_ = long_description; - } - /** Get the registering class */ - virtual const std::string& RegisteringCategory() const - { - return registering_category_; - } - /** Set the registering class */ - virtual void SetRegisteringCategory(const std::string& registering_category) - { - registering_category_ = registering_category; - } - /** Get the Option's type */ - virtual const RegisteredOptionType& Type() const - { - return type_; - } - /** Get the Option's type */ - virtual void SetType(const RegisteredOptionType& type) - { - type_ = type; - } - /** Counter */ - virtual Index Counter() const - { - return counter_; - } - //@} - - /** @name Get / Set methods valid for specific types - NOTE: the Type - * must be set before calling these methods. - */ - //@{ - /** check if the option has a lower bound - can be called for - * OT_Number & OT_Integer*/ - virtual const bool& HasLower() const - { - DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer); - return has_lower_; - } - /** check if the lower bound is strict - can be called for - OT_Number */ - virtual const bool& LowerStrict() const - { - DBG_ASSERT(type_ == OT_Number && has_lower_ == true); - return lower_strict_; - } - /** get the Number version of the lower bound - can be called for - * OT_Number */ - virtual Number LowerNumber() const - { - DBG_ASSERT(has_lower_ == true && type_ == OT_Number); - return lower_; - } - /** set the Number version of the lower bound - can be called for - * OT_Number */ - virtual void SetLowerNumber(const Number& lower, const bool& strict) - { - DBG_ASSERT(type_ == OT_Number); - lower_ = lower; - lower_strict_ = strict, has_lower_ = true; - } - /** get the Integer version of the lower bound can be called for - * OT_Integer*/ - virtual Index LowerInteger() const - { - DBG_ASSERT(has_lower_ == true && type_ == OT_Integer); - return (Index)lower_; - } - /** set the Integer version of the lower bound - can be called for - * OT_Integer */ - virtual void SetLowerInteger(const Index& lower) - { - DBG_ASSERT(type_ == OT_Integer); - lower_ = (Number)lower; - has_lower_ = true; - } - /** check if the option has an upper bound - can be called for - * OT_Number & OT_Integer*/ - virtual const bool& HasUpper() const - { - DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer); - return has_upper_; - } - /** check if the upper bound is strict - can be called for - * OT_Number */ - virtual const bool& UpperStrict() const - { - DBG_ASSERT(type_ == OT_Number && has_upper_ == true); - return upper_strict_; - } - /** get the Number version of the upper bound - can be called for - * OT_Number */ - virtual Number UpperNumber() const - { - DBG_ASSERT(has_upper_ == true && type_ == OT_Number); - return upper_; - } - /** set the Number version of the upper bound - can be called for - * OT_Number */ - virtual void SetUpperNumber(const Number& upper, const bool& strict) - { - DBG_ASSERT(type_ == OT_Number); - upper_ = upper; - upper_strict_ = strict; - has_upper_ = true; - } - /** get the Integer version of the upper bound - can be called for - * OT_Integer*/ - virtual Index UpperInteger() const - { - DBG_ASSERT(has_upper_ == true && type_ == OT_Integer); - return (Index)upper_; - } - /** set the Integer version of the upper bound - can be called for - * OT_Integer */ - virtual void SetUpperInteger(const Index& upper) - { - DBG_ASSERT(type_ == OT_Integer); - upper_ = (Number)upper; - has_upper_ = true; - } - /** method to add valid string entries - can be called for - * OT_String */ - virtual void AddValidStringSetting(const std::string value, - const std::string description) - { - DBG_ASSERT(type_ == OT_String); - valid_strings_.push_back(string_entry(value, description)); - } - /** get the default as a Number - can be called for OT_Number */ - virtual Number DefaultNumber() const - { - DBG_ASSERT(type_ == OT_Number); - return default_number_; - } - /** Set the default as a Number - can be called for OT_Number */ - virtual void SetDefaultNumber(const Number& default_value) - { - DBG_ASSERT(type_ == OT_Number); - default_number_ = default_value; - } - /** get the default as an Integer - can be called for OT_Integer*/ - virtual Index DefaultInteger() const - { - DBG_ASSERT(type_ == OT_Integer); - return (Index)default_number_; - } - /** Set the default as an Integer - can be called for - OT_Integer */ - virtual void SetDefaultInteger(const Index& default_value) - { - DBG_ASSERT(type_ == OT_Integer); - default_number_ = (Number)default_value; - } - /** get the default as a string - can be called for OT_String */ - virtual std::string DefaultString() const - { - DBG_ASSERT(type_ == OT_String); - return default_string_; - } - /** get the default as a string, but as the index of the string in - * the list - helps map from a string to an enum- can be called - * for OT_String */ - virtual Index DefaultStringAsEnum() const - { - DBG_ASSERT(type_ == OT_String); - return MapStringSettingToEnum(default_string_); - } - /** Set the default as a string - can be called for OT_String */ - virtual void SetDefaultString(const std::string& default_value) - { - DBG_ASSERT(type_ == OT_String); - default_string_ = default_value; - } - /** get the valid string settings - can be called for OT_String */ - virtual std::vector GetValidStrings() const - { - DBG_ASSERT(type_ == OT_String); - return valid_strings_; - } - /** Check if the Number value is a valid setting - can be called - * for OT_Number */ - virtual bool IsValidNumberSetting(const Number& value) const - { - DBG_ASSERT(type_ == OT_Number); - if (has_lower_ && ((lower_strict_ == true && value <= lower_) || - (lower_strict_ == false && value < lower_))) { - return false; - } - if (has_upper_ && ((upper_strict_ == true && value >= upper_) || - (upper_strict_ == false && value > upper_))) { - return false; - } - return true; - } - /** Check if the Integer value is a valid setting - can be called - * for OT_Integer */ - virtual bool IsValidIntegerSetting(const Index& value) const - { - DBG_ASSERT(type_ == OT_Integer); - if (has_lower_ && value < lower_) { - return false; - } - if (has_upper_ && value > upper_) { - return false; - } - return true; - } - /** Check if the String value is a valid setting - can be called - * for OT_String */ - virtual bool IsValidStringSetting(const std::string& value) const; - - /** Map a user setting (allowing any case) to the case used when - * the setting was registered. - */ - virtual std::string MapStringSetting(const std::string& value) const; - - /** Map a user setting (allowing any case) to the index of the - * matched setting in the list of string settings. Helps map a - * string setting to an enumeration. - */ - virtual Index MapStringSettingToEnum(const std::string& value) const; - //@} - - /** output a description of the option */ - virtual void OutputDescription(const Journalist& jnlst) const; - /** output a more concise version */ - virtual void OutputShortDescription(const Journalist& jnlst) const; - /** output a latex version */ - virtual void OutputLatexDescription(const Journalist& jnlst) const; - - private: - std::string name_; - std::string short_description_; - std::string long_description_; - std::string registering_category_; - RegisteredOptionType type_; - - bool has_lower_; - bool lower_strict_; - Number lower_; - bool has_upper_; - bool upper_strict_; - Number upper_; - Number default_number_; - - void MakeValidLatexString(std::string source, std::string& dest) const; - std::string MakeValidLatexNumber(Number value) const; - - /** Compare two strings and return true if they are equal (case - insensitive comparison) */ - bool string_equal_insensitive(const std::string& s1, - const std::string& s2) const; - - std::vector valid_strings_; - std::string default_string_; - - /** Has the information as how many-th option this one was - * registered. */ - const Index counter_; - }; - - /** Class for storing registered options. Used for validation and - * documentation. - */ - class RegisteredOptions : public ReferencedObject - { - public: - /** Constructors / Destructors */ - //@{ - /** Standard Constructor */ - RegisteredOptions() - : - next_counter_(0), - current_registering_category_("Uncategorized") - {} - - /** Standard Destructor */ - virtual ~RegisteredOptions() - {} - //@} - - DECLARE_STD_EXCEPTION(OPTION_ALREADY_REGISTERED); - - /** Methods to interact with registered options */ - //@{ - /** set the registering class. All subsequent options will be - * added with the registered class */ - virtual void SetRegisteringCategory(const std::string& registering_category) - { - current_registering_category_ = registering_category; - } - - /** retrieve the value of the current registering category */ - virtual std::string RegisteringCategory() - { - return current_registering_category_; - } - - /** Add a Number option (with no restrictions) */ - virtual void AddNumberOption(const std::string& name, - const std::string& short_description, - Number default_value, - const std::string& long_description=""); - /** Add a Number option (with a lower bound) */ - virtual void AddLowerBoundedNumberOption(const std::string& name, - const std::string& short_description, - Number lower, bool strict, - Number default_value, - const std::string& long_description=""); - /** Add a Number option (with a upper bound) */ - virtual void AddUpperBoundedNumberOption(const std::string& name, - const std::string& short_description, - Number upper, bool strict, - Number default_value, - const std::string& long_description=""); - /** Add a Number option (with a both bounds) */ - virtual void AddBoundedNumberOption(const std::string& name, - const std::string& short_description, - Number lower, bool lower_strict, - Number upper, bool upper_strict, - Number default_value, - const std::string& long_description=""); - /** Add a Integer option (with no restrictions) */ - virtual void AddIntegerOption(const std::string& name, - const std::string& short_description, - Index default_value, - const std::string& long_description=""); - /** Add a Integer option (with a lower bound) */ - virtual void AddLowerBoundedIntegerOption(const std::string& name, - const std::string& short_description, - Index lower, Index default_value, - const std::string& long_description=""); - /** Add a Integer option (with a upper bound) */ - virtual void AddUpperBoundedIntegerOption(const std::string& name, - const std::string& short_description, - Index upper, Index default_value, - const std::string& long_description=""); - /** Add a Integer option (with a both bounds) */ - virtual void AddBoundedIntegerOption(const std::string& name, - const std::string& short_description, - Index lower, Index upper, - Index default_value, - const std::string& long_description=""); - - /** Add a String option (with no restrictions) */ - virtual void AddStringOption(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::vector& settings, - const std::vector& descriptions, - const std::string& long_description=""); - /** Methods that make adding string options with only a few - * entries easier */ - virtual void AddStringOption1(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& long_description=""); - virtual void AddStringOption2(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& long_description=""); - virtual void AddStringOption3(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& long_description=""); - virtual void AddStringOption4(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& long_description=""); - virtual void AddStringOption5(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& long_description=""); - virtual void AddStringOption6(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& setting6, - const std::string& description6, - const std::string& long_description=""); - virtual void AddStringOption7(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& setting6, - const std::string& description6, - const std::string& setting7, - const std::string& description7, - const std::string& long_description=""); - virtual void AddStringOption8(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& setting6, - const std::string& description6, - const std::string& setting7, - const std::string& description7, - const std::string& setting8, - const std::string& description8, - const std::string& long_description=""); - virtual void AddStringOption9(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& setting6, - const std::string& description6, - const std::string& setting7, - const std::string& description7, - const std::string& setting8, - const std::string& description8, - const std::string& setting9, - const std::string& description9, - const std::string& long_description=""); - virtual void AddStringOption10(const std::string& name, - const std::string& short_description, - const std::string& default_value, - const std::string& setting1, - const std::string& description1, - const std::string& setting2, - const std::string& description2, - const std::string& setting3, - const std::string& description3, - const std::string& setting4, - const std::string& description4, - const std::string& setting5, - const std::string& description5, - const std::string& setting6, - const std::string& description6, - const std::string& setting7, - const std::string& description7, - const std::string& setting8, - const std::string& description8, - const std::string& setting9, - const std::string& description9, - const std::string& setting10, - const std::string& description10, - const std::string& long_description=""); - - /** Get a registered option - this will return NULL if the option - * does not exist */ - virtual SmartPtr GetOption(const std::string& name); - - /** Output documentation for the options - gives a description, - * etc. */ - virtual void OutputOptionDocumentation(const Journalist& jnlst, std::list& categories); - - /** Output documentation in Latex format to include in a latex file */ - virtual void OutputLatexOptionDocumentation(const Journalist& jnlst, std::list& categories); - //@} - - typedef std::map > RegOptionsList; - - /** Giving access to iteratable representation of the registered - * options */ - virtual const RegOptionsList& RegisteredOptionsList () const - { - return registered_options_; - } - - private: - Index next_counter_; - std::string current_registering_category_; - std::map > registered_options_; - }; -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpReturnCodes.h b/thirdparty/linux/include/coin1/IpReturnCodes.h deleted file mode 100644 index b16d2c63..00000000 --- a/thirdparty/linux/include/coin1/IpReturnCodes.h +++ /dev/null @@ -1,18 +0,0 @@ -/*********************************************************************** -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpReturnCodes.h 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 -************************************************************************/ - -#ifndef __IPRETURNCODES_H__ -#define __IPRETURNCODES_H__ - -/* include from a common include file */ - -#include "IpReturnCodes_inc.h" - -#endif diff --git a/thirdparty/linux/include/coin1/IpReturnCodes.hpp b/thirdparty/linux/include/coin1/IpReturnCodes.hpp deleted file mode 100644 index 36dd7d70..00000000 --- a/thirdparty/linux/include/coin1/IpReturnCodes.hpp +++ /dev/null @@ -1,21 +0,0 @@ -/*********************************************************************** -// Copyright (C) 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpReturnCodes.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Andreas Waechter IBM 2006-03-01 -************************************************************************/ - -#ifndef __IPRETURNCODES_HPP__ -#define __IPRETURNCODES_HPP__ - -/* include from a common include file */ - -namespace Ipopt -{ -#include "IpReturnCodes_inc.h" -} - -#endif diff --git a/thirdparty/linux/include/coin1/IpReturnCodes.inc b/thirdparty/linux/include/coin1/IpReturnCodes.inc deleted file mode 100644 index c6bf70a4..00000000 --- a/thirdparty/linux/include/coin1/IpReturnCodes.inc +++ /dev/null @@ -1,70 +0,0 @@ -C Copyright (C) 2005, 2009 International Business Machines and others. -C All Rights Reserved. -C This code is published under the Eclipse Public License. -C -C $Id: IpReturnCodes.inc 1861 2010-12-21 21:34:47Z andreasw $ -C -C Author: Andreas Waechter IBM 2005-08-11 -C - INTEGER IP_SOLVE_SUCCEEDED - PARAMETER( IP_SOLVE_SUCCEEDED = 0 ) - - INTEGER IP_ACCEPTABLE_LEVEL - PARAMETER( IP_ACCEPTABLE_LEVEL = 1 ) - - INTEGER IP_INFEASIBLE_PROBLEM - PARAMETER( IP_INFEASIBLE_PROBLEM = 2 ) - - INTEGER IP_SEARCH_DIRECTION_TOO_SMALL - PARAMETER( IP_SEARCH_DIRECTION_TOO_SMALL = 3 ) - - INTEGER IP_DIVERGING_ITERATES - PARAMETER( IP_DIVERGING_ITERATES = 4 ) - - INTEGER IP_USER_REQUESTED_STOP - PARAMETER( IP_USER_REQUESTED_STOP = 5 ) - - INTEGER IP_FEASIBLE_POINT_FOUND - PARAMETER( IP_FEASIBLE_POINT_FOUND = 6 ) - - INTEGER IP_ITERATION_EXCEEDED - PARAMETER( IP_ITERATION_EXCEEDED = -1 ) - - INTEGER IP_RESTORATION_FAILED - PARAMETER( IP_RESTORATION_FAILED = -2 ) - - INTEGER IP_ERROR_IN_STEP_COMPUTATION - PARAMETER( IP_ERROR_IN_STEP_COMPUTATION = -3 ) - - INTEGER IP_CPUTIME_EXCEEDED - PARAMETER( IP_CPUTIME_EXCEEDED = -4 ) - - INTEGER IP_NOT_ENOUGH_DEGREES_OF_FRE - PARAMETER( IP_NOT_ENOUGH_DEGREES_OF_FRE = -10 ) - - INTEGER IP_INVALID_PROBLEM_DEFINITION - PARAMETER( IP_INVALID_PROBLEM_DEFINITION = -11) - - INTEGER IP_INVALID_OPTION - PARAMETER( IP_INVALID_OPTION = -12 ) - - INTEGER IP_INVALID_NUMBER_DETECTED - PARAMETER( IP_INVALID_NUMBER_DETECTED = -13 ) - - INTEGER IP_UNRECOVERABLE_EXCEPTION - PARAMETER( IP_UNRECOVERABLE_EXCEPTION = -100 ) - - INTEGER IP_NON_IPOPT_EXCEPTION - PARAMETER( IP_NON_IPOPT_EXCEPTION = -101 ) - - INTEGER IP_INSUFFICIENT_MEMORY - PARAMETER( IP_INSUFFICIENT_MEMORY = -102 ) - - INTEGER IP_INTERNAL_ERROR - PARAMETER( IP_INTERNAL_ERROR = -199 ) - - INTEGER IP_REGULAR_MODE - PARAMETER( IP_REGULAR_MODE = 0 ) - - INTEGER IP_RESTORATION_PHASE_MODE - PARAMETER( IP_RESTORATION_PHASE_MODE = 1 ) diff --git a/thirdparty/linux/include/coin1/IpReturnCodes_inc.h b/thirdparty/linux/include/coin1/IpReturnCodes_inc.h deleted file mode 100644 index 80190ed1..00000000 --- a/thirdparty/linux/include/coin1/IpReturnCodes_inc.h +++ /dev/null @@ -1,46 +0,0 @@ -/*********************************************************************** -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpReturnCodes_inc.h 2216 2013-04-14 17:06:00Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 -************************************************************************/ - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ -/* !!!!!!!!! REMEMBER TO UPDATE IpReturnCodes.inc and Ipopt.java !!!!!!!! */ -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -/** Return codes for the Optimize call for an application */ -enum ApplicationReturnStatus - { - Solve_Succeeded=0, - Solved_To_Acceptable_Level=1, - Infeasible_Problem_Detected=2, - Search_Direction_Becomes_Too_Small=3, - Diverging_Iterates=4, - User_Requested_Stop=5, - Feasible_Point_Found=6, - - Maximum_Iterations_Exceeded=-1, - Restoration_Failed=-2, - Error_In_Step_Computation=-3, - Maximum_CpuTime_Exceeded=-4, - Not_Enough_Degrees_Of_Freedom=-10, - Invalid_Problem_Definition=-11, - Invalid_Option=-12, - Invalid_Number_Detected=-13, - - Unrecoverable_Exception=-100, - NonIpopt_Exception_Thrown=-101, - Insufficient_Memory=-102, - Internal_Error=-199 - }; - -/** enum to indicate the mode in which the algorithm is */ -enum AlgorithmMode - { - RegularMode=0, - RestorationPhaseMode=1 - }; diff --git a/thirdparty/linux/include/coin1/IpScaledMatrix.hpp b/thirdparty/linux/include/coin1/IpScaledMatrix.hpp deleted file mode 100644 index c182a054..00000000 --- a/thirdparty/linux/include/coin1/IpScaledMatrix.hpp +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpScaledMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSCALEDMATRIX_HPP__ -#define __IPSCALEDMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class ScaledMatrixSpace; - - /** Class for a Matrix in conjunction with its scaling factors for - * row and column scaling. Operations on the matrix are performed using - * the scaled matrix. You can pull out the pointer to the - * unscaled matrix for unscaled calculations. - */ - class ScaledMatrix : public Matrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the owner_space. - */ - ScaledMatrix(const ScaledMatrixSpace* owner_space); - - /** Destructor */ - ~ScaledMatrix(); - //@} - - /** Set the unscaled matrix */ - void SetUnscaledMatrix(const SmartPtr unscaled_matrix); - - /** Set the unscaled matrix in a non-const version */ - void SetUnscaledMatrixNonConst(const SmartPtr& unscaled_matrix); - - /** Return the unscaled matrix in const form */ - SmartPtr GetUnscaledMatrix() const; - - /** Return the unscaled matrix in non-const form */ - SmartPtr GetUnscaledMatrixNonConst(); - - /** return the vector for the row scaling */ - SmartPtr RowScaling() const; - - /** return the vector for the column scaling */ - SmartPtr ColumnScaling() const; - - protected: - /**@name Methods overloaded from Matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - virtual void TransMultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). It is assumed that the scaling factors are - * valid. */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - - /** X = beta*X + alpha*(Matrix S^{-1} Z). Specialized - * implementation missing so far! - */ - virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z, - Vector& X) const; - - /** X = S^{-1} (r + alpha*Z*M^Td). Specialized implementation - * missing so far! - */ - virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S, - const Vector& R, const Vector& Z, - const Vector& D, Vector& X) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - ScaledMatrix(); - - /** Copy Constructor */ - ScaledMatrix(const ScaledMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const ScaledMatrix&); - //@} - - /** const version of the unscaled matrix */ - SmartPtr matrix_; - /** non-const version of the unscaled matrix */ - SmartPtr nonconst_matrix_; - - /** Matrix space stored as a ScaledMatrixSpace */ - SmartPtr owner_space_; - }; - - /** This is the matrix space for ScaledMatrix. - */ - class ScaledMatrixSpace : public MatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of row and columns blocks, as - * well as the totel number of rows and columns. - */ - ScaledMatrixSpace(const SmartPtr& row_scaling, - bool row_scaling_reciprocal, - const SmartPtr& unscaled_matrix_space, - const SmartPtr& column_scaling, - bool column_scaling_reciprocal); - - /** Destructor */ - ~ScaledMatrixSpace() - {} - //@} - - /** Method for creating a new matrix of this specific type. */ - ScaledMatrix* MakeNewScaledMatrix(bool allocate_unscaled_matrix = false) const - { - ScaledMatrix* ret = new ScaledMatrix(this); - if (allocate_unscaled_matrix) { - SmartPtr unscaled_matrix = unscaled_matrix_space_->MakeNew(); - ret->SetUnscaledMatrixNonConst(unscaled_matrix); - } - return ret; - } - - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewScaledMatrix(); - } - - /** return the vector for the row scaling */ - SmartPtr RowScaling() const - { - return ConstPtr(row_scaling_); - } - - /** return the matrix space for the unscaled matrix */ - SmartPtr UnscaledMatrixSpace() const - { - return unscaled_matrix_space_; - } - - /** return the vector for the column scaling */ - SmartPtr ColumnScaling() const - { - return ConstPtr(column_scaling_); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default constructor */ - ScaledMatrixSpace(); - - /** Copy Constructor */ - ScaledMatrixSpace(const ScaledMatrixSpace&); - - /** Overloaded Equals Operator */ - ScaledMatrixSpace& operator=(const ScaledMatrixSpace&); - //@} - - /** Row scaling vector */ - SmartPtr row_scaling_; - /** unscaled matrix space */ - SmartPtr unscaled_matrix_space_; - /** column scaling vector */ - SmartPtr column_scaling_; - }; - - inline - void ScaledMatrix::SetUnscaledMatrix(const SmartPtr unscaled_matrix) - { - matrix_ = unscaled_matrix; - nonconst_matrix_ = NULL; - ObjectChanged(); - } - - inline - void ScaledMatrix::SetUnscaledMatrixNonConst(const SmartPtr& unscaled_matrix) - { - nonconst_matrix_ = unscaled_matrix; - matrix_ = GetRawPtr(unscaled_matrix); - ObjectChanged(); - } - - inline - SmartPtr ScaledMatrix::GetUnscaledMatrix() const - { - return matrix_; - } - - inline - SmartPtr ScaledMatrix::GetUnscaledMatrixNonConst() - { - DBG_ASSERT(IsValid(nonconst_matrix_)); - ObjectChanged(); - return nonconst_matrix_; - } - - inline - SmartPtr ScaledMatrix::RowScaling() const - { - return ConstPtr(owner_space_->RowScaling()); - } - - inline - SmartPtr ScaledMatrix::ColumnScaling() const - { - return ConstPtr(owner_space_->ColumnScaling()); - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpSearchDirCalculator.hpp b/thirdparty/linux/include/coin1/IpSearchDirCalculator.hpp deleted file mode 100644 index 3425c43c..00000000 --- a/thirdparty/linux/include/coin1/IpSearchDirCalculator.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2005, 2007 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSearchDirCalculator.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Andreas Waechter IBM 2005-10-13 - -#ifndef __IPSEARCHDIRCALCULATOR_HPP__ -#define __IPSEARCHDIRCALCULATOR_HPP__ - -#include "IpAlgStrategy.hpp" - -namespace Ipopt -{ - - /** Base class for computing the search direction for the line - * search. - */ - class SearchDirectionCalculator : public AlgorithmStrategyObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - SearchDirectionCalculator() - {} - - /** Default destructor */ - virtual ~SearchDirectionCalculator() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** Pure virtual method for computing the search direction. The - * computed direction is stored in IpData().delta().*/ - virtual bool ComputeSearchDirection()=0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - // SearchDirectionCalculator(); - - /** Copy Constructor */ - SearchDirectionCalculator(const SearchDirectionCalculator&); - - /** Overloaded Equals Operator */ - void operator=(const SearchDirectionCalculator&); - //@} - - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpSmartPtr.hpp b/thirdparty/linux/include/coin1/IpSmartPtr.hpp deleted file mode 100644 index dec0ab56..00000000 --- a/thirdparty/linux/include/coin1/IpSmartPtr.hpp +++ /dev/null @@ -1,734 +0,0 @@ -// Copyright (C) 2004, 2011 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSmartPtr.hpp 2182 2013-03-30 20:02:18Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSMARTPTR_HPP__ -#define __IPSMARTPTR_HPP__ - -#include "IpReferenced.hpp" - -#include "IpDebug.hpp" -#if COIN_IPOPT_CHECKLEVEL > 2 -# define IP_DEBUG_SMARTPTR -#endif -#ifndef IPOPT_UNUSED -# if defined(__GNUC__) -# define IPOPT_UNUSED __attribute__((unused)) -# else -# define IPOPT_UNUSED -# endif -#endif - -namespace Ipopt -{ - - /** Template class for Smart Pointers. - * A SmartPtr behaves much like a raw pointer, but manages the lifetime - * of an object, deleting the object automatically. This class implements - * a reference-counting, intrusive smart pointer design, where all - * objects pointed to must inherit off of ReferencedObject, which - * stores the reference count. Although this is intrusive (native types - * and externally authored classes require wrappers to be referenced - * by smart pointers), it is a safer design. A more detailed discussion of - * these issues follows after the usage information. - * - * Usage Example: - * Note: to use the SmartPtr, all objects to which you point MUST - * inherit off of ReferencedObject. - * - * \verbatim - * - * In MyClass.hpp... - * - * #include "IpReferenced.hpp" - - * namespace Ipopt { - * - * class MyClass : public ReferencedObject // must derive from ReferencedObject - * { - * ... - * } - * } // namespace Ipopt - * - * - * In my_usage.cpp... - * - * #include "IpSmartPtr.hpp" - * #include "MyClass.hpp" - * - * void func(AnyObject& obj) - * { - * SmartPtr ptr_to_myclass = new MyClass(...); - * // ptr_to_myclass now points to a new MyClass, - * // and the reference count is 1 - * - * ... - * - * obj.SetMyClass(ptr_to_myclass); - * // Here, let's assume that AnyObject uses a - * // SmartPtr internally here. - * // Now, both ptr_to_myclass and the internal - * // SmartPtr in obj point to the same MyClass object - * // and its reference count is 2. - * - * ... - * - * // No need to delete ptr_to_myclass, this - * // will be done automatically when the - * // reference count drops to zero. - * - * } - * - * \endverbatim - * - * It is not necessary to use SmartPtr's in all cases where an - * object is used that has been allocated "into" a SmartPtr. It is - * possible to just pass objects by reference or regular pointers, - * even if lower down in the stack a SmartPtr is to be held on to. - * Everything should work fine as long as a pointer created by "new" - * is immediately passed into a SmartPtr, and if SmartPtr's are used - * to hold on to objects. - * - * Other Notes: - * The SmartPtr implements both dereference operators -> & *. - * The SmartPtr does NOT implement a conversion operator to - * the raw pointer. Use the GetRawPtr() method when this - * is necessary. Make sure that the raw pointer is NOT - * deleted. - * The SmartPtr implements the comparison operators == & != - * for a variety of types. Use these instead of - * \verbatim - * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this - * \endverbatim - * SmartPtr's, as currently implemented, do NOT handle circular references. - * For example: consider a higher level object using SmartPtrs to point to - * A and B, but A and B also point to each other (i.e. A has a SmartPtr - * to B and B has a SmartPtr to A). In this scenario, when the higher - * level object is finished with A and B, their reference counts will - * never drop to zero (since they reference each other) and they - * will not be deleted. This can be detected by memory leak tools like - * valgrind. If the circular reference is necessary, the problem can be - * overcome by a number of techniques: - * - * 1) A and B can have a method that "releases" each other, that is - * they set their internal SmartPtrs to NULL. - * \verbatim - * void AClass::ReleaseCircularReferences() - * { - * smart_ptr_to_B = NULL; - * } - * \endverbatim - * Then, the higher level class can call these methods before - * it is done using A & B. - * - * 2) Raw pointers can be used in A and B to reference each other. - * Here, an implicit assumption is made that the lifetime is - * controlled by the higher level object and that A and B will - * both exist in a controlled manner. Although this seems - * dangerous, in many situations, this type of referencing - * is very controlled and this is reasonably safe. - * - * 3) This SmartPtr class could be redesigned with the Weak/Strong - * design concept. Here, the SmartPtr is identified as being - * Strong (controls lifetime of the object) or Weak (merely - * referencing the object). The Strong SmartPtr increments - * (and decrements) the reference count in ReferencedObject - * but the Weak SmartPtr does not. In the example above, - * the higher level object would have Strong SmartPtrs to - * A and B, but A and B would have Weak SmartPtrs to each - * other. Then, when the higher level object was done with - * A and B, they would be deleted. The Weak SmartPtrs in A - * and B would not decrement the reference count and would, - * of course, not delete the object. This idea is very similar - * to item (2), where it is implied that the sequence of events - * is controlled such that A and B will not call anything using - * their pointers following the higher level delete (i.e. in - * their destructors!). This is somehow safer, however, because - * code can be written (however expensive) to perform run-time - * detection of this situation. For example, the ReferencedObject - * could store pointers to all Weak SmartPtrs that are referencing - * it and, in its destructor, tell these pointers that it is - * dying. They could then set themselves to NULL, or set an - * internal flag to detect usage past this point. - * - * Comments on Non-Intrusive Design: - * In a non-intrusive design, the reference count is stored somewhere other - * than the object being referenced. This means, unless the reference - * counting pointer is the first referencer, it must get a pointer to the - * referenced object from another smart pointer (so it has access to the - * reference count location). In this non-intrusive design, if we are - * pointing to an object with a smart pointer (or a number of smart - * pointers), and we then give another smart pointer the address through - * a RAW pointer, we will have two independent, AND INCORRECT, reference - * counts. To avoid this pitfall, we use an intrusive reference counting - * technique where the reference count is stored in the object being - * referenced. - */ - template - class SmartPtr : public Referencer - { - public: -#define ipopt_dbg_smartptr_verbosity 0 - - /**@name Constructors/Destructors */ - //@{ - /** Default constructor, initialized to NULL */ - SmartPtr(); - - /** Copy constructor, initialized from copy of type T */ - SmartPtr(const SmartPtr& copy); - - /** Copy constructor, initialized from copy of type U */ - template - SmartPtr(const SmartPtr& copy); - - /** Constructor, initialized from T* ptr */ - SmartPtr(T* ptr); - - /** Destructor, automatically decrements the - * reference count, deletes the object if - * necessary.*/ - ~SmartPtr(); - //@} - - /**@name Overloaded operators. */ - //@{ - /** Overloaded arrow operator, allows the user to call - * methods using the contained pointer. */ - T* operator->() const; - - /** Overloaded dereference operator, allows the user - * to dereference the contained pointer. */ - T& operator*() const; - - /** Overloaded equals operator, allows the user to - * set the value of the SmartPtr from a raw pointer */ - SmartPtr& operator=(T* rhs); - - /** Overloaded equals operator, allows the user to - * set the value of the SmartPtr from another - * SmartPtr */ - SmartPtr& operator=(const SmartPtr& rhs); - - /** Overloaded equals operator, allows the user to - * set the value of the SmartPtr from another - * SmartPtr of a different type */ - template - SmartPtr& operator=(const SmartPtr& rhs); - - /** Overloaded equality comparison operator, allows the - * user to compare the value of two SmartPtrs */ - template - friend - bool operator==(const SmartPtr& lhs, const SmartPtr& rhs); - - /** Overloaded equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator==(const SmartPtr& lhs, U2* raw_rhs); - - /** Overloaded equality comparison operator, allows the - * user to compare the value of a raw pointer with a SmartPtr. */ - template - friend - bool operator==(U1* lhs, const SmartPtr& raw_rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of two SmartPtrs */ - template - friend - bool operator!=(const SmartPtr& lhs, const SmartPtr& rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator!=(const SmartPtr& lhs, U2* raw_rhs); - - /** Overloaded in-equality comparison operator, allows the - * user to compare the value of a SmartPtr with a raw pointer. */ - template - friend - bool operator!=(U1* lhs, const SmartPtr& raw_rhs); - - /** Overloaded less-than comparison operator, allows the - * user to compare the value of two SmartPtrs */ - template - friend - bool operator<(const SmartPtr& lhs, const SmartPtr& rhs); - //@} - - /**@name friend method declarations. */ - //@{ - /** Returns the raw pointer contained. - * Use to get the value of - * the raw ptr (i.e. to pass to other - * methods/functions, etc.) - * Note: This method does NOT copy, - * therefore, modifications using this - * value modify the underlying object - * contained by the SmartPtr, - * NEVER delete this returned value. - */ - template - friend - U* GetRawPtr(const SmartPtr& smart_ptr); - - /** Returns a const pointer */ - template - friend - SmartPtr ConstPtr(const SmartPtr& smart_ptr); - - /** Returns true if the SmartPtr is NOT NULL. - * Use this to check if the SmartPtr is not null - * This is preferred to if(GetRawPtr(sp) != NULL) - */ - template - friend - bool IsValid(const SmartPtr& smart_ptr); - - /** Returns true if the SmartPtr is NULL. - * Use this to check if the SmartPtr IsNull. - * This is preferred to if(GetRawPtr(sp) == NULL) - */ - template - friend - bool IsNull(const SmartPtr& smart_ptr); - //@} - - private: - /**@name Private Data/Methods */ - //@{ - /** Actual raw pointer to the object. */ - T* ptr_; - - /** Set the value of the internal raw pointer - * from another raw pointer, releasing the - * previously referenced object if necessary. */ - SmartPtr& SetFromRawPtr_(T* rhs); - - /** Set the value of the internal raw pointer - * from a SmartPtr, releasing the previously referenced - * object if necessary. */ - SmartPtr& SetFromSmartPtr_(const SmartPtr& rhs); - - /** Release the currently referenced object. */ - void ReleasePointer_(); - //@} - }; - - /**@name SmartPtr friend function declarations.*/ - //@{ - template - U* GetRawPtr(const SmartPtr& smart_ptr); - - template - SmartPtr ConstPtr(const SmartPtr& smart_ptr); - - template - bool IsNull(const SmartPtr& smart_ptr); - - template - bool IsValid(const SmartPtr& smart_ptr); - - template - bool operator==(const SmartPtr& lhs, const SmartPtr& rhs); - - template - bool operator==(const SmartPtr& lhs, U2* raw_rhs); - - template - bool operator==(U1* lhs, const SmartPtr& raw_rhs); - - template - bool operator!=(const SmartPtr& lhs, const SmartPtr& rhs); - - template - bool operator!=(const SmartPtr& lhs, U2* raw_rhs); - - template - bool operator!=(U1* lhs, const SmartPtr& raw_rhs); - - //@} - - - template - SmartPtr::SmartPtr() - : - ptr_(0) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr::SmartPtr()", ipopt_dbg_smartptr_verbosity); -#endif - -#ifndef NDEBUG - const ReferencedObject* IPOPT_UNUSED trying_to_use_SmartPtr_with_an_object_that_does_not_inherit_from_ReferencedObject_ = ptr_; -#endif - - } - - - template - SmartPtr::SmartPtr(const SmartPtr& copy) - : - ptr_(0) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr::SmartPtr(const SmartPtr& copy)", ipopt_dbg_smartptr_verbosity); -#endif - -#ifndef NDEBUG - const ReferencedObject* IPOPT_UNUSED trying_to_use_SmartPtr_with_an_object_that_does_not_inherit_from_ReferencedObject_ = ptr_; -#endif - - (void) SetFromSmartPtr_(copy); - } - - - template - template - SmartPtr::SmartPtr(const SmartPtr& copy) - : - ptr_(0) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr::SmartPtr(const SmartPtr& copy)", ipopt_dbg_smartptr_verbosity); -#endif - -#ifndef NDEBUG - const ReferencedObject* IPOPT_UNUSED trying_to_use_SmartPtr_with_an_object_that_does_not_inherit_from_ReferencedObject_ = ptr_; -#endif - - (void) SetFromSmartPtr_(GetRawPtr(copy)); - } - - - template - SmartPtr::SmartPtr(T* ptr) - : - ptr_(0) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr::SmartPtr(T* ptr)", ipopt_dbg_smartptr_verbosity); -#endif - -#ifndef NDEBUG - const ReferencedObject* IPOPT_UNUSED trying_to_use_SmartPtr_with_an_object_that_does_not_inherit_from_ReferencedObject_ = ptr_; -#endif - - (void) SetFromRawPtr_(ptr); - } - - template - SmartPtr::~SmartPtr() - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr::~SmartPtr(T* ptr)", ipopt_dbg_smartptr_verbosity); -#endif - - ReleasePointer_(); - } - - - template - T* SmartPtr::operator->() const - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("T* SmartPtr::operator->()", ipopt_dbg_smartptr_verbosity); -#endif - - // cannot deref a null pointer -#if COIN_IPOPT_CHECKLEVEL > 0 - assert(ptr_); -#endif - - return ptr_; - } - - - template - T& SmartPtr::operator*() const - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("T& SmartPtr::operator*()", ipopt_dbg_smartptr_verbosity); -#endif - - // cannot dereference a null pointer -#if COIN_IPOPT_CHECKLEVEL > 0 - assert(ptr_); -#endif - - return *ptr_; - } - - - template - SmartPtr& SmartPtr::operator=(T* rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH("SmartPtr& SmartPtr::operator=(T* rhs)", ipopt_dbg_smartptr_verbosity); -#endif - - return SetFromRawPtr_(rhs); - } - - - template - SmartPtr& SmartPtr::operator=(const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH( - "SmartPtr& SmartPtr::operator=(const SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - return SetFromSmartPtr_(rhs); - } - - - template - template - SmartPtr& SmartPtr::operator=(const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH( - "SmartPtr& SmartPtr::operator=(const SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - return SetFromSmartPtr_(GetRawPtr(rhs)); - } - - - template - SmartPtr& SmartPtr::SetFromRawPtr_(T* rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH( - "SmartPtr& SmartPtr::SetFromRawPtr_(T* rhs)", ipopt_dbg_smartptr_verbosity); -#endif - - if (rhs != 0) - rhs->AddRef(this); - - // Release any old pointer - ReleasePointer_(); - - ptr_ = rhs; - - return *this; - } - - template - SmartPtr& SmartPtr::SetFromSmartPtr_(const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH( - "SmartPtr& SmartPtr::SetFromSmartPtr_(const SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - SetFromRawPtr_(GetRawPtr(rhs)); - - return (*this); - } - - - template - void SmartPtr::ReleasePointer_() - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_METH( - "void SmartPtr::ReleasePointer()", - ipopt_dbg_smartptr_verbosity); -#endif - - if (ptr_) { - ptr_->ReleaseRef(this); - if (ptr_->ReferenceCount() == 0) - delete ptr_; - } - } - - - template - U* GetRawPtr(const SmartPtr& smart_ptr) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "T* GetRawPtr(const SmartPtr& smart_ptr)", - 0); -#endif - - return smart_ptr.ptr_; - } - - template - SmartPtr ConstPtr(const SmartPtr& smart_ptr) - { - // compiler should implicitly cast - return GetRawPtr(smart_ptr); - } - - template - bool IsValid(const SmartPtr& smart_ptr) - { - return !IsNull(smart_ptr); - } - - template - bool IsNull(const SmartPtr& smart_ptr) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool IsNull(const SmartPtr& smart_ptr)", - 0); -#endif - - return (smart_ptr.ptr_ == 0); - } - - - template - bool ComparePointers(const U1* lhs, const U2* rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool ComparePtrs(const U1* lhs, const U2* rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - // Even if lhs and rhs point to the same object - // with different interfaces U1 and U2, we cannot guarantee that - // the value of the pointers will be equivalent. We can - // guarantee this if we convert to ReferencedObject* (see also #162) - const ReferencedObject* v_lhs = lhs; - const ReferencedObject* v_rhs = rhs; - - return v_lhs == v_rhs; - } - - template - bool operator==(const SmartPtr& lhs, const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator==(const SmartPtr& lhs, const SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - U1* raw_lhs = GetRawPtr(lhs); - U2* raw_rhs = GetRawPtr(rhs); - return ComparePointers(raw_lhs, raw_rhs); - } - - template - bool operator==(const SmartPtr& lhs, U2* raw_rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator==(SmartPtr& lhs, U2* rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - U1* raw_lhs = GetRawPtr(lhs); - return ComparePointers(raw_lhs, raw_rhs); - } - - template - bool operator==(U1* raw_lhs, const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator==(U1* raw_lhs, SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - const U2* raw_rhs = GetRawPtr(rhs); - return ComparePointers(raw_lhs, raw_rhs); - } - - template - bool operator!=(const SmartPtr& lhs, const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator!=(const SmartPtr& lhs, const SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - bool retValue = operator==(lhs, rhs); - return !retValue; - } - - template - bool operator!=(const SmartPtr& lhs, U2* raw_rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator!=(SmartPtr& lhs, U2* rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - bool retValue = operator==(lhs, raw_rhs); - return !retValue; - } - - template - bool operator!=(U1* raw_lhs, const SmartPtr& rhs) - { -#ifdef IP_DEBUG_SMARTPTR - DBG_START_FUN( - "bool operator!=(U1* raw_lhs, SmartPtr& rhs)", - ipopt_dbg_smartptr_verbosity); -#endif - - bool retValue = operator==(raw_lhs, rhs); - return !retValue; - } - - template - void swap(SmartPtr& a, SmartPtr& b) - { -#ifdef IP_DEBUG_REFERENCED - SmartPtr tmp(a); - a = b; - b = tmp; -#else - std::swap(a.prt_, b.ptr_); -#endif - } - - template - bool operator<(const SmartPtr& lhs, const SmartPtr& rhs) - { - return lhs.ptr_ < rhs.ptr_; - } - - template - bool operator> (const SmartPtr& lhs, const SmartPtr& rhs) - { - return rhs < lhs; - } - - template bool - operator<=(const SmartPtr& lhs, const SmartPtr& rhs) - { - return !( rhs < lhs ); - } - - template bool - operator>=(const SmartPtr& lhs, const SmartPtr& rhs) - { - return !( lhs < rhs ); - } -} // namespace Ipopt - -#undef ipopt_dbg_smartptr_verbosity - -#endif diff --git a/thirdparty/linux/include/coin1/IpSolveStatistics.hpp b/thirdparty/linux/include/coin1/IpSolveStatistics.hpp deleted file mode 100644 index 625ddfbf..00000000 --- a/thirdparty/linux/include/coin1/IpSolveStatistics.hpp +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (C) 2005, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSolveStatistics.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2005-08-15 - -#ifndef __IPSOLVESTATISTICS_HPP__ -#define __IPSOLVESTATISTICS_HPP__ - -#include "IpReferenced.hpp" -#include "IpSmartPtr.hpp" - -namespace Ipopt -{ - // forward declaration (to avoid inclusion of too many header files) - class IpoptNLP; - class IpoptData; - class IpoptCalculatedQuantities; - - /** This class collects statistics about an optimziation run, such - * as iteration count, final infeasibilities etc. It is meant to - * provide such information to a user of Ipopt during the - * finalize_solution call. - */ - class SolveStatistics : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor. It takes in those collecting Ipopt - * objects that can provide the statistics information. Those - * statistics are retrieved at the time of the constructor - * call. */ - SolveStatistics(const SmartPtr& ip_nlp, - const SmartPtr& ip_data, - const SmartPtr& ip_cq); - - /** Default destructor */ - virtual ~SolveStatistics() - {} - //@} - - /** @name Accessor methods for retrieving different kind of solver - * statistics information */ - //@{ - /** Iteration counts. */ - virtual Index IterationCount() const; - /** Total CPU time, including function evaluations. */ - virtual Number TotalCpuTime() const; - /** Total CPU time, including function evaluations. Included for - * backward compatibility. */ - Number TotalCPUTime() const - { - return TotalCpuTime(); - } - /** Total System time, including function evaluations. */ - virtual Number TotalSysTime() const; - /** Total wall clock time, including function evaluations. */ - virtual Number TotalWallclockTime() const; - /** Number of NLP function evaluations. */ - virtual void NumberOfEvaluations(Index& num_obj_evals, - Index& num_constr_evals, - Index& num_obj_grad_evals, - Index& num_constr_jac_evals, - Index& num_hess_evals) const; - /** Unscaled solution infeasibilities */ - virtual void Infeasibilities(Number& dual_inf, - Number& constr_viol, - Number& complementarity, - Number& kkt_error) const; - /** Scaled solution infeasibilities */ - virtual void ScaledInfeasibilities(Number& scaled_dual_inf, - Number& scaled_constr_viol, - Number& scaled_complementarity, - Number& scaled_kkt_error) const; - /** Final value of objective function */ - virtual Number FinalObjective() const; - /** Final scaled value of objective function */ - virtual Number FinalScaledObjective() const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - SolveStatistics(); - - /** Copy Constructor */ - SolveStatistics(const SolveStatistics&); - - /** Overloaded Equals Operator */ - void operator=(const SolveStatistics&); - //@} - - /** @name Fields for storing the statistics data */ - //@{ - /** Number of iterations. */ - Index num_iters_; - /* Total CPU time */ - Number total_cpu_time_; - /* Total system time */ - Number total_sys_time_; - /* Total wall clock time */ - Number total_wallclock_time_; - /** Number of objective function evaluations. */ - Index num_obj_evals_; - /** Number of constraints evaluations (max of equality and - * inequality) */ - Index num_constr_evals_; - /** Number of objective gradient evaluations. */ - Index num_obj_grad_evals_; - /** Number of constraint Jacobian evaluations. */ - Index num_constr_jac_evals_; - /** Number of Lagrangian Hessian evaluations. */ - Index num_hess_evals_; - - /** Final scaled value of objective function */ - Number scaled_obj_val_; - /** Final unscaled value of objective function */ - Number obj_val_; - /** Final scaled dual infeasibility (max-norm) */ - Number scaled_dual_inf_; - /** Final unscaled dual infeasibility (max-norm) */ - Number dual_inf_; - /** Final scaled constraint violation (max-norm) */ - Number scaled_constr_viol_; - /** Final unscaled constraint violation (max-norm) */ - Number constr_viol_; - /** Final scaled complementarity error (max-norm) */ - Number scaled_compl_; - /** Final unscaled complementarity error (max-norm) */ - Number compl_; - /** Final overall scaled KKT error (max-norm) */ - Number scaled_kkt_error_; - /** Final overall unscaled KKT error (max-norm) */ - Number kkt_error_; - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpStdCInterface.h b/thirdparty/linux/include/coin1/IpStdCInterface.h deleted file mode 100644 index 4f113367..00000000 --- a/thirdparty/linux/include/coin1/IpStdCInterface.h +++ /dev/null @@ -1,271 +0,0 @@ -/************************************************************************* - Copyright (C) 2004, 2010 International Business Machines and others. - All Rights Reserved. - This code is published under the Eclipse Public License. - - $Id: IpStdCInterface.h 2082 2012-02-16 03:00:34Z andreasw $ - - Authors: Carl Laird, Andreas Waechter IBM 2004-09-02 - *************************************************************************/ - -#ifndef __IPSTDCINTERFACE_H__ -#define __IPSTDCINTERFACE_H__ - -#ifndef IPOPT_EXPORT -#ifdef _MSC_VER -#ifdef IPOPT_DLL -#define IPOPT_EXPORT(type) __declspec(dllexport) type __cdecl -#else -#define IPOPT_EXPORT(type) type __cdecl -#endif -#else -#define IPOPT_EXPORT(type) type -#endif -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - - /** Type for all number. We need to make sure that this is - identical with what is defined in Common/IpTypes.hpp */ - typedef double Number; - - /** Type for all incides. We need to make sure that this is - identical with what is defined in Common/IpTypes.hpp */ - typedef int Index; - - /** Type for all integers. We need to make sure that this is - identical with what is defined in Common/IpTypes.hpp */ - typedef int Int; - - /* This includes the SolverReturn enum type */ -#include "IpReturnCodes.h" - - /** Structure collecting all information about the problem - * definition and solve statistics etc. This is defined in the - * source file. */ - struct IpoptProblemInfo; - - /** Pointer to a Ipopt Problem. */ - typedef struct IpoptProblemInfo* IpoptProblem; - - /** define a boolean type for C */ - typedef int Bool; -#ifndef TRUE -# define TRUE (1) -#endif -#ifndef FALSE -# define FALSE (0) -#endif - - /** A pointer for anything that is to be passed between the called - * and individual callback function */ - typedef void * UserDataPtr; - - /** Type defining the callback function for evaluating the value of - * the objective function. Return value should be set to false if - * there was a problem doing the evaluation. */ - typedef Bool (*Eval_F_CB)(Index n, Number* x, Bool new_x, - Number* obj_value, UserDataPtr user_data); - - /** Type defining the callback function for evaluating the gradient of - * the objective function. Return value should be set to false if - * there was a problem doing the evaluation. */ - typedef Bool (*Eval_Grad_F_CB)(Index n, Number* x, Bool new_x, - Number* grad_f, UserDataPtr user_data); - - /** Type defining the callback function for evaluating the value of - * the constraint functions. Return value should be set to false if - * there was a problem doing the evaluation. */ - typedef Bool (*Eval_G_CB)(Index n, Number* x, Bool new_x, - Index m, Number* g, UserDataPtr user_data); - - /** Type defining the callback function for evaluating the Jacobian of - * the constrant functions. Return value should be set to false if - * there was a problem doing the evaluation. */ - typedef Bool (*Eval_Jac_G_CB)(Index n, Number *x, Bool new_x, - Index m, Index nele_jac, - Index *iRow, Index *jCol, Number *values, - UserDataPtr user_data); - - /** Type defining the callback function for evaluating the Hessian of - * the Lagrangian function. Return value should be set to false if - * there was a problem doing the evaluation. */ - typedef Bool (*Eval_H_CB)(Index n, Number *x, Bool new_x, Number obj_factor, - Index m, Number *lambda, Bool new_lambda, - Index nele_hess, Index *iRow, Index *jCol, - Number *values, UserDataPtr user_data); - - /** Type defining the callback function for giving intermediate - * execution control to the user. If set, it is called once per - * iteration, providing the user with some information on the state - * of the optimization. This can be used to print some - * user-defined output. It also gives the user a way to terminate - * the optimization prematurely. If this method returns false, - * Ipopt will terminate the optimization. */ - typedef Bool (*Intermediate_CB)(Index alg_mod, /* 0 is regular, 1 is resto */ - Index iter_count, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, UserDataPtr user_data); - - /** Function for creating a new Ipopt Problem object. This function - * returns an object that can be passed to the IpoptSolve call. It - * contains the basic definition of the optimization problem, such - * as number of variables and constraints, bounds on variables and - * constraints, information about the derivatives, and the callback - * function for the computation of the optimization problem - * functions and derivatives. During this call, the options file - * PARAMS.DAT is read as well. - * - * If NULL is returned, there was a problem with one of the inputs - * or reading the options file. */ - IPOPT_EXPORT(IpoptProblem) CreateIpoptProblem( - Index n /** Number of optimization variables */ - , Number* x_L /** Lower bounds on variables. This array of - size n is copied internally, so that the - caller can change the incoming data after - return without that IpoptProblem is - modified. Any value less or equal than - the number specified by option - 'nlp_lower_bound_inf' is interpreted to - be minus infinity. */ - , Number* x_U /** Upper bounds on variables. This array of - size n is copied internally, so that the - caller can change the incoming data after - return without that IpoptProblem is - modified. Any value greater or equal - than the number specified by option - 'nlp_upper_bound_inf' is interpreted to - be plus infinity. */ - , Index m /** Number of constraints. */ - , Number* g_L /** Lower bounds on constraints. This array of - size m is copied internally, so that the - caller can change the incoming data after - return without that IpoptProblem is - modified. Any value less or equal than - the number specified by option - 'nlp_lower_bound_inf' is interpreted to - be minus infinity. */ - , Number* g_U /** Upper bounds on constraints. This array of - size m is copied internally, so that the - caller can change the incoming data after - return without that IpoptProblem is - modified. Any value greater or equal - than the number specified by option - 'nlp_upper_bound_inf' is interpreted to - be plus infinity. */ - , Index nele_jac /** Number of non-zero elements in constraint - Jacobian. */ - , Index nele_hess /** Number of non-zero elements in Hessian of - Lagrangian. */ - , Index index_style /** indexing style for iRow & jCol, - 0 for C style, 1 for Fortran style */ - , Eval_F_CB eval_f /** Callback function for evaluating - objective function */ - , Eval_G_CB eval_g /** Callback function for evaluating - constraint functions */ - , Eval_Grad_F_CB eval_grad_f - /** Callback function for evaluating gradient - of objective function */ - , Eval_Jac_G_CB eval_jac_g - /** Callback function for evaluating Jacobian - of constraint functions */ - , Eval_H_CB eval_h /** Callback function for evaluating Hessian - of Lagrangian function */ - ); - - /** Method for freeing a previously created IpoptProblem. After - freeing an IpoptProblem, it cannot be used anymore. */ - IPOPT_EXPORT(void) FreeIpoptProblem(IpoptProblem ipopt_problem); - - - /** Function for adding a string option. Returns FALSE the option - * could not be set (e.g., if keyword is unknown) */ - IPOPT_EXPORT(Bool) AddIpoptStrOption(IpoptProblem ipopt_problem, char* keyword, char* val); - - /** Function for adding a Number option. Returns FALSE the option - * could not be set (e.g., if keyword is unknown) */ - IPOPT_EXPORT(Bool) AddIpoptNumOption(IpoptProblem ipopt_problem, char* keyword, Number val); - - /** Function for adding an Int option. Returns FALSE the option - * could not be set (e.g., if keyword is unknown) */ - IPOPT_EXPORT(Bool) AddIpoptIntOption(IpoptProblem ipopt_problem, char* keyword, Int val); - - /** Function for opening an output file for a given name with given - * printlevel. Returns false, if there was a problem opening the - * file. */ - IPOPT_EXPORT(Bool) OpenIpoptOutputFile(IpoptProblem ipopt_problem, char* file_name, - Int print_level); - - /** Optional function for setting scaling parameter for the NLP. - * This corresponds to the get_scaling_parameters method in TNLP. - * If the pointers x_scaling or g_scaling are NULL, then no scaling - * for x resp. g is done. */ - IPOPT_EXPORT(Bool) SetIpoptProblemScaling(IpoptProblem ipopt_problem, - Number obj_scaling, - Number* x_scaling, - Number* g_scaling); - - /** Setting a callback function for the "intermediate callback" - * method in the TNLP. This gives control back to the user once - * per iteration. If set, it provides the user with some - * information on the state of the optimization. This can be used - * to print some user-defined output. It also gives the user a way - * to terminate the optimization prematurely. If the callback - * method returns false, Ipopt will terminate the optimization. - * Calling this set method to set the CB pointer to NULL disables - * the intermediate callback functionality. */ - IPOPT_EXPORT(Bool) SetIntermediateCallback(IpoptProblem ipopt_problem, - Intermediate_CB intermediate_cb); - - /** Function calling the Ipopt optimization algorithm for a problem - previously defined with CreateIpoptProblem. The return - specified outcome of the optimization procedure (e.g., success, - failure etc). - */ - IPOPT_EXPORT(enum ApplicationReturnStatus) IpoptSolve( - IpoptProblem ipopt_problem - /** Problem that is to be optimized. Ipopt - will use the options previously specified with - AddIpoptOption (etc) for this problem. */ - , Number* x /** Input: Starting point - Output: Optimal solution */ - , Number* g /** Values of constraint at final point - (output only - ignored if set to NULL) */ - , Number* obj_val /** Final value of objective function - (output only - ignored if set to NULL) */ - , Number* mult_g /** Input: Initial values for the constraint - multipliers (only if warm start option - is chosen) - Output: Final multipliers for constraints - (ignored if set to NULL) */ - , Number* mult_x_L /** Input: Initial values for the multipliers for - lower variable bounds (only if warm start - option is chosen) - Output: Final multipliers for lower variable - bounds (ignored if set to NULL) */ - , Number* mult_x_U /** Input: Initial values for the multipliers for - upper variable bounds (only if warm start - option is chosen) - Output: Final multipliers for upper variable - bounds (ignored if set to NULL) */ - , UserDataPtr user_data - /** Pointer to user data. This will be - passed unmodified to the callback - functions. */ - ); - - /** - void IpoptStatisticsCounts; - - void IpoptStatisticsInfeasibilities; */ -#ifdef __cplusplus -} /* extern "C" { */ -#endif - -#endif diff --git a/thirdparty/linux/include/coin1/IpSumSymMatrix.hpp b/thirdparty/linux/include/coin1/IpSumSymMatrix.hpp deleted file mode 100644 index 42b11686..00000000 --- a/thirdparty/linux/include/coin1/IpSumSymMatrix.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSumSymMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSUMSYMMATRIX_HPP__ -#define __IPSUMSYMMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class SumSymMatrixSpace; - - /** Class for Matrices which are sum of symmetric matrices. - * For each term in the we store the matrix and a factor. - */ - class SumSymMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, initializing with dimensions of the matrix and - * the number of terms in the sum. - */ - SumSymMatrix(const SumSymMatrixSpace* owner_space); - - /** Destructor */ - ~SumSymMatrix(); - //@} - - /** Method for setting term iterm for the sum. Note that counting - * of terms starts at 0. */ - void SetTerm(Index iterm, Number factor, const SymMatrix& matrix); - - /** Method for getting term iterm for the sum. Note that counting - * of terms starts at 0. */ - void GetTerm(Index iterm, Number& factor, SmartPtr& matrix) const; - - /** Return the number of terms */ - Index NTerms() const; - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - SumSymMatrix(); - - /** Copy Constructor */ - SumSymMatrix(const SumSymMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const SumSymMatrix&); - //@} - - /** std::vector storing the factors for each term. */ - std::vector factors_; - - /** std::vector storing the matrices for each term. */ - std::vector > matrices_; - - /** Copy of the owner_space as a SumSymMatrixSpace */ - const SumSymMatrixSpace* owner_space_; - }; - - /** Class for matrix space for SumSymMatrix */ - class SumSymMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the dimension of the matrix and the number - * of terms in the sum. */ - SumSymMatrixSpace(Index ndim, Index nterms) - : - SymMatrixSpace(ndim), - nterms_(nterms) - {} - - /** Destructor */ - ~SumSymMatrixSpace() - {} - //@} - - /** @name Accessor functions */ - //@{ - /** Number of terms in the sum. */ - Index NTerms() const - { - return nterms_; - } - //@} - - /** Use this method to set the matrix spaces for the various terms. - * You will not be able to create a matrix until all these spaces - * are set. */ - void SetTermSpace(Index term_idx, const SymMatrixSpace& space); - - /** Get the matix space for a particular term */ - SmartPtr GetTermSpace(Index term_idx) const; - - /** Method for creating a new matrix of this specific type. */ - SumSymMatrix* MakeNewSumSymMatrix() const; - - /** Overloaded MakeNew method for the SymMatrixSpace base class. - */ - virtual SymMatrix* MakeNewSymMatrix() const; - - private: - Index nterms_; - - std::vector< SmartPtr > term_spaces_; - }; - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpSymLinearSolver.hpp b/thirdparty/linux/include/coin1/IpSymLinearSolver.hpp deleted file mode 100644 index 82e7dd4b..00000000 --- a/thirdparty/linux/include/coin1/IpSymLinearSolver.hpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSymLinearSolver.hpp 2322 2013-06-12 17:45:57Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSYMLINEARSOLVER_HPP__ -#define __IPSYMLINEARSOLVER_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" -#include "IpAlgStrategy.hpp" -#include - -namespace Ipopt -{ - - /** Enum to report outcome of a linear solve */ - enum ESymSolverStatus { - /** Successful solve */ - SYMSOLVER_SUCCESS, - /** Matrix seems to be singular; solve was aborted */ - SYMSOLVER_SINGULAR, - /** The number of negative eigenvalues is not correct */ - SYMSOLVER_WRONG_INERTIA, - /** Call the solver interface again after the matrix values have - * been restored */ - SYMSOLVER_CALL_AGAIN, - /** Unrecoverable error in linear solver occurred. The - * optimization will be aborted. */ - SYMSOLVER_FATAL_ERROR - }; - - /** Base class for all derived symmetric linear - * solvers. In the full space version of Ipopt a large linear - * system has to be solved for the augmented system. This case is - * meant to be the base class for all derived linear solvers for - * symmetric matrices (of type SymMatrix). - * - * A linear solver can be used repeatedly for matrices with - * identical structure of nonzero elements. The nonzero structure - * of those matrices must not be changed between calls. - * - * The called might ask the solver to only solve the linear system - * if the system is nonsingular, and if the number of negative - * eigenvalues matches a given number. - */ - class SymLinearSolver: public AlgorithmStrategyObject - { - public: - /** @name Constructor/Destructor */ - //@{ - SymLinearSolver() - {} - - virtual ~SymLinearSolver() - {} - //@} - - /** overloaded from AlgorithmStrategyObject */ - virtual bool InitializeImpl(const OptionsList& options, - const std::string& prefix) = 0; - - /** @name Methods for requesting solution of the linear system. */ - //@{ - /** Solve operation for multiple right hand sides. Solves the - * linear system A * Sol = Rhs with multiple right hand sides. If - * necessary, A is factorized. Correct solutions are only - * guaranteed if the return values is SYMSOLVER_SUCCESS. The - * solver will return SYMSOLVER_SINGULAR if the linear system is - * singular, and it will return SYMSOLVER_WRONG_INERTIA if - * check_NegEVals is true and the number of negative eigenvalues - * in the matrix does not match numberOfNegEVals. - * - * check_NegEVals cannot be chosen true, if ProvidesInertia() - * returns false. - */ - virtual ESymSolverStatus MultiSolve(const SymMatrix &A, - std::vector >& rhsV, - std::vector >& solV, - bool check_NegEVals, - Index numberOfNegEVals)=0; - - /** Solve operation for a single right hand side. Solves the - * linear system A * Sol = Rhs. See MultiSolve for more - * details. */ - ESymSolverStatus Solve(const SymMatrix &A, - const Vector& rhs, Vector& sol, - bool check_NegEVals, - Index numberOfNegEVals) - { - std::vector > rhsV(1); - rhsV[0] = &rhs; - std::vector > solV(1); - solV[0] = / - return MultiSolve(A, rhsV, solV, check_NegEVals, - numberOfNegEVals); - } - - /** Number of negative eigenvalues detected during last - * factorization. Returns the number of negative eigenvalues of - * the most recent factorized matrix. This must not be called if - * the linear solver does not compute this quantities (see - * ProvidesInertia). - */ - virtual Index NumberOfNegEVals() const =0; - //@} - - //* @name Options of Linear solver */ - //@{ - /** Request to increase quality of solution for next solve. - * Ask linear solver to increase quality of solution for the next - * solve (e.g. increase pivot tolerance). Returns false, if this - * is not possible (e.g. maximal pivot tolerance already used.) - */ - virtual bool IncreaseQuality() =0; - - /** Query whether inertia is computed by linear solver. - * Returns true, if linear solver provides inertia. - */ - virtual bool ProvidesInertia() const =0; - //@} - }; - - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpSymMatrix.hpp b/thirdparty/linux/include/coin1/IpSymMatrix.hpp deleted file mode 100644 index 4a0137ba..00000000 --- a/thirdparty/linux/include/coin1/IpSymMatrix.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSymMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSYMMATRIX_HPP__ -#define __IPSYMMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class SymMatrixSpace; - - /** This is the base class for all derived symmetric matrix types. - */ - class SymMatrix : public Matrix - { - public: - /** @name Constructor/Destructor */ - //@{ - /** Constructor, taking the owner_space. - */ - inline - SymMatrix(const SymMatrixSpace* owner_space); - - /** Destructor */ - virtual ~SymMatrix() - {} - //@} - - /** @name Information about the size of the matrix */ - //@{ - /** Dimension of the matrix (number of rows and columns) */ - inline - Index Dim() const; - //@} - - inline - SmartPtr OwnerSymMatrixSpace() const; - - protected: - /** @name Overloaded methods from Matrix. */ - //@{ - /** Since the matrix is - * symmetric, it is only necessary to implement the - * MultVectorImpl method in a class that inherits from this base - * class. If the TransMultVectorImpl is called, this base class - * automatically calls MultVectorImpl instead. */ - virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta, - Vector& y) const - { - // Since this matrix is symetric, this is the same operation as - // MultVector - MultVector(alpha, x, beta, y); - } - /** Since the matrix is symmetric, the row and column max norms - * are identical */ - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const - { - ComputeRowAMaxImpl(cols_norms, init); - } - //@} - - private: - /** Copy of the owner space ptr as a SymMatrixSpace instead - * of a MatrixSpace - */ - const SymMatrixSpace* owner_space_; - }; - - - /** SymMatrixSpace base class, corresponding to the SymMatrix base - * class. */ - class SymMatrixSpace : public MatrixSpace - { - public: - /** @name Constructors/Destructors */ - //@{ - /** Constructor, given the dimension (identical to the number of - * rows and columns). - */ - SymMatrixSpace(Index dim) - : - MatrixSpace(dim,dim) - {} - - /** Destructor */ - virtual ~SymMatrixSpace() - {} - //@} - - /** Pure virtual method for creating a new matrix of this specific - * type. */ - virtual SymMatrix* MakeNewSymMatrix() const=0; - - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewSymMatrix(); - } - - /** Accessor method for the dimension of the matrices in this - * matrix space. - */ - Index Dim() const - { - DBG_ASSERT(NRows() == NCols()); - return NRows(); - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** default constructor */ - SymMatrixSpace(); - - /* Copy constructor */ - SymMatrixSpace(const SymMatrixSpace&); - - /** Overloaded Equals Operator */ - SymMatrixSpace& operator=(const SymMatrixSpace&); - //@} - - }; - - /* inline methods */ - inline - SymMatrix::SymMatrix(const SymMatrixSpace* owner_space) - : - Matrix(owner_space), - owner_space_(owner_space) - {} - - inline - Index SymMatrix::Dim() const - { - return owner_space_->Dim(); - } - - inline - SmartPtr SymMatrix::OwnerSymMatrixSpace() const - { - return owner_space_; - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpSymScaledMatrix.hpp b/thirdparty/linux/include/coin1/IpSymScaledMatrix.hpp deleted file mode 100644 index d58742f9..00000000 --- a/thirdparty/linux/include/coin1/IpSymScaledMatrix.hpp +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSymScaledMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSYMSCALEDMATRIX_HPP__ -#define __IPSYMSCALEDMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class SymScaledMatrixSpace; - - /** Class for a Matrix in conjunction with its scaling factors for - * row and column scaling. Operations on the matrix are performed using - * the scaled matrix. You can pull out the pointer to the - * unscaled matrix for unscaled calculations. - */ - class SymScaledMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the owner_space. - */ - SymScaledMatrix(const SymScaledMatrixSpace* owner_space); - - /** Destructor */ - ~SymScaledMatrix(); - //@} - - /** Set the unscaled matrix */ - void SetUnscaledMatrix(const SmartPtr unscaled_matrix); - - /** Set the unscaled matrix in a non-const version */ - void SetUnscaledMatrixNonConst(const SmartPtr& unscaled_matrix); - - /** Return the unscaled matrix in const form */ - SmartPtr GetUnscaledMatrix() const; - - /** Return the unscaled matrix in non-const form */ - SmartPtr GetUnscaledMatrixNonConst(); - - /** return the vector for the row and column scaling */ - SmartPtr RowColScaling() const; - - protected: - /**@name Methods overloaded from Matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). It is assumed here that the scaling factors - * are always valid numbers. */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - SymScaledMatrix(); - - /** Copy Constructor */ - SymScaledMatrix(const SymScaledMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const SymScaledMatrix&); - //@} - - /** const version of the unscaled matrix */ - SmartPtr matrix_; - /** non-const version of the unscaled matrix */ - SmartPtr nonconst_matrix_; - - /** Matrix space stored as a SymScaledMatrixSpace */ - SmartPtr owner_space_; - }; - - /** This is the matrix space for SymScaledMatrix. - */ - class SymScaledMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of row and columns blocks, as - * well as the totel number of rows and columns. - */ - SymScaledMatrixSpace(const SmartPtr& row_col_scaling, - bool row_col_scaling_reciprocal, - const SmartPtr& unscaled_matrix_space) - : - SymMatrixSpace(unscaled_matrix_space->Dim()), - unscaled_matrix_space_(unscaled_matrix_space) - { - scaling_ = row_col_scaling->MakeNewCopy(); - if (row_col_scaling_reciprocal) { - scaling_->ElementWiseReciprocal(); - } - } - - /** Destructor */ - ~SymScaledMatrixSpace() - {} - //@} - - /** Method for creating a new matrix of this specific type. */ - SymScaledMatrix* MakeNewSymScaledMatrix(bool allocate_unscaled_matrix = false) const - { - SymScaledMatrix* ret = new SymScaledMatrix(this); - if (allocate_unscaled_matrix) { - SmartPtr unscaled_matrix = unscaled_matrix_space_->MakeNewSymMatrix(); - ret->SetUnscaledMatrixNonConst(unscaled_matrix); - } - return ret; - } - - /** Overloaded method from SymMatrixSpace */ - virtual SymMatrix* MakeNewSymMatrix() const - { - return MakeNewSymScaledMatrix(); - } - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewSymScaledMatrix(); - } - - /** return the vector for the row and column scaling */ - SmartPtr RowColScaling() const - { - return ConstPtr(scaling_); - } - - /** return the matrix space for the unscaled matrix */ - SmartPtr UnscaledMatrixSpace() const - { - return unscaled_matrix_space_; - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default constructor */ - SymScaledMatrixSpace(); - - /** Copy Constructor */ - SymScaledMatrixSpace(const SymScaledMatrixSpace&); - - /** Overloaded Equals Operator */ - SymScaledMatrixSpace& operator=(const SymScaledMatrixSpace&); - //@} - - /** Row scaling vector */ - SmartPtr scaling_; - /** unscaled matrix space */ - SmartPtr unscaled_matrix_space_; - }; - - inline - void SymScaledMatrix::SetUnscaledMatrix(const SmartPtr unscaled_matrix) - { - matrix_ = unscaled_matrix; - nonconst_matrix_ = NULL; - ObjectChanged(); - } - - inline - void SymScaledMatrix::SetUnscaledMatrixNonConst(const SmartPtr& unscaled_matrix) - { - nonconst_matrix_ = unscaled_matrix; - matrix_ = GetRawPtr(unscaled_matrix); - ObjectChanged(); - } - - inline - SmartPtr SymScaledMatrix::GetUnscaledMatrix() const - { - return matrix_; - } - - inline - SmartPtr SymScaledMatrix::GetUnscaledMatrixNonConst() - { - DBG_ASSERT(IsValid(nonconst_matrix_)); - ObjectChanged(); - return nonconst_matrix_; - } - - inline SmartPtr SymScaledMatrix::RowColScaling() const - { - return ConstPtr(owner_space_->RowColScaling()); - } - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpSymTMatrix.hpp b/thirdparty/linux/include/coin1/IpSymTMatrix.hpp deleted file mode 100644 index ead2d85f..00000000 --- a/thirdparty/linux/include/coin1/IpSymTMatrix.hpp +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpSymTMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPSYMTMATRIX_HPP__ -#define __IPSYMTMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /* forward declarations */ - class SymTMatrixSpace; - - /** Class for symmetric matrices stored in triplet format. In the - * triplet format, the nonzeros elements of a symmetric matrix is - * stored in three arrays, Irn, Jcn, and Values, all of length - * Nonzeros. The first two arrays indicate the location of a - * non-zero element (as the row and column indices), and the last - * array stores the value at that location. Off-diagonal elements - * need to be stored only once since the matrix is symmetric. For - * example, the element \f$a_{1,2}=a_{2,1}\f$ would be stored only - * once, either with Irn[i]=1 and Jcn[i]=2, or with Irn[i]=2 and - * Jcn[i]=1. Both representations are identical. If nonzero - * elements (or their symmetric counter part) are listed more than - * once, their values are added. - * - * The structure of the nonzeros (i.e. the arrays Irn and Jcn) - * cannot be changed after the matrix can been initialized. Only - * the values of the nonzero elements can be modified. - * - * Note that the first row and column of a matrix has index 1, not - * 0. - * - */ - class SymTMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the corresponding matrix space. - */ - SymTMatrix(const SymTMatrixSpace* owner_space); - - /** Destructor */ - ~SymTMatrix(); - //@} - - /**@name Changing the Values.*/ - //@{ - /** Set values of nonzero elements. The values of the nonzero - * elements is copied from the incoming Number array. Important: - * It is assume that the order of the values in Values - * corresponds to the one of Irn and Jcn given to the matrix - * space. */ - void SetValues(const Number* Values); - //@} - - /** @name Accessor Methods */ - //@{ - /** Number of nonzero entries */ - Index Nonzeros() const; - - /** Obtain pointer to the internal Index array irn_ without the - * intention to change the matrix data (USE WITH CARE!). This - * does not produce a copy, and lifetime is not guaranteed! - */ - const Index* Irows() const; - - /** Obtain pointer to the internal Index array jcn_ without the - * intention to change the matrix data (USE WITH CARE!). This - * does not produce a copy, and lifetime is not guaranteed! - */ - const Index* Jcols() const; - - /** Obtain pointer to the internal Number array values_ with the - * intention to change the matrix data (USE WITH CARE!). This - * does not produce a copy, and lifetime is not guaranteed! - */ - Number* Values(); - /** Obtain pointer to the internal Number array values_ without the - * intention to change the matrix data (USE WITH CARE!). This - * does not produce a copy, and lifetime is not guaranteed! - */ - const Number* Values() const; - //@} - - /**@name Methods for providing copy of the matrix data */ - //@{ - /** Copy the nonzero structure into provided space */ - void FillStruct(ipfint* Irn, ipfint* Jcn) const; - - /** Copy the value data into provided space */ - void FillValues(Number* Values) const; - //@} - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, Number beta, - Vector& y) const; - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - virtual bool HasValidNumbersImpl() const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const; - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - SymTMatrix(); - - /** Copy Constructor */ - SymTMatrix(const SymTMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const SymTMatrix&); - //@} - - /** Copy of the owner_space ptr as a SymTMatrixSpace insteaqd - * of a MatrixSpace - */ - const SymTMatrixSpace* owner_space_; - - /** Values of nonzeros */ - Number* values_; - - /** Flag for Initialization */ - bool initialized_; - - }; - - /** This is the matrix space for a SymTMatrix with fixed sparsity - * structure. The sparsity structure is stored here in the matrix - * space. - */ - class SymTMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of rows and columns (both as - * dim), as well as the number of nonzeros and the position of - * the nonzero elements. Note that the counting of the nonzeros - * starts a 1, i.e., iRows[i]==1 and jCols[i]==1 refers to the - * first element in the first row. This is in accordance with - * the HSL data structure. Off-diagonal elements are stored only - * once. - */ - SymTMatrixSpace(Index dim, Index nonZeros, const Index* iRows, - const Index* jCols); - - /** Destructor */ - ~SymTMatrixSpace(); - //@} - - /** Overloaded MakeNew method for the sYMMatrixSpace base class. - */ - virtual SymMatrix* MakeNewSymMatrix() const - { - return MakeNewSymTMatrix(); - } - - /** Method for creating a new matrix of this specific type. */ - SymTMatrix* MakeNewSymTMatrix() const - { - return new SymTMatrix(this); - } - - /**@name Methods describing Matrix structure */ - //@{ - /** Number of non-zeros in the sparse matrix */ - Index Nonzeros() const - { - return nonZeros_; - } - - /** Row index of each non-zero element */ - const Index* Irows() const - { - return iRows_; - } - - /** Column index of each non-zero element */ - const Index* Jcols() const - { - return jCols_; - } - //@} - - private: - /**@name Methods called by SymTMatrix for memory management */ - //@{ - /** Allocate internal storage for the SymTMatrix values */ - Number* AllocateInternalStorage() const; - - /** Deallocate internal storage for the SymTMatrix values */ - void FreeInternalStorage(Number* values) const; - //@} - - const Index nonZeros_; - Index* iRows_; - Index* jCols_; - - friend class SymTMatrix; - }; - - /* Inline Methods */ - inline - Index SymTMatrix::Nonzeros() const - { - return owner_space_->Nonzeros(); - } - - inline - const Index* SymTMatrix::Irows() const - { - return owner_space_->Irows(); - } - - inline - const Index* SymTMatrix::Jcols() const - { - return owner_space_->Jcols(); - } - - -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpTNLP.hpp b/thirdparty/linux/include/coin1/IpTNLP.hpp deleted file mode 100644 index 998d38e8..00000000 --- a/thirdparty/linux/include/coin1/IpTNLP.hpp +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTNLP.hpp 2212 2013-04-14 14:51:52Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPTNLP_HPP__ -#define __IPTNLP_HPP__ - -#include "IpUtils.hpp" -#include "IpReferenced.hpp" -#include "IpException.hpp" -#include "IpAlgTypes.hpp" -#include "IpReturnCodes.hpp" - -#include - -namespace Ipopt -{ - // forward declarations - class IpoptData; - class IpoptCalculatedQuantities; - class IteratesVector; - - /** Base class for all NLP's that use standard triplet matrix form - * and dense vectors. This is the standard base class for all - * NLP's that use the standard triplet matrix form (as for Harwell - * routines) and dense vectors. The class TNLPAdapter then converts - * this interface to an interface that can be used directly by - * ipopt. - * - * This interface presents the problem form: - * - * min f(x) - * - * s.t. gL <= g(x) <= gU - * - * xL <= x <= xU - * - * In order to specify an equality constraint, set gL_i = gU_i = - * rhs. The value that indicates "infinity" for the bounds - * (i.e. the variable or constraint has no lower bound (-infinity) - * or upper bound (+infinity)) is set through the option - * nlp_lower_bound_inf and nlp_upper_bound_inf. To indicate that a - * variable has no upper or lower bound, set the bound to - * -ipopt_inf or +ipopt_inf respectively - */ - class TNLP : public ReferencedObject - { - public: - /** Type of the constraints*/ - enum LinearityType - { - LINEAR/** Constraint/Variable is linear.*/, - NON_LINEAR/**Constraint/Varaible is non-linear.*/ - }; - - /**@name Constructors/Destructors */ - //@{ - TNLP() - {} - - /** Default destructor */ - virtual ~TNLP() - {} - //@} - - DECLARE_STD_EXCEPTION(INVALID_TNLP); - - /**@name methods to gather information about the NLP */ - //@{ - /** overload this method to return the number of variables - * and constraints, and the number of non-zeros in the jacobian and - * the hessian. The index_style parameter lets you specify C or Fortran - * style indexing for the sparse matrix iRow and jCol parameters. - * C_STYLE is 0-based, and FORTRAN_STYLE is 1-based. - */ - enum IndexStyleEnum { C_STYLE=0, FORTRAN_STYLE=1 }; - virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, - Index& nnz_h_lag, IndexStyleEnum& index_style)=0; - - typedef std::map > StringMetaDataMapType; - typedef std::map > IntegerMetaDataMapType; - typedef std::map > NumericMetaDataMapType; - - /** overload this method to return any meta data for - * the variables and the constraints */ - virtual bool get_var_con_metadata(Index n, - StringMetaDataMapType& var_string_md, - IntegerMetaDataMapType& var_integer_md, - NumericMetaDataMapType& var_numeric_md, - Index m, - StringMetaDataMapType& con_string_md, - IntegerMetaDataMapType& con_integer_md, - NumericMetaDataMapType& con_numeric_md) - - { - return false; - } - - /** overload this method to return the information about the bound - * on the variables and constraints. The value that indicates - * that a bound does not exist is specified in the parameters - * nlp_lower_bound_inf and nlp_upper_bound_inf. By default, - * nlp_lower_bound_inf is -1e19 and nlp_upper_bound_inf is - * 1e19. (see TNLPAdapter) */ - virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u, - Index m, Number* g_l, Number* g_u)=0; - - /** overload this method to return scaling parameters. This is - * only called if the options are set to retrieve user scaling. - * There, use_x_scaling (or use_g_scaling) should get set to true - * only if the variables (or constraints) are to be scaled. This - * method should return true only if the scaling parameters could - * be provided. - */ - virtual bool get_scaling_parameters(Number& obj_scaling, - bool& use_x_scaling, Index n, - Number* x_scaling, - bool& use_g_scaling, Index m, - Number* g_scaling) - { - return false; - } - - /** overload this method to return the variables linearity - * (TNLP::LINEAR or TNLP::NON_LINEAR). The var_types - * array has been allocated with length at least n. (default implementation - * just return false and does not fill the array).*/ - virtual bool get_variables_linearity(Index n, LinearityType* var_types) - { - return false; - } - - /** overload this method to return the constraint linearity. - * array has been allocated with length at least n. (default implementation - * just return false and does not fill the array).*/ - virtual bool get_constraints_linearity(Index m, LinearityType* const_types) - { - return false; - } - - /** overload this method to return the starting point. The bool - * variables indicate whether the algorithm wants you to - * initialize x, z_L/z_u, and lambda, respectively. If, for some - * reason, the algorithm wants you to initialize these and you - * cannot, return false, which will cause Ipopt to stop. You - * will have to run Ipopt with different options then. - */ - virtual bool get_starting_point(Index n, bool init_x, Number* x, - bool init_z, Number* z_L, Number* z_U, - Index m, bool init_lambda, - Number* lambda)=0; - - /** overload this method to provide an Ipopt iterate (already in - * the form Ipopt requires it internally) for a warm start. - * Since this is only for expert users, a default dummy - * implementation is provided and returns false. */ - virtual bool get_warm_start_iterate(IteratesVector& warm_start_iterate) - { - return false; - } - - /** overload this method to return the value of the objective function */ - virtual bool eval_f(Index n, const Number* x, bool new_x, - Number& obj_value)=0; - - /** overload this method to return the vector of the gradient of - * the objective w.r.t. x */ - virtual bool eval_grad_f(Index n, const Number* x, bool new_x, - Number* grad_f)=0; - - /** overload this method to return the vector of constraint values */ - virtual bool eval_g(Index n, const Number* x, bool new_x, - Index m, Number* g)=0; - /** overload this method to return the jacobian of the - * constraints. The vectors iRow and jCol only need to be set - * once. The first call is used to set the structure only (iRow - * and jCol will be non-NULL, and values will be NULL) For - * subsequent calls, iRow and jCol will be NULL. */ - virtual bool eval_jac_g(Index n, const Number* x, bool new_x, - Index m, Index nele_jac, Index* iRow, - Index *jCol, Number* values)=0; - - /** overload this method to return the hessian of the - * lagrangian. The vectors iRow and jCol only need to be set once - * (during the first call). The first call is used to set the - * structure only (iRow and jCol will be non-NULL, and values - * will be NULL) For subsequent calls, iRow and jCol will be - * NULL. This matrix is symmetric - specify the lower diagonal - * only. A default implementation is provided, in case the user - * wants to se quasi-Newton approximations to estimate the second - * derivatives and doesn't not neet to implement this method. */ - virtual bool eval_h(Index n, const Number* x, bool new_x, - Number obj_factor, Index m, const Number* lambda, - bool new_lambda, Index nele_hess, - Index* iRow, Index* jCol, Number* values) - { - return false; - } - //@} - - /** @name Solution Methods */ - //@{ - /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ - virtual void finalize_solution(SolverReturn status, - Index n, const Number* x, const Number* z_L, const Number* z_U, - Index m, const Number* g, const Number* lambda, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq)=0; - /** This method is called just before finalize_solution. With - * this method, the algorithm returns any metadata collected - * during its run, including the metadata provided by the user - * with the above get_var_con_metadata. Each metadata can be of - * type string, integer, and numeric. It can be associated to - * either the variables or the constraints. The metadata that - * was associated with the primal variable vector is stored in - * var_..._md. The metadata associated with the constraint - * multipliers is stored in con_..._md. The metadata associated - * with the bound multipliers is stored in var_..._md, with the - * suffixes "_z_L", and "_z_U", denoting lower and upper - * bounds. */ - virtual void finalize_metadata(Index n, - const StringMetaDataMapType& var_string_md, - const IntegerMetaDataMapType& var_integer_md, - const NumericMetaDataMapType& var_numeric_md, - Index m, - const StringMetaDataMapType& con_string_md, - const IntegerMetaDataMapType& con_integer_md, - const NumericMetaDataMapType& con_numeric_md) - {} - - - /** Intermediate Callback method for the user. Providing dummy - * default implementation. For details see IntermediateCallBack - * in IpNLP.hpp. */ - virtual bool intermediate_callback(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq) - { - return true; - } - //@} - - /** @name Methods for quasi-Newton approximation. If the second - * derivatives are approximated by Ipopt, it is better to do this - * only in the space of nonlinear variables. The following - * methods are call by Ipopt if the quasi-Newton approximation is - * selected. If -1 is returned as number of nonlinear variables, - * Ipopt assumes that all variables are nonlinear. Otherwise, it - * calls get_list_of_nonlinear_variables with an array into which - * the indices of the nonlinear variables should be written - the - * array has the lengths num_nonlin_vars, which is identical with - * the return value of get_number_of_nonlinear_variables(). It - * is assumed that the indices are counted starting with 1 in the - * FORTRAN_STYLE, and 0 for the C_STYLE. */ - //@{ - virtual Index get_number_of_nonlinear_variables() - { - return -1; - } - - virtual bool get_list_of_nonlinear_variables(Index num_nonlin_vars, - Index* pos_nonlin_vars) - { - return false; - } - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - //TNLP(); - - /** Copy Constructor */ - TNLP(const TNLP&); - - /** Overloaded Equals Operator */ - void operator=(const TNLP&); - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTNLPAdapter.hpp b/thirdparty/linux/include/coin1/IpTNLPAdapter.hpp deleted file mode 100644 index 6eea8e3b..00000000 --- a/thirdparty/linux/include/coin1/IpTNLPAdapter.hpp +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTNLPAdapter.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPTNLPADAPTER_HPP__ -#define __IPTNLPADAPTER_HPP__ - -#include "IpNLP.hpp" -#include "IpTNLP.hpp" -#include "IpOrigIpoptNLP.hpp" -#include - -namespace Ipopt -{ - - // forward declarations - class ExpansionMatrix; - class ExpansionMatrixSpace; - class IteratesVector; - class TDependencyDetector; - - /** This class Adapts the TNLP interface so it looks like an NLP interface. - * This is an Adapter class (Design Patterns) that converts a TNLP to an - * NLP. This allows users to write to the "more convenient" TNLP interface. - */ - class TNLPAdapter : public NLP - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor */ - TNLPAdapter(const SmartPtr tnlp, - const SmartPtr jnlst = NULL); - - /** Default destructor */ - virtual ~TNLPAdapter(); - //@} - - /**@name Exceptions */ - //@{ - DECLARE_STD_EXCEPTION(INVALID_TNLP); - DECLARE_STD_EXCEPTION(ERROR_IN_TNLP_DERIVATIVE_TEST); - //@} - - /** @name TNLPAdapter Initialization. */ - //@{ - virtual bool ProcessOptions(const OptionsList& options, - const std::string& prefix); - - /** Method for creating the derived vector / matrix types - * (Do not delete these, the ). */ - virtual bool GetSpaces(SmartPtr& x_space, - SmartPtr& c_space, - SmartPtr& d_space, - SmartPtr& x_l_space, - SmartPtr& px_l_space, - SmartPtr& x_u_space, - SmartPtr& px_u_space, - SmartPtr& d_l_space, - SmartPtr& pd_l_space, - SmartPtr& d_u_space, - SmartPtr& pd_u_space, - SmartPtr& Jac_c_space, - SmartPtr& Jac_d_space, - SmartPtr& Hess_lagrangian_space); - - /** Method for obtaining the bounds information */ - virtual bool GetBoundsInformation(const Matrix& Px_L, - Vector& x_L, - const Matrix& Px_U, - Vector& x_U, - const Matrix& Pd_L, - Vector& d_L, - const Matrix& Pd_U, - Vector& d_U); - - /** Method for obtaining the starting point - * for all the iterates. */ - virtual bool GetStartingPoint( - SmartPtr x, - bool need_x, - SmartPtr y_c, - bool need_y_c, - SmartPtr y_d, - bool need_y_d, - SmartPtr z_L, - bool need_z_L, - SmartPtr z_U, - bool need_z_U - ); - - /** Method for obtaining an entire iterate as a warmstart point. - * The incoming IteratesVector has to be filled. */ - virtual bool GetWarmStartIterate(IteratesVector& warm_start_iterate); - //@} - - /** @name TNLPAdapter evaluation routines. */ - //@{ - virtual bool Eval_f(const Vector& x, Number& f); - - virtual bool Eval_grad_f(const Vector& x, Vector& g_f); - - virtual bool Eval_c(const Vector& x, Vector& c); - - virtual bool Eval_jac_c(const Vector& x, Matrix& jac_c); - - virtual bool Eval_d(const Vector& x, Vector& d); - - virtual bool Eval_jac_d(const Vector& x, Matrix& jac_d); - - virtual bool Eval_h(const Vector& x, - Number obj_factor, - const Vector& yc, - const Vector& yd, - SymMatrix& h); - - virtual void GetScalingParameters( - const SmartPtr x_space, - const SmartPtr c_space, - const SmartPtr d_space, - Number& obj_scaling, - SmartPtr& x_scaling, - SmartPtr& c_scaling, - SmartPtr& d_scaling) const; - //@} - - /** @name Solution Reporting Methods */ - //@{ - virtual void FinalizeSolution(SolverReturn status, - const Vector& x, - const Vector& z_L, const Vector& z_U, - const Vector& c, const Vector& d, - const Vector& y_c, const Vector& y_d, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq); - - virtual bool IntermediateCallBack(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq); - //@} - - /** Method returning information on quasi-Newton approximation. */ - virtual void - GetQuasiNewtonApproximationSpaces(SmartPtr& approx_space, - SmartPtr& P_approx); - - /** Enum for treatment of fixed variables option */ - enum FixedVariableTreatmentEnum - { - MAKE_PARAMETER=0, - MAKE_CONSTRAINT, - RELAX_BOUNDS - }; - - /** Enum for specifying which derivative test is to be performed. */ - enum DerivativeTestEnum - { - NO_TEST=0, - FIRST_ORDER_TEST, - SECOND_ORDER_TEST, - ONLY_SECOND_ORDER_TEST - }; - - /** Enum for specifying technique for computing Jacobian */ - enum JacobianApproxEnum - { - JAC_EXACT=0, - JAC_FINDIFF_VALUES - }; - - /** Method for performing the derivative test */ - bool CheckDerivatives(DerivativeTestEnum deriv_test, - Index deriv_test_start_index); - - /** @name Methods for IpoptType */ - //@{ - static void RegisterOptions(SmartPtr roptions); - //@} - - /** Accessor method for the underlying TNLP. */ - SmartPtr tnlp() const - { - return tnlp_; - } - - /** @name Methods for translating data for IpoptNLP into the TNLP - * data. These methods are used to obtain the current (or - * final) data for the TNLP formulation from the IpoptNLP - * structure. */ - //@{ - /** Sort the primal variables, and add the fixed values in x */ - void ResortX(const Vector& x, Number* x_orig); - void ResortG(const Vector& c, const Vector& d, Number *g_orig); - void ResortBnds(const Vector& x_L, Number* x_L_orig, - const Vector& x_U, Number* x_U_orig); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - TNLPAdapter(const TNLPAdapter&); - - /** Overloaded Equals Operator */ - void operator=(const TNLPAdapter&); - //@} - - /** @name Method implementing the detection of linearly dependent - equality constraints */ - bool DetermineDependentConstraints(Index n_x_var, - const Index* x_not_fixed_map, - const Number* x_l, const Number* x_u, - const Number* g_l, const Number* g_u, - Index n_c, const Index* c_map, - std::list& c_deps); - - /** Pointer to the TNLP class (class specific to Number* vectors and - * harwell triplet matrices) */ - SmartPtr tnlp_; - - /** Journalist */ - SmartPtr jnlst_; - - /** Object that can be used to detect linearly dependent rows in - * the equality constraint Jacobian */ - SmartPtr dependency_detector_; - - /**@name Algorithmic parameters */ - //@{ - /** Value for a lower bound that denotes -infinity */ - Number nlp_lower_bound_inf_; - /** Value for a upper bound that denotes infinity */ - Number nlp_upper_bound_inf_; - /** Flag indicating how fixed variables should be handled */ - FixedVariableTreatmentEnum fixed_variable_treatment_; - /* Determines relaxation of fixing bound for RELAX_BOUNDS. */ - Number bound_relax_factor_; - /* Maximal slack for one-sidedly bounded variables. If a - * variable has only one bound, say a lower bound xL, then an - * upper bound xL + max_onesided_bound_slack_. If this value is - * zero, no upper bound is added. */ - /* Took this out: Number max_onesided_bound_slack_; */ - /** Enum indicating whether and which derivative test should be - * performed at starting point. */ - DerivativeTestEnum derivative_test_; - /** Size of the perturbation for the derivative test */ - Number derivative_test_perturbation_; - /** Relative threshold for marking deviation from finite - * difference test */ - Number derivative_test_tol_; - /** Flag indicating if all test values should be printed, or only - * those violating the threshold. */ - bool derivative_test_print_all_; - /** Index of first quantity to be checked. */ - Index derivative_test_first_index_; - /** Flag indicating whether the TNLP with identical structure has - * already been solved before. */ - bool warm_start_same_structure_; - /** Flag indicating what Hessian information is to be used. */ - HessianApproximationType hessian_approximation_; - /** Number of linear variables. */ - Index num_linear_variables_; - /** Flag indicating how Jacobian is computed. */ - JacobianApproxEnum jacobian_approximation_; - /** Size of the perturbation for the derivative approximation */ - Number findiff_perturbation_; - /** Maximal perturbation of the initial point */ - Number point_perturbation_radius_; - /** Flag indicating if rhs should be considered during dependency - * detection */ - bool dependency_detection_with_rhs_; - - /** Overall convergence tolerance */ - Number tol_; - //@} - - /**@name Problem Size Data */ - //@{ - /** full dimension of x (fixed + non-fixed) */ - Index n_full_x_; - /** full dimension of g (c + d) */ - Index n_full_g_; - /** non-zeros of the jacobian of c */ - Index nz_jac_c_; - /** non-zeros of the jacobian of c without added constraints for - * fixed variables. */ - Index nz_jac_c_no_extra_; - /** non-zeros of the jacobian of d */ - Index nz_jac_d_; - /** number of non-zeros in full-size Jacobian of g */ - Index nz_full_jac_g_; - /** number of non-zeros in full-size Hessian */ - Index nz_full_h_; - /** number of non-zeros in the non-fixed-size Hessian */ - Index nz_h_; - /** Number of fixed variables */ - Index n_x_fixed_; - //@} - - /** Numbering style of variables and constraints */ - TNLP::IndexStyleEnum index_style_; - - /** @name Local copy of spaces (for warm start) */ - //@{ - SmartPtr x_space_; - SmartPtr c_space_; - SmartPtr d_space_; - SmartPtr x_l_space_; - SmartPtr px_l_space_; - SmartPtr x_u_space_; - SmartPtr px_u_space_; - SmartPtr d_l_space_; - SmartPtr pd_l_space_; - SmartPtr d_u_space_; - SmartPtr pd_u_space_; - SmartPtr Jac_c_space_; - SmartPtr Jac_d_space_; - SmartPtr Hess_lagrangian_space_; - //@} - - /**@name Local Copy of the Data */ - //@{ - Number* full_x_; /** copy of the full x vector (fixed & non-fixed) */ - Number* full_lambda_; /** copy of lambda (yc & yd) */ - Number* full_g_; /** copy of g (c & d) */ - Number* jac_g_; /** the values for the full jacobian of g */ - Number* c_rhs_; /** the rhs values of c */ - //@} - - /**@name Tags for deciding when to update internal copies of vectors */ - //@{ - TaggedObject::Tag x_tag_for_iterates_; - TaggedObject::Tag y_c_tag_for_iterates_; - TaggedObject::Tag y_d_tag_for_iterates_; - TaggedObject::Tag x_tag_for_g_; - TaggedObject::Tag x_tag_for_jac_g_; - //@} - - /**@name Methods to update the values in the local copies of vectors */ - //@{ - bool update_local_x(const Vector& x); - bool update_local_lambda(const Vector& y_c, const Vector& y_d); - //@} - - /**@name Internal routines for evaluating g and jac_g (values stored since - * they are used in both c and d routines */ - //@{ - bool internal_eval_g(bool new_x); - bool internal_eval_jac_g(bool new_x); - //@} - - /** @name Internal methods for dealing with finite difference - approxation */ - //@{ - /** Initialize sparsity structure for finite difference Jacobian */ - void initialize_findiff_jac(const Index* iRow, const Index* jCol); - //@} - - /**@name Internal Permutation Spaces and matrices - */ - //@{ - /** Expansion from fixed x (ipopt) to full x */ - SmartPtr P_x_full_x_; - SmartPtr P_x_full_x_space_; - - /** Expansion from fixed x_L (ipopt) to full x */ - SmartPtr P_x_x_L_; - SmartPtr P_x_x_L_space_; - - /** Expansion from fixed x_U (ipopt) to full x */ - SmartPtr P_x_x_U_; - SmartPtr P_x_x_U_space_; - - /** Expansion from c only (ipopt) to full ampl c */ - SmartPtr P_c_g_space_; - SmartPtr P_c_g_; - - /** Expansion from d only (ipopt) to full ampl d */ - SmartPtr P_d_g_space_; - SmartPtr P_d_g_; - - Index* jac_idx_map_; - Index* h_idx_map_; - - /** Position of fixed variables. This is required for a warm start */ - Index* x_fixed_map_; - //@} - - /** @name Data for finite difference approximations of derivatives */ - //@{ - /** Number of unique nonzeros in constraint Jacobian */ - Index findiff_jac_nnz_; - /** Start position for nonzero indices in ja for each column of - Jacobian */ - Index* findiff_jac_ia_; - /** Ordered by columns, for each column the row indices in - Jacobian */ - Index* findiff_jac_ja_; - /** Position of entry in original triplet matrix */ - Index* findiff_jac_postriplet_; - /** Copy of the lower bounds */ - Number* findiff_x_l_; - /** Copy of the upper bounds */ - Number* findiff_x_u_; - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTNLPReducer.hpp b/thirdparty/linux/include/coin1/IpTNLPReducer.hpp deleted file mode 100644 index bce1478e..00000000 --- a/thirdparty/linux/include/coin1/IpTNLPReducer.hpp +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (C) 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTNLPReducer.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Andreas Waechter IBM 2008-08-10 - -#ifndef __IPTNLPREDUCER_HPP__ -#define __IPTNLPREDUCER_HPP__ - -#include "IpTNLP.hpp" - -namespace Ipopt -{ - /** This is a wrapper around a given TNLP class that takes out a - * list of constraints that are given to the constructor. It is - * provided for convenience, if one wants to experiment with - * problems that consist of only a subset of the constraints. But - * keep in mind that this is not efficient, since behind the scenes - * we are still evaluation all functions and derivatives, and are - * making copies of the original data. */ - class TNLPReducer : public TNLP - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor is given the indices of the constraints that - * should be taken out of the problem statement, as well as the - * original TNLP. */ - TNLPReducer(TNLP& tnlp, Index n_g_skip, const Index* index_g_skip, - Index n_xL_skip, const Index* index_xL_skip, - Index n_xU_skip, const Index* index_xU_skip, - Index n_x_fix, const Index* index_f_fix); - - /** Default destructor */ - virtual ~TNLPReducer(); - //@} - - /** @name Overloaded methods from TNLP */ - virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, - Index& nnz_h_lag, IndexStyleEnum& index_style); - - virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u, - Index m, Number* g_l, Number* g_u); - - virtual bool get_scaling_parameters(Number& obj_scaling, - bool& use_x_scaling, Index n, - Number* x_scaling, - bool& use_g_scaling, Index m, - Number* g_scaling); - - virtual bool get_variables_linearity(Index n, LinearityType* var_types); - - virtual bool get_constraints_linearity(Index m, LinearityType* const_types); - - virtual bool get_starting_point(Index n, bool init_x, Number* x, - bool init_z, Number* z_L, Number* z_U, - Index m, bool init_lambda, - Number* lambda); - - virtual bool get_warm_start_iterate(IteratesVector& warm_start_iterate); - - virtual bool eval_f(Index n, const Number* x, bool new_x, - Number& obj_value); - - virtual bool eval_grad_f(Index n, const Number* x, bool new_x, - Number* grad_f); - - virtual bool eval_g(Index n, const Number* x, bool new_x, - Index m, Number* g); - - virtual bool eval_jac_g(Index n, const Number* x, bool new_x, - Index m, Index nele_jac, Index* iRow, - Index *jCol, Number* values); - - virtual bool eval_h(Index n, const Number* x, bool new_x, - Number obj_factor, Index m, const Number* lambda, - bool new_lambda, Index nele_hess, - Index* iRow, Index* jCol, Number* values); - - virtual void finalize_solution(SolverReturn status, - Index n, const Number* x, const Number* z_L, const Number* z_U, - Index m, const Number* g, const Number* lambda, - Number obj_value, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq); - - virtual bool intermediate_callback(AlgorithmMode mode, - Index iter, Number obj_value, - Number inf_pr, Number inf_du, - Number mu, Number d_norm, - Number regularization_size, - Number alpha_du, Number alpha_pr, - Index ls_trials, - const IpoptData* ip_data, - IpoptCalculatedQuantities* ip_cq); - - virtual Index get_number_of_nonlinear_variables(); - - virtual bool get_list_of_nonlinear_variables(Index num_nonlin_vars, - Index* pos_nonlin_vars); - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - TNLPReducer(); - - /** Copy Constructor */ - TNLPReducer(const TNLPReducer&); - - /** Overloaded Equals Operator */ - void operator=(const TNLPReducer&); - //@} - - /** @name original TNLP */ - //@{ - SmartPtr tnlp_; - Index m_orig_; - Index nnz_jac_g_orig_; - //@} - - /** Number of constraints to be skipped */ - Index n_g_skip_; - - /** Array of indices of the constraints that are to be skipped. - * This is provided at the beginning in the constructor. */ - Index* index_g_skip_; - - /** Index style for original problem. Internally, we use C-Style - * now. */ - IndexStyleEnum index_style_orig_; - - /** Map from original constraints to new constraints. A -1 means - * that a constraint is skipped. */ - Index* g_keep_map_; - - /** Number of constraints in reduced NLP */ - Index m_reduced_; - - /** Number of Jacobian nonzeros in the reduced NLP */ - Index nnz_jac_g_reduced_; - - /** Number of Jacobian nonzeros that are skipped */ - Index nnz_jac_g_skipped_; - - /** Array of Jacobian elements that are to be skipped. This is in - * increasing order. */ - Index* jac_g_skipped_; - - /** Number of lower variable bounds to be skipped. */ - Index n_xL_skip_; - - /** Array of indices of the lower variable bounds to be skipped. */ - Index* index_xL_skip_; - - /** Number of upper variable bounds to be skipped. */ - Index n_xU_skip_; - - /** Array of indices of the upper variable bounds to be skipped. */ - Index* index_xU_skip_; - - /** Number of variables that are to be fixed to initial value. */ - Index n_x_fix_; - - /** Array of indices of the variables that are to be fixed. */ - Index* index_x_fix_; - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTaggedObject.hpp b/thirdparty/linux/include/coin1/IpTaggedObject.hpp deleted file mode 100644 index 7262c43b..00000000 --- a/thirdparty/linux/include/coin1/IpTaggedObject.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTaggedObject.hpp 2613 2015-11-04 14:42:02Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPTAGGEDOBJECT_HPP__ -#define __IPTAGGEDOBJECT_HPP__ - -#include "IpUtils.hpp" -#include "IpDebug.hpp" -#include "IpReferenced.hpp" -#include "IpObserver.hpp" -#include - -/* keyword to declare a thread-local variable according to http://en.wikipedia.org/wiki/Thread-local_storage - * GCC < 4.5 on MacOS X does not support TLS - * With Intel compiler on MacOS X, problems with TLS were reported. - */ -#ifndef IPOPT_THREAD_LOCAL - -#if defined(_MSC_VER) -#define IPOPT_THREAD_LOCAL __declspec(thread) -#elif defined(__APPLE__) && ((defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 405)) || defined(__INTEL_COMPILER)) -#define IPOPT_THREAD_LOCAL -#else -#define IPOPT_THREAD_LOCAL __thread -#endif - -#endif - -namespace Ipopt -{ - - /** TaggedObject class. - * Often, certain calculations or operations are expensive, - * and it can be very inefficient to perform these calculations - * again if the input to the calculation has not changed - * since the result was last stored. - * This base class provides an efficient mechanism to update - * a tag, indicating that the object has changed. - * Users of a TaggedObject class, need their own Tag data - * member to keep track of the state of the TaggedObject, the - * last time they performed a calculation. A basic use case for - * users of a class inheriting from TaggedObject follows like - * this: - * - * 1. Initialize your own Tag to zero in constructor. - * - * 2. Before an expensive calculation, - * check if the TaggedObject has changed, passing in - * your own Tag, indicating the last time you used - * the object for the calculation. If it has changed, - * perform the calculation again, and store the result. - * If it has not changed, simply return the stored result. - * - * Here is a simple example: - \verbatim - if (vector.HasChanged(my_vector_tag_)) { - my_vector_tag_ = vector.GetTag(); - result = PerformExpensiveCalculation(vector); - return result; - } - else { - return result; - } - \endverbatim - * - * Objects derived from TaggedObject must indicate that they have changed to - * the base class using the protected member function ObjectChanged(). For - * example, a Vector class, inside its own set method, MUST call - * ObjectChanged() to update the internally stored tag for comparison. - */ - class TaggedObject : public ReferencedObject, public Subject - { - public: - /** Type for the Tag values */ - typedef unsigned int Tag; - - /** Constructor. */ - TaggedObject() - : - Subject() - { - ObjectChanged(); - } - - /** Destructor. */ - virtual ~TaggedObject() - {} - - /** Users of TaggedObjects call this to - * update their own internal tags every time - * they perform the expensive operation. - */ - Tag GetTag() const - { - return tag_; - } - - /** Users of TaggedObjects call this to - * check if the object HasChanged since - * they last updated their own internal - * tag. - */ - bool HasChanged(const Tag comparison_tag) const - { - return (comparison_tag == tag_) ? false : true; - } - protected: - /** Objects derived from TaggedObject MUST call this - * method every time their internal state changes to - * update the internal tag for comparison - */ - void ObjectChanged() - { - DBG_START_METH("TaggedObject::ObjectChanged()", 0); - tag_ = unique_tag_; - unique_tag_++; - DBG_ASSERT(unique_tag_ < std::numeric_limits::max()); - // The Notify method from the Subject base class notifies all - // registered Observers that this subject has changed. - Notify(Observer::NT_Changed); - } - private: - /**@name Default Compiler Generated Methods (Hidden to avoid - * implicit creation/calling). These methods are not implemented - * and we do not want the compiler to implement them for us, so we - * declare them private and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - TaggedObject(const TaggedObject&); - - /** Overloaded Equals Operator */ - void operator=(const TaggedObject&); - //@} - - /** static data member that is incremented every - * time ANY TaggedObject changes. This allows us - * to obtain a unique Tag when the object changes - */ - static IPOPT_THREAD_LOCAL Tag unique_tag_; - - /** The tag indicating the current state of the object. - * We use this to compare against the comparison_tag - * in the HasChanged method. This member is updated - * from the unique_tag_ every time the object changes. - */ - Tag tag_; - - /** The index indicating the cache priority for this - * TaggedObject. If a result that depended on this - * TaggedObject is cached, it will be cached with this - * priority - */ - Index cache_priority_; - }; -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpTimedTask.hpp b/thirdparty/linux/include/coin1/IpTimedTask.hpp deleted file mode 100644 index a1c5bac7..00000000 --- a/thirdparty/linux/include/coin1/IpTimedTask.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (C) 2006, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTimedTask.hpp 1861 2010-12-21 21:34:47Z andreasw $ -// -// Authors: Andreas Waechter IBM 2005-09-19 - -#ifndef __IPTIMEDTASK_HPP__ -#define __IPTIMEDTASK_HPP__ - -#include "IpUtils.hpp" - -namespace Ipopt -{ - /** This class is used to collect timing information for a - * particular task. */ - class TimedTask - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor. */ - TimedTask() - : - total_cputime_(0.), - total_systime_(0.), - total_walltime_(0.), - start_called_(false), - end_called_(true) - {} - - /** Default destructor */ - ~TimedTask() - {} - //@} - - /** Method for resetting time to zero. */ - void Reset() - { - total_cputime_ = 0.; - total_systime_ = 0.; - total_walltime_ = 0.; - start_called_ = false; - end_called_ = true; - } - - /** Method that is called before execution of the task. */ - void Start() - { - DBG_ASSERT(end_called_); - DBG_ASSERT(!start_called_); - end_called_ = false; - start_called_ = true; - start_cputime_ = CpuTime(); - start_systime_ = SysTime(); - start_walltime_ = WallclockTime(); - } - - /** Method that is called after execution of the task. */ - void End() - { - DBG_ASSERT(!end_called_); - DBG_ASSERT(start_called_); - end_called_ = true; - start_called_ = false; - total_cputime_ += CpuTime() - start_cputime_; - total_systime_ += SysTime() - start_systime_; - total_walltime_ += WallclockTime() - start_walltime_; - } - - /** Method that is called after execution of the task for which - * timing might have been started. This only updates the timing - * if the timing has indeed been conducted. This is useful to - * stop timing after catching exceptions. */ - void EndIfStarted() - { - if (start_called_) { - end_called_ = true; - start_called_ = false; - total_cputime_ += CpuTime() - start_cputime_; - total_systime_ += SysTime() - start_systime_; - total_walltime_ += WallclockTime() - start_walltime_; - } - DBG_ASSERT(end_called_); - } - - /** Method returning total CPU time spend for task so far. */ - Number TotalCpuTime() const - { - DBG_ASSERT(end_called_); - return total_cputime_; - } - - /** Method returning total system time spend for task so far. */ - Number TotalSysTime() const - { - DBG_ASSERT(end_called_); - return total_systime_; - } - - /** Method returning total wall clock time spend for task so far. */ - Number TotalWallclockTime() const - { - DBG_ASSERT(end_called_); - return total_walltime_; - } - - private: - /**@name Default Compiler Generated Methods (Hidden to avoid - * implicit creation/calling). These methods are not - * implemented and we do not want the compiler to implement them - * for us, so we declare them private and do not define - * them. This ensures that they will not be implicitly - * created/called. */ - //@{ - /** Copy Constructor */ - TimedTask(const TimedTask&); - - /** Overloaded Equals Operator */ - void operator=(const TimedTask&); - //@} - - /** CPU time at beginning of task. */ - Number start_cputime_; - /** Total CPU time for task measured so far. */ - Number total_cputime_; - /** System time at beginning of task. */ - Number start_systime_; - /** Total system time for task measured so far. */ - Number total_systime_; - /** Wall clock time at beginning of task. */ - Number start_walltime_; - /** Total wall clock time for task measured so far. */ - Number total_walltime_; - - /** @name fields for debugging */ - //@{ - bool start_called_; - bool end_called_; - //@} - - }; -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTimingStatistics.hpp b/thirdparty/linux/include/coin1/IpTimingStatistics.hpp deleted file mode 100644 index 850ed1b8..00000000 --- a/thirdparty/linux/include/coin1/IpTimingStatistics.hpp +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (C) 2005, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTimingStatistics.hpp 2005 2011-06-06 12:55:16Z stefan $ -// -// Authors: Andreas Waechter IBM 2005-09-19 - -#ifndef __IPTIMINGSTATISTICS_HPP__ -#define __IPTIMINGSTATISTICS_HPP__ - -#include "IpReferenced.hpp" -#include "IpJournalist.hpp" -#include "IpTimedTask.hpp" - -namespace Ipopt -{ - /** This class collects all timing statistics for Ipopt. - */ - class TimingStatistics : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default constructor. */ - TimingStatistics() - {} - - /** Default destructor */ - virtual ~TimingStatistics() - {} - //@} - - /** Method for resetting all times. */ - void ResetTimes(); - - /** Method for printing all timing information */ - void PrintAllTimingStatistics(Journalist& jnlst, - EJournalLevel level, - EJournalCategory category) const; - - /**@name Accessor methods to all timed tasks. */ - //@{ - TimedTask& OverallAlgorithm() - { - return OverallAlgorithm_; - } - TimedTask& PrintProblemStatistics() - { - return PrintProblemStatistics_; - } - TimedTask& InitializeIterates() - { - return InitializeIterates_; - } - TimedTask& UpdateHessian() - { - return UpdateHessian_; - } - TimedTask& OutputIteration() - { - return OutputIteration_; - } - TimedTask& UpdateBarrierParameter() - { - return UpdateBarrierParameter_; - } - TimedTask& ComputeSearchDirection() - { - return ComputeSearchDirection_; - } - TimedTask& ComputeAcceptableTrialPoint() - { - return ComputeAcceptableTrialPoint_; - } - TimedTask& AcceptTrialPoint() - { - return AcceptTrialPoint_; - } - TimedTask& CheckConvergence() - { - return CheckConvergence_; - } - - TimedTask& PDSystemSolverTotal() - { - return PDSystemSolverTotal_; - } - TimedTask& PDSystemSolverSolveOnce() - { - return PDSystemSolverSolveOnce_; - } - TimedTask& ComputeResiduals() - { - return ComputeResiduals_; - } - TimedTask& StdAugSystemSolverMultiSolve() - { - return StdAugSystemSolverMultiSolve_; - } - TimedTask& LinearSystemScaling() - { - return LinearSystemScaling_; - } - TimedTask& LinearSystemSymbolicFactorization() - { - return LinearSystemSymbolicFactorization_; - } - TimedTask& LinearSystemFactorization() - { - return LinearSystemFactorization_; - } - TimedTask& LinearSystemBackSolve() - { - return LinearSystemBackSolve_; - } - TimedTask& LinearSystemStructureConverter() - { - return LinearSystemStructureConverter_; - } - TimedTask& LinearSystemStructureConverterInit() - { - return LinearSystemStructureConverterInit_; - } - TimedTask& QualityFunctionSearch() - { - return QualityFunctionSearch_; - } - TimedTask& TryCorrector() - { - return TryCorrector_; - } - - TimedTask& Task1() - { - return Task1_; - } - TimedTask& Task2() - { - return Task2_; - } - TimedTask& Task3() - { - return Task3_; - } - TimedTask& Task4() - { - return Task4_; - } - TimedTask& Task5() - { - return Task5_; - } - TimedTask& Task6() - { - return Task6_; - } - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - TimingStatistics(const TimingStatistics&); - - /** Overloaded Equals Operator */ - void operator=(const TimingStatistics&); - //@} - - /**@name All timed tasks. */ - //@{ - TimedTask OverallAlgorithm_; - TimedTask PrintProblemStatistics_; - TimedTask InitializeIterates_; - TimedTask UpdateHessian_; - TimedTask OutputIteration_; - TimedTask UpdateBarrierParameter_; - TimedTask ComputeSearchDirection_; - TimedTask ComputeAcceptableTrialPoint_; - TimedTask AcceptTrialPoint_; - TimedTask CheckConvergence_; - - TimedTask PDSystemSolverTotal_; - TimedTask PDSystemSolverSolveOnce_; - TimedTask ComputeResiduals_; - TimedTask StdAugSystemSolverMultiSolve_; - TimedTask LinearSystemScaling_; - TimedTask LinearSystemSymbolicFactorization_; - TimedTask LinearSystemFactorization_; - TimedTask LinearSystemBackSolve_; - TimedTask LinearSystemStructureConverter_; - TimedTask LinearSystemStructureConverterInit_; - TimedTask QualityFunctionSearch_; - TimedTask TryCorrector_; - - TimedTask Task1_; - TimedTask Task2_; - TimedTask Task3_; - TimedTask Task4_; - TimedTask Task5_; - TimedTask Task6_; - //@} - }; - -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTripletHelper.hpp b/thirdparty/linux/include/coin1/IpTripletHelper.hpp deleted file mode 100644 index 35424c03..00000000 --- a/thirdparty/linux/include/coin1/IpTripletHelper.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTripletHelper.hpp 2380 2013-09-06 22:57:49Z ghackebeil $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPTRIPLETHELPER_HPP__ -#define __IPTRIPLETHELPER_HPP__ - -#include "IpTypes.hpp" -#include "IpException.hpp" - -namespace Ipopt -{ - - DECLARE_STD_EXCEPTION(UNKNOWN_MATRIX_TYPE); - DECLARE_STD_EXCEPTION(UNKNOWN_VECTOR_TYPE); - - /** forward declarations */ - class Matrix; - class GenTMatrix; - class SymTMatrix; - class DiagMatrix; - class IdentityMatrix; - class ExpansionMatrix; - class ScaledMatrix; - class SymScaledMatrix; - class SumMatrix; - class SumSymMatrix; - class ZeroMatrix; - class ZeroSymMatrix; - class CompoundMatrix; - class CompoundSymMatrix; - class TransposeMatrix; - class ExpandedMultiVectorMatrix; - class Vector; - - class TripletHelper - { - public: - /**@name A set of recursive routines that help with the Triplet format. */ - //@{ - /** find the total number of triplet entries of a Matrix */ - static Index GetNumberEntries(const Matrix& matrix); - - /** fill the irows, jcols structure for the triplet format from the matrix */ - static void FillRowCol(Index n_entries, const Matrix& matrix, Index* iRow, Index* jCol, Index row_offset=0, Index col_offset=0); - - /** fill the values for the triplet format from the matrix */ - static void FillValues(Index n_entries, const Matrix& matrix, Number* values); - - /** fill the values from the vector into a dense double* structure */ - static void FillValuesFromVector(Index dim, const Vector& vector, Number* values); - - /** put the values from the double* back into the vector */ - static void PutValuesInVector(Index dim, const double* values, Vector& vector); - //@} - - private: - /** find the total number of triplet entries for the SumMatrix */ - static Index GetNumberEntries_(const SumMatrix& matrix); - - /** find the total number of triplet entries for the SumSymMatrix */ - static Index GetNumberEntries_(const SumSymMatrix& matrix); - - /** find the total number of triplet entries for the CompoundMatrix */ - static Index GetNumberEntries_(const CompoundMatrix& matrix); - - /** find the total number of triplet entries for the CompoundSymMatrix */ - static Index GetNumberEntries_(const CompoundSymMatrix& matrix); - - /** find the total number of triplet entries for the TransposeMatrix */ - static Index GetNumberEntries_(const TransposeMatrix& matrix); - - /** find the total number of triplet entries for the TransposeMatrix */ - static Index GetNumberEntries_(const ExpandedMultiVectorMatrix& matrix); - - static void FillRowCol_(Index n_entries, const GenTMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const GenTMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const SymTMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const SymTMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const DiagMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const DiagMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const IdentityMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const IdentityMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const ExpansionMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const ExpansionMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const SumMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const SumMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const SumSymMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const SumSymMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const CompoundMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const CompoundMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const CompoundSymMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const CompoundSymMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const ScaledMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const ScaledMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const SymScaledMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const SymScaledMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const TransposeMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const TransposeMatrix& matrix, Number* values); - - static void FillRowCol_(Index n_entries, const ExpandedMultiVectorMatrix& matrix, Index row_offset, Index col_offset, Index* iRow, Index* jCol); - - static void FillValues_(Index n_entries, const ExpandedMultiVectorMatrix& matrix, Number* values); - - }; -} // namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpTypes.hpp b/thirdparty/linux/include/coin1/IpTypes.hpp deleted file mode 100644 index 9c41b8f1..00000000 --- a/thirdparty/linux/include/coin1/IpTypes.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2004, 2006 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpTypes.hpp 2005 2011-06-06 12:55:16Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPTYPES_HPP__ -#define __IPTYPES_HPP__ - -#include "IpoptConfig.h" - -namespace Ipopt -{ - /** Type of all numbers */ - typedef double Number; - /** Type of all indices of vectors, matrices etc */ - typedef int Index; - /** Type of default integer */ - typedef int Int; - -} // namespace Ipopt - -/* Type of Fortran integer translated into C */ -typedef FORTRAN_INTEGER_TYPE ipfint; - -#endif diff --git a/thirdparty/linux/include/coin1/IpUtils.hpp b/thirdparty/linux/include/coin1/IpUtils.hpp deleted file mode 100644 index 4e5f0455..00000000 --- a/thirdparty/linux/include/coin1/IpUtils.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpUtils.hpp 2167 2013-03-08 11:15:38Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPUTILS_HPP__ -#define __IPUTILS_HPP__ - -// Standard Ip Include Files -#include "IpTypes.hpp" -#include "IpDebug.hpp" - -namespace Ipopt -{ - - inline Index Max(Index a, Index b) - { - return ((a) > (b) ? (a) : (b)); - } - - inline Index Max(Index a, Index b, Index c) - { - Index max = Max(a,b); - max = Max(max, c); - return max; - } - - inline Index Max(Index a, Index b, Index c, Index d) - { - Index max = Max(a, b, c); - max = Max(max, d); - return max; - } - - inline Index Min(Index a, Index b) - { - return ((a) < (b) ? (a) : (b)); - } - - inline Index Min(Index a, Index b, Index c) - { - Index min = Min(a,b); - min = Min(min, c); - return min; - } - - inline Index Min(Index a, Index b, Index c, Index d) - { - Index min = Min(a, b, c); - min = Min(min, d); - return min; - } - - /////////////////////////////////////////// - - inline Number Max(Number a, Number b) - { - return ((a) > (b) ? (a) : (b)); - } - - inline Number Max(Number a, Number b, Number c) - { - Number max = Max(a,b); - max = Max(max, c); - return max; - } - - inline Number Max(Number a, Number b, Number c, Number d) - { - Number max = Max(a, b, c); - max = Max(max, d); - return max; - } - - inline Number Min(Number a, Number b) - { - return ((a) < (b) ? (a) : (b)); - } - - inline Number Min(Number a, Number b, Number c) - { - Number min = Min(a,b); - min = Min(min, c); - return min; - } - - inline Number Min(Number a, Number b, Number c, Number d) - { - Number min = Min(a, b, c); - min = Min(min, d); - return min; - } - - /** Function returning true iff the argument is a valid double number - * (not NaN or Inf). */ - bool IsFiniteNumber(Number val); - - /** Function returning a random number between 0 and 1 */ - Number IpRandom01(); - - /** Function resetting the random number generator */ - void IpResetRandom01(); - - /** method determining CPU time */ - Number CpuTime(); - - /** method determining system time */ - Number SysTime(); - - /** method determining wallclock time since first call */ - Number WallclockTime(); - - /** Method for comparing two numbers within machine precision. The - * return value is true if lhs is less or equal the rhs, relaxing - * this inequality by something a little larger than machine - * precision relative to the absolute value of BasVal. */ - bool Compare_le(Number lhs, Number rhs, Number BasVal); - - /** Method for printing a formatted output to a string with given size. - */ - int Snprintf(char* str, long size, const char* format, ...); - -} //namespace Ipopt - -#endif diff --git a/thirdparty/linux/include/coin1/IpVector.hpp b/thirdparty/linux/include/coin1/IpVector.hpp deleted file mode 100644 index a9035588..00000000 --- a/thirdparty/linux/include/coin1/IpVector.hpp +++ /dev/null @@ -1,774 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpVector.hpp 2472 2014-04-05 17:47:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPVECTOR_HPP__ -#define __IPVECTOR_HPP__ - -#include "IpTypes.hpp" -#include "IpTaggedObject.hpp" -#include "IpCachedResults.hpp" -#include "IpSmartPtr.hpp" -#include "IpJournalist.hpp" -#include "IpException.hpp" - -#include - -namespace Ipopt -{ - /** Exception that can be used to flag unimplemented linear algebra - * methods */ - DECLARE_STD_EXCEPTION(UNIMPLEMENTED_LINALG_METHOD_CALLED); - - /* forward declarations */ - class VectorSpace; - - /** Vector Base Class. - * This is the base class for all derived vector types. Those vectors - * are meant to store entities like iterates, Lagrangian multipliers, - * constraint values etc. The implementation of a vector type depends - * on the computational environment (e.g. just a double array on a shared - * memory machine, or distributed double arrays for a distributed - * memory machine.) - * - * Deriving from Vector: This class inherits from tagged object to - * implement an advanced caching scheme. Because of this, the - * TaggedObject method ObjectChanged() must be called each time the - * Vector changes. If you overload the XXXX_Impl protected methods, - * this taken care of (along with caching if possible) for you. If - * you have additional methods in your derived class that change the - * underlying data (vector values), you MUST remember to call - * ObjectChanged() AFTER making the change! - */ - class Vector : public TaggedObject - { - public: - /** @name Constructor/Destructor */ - //@{ - /** Constructor. It has to be given a pointer to the - * corresponding VectorSpace. - */ - inline - Vector(const VectorSpace* owner_space); - - /** Destructor */ - inline - virtual ~Vector(); - //@} - - /** Create new Vector of the same type with uninitialized data */ - inline - Vector* MakeNew() const; - - /** Create new Vector of the same type and copy the data over */ - inline - Vector* MakeNewCopy() const; - - /**@name Standard BLAS-1 Operations - * (derived classes do NOT overload these - * methods, instead, overload the - * protected versions of these methods). */ - //@{ - /** Copy the data of the vector x into this vector (DCOPY). */ - inline - void Copy(const Vector& x); - - /** Scales the vector by scalar alpha (DSCAL) */ - void Scal(Number alpha); - - /** Add the multiple alpha of vector x to this vector (DAXPY) */ - inline - void Axpy(Number alpha, const Vector &x); - - /** Computes inner product of vector x with this (DDOT) */ - inline - Number Dot(const Vector &x) const; - - /** Computes the 2-norm of this vector (DNRM2) */ - inline - Number Nrm2() const; - - /** Computes the 1-norm of this vector (DASUM) */ - inline - Number Asum() const; - - /** Computes the max-norm of this vector (based on IDAMAX) */ - inline - Number Amax() const; - //@} - - /** @name Additional (Non-BLAS) Vector Methods - * (derived classes do NOT overload these - * methods, instead, overload the - * protected versions of these methods). */ - //@{ - /** Set each element in the vector to the scalar alpha. */ - inline - void Set(Number alpha); - - /** Element-wise division \f$y_i \gets y_i/x_i\f$*/ - inline - void ElementWiseDivide(const Vector& x); - - /** Element-wise multiplication \f$y_i \gets y_i*x_i\f$ */ - inline - void ElementWiseMultiply(const Vector& x); - - /** Element-wise max against entries in x */ - inline - void ElementWiseMax(const Vector& x); - - /** Element-wise min against entries in x */ - inline - void ElementWiseMin(const Vector& x); - - /** Reciprocates the entries in the vector */ - inline - void ElementWiseReciprocal(); - - /** Absolute values of the entries in the vector */ - inline - void ElementWiseAbs(); - - /** Element-wise square root of the entries in the vector */ - inline - void ElementWiseSqrt(); - - /** Replaces the vector values with their sgn values - ( -1 if x_i < 0, 0 if x_i == 0, and 1 if x_i > 0) - */ - inline - void ElementWiseSgn(); - - /** Add scalar to every vector component */ - inline - void AddScalar(Number scalar); - - /** Returns the maximum value in the vector */ - inline - Number Max() const; - - /** Returns the minimum value in the vector */ - inline - Number Min() const; - - /** Returns the sum of the vector entries */ - inline - Number Sum() const; - - /** Returns the sum of the logs of each vector entry */ - inline - Number SumLogs() const; - //@} - - /** @name Methods for specialized operations. A prototype - * implementation is provided, but for efficient implementation - * those should be specially implemented. - */ - //@{ - /** Add one vector, y = a * v1 + c * y. This is automatically - * reduced to call AddTwoVectors. */ - inline - void AddOneVector(Number a, const Vector& v1, Number c); - - /** Add two vectors, y = a * v1 + b * v2 + c * y. Here, this - * vector is y */ - inline void AddTwoVectors(Number a, const Vector& v1, - Number b, const Vector& v2, Number c); - /** Fraction to the boundary parameter. Computes \f$\alpha = - * \max\{\bar\alpha\in(0,1] : x + \bar\alpha \Delta \geq (1-\tau)x\}\f$ - */ - inline - Number FracToBound(const Vector& delta, Number tau) const; - /** Add the quotient of two vectors, y = a * z/s + c * y. */ - inline - void AddVectorQuotient(Number a, const Vector& z, const Vector& s, - Number c); - //@} - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). */ - inline - bool HasValidNumbers() const; - - /** @name Accessor methods */ - //@{ - /** Dimension of the Vector */ - inline - Index Dim() const; - - /** Return the owner VectorSpace*/ - inline - SmartPtr OwnerSpace() const; - //@} - - /** @name Output methods - * (derived classes do NOT overload these - * methods, instead, overload the - * protected versions of these methods). */ - //@{ - /** Print the entire vector */ - void Print(SmartPtr jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent=0, - const std::string& prefix="") const; - void Print(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent=0, - const std::string& prefix="") const; - //@} - - protected: - /** @name implementation methods (derived classes MUST - * overload these pure virtual protected methods.) - */ - //@{ - /** Copy the data of the vector x into this vector (DCOPY). */ - virtual void CopyImpl(const Vector& x)=0; - - /** Scales the vector by scalar alpha (DSCAL) */ - virtual void ScalImpl(Number alpha)=0; - - /** Add the multiple alpha of vector x to this vector (DAXPY) */ - virtual void AxpyImpl(Number alpha, const Vector &x)=0; - - /** Computes inner product of vector x with this (DDOT) */ - virtual Number DotImpl(const Vector &x) const =0; - - /** Computes the 2-norm of this vector (DNRM2) */ - virtual Number Nrm2Impl() const =0; - - /** Computes the 1-norm of this vector (DASUM) */ - virtual Number AsumImpl() const =0; - - /** Computes the max-norm of this vector (based on IDAMAX) */ - virtual Number AmaxImpl() const =0; - - /** Set each element in the vector to the scalar alpha. */ - virtual void SetImpl(Number alpha)=0; - - /** Element-wise division \f$y_i \gets y_i/x_i\f$*/ - virtual void ElementWiseDivideImpl(const Vector& x)=0; - - /** Element-wise multiplication \f$y_i \gets y_i*x_i\f$ */ - virtual void ElementWiseMultiplyImpl(const Vector& x)=0; - - /** Element-wise max against entries in x */ - virtual void ElementWiseMaxImpl(const Vector& x)=0; - - /** Element-wise min against entries in x */ - virtual void ElementWiseMinImpl(const Vector& x)=0; - - /** Reciprocates the elements of the vector */ - virtual void ElementWiseReciprocalImpl()=0; - - /** Take elementwise absolute values of the elements of the vector */ - virtual void ElementWiseAbsImpl()=0; - - /** Take elementwise square-root of the elements of the vector */ - virtual void ElementWiseSqrtImpl()=0; - - /** Replaces entries with sgn of the entry */ - virtual void ElementWiseSgnImpl()=0; - - /** Add scalar to every component of vector */ - virtual void AddScalarImpl(Number scalar)=0; - - /** Max value in the vector */ - virtual Number MaxImpl() const=0; - - /** Min number in the vector */ - virtual Number MinImpl() const=0; - - /** Sum of entries in the vector */ - virtual Number SumImpl() const=0; - - /** Sum of logs of entries in the vector */ - virtual Number SumLogsImpl() const=0; - - /** Add two vectors (a * v1 + b * v2). Result is stored in this - vector. */ - virtual void AddTwoVectorsImpl(Number a, const Vector& v1, - Number b, const Vector& v2, Number c); - - /** Fraction to boundary parameter. */ - virtual Number FracToBoundImpl(const Vector& delta, Number tau) const; - - /** Add the quotient of two vectors */ - virtual void AddVectorQuotientImpl(Number a, const Vector& z, - const Vector& s, Number c); - - /** Method for determining if all stored numbers are valid (i.e., - * no Inf or Nan). A default implementation using Asum is - * provided. */ - virtual bool HasValidNumbersImpl() const; - - /** Print the entire vector */ - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const =0; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default constructor */ - Vector(); - - /** Copy constructor */ - Vector(const Vector&); - - /** Overloaded Equals Operator */ - Vector& operator=(const Vector&); - //@} - - /** Vector Space */ - const SmartPtr owner_space_; - - /**@name CachedResults data members */ - //@{ - /** Cache for dot products */ - mutable CachedResults dot_cache_; - - mutable TaggedObject::Tag nrm2_cache_tag_; - mutable Number cached_nrm2_; - - mutable TaggedObject::Tag asum_cache_tag_; - mutable Number cached_asum_; - - mutable TaggedObject::Tag amax_cache_tag_; - mutable Number cached_amax_; - - mutable TaggedObject::Tag max_cache_tag_; - mutable Number cached_max_; - - mutable TaggedObject::Tag min_cache_tag_; - mutable Number cached_min_; - - mutable TaggedObject::Tag sum_cache_tag_; - mutable Number cached_sum_; - - mutable TaggedObject::Tag sumlogs_cache_tag_; - mutable Number cached_sumlogs_; - - mutable TaggedObject::Tag valid_cache_tag_; - mutable bool cached_valid_; - - // AW: I removed this cache since it gets in the way for the - // quality function search - // /** Cache for FracToBound */ - // mutable CachedResults frac_to_bound_cache_; - //@} - - }; - - /** VectorSpace base class, corresponding to the Vector base class. - * For each Vector implementation, a corresponding VectorSpace has - * to be implemented. A VectorSpace is able to create new Vectors - * of a specific type. The VectorSpace should also store - * information that is common to all Vectors of that type. For - * example, the dimension of a Vector is stored in the VectorSpace - * base class. - */ - class VectorSpace : public ReferencedObject - { - public: - /** @name Constructors/Destructors */ - //@{ - /** Constructor, given the dimension of all vectors generated by - * this VectorSpace. - */ - VectorSpace(Index dim); - - /** Destructor */ - virtual ~VectorSpace() - {} - //@} - - /** Pure virtual method for creating a new Vector of the - * corresponding type. - */ - virtual Vector* MakeNew() const=0; - - /** Accessor function for the dimension of the vectors of this type.*/ - Index Dim() const - { - return dim_; - } - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** default constructor */ - VectorSpace(); - - /** Copy constructor */ - VectorSpace(const VectorSpace&); - - /** Overloaded Equals Operator */ - VectorSpace& operator=(const VectorSpace&); - //@} - - /** Dimension of the vectors in this vector space. */ - const Index dim_; - }; - - /* inline methods */ - inline - Vector::~Vector() - {} - - inline - Vector::Vector(const VectorSpace* owner_space) - : - TaggedObject(), - owner_space_(owner_space), - dot_cache_(10), - nrm2_cache_tag_(0), - asum_cache_tag_(0), - amax_cache_tag_(0), - max_cache_tag_(0), - min_cache_tag_(0), - sum_cache_tag_(0), - sumlogs_cache_tag_(0), - cached_valid_(0) - { - DBG_ASSERT(IsValid(owner_space_)); - } - - inline - Vector* Vector::MakeNew() const - { - return owner_space_->MakeNew(); - } - - inline - Vector* Vector::MakeNewCopy() const - { - // ToDo: We can probably copy also the cached values for Norms etc here - Vector* copy = MakeNew(); - copy->Copy(*this); - return copy; - } - - inline - void Vector::Copy(const Vector& x) - { - CopyImpl(x); - ObjectChanged(); - // Also copy any cached scalar values from the original vector - // ToDo: Check if that is too much overhead - TaggedObject::Tag x_tag = x.GetTag(); - if (x_tag == x.nrm2_cache_tag_) { - nrm2_cache_tag_ = GetTag(); - cached_nrm2_ = x.cached_nrm2_; - } - if (x_tag == x.asum_cache_tag_) { - asum_cache_tag_ = GetTag(); - cached_asum_ = x.cached_asum_; - } - if (x_tag == x.amax_cache_tag_) { - amax_cache_tag_ = GetTag(); - cached_amax_ = x.cached_amax_; - } - if (x_tag == x.max_cache_tag_) { - max_cache_tag_ = GetTag(); - cached_max_ = x.cached_max_; - } - if (x_tag == x.min_cache_tag_) { - min_cache_tag_ = GetTag(); - cached_min_ = x.cached_min_; - } - if (x_tag == x.sum_cache_tag_) { - sum_cache_tag_ = GetTag(); - cached_sum_ = x.cached_sum_; - } - if (x_tag == x.sumlogs_cache_tag_) { - sumlogs_cache_tag_ = GetTag(); - cached_sumlogs_ = x.cached_sumlogs_; - } - } - - inline - void Vector::Axpy(Number alpha, const Vector &x) - { - AxpyImpl(alpha, x); - ObjectChanged(); - } - - inline - Number Vector::Dot(const Vector &x) const - { - // The current implementation of the caching doesn't allow to have - // a dependency of something with itself. Therefore, we use the - // Nrm2 method if the dot product is to be taken with the vector - // itself. Might be more efficient anyway. - if (this==&x) { - Number nrm2 = Nrm2(); - return nrm2*nrm2; - } - Number retValue; - if (!dot_cache_.GetCachedResult2Dep(retValue, this, &x)) { - retValue = DotImpl(x); - dot_cache_.AddCachedResult2Dep(retValue, this, &x); - } - return retValue; - } - - inline - Number Vector::Nrm2() const - { - if (nrm2_cache_tag_ != GetTag()) { - cached_nrm2_ = Nrm2Impl(); - nrm2_cache_tag_ = GetTag(); - } - return cached_nrm2_; - } - - inline - Number Vector::Asum() const - { - if (asum_cache_tag_ != GetTag()) { - cached_asum_ = AsumImpl(); - asum_cache_tag_ = GetTag(); - } - return cached_asum_; - } - - inline - Number Vector::Amax() const - { - if (amax_cache_tag_ != GetTag()) { - cached_amax_ = AmaxImpl(); - amax_cache_tag_ = GetTag(); - } - return cached_amax_; - } - - inline - Number Vector::Sum() const - { - if (sum_cache_tag_ != GetTag()) { - cached_sum_ = SumImpl(); - sum_cache_tag_ = GetTag(); - } - return cached_sum_; - } - - inline - Number Vector::SumLogs() const - { - if (sumlogs_cache_tag_ != GetTag()) { - cached_sumlogs_ = SumLogsImpl(); - sumlogs_cache_tag_ = GetTag(); - } - return cached_sumlogs_; - } - - inline - void Vector::ElementWiseSgn() - { - ElementWiseSgnImpl(); - ObjectChanged(); - } - - inline - void Vector::Set(Number alpha) - { - // Could initialize caches here - SetImpl(alpha); - ObjectChanged(); - } - - inline - void Vector::ElementWiseDivide(const Vector& x) - { - ElementWiseDivideImpl(x); - ObjectChanged(); - } - - inline - void Vector::ElementWiseMultiply(const Vector& x) - { - ElementWiseMultiplyImpl(x); - ObjectChanged(); - } - - inline - void Vector::ElementWiseReciprocal() - { - ElementWiseReciprocalImpl(); - ObjectChanged(); - } - - inline - void Vector::ElementWiseMax(const Vector& x) - { - // Could initialize some caches here - ElementWiseMaxImpl(x); - ObjectChanged(); - } - - inline - void Vector::ElementWiseMin(const Vector& x) - { - // Could initialize some caches here - ElementWiseMinImpl(x); - ObjectChanged(); - } - - inline - void Vector::ElementWiseAbs() - { - // Could initialize some caches here - ElementWiseAbsImpl(); - ObjectChanged(); - } - - inline - void Vector::ElementWiseSqrt() - { - ElementWiseSqrtImpl(); - ObjectChanged(); - } - - inline - void Vector::AddScalar(Number scalar) - { - // Could initialize some caches here - AddScalarImpl(scalar); - ObjectChanged(); - } - - inline - Number Vector::Max() const - { - if (max_cache_tag_ != GetTag()) { - cached_max_ = MaxImpl(); - max_cache_tag_ = GetTag(); - } - return cached_max_; - } - - inline - Number Vector::Min() const - { - if (min_cache_tag_ != GetTag()) { - cached_min_ = MinImpl(); - min_cache_tag_ = GetTag(); - } - return cached_min_; - } - - inline - void Vector::AddOneVector(Number a, const Vector& v1, Number c) - { - AddTwoVectors(a, v1, 0., v1, c); - } - - inline - void Vector::AddTwoVectors(Number a, const Vector& v1, - Number b, const Vector& v2, Number c) - { - AddTwoVectorsImpl(a, v1, b, v2, c); - ObjectChanged(); - } - - inline - Number Vector::FracToBound(const Vector& delta, Number tau) const - { - /* AW: I avoid the caching here, since it leads to overhead in the - quality function search. Caches for this are in - CalculatedQuantities. - Number retValue; - std::vector tdeps(1); - tdeps[0] = δ - std::vector sdeps(1); - sdeps[0] = tau; - if (!frac_to_bound_cache_.GetCachedResult(retValue, tdeps, sdeps)) { - retValue = FracToBoundImpl(delta, tau); - frac_to_bound_cache_.AddCachedResult(retValue, tdeps, sdeps); - } - return retValue; - */ - return FracToBoundImpl(delta, tau); - } - - inline - void Vector::AddVectorQuotient(Number a, const Vector& z, - const Vector& s, Number c) - { - AddVectorQuotientImpl(a, z, s, c); - ObjectChanged(); - } - - inline - bool Vector::HasValidNumbers() const - { - if (valid_cache_tag_ != GetTag()) { - cached_valid_ = HasValidNumbersImpl(); - valid_cache_tag_ = GetTag(); - } - return cached_valid_; - } - - inline - Index Vector::Dim() const - { - return owner_space_->Dim(); - } - - inline - SmartPtr Vector::OwnerSpace() const - { - return owner_space_; - } - - inline - VectorSpace::VectorSpace(Index dim) - : - dim_(dim) - {} - -} // namespace Ipopt - -// Macro definitions for debugging vectors -#if COIN_IPOPT_VERBOSITY == 0 -# define DBG_PRINT_VECTOR(__verbose_level, __vec_name, __vec) -#else -# define DBG_PRINT_VECTOR(__verbose_level, __vec_name, __vec) \ - if (dbg_jrnl.Verbosity() >= (__verbose_level)) { \ - if (dbg_jrnl.Jnlst()!=NULL) { \ - (__vec).Print(dbg_jrnl.Jnlst(), \ - J_ERROR, J_DBG, \ - __vec_name, \ - dbg_jrnl.IndentationLevel()*2, \ - "# "); \ - } \ - } -#endif //if COIN_IPOPT_VERBOSITY == 0 - -#endif diff --git a/thirdparty/linux/include/coin1/IpZeroSymMatrix.hpp b/thirdparty/linux/include/coin1/IpZeroSymMatrix.hpp deleted file mode 100644 index 35ad95e7..00000000 --- a/thirdparty/linux/include/coin1/IpZeroSymMatrix.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (C) 2004, 2008 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpZeroSymMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPZEROSYMMATRIX_HPP__ -#define __IPZEROSYMMATRIX_HPP__ - -#include "IpUtils.hpp" -#include "IpSymMatrix.hpp" - -namespace Ipopt -{ - - /** Class for Symmetric Matrices with only zero entries. - */ - class ZeroSymMatrix : public SymMatrix - { - public: - - /**@name Constructors / Destructors */ - //@{ - - /** Constructor, taking the corresponding matrix space. - */ - ZeroSymMatrix(const SymMatrixSpace* owner_space); - - /** Destructor */ - ~ZeroSymMatrix(); - //@} - - protected: - /**@name Methods overloaded from matrix */ - //@{ - virtual void MultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - virtual void TransMultVectorImpl(Number alpha, const Vector& x, - Number beta, Vector& y) const; - - virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const - {} - - virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const - {} - - virtual void PrintImpl(const Journalist& jnlst, - EJournalLevel level, - EJournalCategory category, - const std::string& name, - Index indent, - const std::string& prefix) const; - //@} - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - ZeroSymMatrix(); - - /** Copy Constructor */ - ZeroSymMatrix(const ZeroSymMatrix&); - - /** Overloaded Equals Operator */ - void operator=(const ZeroSymMatrix&); - //@} - }; - - /** Class for matrix space for ZeroSymMatrix. */ - class ZeroSymMatrixSpace : public SymMatrixSpace - { - public: - /** @name Constructors / Destructors */ - //@{ - /** Constructor, given the number of row and columns. - */ - ZeroSymMatrixSpace(Index dim) - : - SymMatrixSpace(dim) - {} - - /** Destructor */ - virtual ~ZeroSymMatrixSpace() - {} - //@} - - /** Overloaded MakeNew method for the MatrixSpace base class. - */ - virtual Matrix* MakeNew() const - { - return MakeNewZeroSymMatrix(); - } - - /** Overloaded method from SymMatrixSpace base class - */ - virtual SymMatrix* MakeNewSymMatrix() const - { - return MakeNewZeroSymMatrix(); - } - - /** Method for creating a new matrix of this specific type. */ - ZeroSymMatrix* MakeNewZeroSymMatrix() const - { - return new ZeroSymMatrix(this); - } - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Default Constructor */ - ZeroSymMatrixSpace(); - - /** Copy Constructor */ - ZeroSymMatrixSpace(const ZeroSymMatrixSpace&); - - /** Overloaded Equals Operator */ - void operator=(const ZeroSymMatrixSpace&); - //@} - }; -} // namespace Ipopt -#endif diff --git a/thirdparty/linux/include/coin1/IpoptConfig.h b/thirdparty/linux/include/coin1/IpoptConfig.h deleted file mode 100644 index 78dadd34..00000000 --- a/thirdparty/linux/include/coin1/IpoptConfig.h +++ /dev/null @@ -1,22 +0,0 @@ -/* src/Common/config_ipopt.h. Generated by configure. */ -/* src/Common/config_ipopt.h.in. */ - -#ifndef __CONFIG_IPOPT_H__ -#define __CONFIG_IPOPT_H__ - -/* Version number of project */ -#define IPOPT_VERSION "3.12.7" - -/* Major Version number of project */ -#define IPOPT_VERSION_MAJOR 3 - -/* Minor Version number of project */ -#define IPOPT_VERSION_MINOR 12 - -/* Release Version number of project */ -#define IPOPT_VERSION_RELEASE 7 - -/* Define to the C type corresponding to Fortran INTEGER */ -#define FORTRAN_INTEGER_TYPE int - -#endif diff --git a/thirdparty/linux/include/coin1/OsiAuxInfo.hpp b/thirdparty/linux/include/coin1/OsiAuxInfo.hpp deleted file mode 100644 index 182d981d..00000000 --- a/thirdparty/linux/include/coin1/OsiAuxInfo.hpp +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (C) 2006, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiAuxInfo_H -#define OsiAuxInfo_H - -class OsiSolverInterface; - -//############################################################################# -/** This class allows for a more structured use of algorithmic tweaking to - an OsiSolverInterface. It is designed to replace the simple use of - appData_ pointer. - - This has been done to make it easier to use NonLinear solvers and other - exotic beasts in a branch and bound mode. After this class definition - there is one for a derived class for just such a purpose. - -*/ - -class OsiAuxInfo { -public: - // Default Constructor - OsiAuxInfo (void * appData = NULL); - - // Copy Constructor - OsiAuxInfo (const OsiAuxInfo & rhs); - // Destructor - virtual ~OsiAuxInfo(); - - /// Clone - virtual OsiAuxInfo * clone() const; - /// Assignment operator - OsiAuxInfo & operator=(const OsiAuxInfo& rhs); - - /// Get application data - inline void * getApplicationData() const - { return appData_;} -protected: - /// Pointer to user-defined data structure - void * appData_; -}; -//############################################################################# -/** This class allows for the use of more exotic solvers e.g. Non-Linear or Volume. - - You can derive from this although at present I can't see the need. -*/ - -class OsiBabSolver : public OsiAuxInfo { -public: - // Default Constructor - OsiBabSolver (int solverType=0); - - // Copy Constructor - OsiBabSolver (const OsiBabSolver & rhs); - // Destructor - virtual ~OsiBabSolver(); - - /// Clone - virtual OsiAuxInfo * clone() const; - /// Assignment operator - OsiBabSolver & operator=(const OsiBabSolver& rhs); - - /// Update solver - inline void setSolver(const OsiSolverInterface * solver) - { solver_ = solver;} - /// Update solver - inline void setSolver(const OsiSolverInterface & solver) - { solver_ = &solver;} - - /** returns 0 if no heuristic solution, 1 if valid solution - with better objective value than one passed in - Sets solution values if good, sets objective value - numberColumns is size of newSolution - */ - int solution(double & objectiveValue, - double * newSolution, int numberColumns); - /** Set solution and objective value. - Number of columns and optimization direction taken from current solver. - Size of solution is numberColumns (may be padded or truncated in function) */ - void setSolution(const double * solution, int numberColumns, double objectiveValue); - - /** returns true if the object stores a solution, false otherwise. If there - is a solution then solutionValue and solution will be filled out as well. - In that case the user needs to allocate solution to be a big enough - array. - */ - bool hasSolution(double & solutionValue, double * solution); - - /** Sets solver type - 0 - normal LP solver - 1 - DW - may also return heuristic solutions - 2 - NLP solver or similar - can't compute objective value just from solution - check solver to see if feasible and what objective value is - - may also return heuristic solution - 3 - NLP solver or similar - can't compute objective value just from solution - check this (rather than solver) to see if feasible and what objective value is. - Using Outer Approximation so called lp based - - may also return heuristic solution - 4 - normal solver but cuts are needed for integral solution - */ - inline void setSolverType(int value) - { solverType_=value;} - /** gets solver type - 0 - normal LP solver - 1 - DW - may also return heuristic solutions - 2 - NLP solver or similar - can't compute objective value just from solution - check this (rather than solver) to see if feasible and what objective value is - - may also return heuristic solution - 3 - NLP solver or similar - can't compute objective value just from solution - check this (rather than solver) to see if feasible and what objective value is. - Using Outer Approximation so called lp based - - may also return heuristic solution - 4 - normal solver but cuts are needed for integral solution - */ - inline int solverType() const - { return solverType_;} - /** Return true if getting solution may add cuts so hot start etc will - be obsolete */ - inline bool solutionAddsCuts() const - { return solverType_==3;} - /// Return true if we should try cuts at root even if looks satisfied - inline bool alwaysTryCutsAtRootNode() const - { return solverType_==4;} - /** Returns true if can use solver objective or feasible values, - otherwise use mipBound etc */ - inline bool solverAccurate() const - { return solverType_==0||solverType_==2||solverType_==4;} - /// Returns true if can use reduced costs for fixing - inline bool reducedCostsAccurate() const - { return solverType_==0||solverType_==4;} - /// Get objective (well mip bound) - double mipBound() const; - /// Returns true if node feasible - bool mipFeasible() const; - /// Set mip bound (only used for some solvers) - inline void setMipBound(double value) - { mipBound_ = value;} - /// Get objective value of saved solution - inline double bestObjectiveValue() const - { return bestObjectiveValue_;} - /// Says whether we want to try cuts at all - inline bool tryCuts() const - { return solverType_!=2;} - /// Says whether we have a warm start (so can do strong branching) - inline bool warmStart() const - { return solverType_!=2;} - /** Get bit mask for odd actions of solvers - 1 - solution or bound arrays may move in mysterious ways e.g. cplex - 2 - solver may want bounds before branch - */ - inline int extraCharacteristics() const - { return extraCharacteristics_;} - /** Set bit mask for odd actions of solvers - 1 - solution or bound arrays may move in mysterious ways e.g. cplex - 2 - solver may want bounds before branch - */ - inline void setExtraCharacteristics(int value) - { extraCharacteristics_=value;} - /// Pointer to lower bounds before branch (only if extraCharacteristics set) - inline const double * beforeLower() const - { return beforeLower_;} - /// Set pointer to lower bounds before branch (only if extraCharacteristics set) - inline void setBeforeLower(const double * array) - { beforeLower_ = array;} - /// Pointer to upper bounds before branch (only if extraCharacteristics set) - inline const double * beforeUpper() const - { return beforeUpper_;} - /// Set pointer to upper bounds before branch (only if extraCharacteristics set) - inline void setBeforeUpper(const double * array) - { beforeUpper_ = array;} -protected: - /// Objective value of best solution (if there is one) (minimization) - double bestObjectiveValue_; - /// Current lower bound on solution ( if > 1.0e50 infeasible) - double mipBound_; - /// Solver to use for getting/setting solutions etc - const OsiSolverInterface * solver_; - /// Best integer feasible solution - double * bestSolution_; - /// Pointer to lower bounds before branch (only if extraCharacteristics set) - const double * beforeLower_; - /// Pointer to upper bounds before branch (only if extraCharacteristics set) - const double * beforeUpper_; - /** Solver type - 0 - normal LP solver - 1 - DW - may also return heuristic solutions - 2 - NLP solver or similar - can't compute objective value just from solution - check this (rather than solver) to see if feasible and what objective value is - - may also return heuristic solution - 3 - NLP solver or similar - can't compute objective value just from solution - check this (rather than solver) to see if feasible and what objective value is. - Using Outer Approximation so called lp based - - may also return heuristic solution - */ - int solverType_; - /// Size of solution - int sizeSolution_; - /** Bit mask for odd actions of solvers - 1 - solution or bound arrays may move in mysterious ways e.g. cplex - 2 - solver may want bounds before branch - */ - int extraCharacteristics_; -}; - -#endif diff --git a/thirdparty/linux/include/coin1/OsiBranchingObject.hpp b/thirdparty/linux/include/coin1/OsiBranchingObject.hpp deleted file mode 100644 index 78b6984c..00000000 --- a/thirdparty/linux/include/coin1/OsiBranchingObject.hpp +++ /dev/null @@ -1,1005 +0,0 @@ -// Copyright (C) 2006, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiBranchingObject_H -#define OsiBranchingObject_H - -#include -#include -#include - -#include "CoinError.hpp" -#include "CoinTypes.hpp" - -class OsiSolverInterface; -class OsiSolverBranch; - -class OsiBranchingObject; -class OsiBranchingInformation; - -//############################################################################# -//This contains the abstract base class for an object and for branching. -//It also contains a simple integer class -//############################################################################# - -/** Abstract base class for `objects'. - - The branching model used in Osi is based on the idea of an object. - In the abstract, an object is something that has a feasible region, can be - evaluated for infeasibility, can be branched on (i.e., there's some - constructive action to be taken to move toward feasibility), and allows - comparison of the effect of branching. - - This class (OsiObject) is the base class for an object. To round out the - branching model, the class OsiBranchingObject describes how to perform a - branch, and the class OsiBranchDecision describes how to compare two - OsiBranchingObjects. - - To create a new type of object you need to provide three methods: - #infeasibility(), #feasibleRegion(), and #createBranch(), described below. - - This base class is primarily virtual to allow for any form of structure. - Any form of discontinuity is allowed. - - As there is an overhead in getting information from solvers and because - other useful information is available there is also an OsiBranchingInformation - class which can contain pointers to information. - If used it must at minimum contain pointers to current value of objective, - maximum allowed objective and pointers to arrays for bounds and solution - and direction of optimization. Also integer and primal tolerance. - - Classes which inherit might have other information such as depth, number of - solutions, pseudo-shadow prices etc etc. - May be easier just to throw in here - as I keep doing -*/ -class OsiObject { - -public: - - /// Default Constructor - OsiObject (); - - /// Copy constructor - OsiObject ( const OsiObject &); - - /// Assignment operator - OsiObject & operator=( const OsiObject& rhs); - - /// Clone - virtual OsiObject * clone() const=0; - - /// Destructor - virtual ~OsiObject (); - - /** Infeasibility of the object - - This is some measure of the infeasibility of the object. 0.0 - indicates that the object is satisfied. - - The preferred branching direction is returned in whichWay, where for - normal two-way branching 0 is down, 1 is up - - This is used to prepare for strong branching but should also think of - case when no strong branching - - The object may also compute an estimate of cost of going "up" or "down". - This will probably be based on pseudo-cost ideas - - This should also set mutable infeasibility_ and whichWay_ - This is for instant re-use for speed - - Default for this just calls infeasibility with OsiBranchingInformation - NOTE - Convention says that an infeasibility of COIN_DBL_MAX means - object has worked out it can't be satisfied! - */ - double infeasibility(const OsiSolverInterface * solver,int &whichWay) const ; - // Faster version when more information available - virtual double infeasibility(const OsiBranchingInformation * info, int &whichWay) const =0; - // This does NOT set mutable stuff - virtual double checkInfeasibility(const OsiBranchingInformation * info) const; - - /** For the variable(s) referenced by the object, - look at the current solution and set bounds to match the solution. - Returns measure of how much it had to move solution to make feasible - */ - virtual double feasibleRegion(OsiSolverInterface * solver) const ; - /** For the variable(s) referenced by the object, - look at the current solution and set bounds to match the solution. - Returns measure of how much it had to move solution to make feasible - Faster version - */ - virtual double feasibleRegion(OsiSolverInterface * solver, const OsiBranchingInformation * info) const =0; - - /** Create a branching object and indicate which way to branch first. - - The branching object has to know how to create branches (fix - variables, etc.) - */ - virtual OsiBranchingObject * createBranch(OsiSolverInterface * /*solver*/, - const OsiBranchingInformation * /*info*/, - int /*way*/) const {throw CoinError("Need code","createBranch","OsiBranchingObject"); return NULL; } - - /** \brief Return true if object can take part in normal heuristics - */ - virtual bool canDoHeuristics() const - {return true;} - /** \brief Return true if object can take part in move to nearest heuristic - */ - virtual bool canMoveToNearest() const - {return false;} - /** Column number if single column object -1 otherwise, - Used by heuristics - */ - virtual int columnNumber() const; - /// Return Priority - note 1 is highest priority - inline int priority() const - { return priority_;} - /// Set priority - inline void setPriority(int priority) - { priority_ = priority;} - /** \brief Return true if branch should only bound variables - */ - virtual bool boundBranch() const - {return true;} - /// Return true if knows how to deal with Pseudo Shadow Prices - virtual bool canHandleShadowPrices() const - { return false;} - /// Return maximum number of ways branch may have - inline int numberWays() const - { return numberWays_;} - /// Set maximum number of ways branch may have - inline void setNumberWays(int numberWays) - { numberWays_ = static_cast(numberWays) ; } - /** Return preferred way to branch. If two - then way=0 means down and 1 means up, otherwise - way points to preferred branch - */ - inline void setWhichWay(int way) - { whichWay_ = static_cast(way) ; } - /** Return current preferred way to branch. If two - then way=0 means down and 1 means up, otherwise - way points to preferred branch - */ - inline int whichWay() const - { return whichWay_;} - /// Get pre-emptive preferred way of branching - -1 off, 0 down, 1 up (for 2-way) - virtual int preferredWay() const - { return -1;} - /// Return infeasibility - inline double infeasibility() const - { return infeasibility_;} - /// Return "up" estimate (default 1.0e-5) - virtual double upEstimate() const; - /// Return "down" estimate (default 1.0e-5) - virtual double downEstimate() const; - /** Reset variable bounds to their original values. - Bounds may be tightened, so it may be good to be able to reset them to - their original values. - */ - virtual void resetBounds(const OsiSolverInterface * ) {} - /** Change column numbers after preprocessing - */ - virtual void resetSequenceEtc(int , const int * ) {} - /// Updates stuff like pseudocosts before threads - virtual void updateBefore(const OsiObject * ) {} - /// Updates stuff like pseudocosts after threads finished - virtual void updateAfter(const OsiObject * , const OsiObject * ) {} - -protected: - /// data - - /// Computed infeasibility - mutable double infeasibility_; - /// Computed preferred way to branch - mutable short whichWay_; - /// Maximum number of ways on branch - short numberWays_; - /// Priority - int priority_; - -}; -/// Define a class to add a bit of complexity to OsiObject -/// This assumes 2 way branching - - -class OsiObject2 : public OsiObject { - -public: - - /// Default Constructor - OsiObject2 (); - - /// Copy constructor - OsiObject2 ( const OsiObject2 &); - - /// Assignment operator - OsiObject2 & operator=( const OsiObject2& rhs); - - /// Destructor - virtual ~OsiObject2 (); - - /// Set preferred way of branching - -1 off, 0 down, 1 up (for 2-way) - inline void setPreferredWay(int value) - {preferredWay_=value;} - - /// Get preferred way of branching - -1 off, 0 down, 1 up (for 2-way) - virtual int preferredWay() const - { return preferredWay_;} -protected: - /// Preferred way of branching - -1 off, 0 down, 1 up (for 2-way) - int preferredWay_; - /// "Infeasibility" on other way - mutable double otherInfeasibility_; - -}; - -/** \brief Abstract branching object base class - - In the abstract, an OsiBranchingObject contains instructions for how to - branch. We want an abstract class so that we can describe how to branch on - simple objects (e.g., integers) and more exotic objects - (e.g., cliques or hyperplanes). - - The #branch() method is the crucial routine: it is expected to be able to - step through a set of branch arms, executing the actions required to create - each subproblem in turn. The base class is primarily virtual to allow for - a wide range of problem modifications. - - See OsiObject for an overview of the two classes (OsiObject and - OsiBranchingObject) which make up Osi's branching - model. -*/ - -class OsiBranchingObject { - -public: - - /// Default Constructor - OsiBranchingObject (); - - /// Constructor - OsiBranchingObject (OsiSolverInterface * solver, double value); - - /// Copy constructor - OsiBranchingObject ( const OsiBranchingObject &); - - /// Assignment operator - OsiBranchingObject & operator=( const OsiBranchingObject& rhs); - - /// Clone - virtual OsiBranchingObject * clone() const=0; - - /// Destructor - virtual ~OsiBranchingObject (); - - /// The number of branch arms created for this branching object - inline int numberBranches() const - {return numberBranches_;} - - /// The number of branch arms left for this branching object - inline int numberBranchesLeft() const - {return numberBranches_-branchIndex_;} - - /// Increment the number of branch arms left for this branching object - inline void incrementNumberBranchesLeft() - { numberBranches_ ++;} - - /** Set the number of branch arms left for this branching object - Just for forcing - */ - inline void setNumberBranchesLeft(int /*value*/) - {/*assert (value==1&&!branchIndex_);*/ numberBranches_=1;} - - /// Decrement the number of branch arms left for this branching object - inline void decrementNumberBranchesLeft() - {branchIndex_++;} - - /** \brief Execute the actions required to branch, as specified by the - current state of the branching object, and advance the object's - state. - Returns change in guessed objective on next branch - */ - virtual double branch(OsiSolverInterface * solver)=0; - /** \brief Execute the actions required to branch, as specified by the - current state of the branching object, and advance the object's - state. - Returns change in guessed objective on next branch - */ - virtual double branch() {return branch(NULL);} - /** \brief Return true if branch should fix variables - */ - virtual bool boundBranch() const - {return true;} - /** Get the state of the branching object - This is just the branch index - */ - inline int branchIndex() const - {return branchIndex_;} - - /** Set the state of the branching object. - */ - inline void setBranchingIndex(int branchIndex) - { branchIndex_ = static_cast(branchIndex) ; } - - /// Current value - inline double value() const - {return value_;} - - /// Return pointer back to object which created - inline const OsiObject * originalObject() const - {return originalObject_;} - /// Set pointer back to object which created - inline void setOriginalObject(const OsiObject * object) - {originalObject_=object;} - /** Double checks in case node can change its mind! - Returns objective value - Can change objective etc */ - virtual void checkIsCutoff(double ) {} - /// For debug - int columnNumber() const; - /** \brief Print something about branch - only if log level high - */ - virtual void print(const OsiSolverInterface * =NULL) const {} - -protected: - - /// Current value - has some meaning about branch - double value_; - - /// Pointer back to object which created - const OsiObject * originalObject_; - - /** Number of branches - */ - int numberBranches_; - - /** The state of the branching object. i.e. branch index - This starts at 0 when created - */ - short branchIndex_; - -}; -/* This contains information - This could also contain pseudo shadow prices - or information for dealing with computing and trusting pseudo-costs -*/ -class OsiBranchingInformation { - -public: - - /// Default Constructor - OsiBranchingInformation (); - - /** Useful Constructor - (normalSolver true if has matrix etc etc) - copySolution true if constructot should make a copy - */ - OsiBranchingInformation (const OsiSolverInterface * solver, bool normalSolver,bool copySolution=false); - - /// Copy constructor - OsiBranchingInformation ( const OsiBranchingInformation &); - - /// Assignment operator - OsiBranchingInformation & operator=( const OsiBranchingInformation& rhs); - - /// Clone - virtual OsiBranchingInformation * clone() const; - - /// Destructor - virtual ~OsiBranchingInformation (); - - // Note public -public: - /// data - - /** State of search - 0 - no solution - 1 - only heuristic solutions - 2 - branched to a solution - 3 - no solution but many nodes - */ - int stateOfSearch_; - /// Value of objective function (in minimization sense) - double objectiveValue_; - /// Value of objective cutoff (in minimization sense) - double cutoff_; - /// Direction 1.0 for minimization, -1.0 for maximization - double direction_; - /// Integer tolerance - double integerTolerance_; - /// Primal tolerance - double primalTolerance_; - /// Maximum time remaining before stopping on time - double timeRemaining_; - /// Dual to use if row bound violated (if negative then pseudoShadowPrices off) - double defaultDual_; - /// Pointer to solver - mutable const OsiSolverInterface * solver_; - /// The number of columns - int numberColumns_; - /// Pointer to current lower bounds on columns - mutable const double * lower_; - /// Pointer to current solution - mutable const double * solution_; - /// Pointer to current upper bounds on columns - mutable const double * upper_; - /// Highly optional target (hot start) solution - const double * hotstartSolution_; - /// Pointer to duals - const double * pi_; - /// Pointer to row activity - const double * rowActivity_; - /// Objective - const double * objective_; - /// Pointer to current lower bounds on rows - const double * rowLower_; - /// Pointer to current upper bounds on rows - const double * rowUpper_; - /// Elements in column copy of matrix - const double * elementByColumn_; - /// Column starts - const CoinBigIndex * columnStart_; - /// Column lengths - const int * columnLength_; - /// Row indices - const int * row_; - /** Useful region of length CoinMax(numberColumns,2*numberRows) - This is allocated and deleted before OsiObject::infeasibility - It is zeroed on entry and should be so on exit - It only exists if defaultDual_>=0.0 - */ - double * usefulRegion_; - /// Useful index region to go with usefulRegion_ - int * indexRegion_; - /// Number of solutions found - int numberSolutions_; - /// Number of branching solutions found (i.e. exclude heuristics) - int numberBranchingSolutions_; - /// Depth in tree - int depth_; - /// TEMP - bool owningSolution_; -}; - -/// This just adds two-wayness to a branching object - -class OsiTwoWayBranchingObject : public OsiBranchingObject { - -public: - - /// Default constructor - OsiTwoWayBranchingObject (); - - /** Create a standard tw0-way branch object - - Specifies a simple two-way branch. - Specify way = -1 to set the object state to perform the down arm first, - way = 1 for the up arm. - */ - OsiTwoWayBranchingObject (OsiSolverInterface *solver,const OsiObject * originalObject, - int way , double value) ; - - /// Copy constructor - OsiTwoWayBranchingObject ( const OsiTwoWayBranchingObject &); - - /// Assignment operator - OsiTwoWayBranchingObject & operator= (const OsiTwoWayBranchingObject& rhs); - - /// Destructor - virtual ~OsiTwoWayBranchingObject (); - - using OsiBranchingObject::branch ; - /** \brief Sets the bounds for the variable according to the current arm - of the branch and advances the object state to the next arm. - state. - Returns change in guessed objective on next branch - */ - virtual double branch(OsiSolverInterface * solver)=0; - - inline int firstBranch() const { return firstBranch_; } - /// Way returns -1 on down +1 on up - inline int way() const - { return !branchIndex_ ? firstBranch_ : -firstBranch_;} -protected: - /// Which way was first branch -1 = down, +1 = up - int firstBranch_; -}; -/// Define a single integer class - - -class OsiSimpleInteger : public OsiObject2 { - -public: - - /// Default Constructor - OsiSimpleInteger (); - - /// Useful constructor - passed solver index - OsiSimpleInteger (const OsiSolverInterface * solver, int iColumn); - - /// Useful constructor - passed solver index and original bounds - OsiSimpleInteger (int iColumn, double lower, double upper); - - /// Copy constructor - OsiSimpleInteger ( const OsiSimpleInteger &); - - /// Clone - virtual OsiObject * clone() const; - - /// Assignment operator - OsiSimpleInteger & operator=( const OsiSimpleInteger& rhs); - - /// Destructor - virtual ~OsiSimpleInteger (); - - using OsiObject::infeasibility ; - /// Infeasibility - large is 0.5 - virtual double infeasibility(const OsiBranchingInformation * info, int & whichWay) const; - - using OsiObject::feasibleRegion ; - /** Set bounds to fix the variable at the current (integer) value. - - Given an integer value, set the lower and upper bounds to fix the - variable. Returns amount it had to move variable. - */ - virtual double feasibleRegion(OsiSolverInterface * solver, const OsiBranchingInformation * info) const; - - /** Creates a branching object - - The preferred direction is set by \p way, 0 for down, 1 for up. - */ - virtual OsiBranchingObject * createBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) const; - - - /// Set solver column number - inline void setColumnNumber(int value) - {columnNumber_=value;} - - /** Column number if single column object -1 otherwise, - so returns >= 0 - Used by heuristics - */ - virtual int columnNumber() const; - - /// Original bounds - inline double originalLowerBound() const - { return originalLower_;} - inline void setOriginalLowerBound(double value) - { originalLower_=value;} - inline double originalUpperBound() const - { return originalUpper_;} - inline void setOriginalUpperBound(double value) - { originalUpper_=value;} - /** Reset variable bounds to their original values. - Bounds may be tightened, so it may be good to be able to reset them to - their original values. - */ - virtual void resetBounds(const OsiSolverInterface * solver) ; - /** Change column numbers after preprocessing - */ - virtual void resetSequenceEtc(int numberColumns, const int * originalColumns); - - /// Return "up" estimate (default 1.0e-5) - virtual double upEstimate() const; - /// Return "down" estimate (default 1.0e-5) - virtual double downEstimate() const; - /// Return true if knows how to deal with Pseudo Shadow Prices - virtual bool canHandleShadowPrices() const - { return false;} -protected: - /// data - /// Original lower bound - double originalLower_; - /// Original upper bound - double originalUpper_; - /// Column number in solver - int columnNumber_; - -}; -/** Simple branching object for an integer variable - - This object can specify a two-way branch on an integer variable. For each - arm of the branch, the upper and lower bounds on the variable can be - independently specified. 0 -> down, 1-> up. -*/ - -class OsiIntegerBranchingObject : public OsiTwoWayBranchingObject { - -public: - - /// Default constructor - OsiIntegerBranchingObject (); - - /** Create a standard floor/ceiling branch object - - Specifies a simple two-way branch. Let \p value = x*. One arm of the - branch will be lb <= x <= floor(x*), the other ceil(x*) <= x <= ub. - Specify way = -1 to set the object state to perform the down arm first, - way = 1 for the up arm. - */ - OsiIntegerBranchingObject (OsiSolverInterface *solver,const OsiSimpleInteger * originalObject, - int way , double value) ; - /** Create a standard floor/ceiling branch object - - Specifies a simple two-way branch in a more flexible way. One arm of the - branch will be lb <= x <= downUpperBound, the other upLowerBound <= x <= ub. - Specify way = -1 to set the object state to perform the down arm first, - way = 1 for the up arm. - */ - OsiIntegerBranchingObject (OsiSolverInterface *solver,const OsiSimpleInteger * originalObject, - int way , double value, double downUpperBound, double upLowerBound) ; - - /// Copy constructor - OsiIntegerBranchingObject ( const OsiIntegerBranchingObject &); - - /// Assignment operator - OsiIntegerBranchingObject & operator= (const OsiIntegerBranchingObject& rhs); - - /// Clone - virtual OsiBranchingObject * clone() const; - - /// Destructor - virtual ~OsiIntegerBranchingObject (); - - using OsiBranchingObject::branch ; - /** \brief Sets the bounds for the variable according to the current arm - of the branch and advances the object state to the next arm. - state. - Returns change in guessed objective on next branch - */ - virtual double branch(OsiSolverInterface * solver); - - using OsiBranchingObject::print ; - /** \brief Print something about branch - only if log level high - */ - virtual void print(const OsiSolverInterface * solver=NULL); - -protected: - // Probably could get away with just value which is already stored - /// Lower [0] and upper [1] bounds for the down arm (way_ = -1) - double down_[2]; - /// Lower [0] and upper [1] bounds for the up arm (way_ = 1) - double up_[2]; -}; - - -/** Define Special Ordered Sets of type 1 and 2. These do not have to be - integer - so do not appear in lists of integers. - - which_ points columns of matrix -*/ - - -class OsiSOS : public OsiObject2 { - -public: - - // Default Constructor - OsiSOS (); - - /** Useful constructor - which are indices - and weights are also given. If null then 0,1,2.. - type is SOS type - */ - OsiSOS (const OsiSolverInterface * solver, int numberMembers, - const int * which, const double * weights, int type=1); - - // Copy constructor - OsiSOS ( const OsiSOS &); - - /// Clone - virtual OsiObject * clone() const; - - // Assignment operator - OsiSOS & operator=( const OsiSOS& rhs); - - // Destructor - virtual ~OsiSOS (); - - using OsiObject::infeasibility ; - /// Infeasibility - large is 0.5 - virtual double infeasibility(const OsiBranchingInformation * info,int & whichWay) const; - - using OsiObject::feasibleRegion ; - /** Set bounds to fix the variable at the current (integer) value. - - Given an integer value, set the lower and upper bounds to fix the - variable. Returns amount it had to move variable. - */ - virtual double feasibleRegion(OsiSolverInterface * solver, const OsiBranchingInformation * info) const; - - /** Creates a branching object - - The preferred direction is set by \p way, 0 for down, 1 for up. - */ - virtual OsiBranchingObject * createBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) const; - /// Return "up" estimate (default 1.0e-5) - virtual double upEstimate() const; - /// Return "down" estimate (default 1.0e-5) - virtual double downEstimate() const; - - /// Redoes data when sequence numbers change - virtual void resetSequenceEtc(int numberColumns, const int * originalColumns); - - /// Number of members - inline int numberMembers() const - {return numberMembers_;} - - /// Members (indices in range 0 ... numberColumns-1) - inline const int * members() const - {return members_;} - - /// SOS type - inline int sosType() const - {return sosType_;} - - /// SOS type - inline int setType() const - {return sosType_;} - - /** Array of weights */ - inline const double * weights() const - { return weights_;} - - /** \brief Return true if object can take part in normal heuristics - */ - virtual bool canDoHeuristics() const - {return (sosType_==1&&integerValued_);} - /// Set whether set is integer valued or not - inline void setIntegerValued(bool yesNo) - { integerValued_=yesNo;} - /// Return true if knows how to deal with Pseudo Shadow Prices - virtual bool canHandleShadowPrices() const - { return true;} - /// Set number of members - inline void setNumberMembers(int value) - {numberMembers_=value;} - - /// Members (indices in range 0 ... numberColumns-1) - inline int * mutableMembers() const - {return members_;} - - /// Set SOS type - inline void setSosType(int value) - {sosType_=value;} - - /** Array of weights */ - inline double * mutableWeights() const - { return weights_;} -protected: - /// data - - /// Members (indices in range 0 ... numberColumns-1) - int * members_; - /// Weights - double * weights_; - - /// Number of members - int numberMembers_; - /// SOS type - int sosType_; - /// Whether integer valued - bool integerValued_; -}; - -/** Branching object for Special ordered sets - - */ -class OsiSOSBranchingObject : public OsiTwoWayBranchingObject { - -public: - - // Default Constructor - OsiSOSBranchingObject (); - - // Useful constructor - OsiSOSBranchingObject (OsiSolverInterface * solver, const OsiSOS * originalObject, - int way, - double separator); - - // Copy constructor - OsiSOSBranchingObject ( const OsiSOSBranchingObject &); - - // Assignment operator - OsiSOSBranchingObject & operator=( const OsiSOSBranchingObject& rhs); - - /// Clone - virtual OsiBranchingObject * clone() const; - - // Destructor - virtual ~OsiSOSBranchingObject (); - - using OsiBranchingObject::branch ; - /// Does next branch and updates state - virtual double branch(OsiSolverInterface * solver); - - using OsiBranchingObject::print ; - /** \brief Print something about branch - only if log level high - */ - virtual void print(const OsiSolverInterface * solver=NULL); -private: - /// data -}; -/** Lotsize class */ - - -class OsiLotsize : public OsiObject2 { - -public: - - // Default Constructor - OsiLotsize (); - - /* Useful constructor - passed model index. - Also passed valid values - if range then pairs - */ - OsiLotsize (const OsiSolverInterface * solver, int iColumn, - int numberPoints, const double * points, bool range=false); - - // Copy constructor - OsiLotsize ( const OsiLotsize &); - - /// Clone - virtual OsiObject * clone() const; - - // Assignment operator - OsiLotsize & operator=( const OsiLotsize& rhs); - - // Destructor - virtual ~OsiLotsize (); - - using OsiObject::infeasibility ; - /// Infeasibility - large is 0.5 - virtual double infeasibility(const OsiBranchingInformation * info, int & whichWay) const; - - using OsiObject::feasibleRegion ; - /** Set bounds to contain the current solution. - - More precisely, for the variable associated with this object, take the - value given in the current solution, force it within the current bounds - if required, then set the bounds to fix the variable at the integer - nearest the solution value. Returns amount it had to move variable. - */ - virtual double feasibleRegion(OsiSolverInterface * solver, const OsiBranchingInformation * info) const; - - /** Creates a branching object - - The preferred direction is set by \p way, 0 for down, 1 for up. - */ - virtual OsiBranchingObject * createBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) const; - - - /// Set solver column number - inline void setColumnNumber(int value) - {columnNumber_=value;} - - /** Column number if single column object -1 otherwise, - so returns >= 0 - Used by heuristics - */ - virtual int columnNumber() const; - /** Reset original upper and lower bound values from the solver. - - Handy for updating bounds held in this object after bounds held in the - solver have been tightened. - */ - virtual void resetBounds(const OsiSolverInterface * solver); - - /** Finds range of interest so value is feasible in range range_ or infeasible - between hi[range_] and lo[range_+1]. Returns true if feasible. - */ - bool findRange(double value, double integerTolerance) const; - - /** Returns floor and ceiling - */ - virtual void floorCeiling(double & floorLotsize, double & ceilingLotsize, double value, - double tolerance) const; - - /// Original bounds - inline double originalLowerBound() const - { return bound_[0];} - inline double originalUpperBound() const - { return bound_[rangeType_*numberRanges_-1];} - /// Type - 1 points, 2 ranges - inline int rangeType() const - { return rangeType_;} - /// Number of points - inline int numberRanges() const - { return numberRanges_;} - /// Ranges - inline double * bound() const - { return bound_;} - /** Change column numbers after preprocessing - */ - virtual void resetSequenceEtc(int numberColumns, const int * originalColumns); - - /// Return "up" estimate (default 1.0e-5) - virtual double upEstimate() const; - /// Return "down" estimate (default 1.0e-5) - virtual double downEstimate() const; - /// Return true if knows how to deal with Pseudo Shadow Prices - virtual bool canHandleShadowPrices() const - { return true;} - /** \brief Return true if object can take part in normal heuristics - */ - virtual bool canDoHeuristics() const - {return false;} - -private: - /// data - - /// Column number in model - int columnNumber_; - /// Type - 1 points, 2 ranges - int rangeType_; - /// Number of points - int numberRanges_; - // largest gap - double largestGap_; - /// Ranges - double * bound_; - /// Current range - mutable int range_; -}; - - -/** Lotsize branching object - - This object can specify a two-way branch on an integer variable. For each - arm of the branch, the upper and lower bounds on the variable can be - independently specified. - - Variable_ holds the index of the integer variable in the integerVariable_ - array of the model. -*/ - -class OsiLotsizeBranchingObject : public OsiTwoWayBranchingObject { - -public: - - /// Default constructor - OsiLotsizeBranchingObject (); - - /** Create a lotsize floor/ceiling branch object - - Specifies a simple two-way branch. Let \p value = x*. One arm of the - branch will be is lb <= x <= valid range below(x*), the other valid range above(x*) <= x <= ub. - Specify way = -1 to set the object state to perform the down arm first, - way = 1 for the up arm. - */ - OsiLotsizeBranchingObject (OsiSolverInterface *solver,const OsiLotsize * originalObject, - int way , double value) ; - - /// Copy constructor - OsiLotsizeBranchingObject ( const OsiLotsizeBranchingObject &); - - /// Assignment operator - OsiLotsizeBranchingObject & operator= (const OsiLotsizeBranchingObject& rhs); - - /// Clone - virtual OsiBranchingObject * clone() const; - - /// Destructor - virtual ~OsiLotsizeBranchingObject (); - - using OsiBranchingObject::branch ; - /** \brief Sets the bounds for the variable according to the current arm - of the branch and advances the object state to the next arm. - state. - Returns change in guessed objective on next branch - */ - virtual double branch(OsiSolverInterface * solver); - - using OsiBranchingObject::print ; - /** \brief Print something about branch - only if log level high - */ - virtual void print(const OsiSolverInterface * solver=NULL); - -protected: - /// Lower [0] and upper [1] bounds for the down arm (way_ = -1) - double down_[2]; - /// Lower [0] and upper [1] bounds for the up arm (way_ = 1) - double up_[2]; -}; -#endif diff --git a/thirdparty/linux/include/coin1/OsiChooseVariable.hpp b/thirdparty/linux/include/coin1/OsiChooseVariable.hpp deleted file mode 100644 index 1613bcac..00000000 --- a/thirdparty/linux/include/coin1/OsiChooseVariable.hpp +++ /dev/null @@ -1,534 +0,0 @@ -// Copyright (C) 2006, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiChooseVariable_H -#define OsiChooseVariable_H - -#include -#include - -#include "CoinWarmStartBasis.hpp" -#include "OsiBranchingObject.hpp" - -class OsiSolverInterface; -class OsiHotInfo; - -/** This class chooses a variable to branch on - - The base class just chooses the variable and direction without strong branching but it - has information which would normally be used by strong branching e.g. to re-enter - having fixed a variable but using same candidates for strong branching. - - The flow is : - a) initialize the process. This decides on strong branching list - and stores indices of all infeasible objects - b) do strong branching on list. If list is empty then just - choose one candidate and return without strong branching. If not empty then - go through list and return best. However we may find that the node is infeasible - or that we can fix a variable. If so we return and it is up to user to call - again (after fixing a variable). -*/ - -class OsiChooseVariable { - -public: - - /// Default Constructor - OsiChooseVariable (); - - /// Constructor from solver (so we can set up arrays etc) - OsiChooseVariable (const OsiSolverInterface * solver); - - /// Copy constructor - OsiChooseVariable (const OsiChooseVariable &); - - /// Assignment operator - OsiChooseVariable & operator= (const OsiChooseVariable& rhs); - - /// Clone - virtual OsiChooseVariable * clone() const; - - /// Destructor - virtual ~OsiChooseVariable (); - - /** Sets up strong list and clears all if initialize is true. - Returns number of infeasibilities. - If returns -1 then has worked out node is infeasible! - */ - virtual int setupList ( OsiBranchingInformation *info, bool initialize); - /** Choose a variable - Returns - - -1 Node is infeasible - 0 Normal termination - we have a candidate - 1 All looks satisfied - no candidate - 2 We can change the bound on a variable - but we also have a strong branching candidate - 3 We can change the bound on a variable - but we have a non-strong branching candidate - 4 We can change the bound on a variable - no other candidates - We can pick up branch from bestObjectIndex() and bestWhichWay() - We can pick up a forced branch (can change bound) from firstForcedObjectIndex() and firstForcedWhichWay() - If we have a solution then we can pick up from goodObjectiveValue() and goodSolution() - If fixVariables is true then 2,3,4 are all really same as problem changed - */ - virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables); - /// Returns true if solution looks feasible against given objects - virtual bool feasibleSolution(const OsiBranchingInformation * info, - const double * solution, - int numberObjects, - const OsiObject ** objects); - /// Saves a good solution - void saveSolution(const OsiSolverInterface * solver); - /// Clears out good solution after use - void clearGoodSolution(); - /// Given a candidate fill in useful information e.g. estimates - virtual void updateInformation( const OsiBranchingInformation *info, - int branch, OsiHotInfo * hotInfo); -#if 1 - /// Given a branch fill in useful information e.g. estimates - virtual void updateInformation( int whichObject, int branch, - double changeInObjective, double changeInValue, - int status); -#endif - /// Objective value for feasible solution - inline double goodObjectiveValue() const - { return goodObjectiveValue_;} - /// Estimate of up change or change on chosen if n-way - inline double upChange() const - { return upChange_;} - /// Estimate of down change or max change on other possibilities if n-way - inline double downChange() const - { return downChange_;} - /// Good solution - deleted by finalize - inline const double * goodSolution() const - { return goodSolution_;} - /// Index of chosen object - inline int bestObjectIndex() const - { return bestObjectIndex_;} - /// Set index of chosen object - inline void setBestObjectIndex(int value) - { bestObjectIndex_ = value;} - /// Preferred way of chosen object - inline int bestWhichWay() const - { return bestWhichWay_;} - /// Set preferred way of chosen object - inline void setBestWhichWay(int value) - { bestWhichWay_ = value;} - /// Index of forced object - inline int firstForcedObjectIndex() const - { return firstForcedObjectIndex_;} - /// Set index of forced object - inline void setFirstForcedObjectIndex(int value) - { firstForcedObjectIndex_ = value;} - /// Preferred way of forced object - inline int firstForcedWhichWay() const - { return firstForcedWhichWay_;} - /// Set preferred way of forced object - inline void setFirstForcedWhichWay(int value) - { firstForcedWhichWay_ = value;} - /// Get the number of objects unsatisfied at this node - accurate on first pass - inline int numberUnsatisfied() const - {return numberUnsatisfied_;} - /// Number of objects to choose for strong branching - inline int numberStrong() const - { return numberStrong_;} - /// Set number of objects to choose for strong branching - inline void setNumberStrong(int value) - { numberStrong_ = value;} - /// Number left on strong list - inline int numberOnList() const - { return numberOnList_;} - /// Number of strong branches actually done - inline int numberStrongDone() const - { return numberStrongDone_;} - /// Number of strong iterations actually done - inline int numberStrongIterations() const - { return numberStrongIterations_;} - /// Number of strong branches which changed bounds - inline int numberStrongFixed() const - { return numberStrongFixed_;} - /// List of candidates - inline const int * candidates() const - { return list_;} - /// Trust results from strong branching for changing bounds - inline bool trustStrongForBound() const - { return trustStrongForBound_;} - /// Set trust results from strong branching for changing bounds - inline void setTrustStrongForBound(bool yesNo) - { trustStrongForBound_ = yesNo;} - /// Trust results from strong branching for valid solution - inline bool trustStrongForSolution() const - { return trustStrongForSolution_;} - /// Set trust results from strong branching for valid solution - inline void setTrustStrongForSolution(bool yesNo) - { trustStrongForSolution_ = yesNo;} - /// Set solver and redo arrays - void setSolver (const OsiSolverInterface * solver); - /** Return status - - -1 Node is infeasible - 0 Normal termination - we have a candidate - 1 All looks satisfied - no candidate - 2 We can change the bound on a variable - but we also have a strong branching candidate - 3 We can change the bound on a variable - but we have a non-strong branching candidate - 4 We can change the bound on a variable - no other candidates - We can pick up branch from bestObjectIndex() and bestWhichWay() - We can pick up a forced branch (can change bound) from firstForcedObjectIndex() and firstForcedWhichWay() - If we have a solution then we can pick up from goodObjectiveValue() and goodSolution() - */ - inline int status() const - { return status_;} - inline void setStatus(int value) - { status_ = value;} - - -protected: - // Data - /// Objective value for feasible solution - double goodObjectiveValue_; - /// Estimate of up change or change on chosen if n-way - double upChange_; - /// Estimate of down change or max change on other possibilities if n-way - double downChange_; - /// Good solution - deleted by finalize - double * goodSolution_; - /// List of candidates - int * list_; - /// Useful array (for sorting etc) - double * useful_; - /// Pointer to solver - const OsiSolverInterface * solver_; - /* Status - - -1 Node is infeasible - 0 Normal termination - we have a candidate - 1 All looks satisfied - no candidate - 2 We can change the bound on a variable - but we also have a strong branching candidate - 3 We can change the bound on a variable - but we have a non-strong branching candidate - 4 We can change the bound on a variable - no other candidates - */ - int status_; - /// Index of chosen object - int bestObjectIndex_; - /// Preferred way of chosen object - int bestWhichWay_; - /// Index of forced object - int firstForcedObjectIndex_; - /// Preferred way of forced object - int firstForcedWhichWay_; - /// The number of objects unsatisfied at this node. - int numberUnsatisfied_; - /// Number of objects to choose for strong branching - int numberStrong_; - /// Number left on strong list - int numberOnList_; - /// Number of strong branches actually done - int numberStrongDone_; - /// Number of strong iterations actually done - int numberStrongIterations_; - /// Number of bound changes due to strong branching - int numberStrongFixed_; - /// List of unsatisfied objects - first numberOnList_ for strong branching - /// Trust results from strong branching for changing bounds - bool trustStrongForBound_; - /// Trust results from strong branching for valid solution - bool trustStrongForSolution_; -}; - -/** This class is the placeholder for the pseudocosts used by OsiChooseStrong. - It can also be used by any other pseudocost based strong branching - algorithm. -*/ - -class OsiPseudoCosts { -protected: - // Data - /// Total of all changes up - double * upTotalChange_; - /// Total of all changes down - double * downTotalChange_; - /// Number of times up - int * upNumber_; - /// Number of times down - int * downNumber_; - /// Number of objects (could be found from solver) - int numberObjects_; - /// Number before we trust - int numberBeforeTrusted_; - -private: - void gutsOfDelete(); - void gutsOfCopy(const OsiPseudoCosts& rhs); - -public: - OsiPseudoCosts(); - virtual ~OsiPseudoCosts(); - OsiPseudoCosts(const OsiPseudoCosts& rhs); - OsiPseudoCosts& operator=(const OsiPseudoCosts& rhs); - - /// Number of times before trusted - inline int numberBeforeTrusted() const - { return numberBeforeTrusted_; } - /// Set number of times before trusted - inline void setNumberBeforeTrusted(int value) - { numberBeforeTrusted_ = value; } - /// Initialize the pseudocosts with n entries - void initialize(int n); - /// Give the number of objects for which pseudo costs are stored - inline int numberObjects() const - { return numberObjects_; } - - /** @name Accessor methods to pseudo costs data */ - //@{ - inline double* upTotalChange() { return upTotalChange_; } - inline const double* upTotalChange() const { return upTotalChange_; } - - inline double* downTotalChange() { return downTotalChange_; } - inline const double* downTotalChange() const { return downTotalChange_; } - - inline int* upNumber() { return upNumber_; } - inline const int* upNumber() const { return upNumber_; } - - inline int* downNumber() { return downNumber_; } - inline const int* downNumber() const { return downNumber_; } - //@} - - /// Given a candidate fill in useful information e.g. estimates - virtual void updateInformation(const OsiBranchingInformation *info, - int branch, OsiHotInfo * hotInfo); -#if 1 - /// Given a branch fill in useful information e.g. estimates - virtual void updateInformation( int whichObject, int branch, - double changeInObjective, double changeInValue, - int status); -#endif -}; - -/** This class chooses a variable to branch on - - This chooses the variable and direction with reliability strong branching. - - The flow is : - a) initialize the process. This decides on strong branching list - and stores indices of all infeasible objects - b) do strong branching on list. If list is empty then just - choose one candidate and return without strong branching. If not empty then - go through list and return best. However we may find that the node is infeasible - or that we can fix a variable. If so we return and it is up to user to call - again (after fixing a variable). -*/ - -class OsiChooseStrong : public OsiChooseVariable { - -public: - - /// Default Constructor - OsiChooseStrong (); - - /// Constructor from solver (so we can set up arrays etc) - OsiChooseStrong (const OsiSolverInterface * solver); - - /// Copy constructor - OsiChooseStrong (const OsiChooseStrong &); - - /// Assignment operator - OsiChooseStrong & operator= (const OsiChooseStrong& rhs); - - /// Clone - virtual OsiChooseVariable * clone() const; - - /// Destructor - virtual ~OsiChooseStrong (); - - /** Sets up strong list and clears all if initialize is true. - Returns number of infeasibilities. - If returns -1 then has worked out node is infeasible! - */ - virtual int setupList ( OsiBranchingInformation *info, bool initialize); - /** Choose a variable - Returns - - -1 Node is infeasible - 0 Normal termination - we have a candidate - 1 All looks satisfied - no candidate - 2 We can change the bound on a variable - but we also have a strong branching candidate - 3 We can change the bound on a variable - but we have a non-strong branching candidate - 4 We can change the bound on a variable - no other candidates - We can pick up branch from bestObjectIndex() and bestWhichWay() - We can pick up a forced branch (can change bound) from firstForcedObjectIndex() and firstForcedWhichWay() - If we have a solution then we can pick up from goodObjectiveValue() and goodSolution() - If fixVariables is true then 2,3,4 are all really same as problem changed - */ - virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables); - - /** Pseudo Shadow Price mode - 0 - off - 1 - use if no strong info - 2 - use if strong not trusted - 3 - use even if trusted - */ - inline int shadowPriceMode() const - { return shadowPriceMode_;} - /// Set Shadow price mode - inline void setShadowPriceMode(int value) - { shadowPriceMode_ = value;} - - /** Accessor method to pseudo cost object*/ - const OsiPseudoCosts& pseudoCosts() const - { return pseudoCosts_; } - - /** Accessor method to pseudo cost object*/ - OsiPseudoCosts& pseudoCosts() - { return pseudoCosts_; } - - /** A feww pass-through methods to access members of pseudoCosts_ as if they - were members of OsiChooseStrong object */ - inline int numberBeforeTrusted() const { - return pseudoCosts_.numberBeforeTrusted(); } - inline void setNumberBeforeTrusted(int value) { - pseudoCosts_.setNumberBeforeTrusted(value); } - inline int numberObjects() const { - return pseudoCosts_.numberObjects(); } - -protected: - - /** This is a utility function which does strong branching on - a list of objects and stores the results in OsiHotInfo.objects. - On entry the object sequence is stored in the OsiHotInfo object - and maybe more. - It returns - - -1 - one branch was infeasible both ways - 0 - all inspected - nothing can be fixed - 1 - all inspected - some can be fixed (returnCriterion==0) - 2 - may be returning early - one can be fixed (last one done) (returnCriterion==1) - 3 - returning because max time - - */ - int doStrongBranching( OsiSolverInterface * solver, - OsiBranchingInformation *info, - int numberToDo, int returnCriterion); - - /** Clear out the results array */ - void resetResults(int num); - -protected: - /** Pseudo Shadow Price mode - 0 - off - 1 - use and multiply by strong info - 2 - use - */ - int shadowPriceMode_; - - /** The pseudo costs for the chooser */ - OsiPseudoCosts pseudoCosts_; - - /** The results of the strong branching done on the candidates where the - pseudocosts were not sufficient */ - OsiHotInfo* results_; - /** The number of OsiHotInfo objetcs that contain information */ - int numResults_; -}; - -/** This class contains the result of strong branching on a variable - When created it stores enough information for strong branching -*/ - -class OsiHotInfo { - -public: - - /// Default Constructor - OsiHotInfo (); - - /// Constructor from useful information - OsiHotInfo ( OsiSolverInterface * solver, - const OsiBranchingInformation *info, - const OsiObject * const * objects, - int whichObject); - - /// Copy constructor - OsiHotInfo (const OsiHotInfo &); - - /// Assignment operator - OsiHotInfo & operator= (const OsiHotInfo& rhs); - - /// Clone - virtual OsiHotInfo * clone() const; - - /// Destructor - virtual ~OsiHotInfo (); - - /** Fill in useful information after strong branch. - Return status - */ - int updateInformation( const OsiSolverInterface * solver, const OsiBranchingInformation * info, - OsiChooseVariable * choose); - /// Original objective value - inline double originalObjectiveValue() const - { return originalObjectiveValue_;} - /// Up change - invalid if n-way - inline double upChange() const - { assert (branchingObject_->numberBranches()==2); return changes_[1];} - /// Down change - invalid if n-way - inline double downChange() const - { assert (branchingObject_->numberBranches()==2); return changes_[0];} - /// Set up change - invalid if n-way - inline void setUpChange(double value) - { assert (branchingObject_->numberBranches()==2); changes_[1] = value;} - /// Set down change - invalid if n-way - inline void setDownChange(double value) - { assert (branchingObject_->numberBranches()==2); changes_[0] = value;} - /// Change on way k - inline double change(int k) const - { return changes_[k];} - - /// Up iteration count - invalid if n-way - inline int upIterationCount() const - { assert (branchingObject_->numberBranches()==2); return iterationCounts_[1];} - /// Down iteration count - invalid if n-way - inline int downIterationCount() const - { assert (branchingObject_->numberBranches()==2); return iterationCounts_[0];} - /// Iteration count on way k - inline int iterationCount(int k) const - { return iterationCounts_[k];} - - /// Up status - invalid if n-way - inline int upStatus() const - { assert (branchingObject_->numberBranches()==2); return statuses_[1];} - /// Down status - invalid if n-way - inline int downStatus() const - { assert (branchingObject_->numberBranches()==2); return statuses_[0];} - /// Set up status - invalid if n-way - inline void setUpStatus(int value) - { assert (branchingObject_->numberBranches()==2); statuses_[1] = value;} - /// Set down status - invalid if n-way - inline void setDownStatus(int value) - { assert (branchingObject_->numberBranches()==2); statuses_[0] = value;} - /// Status on way k - inline int status(int k) const - { return statuses_[k];} - /// Branching object - inline OsiBranchingObject * branchingObject() const - { return branchingObject_;} - inline int whichObject() const - { return whichObject_;} - -protected: - // Data - /// Original objective value - double originalObjectiveValue_; - /// Objective changes - double * changes_; - /// Iteration counts - int * iterationCounts_; - /** Status - -1 - not done - 0 - feasible and finished - 1 - infeasible - 2 - not finished - */ - int * statuses_; - /// Branching object - OsiBranchingObject * branchingObject_; - /// Which object on list - int whichObject_; -}; - - -#endif diff --git a/thirdparty/linux/include/coin1/OsiClpSolverInterface.hpp b/thirdparty/linux/include/coin1/OsiClpSolverInterface.hpp deleted file mode 100644 index ebc7e643..00000000 --- a/thirdparty/linux/include/coin1/OsiClpSolverInterface.hpp +++ /dev/null @@ -1,1509 +0,0 @@ -// $Id$ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - - -#ifndef OsiClpSolverInterface_H -#define OsiClpSolverInterface_H - -#include -#include -#include - -#include "ClpSimplex.hpp" -#include "ClpLinearObjective.hpp" -#include "CoinPackedMatrix.hpp" -#include "OsiSolverInterface.hpp" -#include "CoinWarmStartBasis.hpp" -#include "ClpEventHandler.hpp" -#include "ClpNode.hpp" -#include "CoinIndexedVector.hpp" -#include "CoinFinite.hpp" - -class OsiRowCut; -class OsiClpUserSolver; -class OsiClpDisasterHandler; -class CoinSet; -static const double OsiClpInfinity = COIN_DBL_MAX; - -//############################################################################# - -/** Clp Solver Interface - -Instantiation of OsiClpSolverInterface for the Model Algorithm. - -*/ - -class OsiClpSolverInterface : - virtual public OsiSolverInterface { - friend void OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); - -public: - //--------------------------------------------------------------------------- - /**@name Solve methods */ - //@{ - /// Solve initial LP relaxation - virtual void initialSolve(); - - /// Resolve an LP relaxation after problem modification - virtual void resolve(); - - /// Resolve an LP relaxation after problem modification (try GUB) - virtual void resolveGub(int needed); - - /// Invoke solver's built-in enumeration algorithm - virtual void branchAndBound(); - - /** Solve when primal column and dual row solutions are near-optimal - options - 0 no presolve (use primal and dual) - 1 presolve (just use primal) - 2 no presolve (just use primal) - basis - 0 use all slack basis - 1 try and put some in basis - */ - void crossover(int options,int basis); - //@} - - /*! @name OsiSimplexInterface methods - \brief Methods for the Osi Simplex API. - - The current implementation should work for both minimisation and - maximisation in mode 1 (tableau access). In mode 2 (single pivot), only - minimisation is supported as of 100907. - */ - //@{ - /** \brief Simplex API capability. - - Returns - - 0 if no simplex API - - 1 if can just do getBInv etc - - 2 if has all OsiSimplex methods - */ - virtual int canDoSimplexInterface() const; - - /*! \brief Enables simplex mode 1 (tableau access) - - Tells solver that calls to getBInv etc are about to take place. - Underlying code may need mutable as this may be called from - CglCut::generateCuts which is const. If that is too horrific then - each solver e.g. BCP or CBC will have to do something outside - main loop. - */ - virtual void enableFactorization() const; - - /*! \brief Undo any setting changes made by #enableFactorization */ - virtual void disableFactorization() const; - - /** Returns true if a basis is available - AND problem is optimal. This should be used to see if - the BInvARow type operations are possible and meaningful. - */ - virtual bool basisIsAvailable() const; - - /** The following two methods may be replaced by the - methods of OsiSolverInterface using OsiWarmStartBasis if: - 1. OsiWarmStartBasis resize operation is implemented - more efficiently and - 2. It is ensured that effects on the solver are the same - - Returns a basis status of the structural/artificial variables - At present as warm start i.e 0 free, 1 basic, 2 upper, 3 lower - - NOTE artificials are treated as +1 elements so for <= rhs - artificial will be at lower bound if constraint is tight - - This means that Clpsimplex flips artificials as it works - in terms of row activities - */ - virtual void getBasisStatus(int* cstat, int* rstat) const; - - /** Set the status of structural/artificial variables and - factorize, update solution etc - - NOTE artificials are treated as +1 elements so for <= rhs - artificial will be at lower bound if constraint is tight - - This means that Clpsimplex flips artificials as it works - in terms of row activities - Returns 0 if OK, 1 if problem is bad e.g. duplicate elements, too large ... - */ - virtual int setBasisStatus(const int* cstat, const int* rstat); - - ///Get the reduced gradient for the cost vector c - virtual void getReducedGradient(double* columnReducedCosts, - double * duals, - const double * c) const ; - - ///Get a row of the tableau (slack part in slack if not NULL) - virtual void getBInvARow(int row, double* z, double * slack=NULL) const; - - /** Get a row of the tableau (slack part in slack if not NULL) - If keepScaled is true then scale factors not applied after so - user has to use coding similar to what is in this method - */ - virtual void getBInvARow(int row, CoinIndexedVector * z, CoinIndexedVector * slack=NULL, - bool keepScaled=false) const; - - ///Get a row of the basis inverse - virtual void getBInvRow(int row, double* z) const; - - ///Get a column of the tableau - virtual void getBInvACol(int col, double* vec) const ; - - ///Get a column of the tableau - virtual void getBInvACol(int col, CoinIndexedVector * vec) const ; - - /** Update (i.e. ftran) the vector passed in. - Unscaling is applied after - can't be applied before - */ - - virtual void getBInvACol(CoinIndexedVector * vec) const ; - - ///Get a column of the basis inverse - virtual void getBInvCol(int col, double* vec) const ; - - /** Get basic indices (order of indices corresponds to the - order of elements in a vector retured by getBInvACol() and - getBInvCol()). - */ - virtual void getBasics(int* index) const; - - /*! \brief Enables simplex mode 2 (individual pivot control) - - This method is supposed to ensure that all typical things (like - reduced costs, etc.) are updated when individual pivots are executed - and can be queried by other methods. - */ - virtual void enableSimplexInterface(bool doingPrimal); - /// Copy across enabled stuff from one solver to another - void copyEnabledSuff(OsiClpSolverInterface & rhs); - - /*! \brief Undo setting changes made by #enableSimplexInterface */ - virtual void disableSimplexInterface(); - /// Copy across enabled stuff from one solver to another - void copyEnabledStuff(ClpSimplex & rhs); - - /** Perform a pivot by substituting a colIn for colOut in the basis. - The status of the leaving variable is given in statOut. Where - 1 is to upper bound, -1 to lower bound - Return code is 0 for okay, - 1 if inaccuracy forced re-factorization (should be okay) and - -1 for singular factorization - */ - virtual int pivot(int colIn, int colOut, int outStatus); - - /** Obtain a result of the primal pivot - Outputs: colOut -- leaving column, outStatus -- its status, - t -- step size, and, if dx!=NULL, *dx -- primal ray direction. - Inputs: colIn -- entering column, sign -- direction of its change (+/-1). - Both for colIn and colOut, artificial variables are index by - the negative of the row index minus 1. - Return code (for now): 0 -- leaving variable found, - -1 -- everything else? - Clearly, more informative set of return values is required - Primal and dual solutions are updated - */ - virtual int primalPivotResult(int colIn, int sign, - int& colOut, int& outStatus, - double& t, CoinPackedVector* dx); - - /** Obtain a result of the dual pivot (similar to the previous method) - Differences: entering variable and a sign of its change are now - the outputs, the leaving variable and its statuts -- the inputs - If dx!=NULL, then *dx contains dual ray - Return code: same - */ - virtual int dualPivotResult(int& colIn, int& sign, - int colOut, int outStatus, - double& t, CoinPackedVector* dx); - - - //@} - //--------------------------------------------------------------------------- - /**@name Parameter set/get methods - - The set methods return true if the parameter was set to the given value, - false otherwise. There can be various reasons for failure: the given - parameter is not applicable for the solver (e.g., refactorization - frequency for the clp algorithm), the parameter is not yet implemented - for the solver or simply the value of the parameter is out of the range - the solver accepts. If a parameter setting call returns false check the - details of your solver. - - The get methods return true if the given parameter is applicable for the - solver and is implemented. In this case the value of the parameter is - returned in the second argument. Otherwise they return false. - */ - //@{ - // Set an integer parameter - bool setIntParam(OsiIntParam key, int value); - // Set an double parameter - bool setDblParam(OsiDblParam key, double value); - // Set a string parameter - bool setStrParam(OsiStrParam key, const std::string & value); - // Get an integer parameter - bool getIntParam(OsiIntParam key, int& value) const; - // Get an double parameter - bool getDblParam(OsiDblParam key, double& value) const; - // Get a string parameter - bool getStrParam(OsiStrParam key, std::string& value) const; - // Set a hint parameter - overrides OsiSolverInterface - virtual bool setHintParam(OsiHintParam key, bool yesNo=true, - OsiHintStrength strength=OsiHintTry, - void * otherInformation=NULL); - //@} - - //--------------------------------------------------------------------------- - ///@name Methods returning info on how the solution process terminated - //@{ - /// Are there a numerical difficulties? - virtual bool isAbandoned() const; - /// Is optimality proven? - virtual bool isProvenOptimal() const; - /// Is primal infeasiblity proven? - virtual bool isProvenPrimalInfeasible() const; - /// Is dual infeasiblity proven? - virtual bool isProvenDualInfeasible() const; - /// Is the given primal objective limit reached? - virtual bool isPrimalObjectiveLimitReached() const; - /// Is the given dual objective limit reached? - virtual bool isDualObjectiveLimitReached() const; - /// Iteration limit reached? - virtual bool isIterationLimitReached() const; - //@} - - //--------------------------------------------------------------------------- - /**@name WarmStart related methods */ - //@{ - - /*! \brief Get an empty warm start object - - This routine returns an empty CoinWarmStartBasis object. Its purpose is - to provide a way to give a client a warm start basis object of the - appropriate type, which can resized and modified as desired. - */ - - virtual CoinWarmStart *getEmptyWarmStart () const; - - /// Get warmstarting information - virtual CoinWarmStart* getWarmStart() const; - /// Get warmstarting information - inline CoinWarmStartBasis* getPointerToWarmStart() - { return &basis_;} - /// Get warmstarting information - inline const CoinWarmStartBasis* getConstPointerToWarmStart() const - { return &basis_;} - /** Set warmstarting information. Return true/false depending on whether - the warmstart information was accepted or not. */ - virtual bool setWarmStart(const CoinWarmStart* warmstart); - /** \brief Get warm start information. - - Return warm start information for the current state of the solver - interface. If there is no valid warm start information, an empty warm - start object wil be returned. This does not necessarily create an - object - may just point to one. must Delete set true if user - should delete returned object. - OsiClp version always returns pointer and false. - */ - virtual CoinWarmStart* getPointerToWarmStart(bool & mustDelete) ; - - /// Set column status in ClpSimplex and warmStart - void setColumnStatus(int iColumn, ClpSimplex::Status status); - - //@} - - //--------------------------------------------------------------------------- - /**@name Hotstart related methods (primarily used in strong branching). - The user can create a hotstart (a snapshot) of the optimization process - then reoptimize over and over again always starting from there.
      - NOTE: between hotstarted optimizations only - bound changes are allowed. */ - //@{ - /// Create a hotstart point of the optimization process - virtual void markHotStart(); - /// Optimize starting from the hotstart - virtual void solveFromHotStart(); - /// Delete the snapshot - virtual void unmarkHotStart(); - /** Start faster dual - returns negative if problems 1 if infeasible, - Options to pass to solver - 1 - create external reduced costs for columns - 2 - create external reduced costs for rows - 4 - create external row activity (columns always done) - Above only done if feasible - When set resolve does less work - */ - int startFastDual(int options); - /// Stop fast dual - void stopFastDual(); - /// Sets integer tolerance and increment - void setStuff(double tolerance,double increment); - /// Return a conflict analysis cut from small model - OsiRowCut * smallModelCut(const double * originalLower, const double * originalUpper, - int numberRowsAtContinuous,const int * whichGenerator, - int typeCut=0); - /** Return a conflict analysis cut from model - If type is 0 then genuine cut, if 1 then only partially processed - */ - OsiRowCut * modelCut(const double * originalLower, const double * originalUpper, - int numberRowsAtContinuous,const int * whichGenerator, - int typeCut=0); - //@} - - //--------------------------------------------------------------------------- - /**@name Problem information methods - - These methods call the solver's query routines to return - information about the problem referred to by the current object. - Querying a problem that has no data associated with it result in - zeros for the number of rows and columns, and NULL pointers from - the methods that return vectors. - - Const pointers returned from any data-query method are valid as - long as the data is unchanged and the solver is not called. - */ - //@{ - /**@name Methods related to querying the input data */ - //@{ - /// Get number of columns - virtual int getNumCols() const { - return modelPtr_->numberColumns(); } - - /// Get number of rows - virtual int getNumRows() const { - return modelPtr_->numberRows(); } - - /// Get number of nonzero elements - virtual int getNumElements() const { - int retVal = 0; - const CoinPackedMatrix * matrix =modelPtr_->matrix(); - if ( matrix != NULL ) retVal=matrix->getNumElements(); - return retVal; } - - /// Return name of row if one exists or Rnnnnnnn - /// maxLen is currently ignored and only there to match the signature from the base class! - virtual std::string getRowName(int rowIndex, - unsigned maxLen = static_cast(std::string::npos)) const; - - /// Return name of column if one exists or Cnnnnnnn - /// maxLen is currently ignored and only there to match the signature from the base class! - virtual std::string getColName(int colIndex, - unsigned maxLen = static_cast(std::string::npos)) const; - - - /// Get pointer to array[getNumCols()] of column lower bounds - virtual const double * getColLower() const { return modelPtr_->columnLower(); } - - /// Get pointer to array[getNumCols()] of column upper bounds - virtual const double * getColUpper() const { return modelPtr_->columnUpper(); } - - /** Get pointer to array[getNumRows()] of row constraint senses. -
        -
      • 'L' <= constraint -
      • 'E' = constraint -
      • 'G' >= constraint -
      • 'R' ranged constraint -
      • 'N' free constraint -
      - */ - virtual const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of rows right-hand sides -
        -
      • if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i] -
      • if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i] -
      • if rowsense()[i] == 'N' then rhs()[i] == 0.0 -
      - */ - virtual const double * getRightHandSide() const ; - - /** Get pointer to array[getNumRows()] of row ranges. -
        -
      • if rowsense()[i] == 'R' then - rowrange()[i] == rowupper()[i] - rowlower()[i] -
      • if rowsense()[i] != 'R' then - rowrange()[i] is undefined -
      - */ - virtual const double * getRowRange() const ; - - /// Get pointer to array[getNumRows()] of row lower bounds - virtual const double * getRowLower() const { return modelPtr_->rowLower(); } - - /// Get pointer to array[getNumRows()] of row upper bounds - virtual const double * getRowUpper() const { return modelPtr_->rowUpper(); } - - /// Get pointer to array[getNumCols()] of objective function coefficients - virtual const double * getObjCoefficients() const - { if (fakeMinInSimplex_) - return linearObjective_ ; - else - return modelPtr_->objective(); } - - /// Get objective function sense (1 for min (default), -1 for max) - virtual double getObjSense() const - { return ((fakeMinInSimplex_)?-modelPtr_->optimizationDirection(): - modelPtr_->optimizationDirection()); } - - /// Return true if column is continuous - virtual bool isContinuous(int colNumber) const; - /// Return true if variable is binary - virtual bool isBinary(int colIndex) const; - - /** Return true if column is integer. - Note: This function returns true if the the column - is binary or a general integer. - */ - virtual bool isInteger(int colIndex) const; - - /// Return true if variable is general integer - virtual bool isIntegerNonBinary(int colIndex) const; - - /// Return true if variable is binary and not fixed at either bound - virtual bool isFreeBinary(int colIndex) const; - /** Return array of column length - 0 - continuous - 1 - binary (may get fixed later) - 2 - general integer (may get fixed later) - */ - virtual const char * getColType(bool refresh=false) const; - - /** Return true if column is integer but does not have to - be declared as such. - Note: This function returns true if the the column - is binary or a general integer. - */ - bool isOptionalInteger(int colIndex) const; - /** Set the index-th variable to be an optional integer variable */ - void setOptionalInteger(int index); - - /// Get pointer to row-wise copy of matrix - virtual const CoinPackedMatrix * getMatrixByRow() const; - - /// Get pointer to column-wise copy of matrix - virtual const CoinPackedMatrix * getMatrixByCol() const; - - /// Get pointer to mutable column-wise copy of matrix - virtual CoinPackedMatrix * getMutableMatrixByCol() const; - - /// Get solver's value for infinity - virtual double getInfinity() const { return OsiClpInfinity; } - //@} - - /**@name Methods related to querying the solution */ - //@{ - /// Get pointer to array[getNumCols()] of primal solution vector - virtual const double * getColSolution() const; - - /// Get pointer to array[getNumRows()] of dual prices - virtual const double * getRowPrice() const; - - /// Get a pointer to array[getNumCols()] of reduced costs - virtual const double * getReducedCost() const; - - /** Get pointer to array[getNumRows()] of row activity levels (constraint - matrix times the solution vector */ - virtual const double * getRowActivity() const; - - /// Get objective function value - virtual double getObjValue() const; - - /** Get how many iterations it took to solve the problem (whatever - "iteration" mean to the solver. */ - virtual int getIterationCount() const - { return modelPtr_->numberIterations(); } - - /** Get as many dual rays as the solver can provide. (In case of proven - primal infeasibility there should be at least one.) - - The first getNumRows() ray components will always be associated with - the row duals (as returned by getRowPrice()). If \c fullRay is true, - the final getNumCols() entries will correspond to the ray components - associated with the nonbasic variables. If the full ray is requested - and the method cannot provide it, it will throw an exception. - - NOTE for implementers of solver interfaces:
      - The double pointers in the vector should point to arrays of length - getNumRows() and they should be allocated via new[].
      - - NOTE for users of solver interfaces:
      - It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getDualRays(int maxNumRays, - bool fullRay = false) const; - /** Get as many primal rays as the solver can provide. (In case of proven - dual infeasibility there should be at least one.) - - NOTE for implementers of solver interfaces:
      - The double pointers in the vector should point to arrays of length - getNumCols() and they should be allocated via new[].
      - - NOTE for users of solver interfaces:
      - It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getPrimalRays(int maxNumRays) const; - - //@} - //@} - - //--------------------------------------------------------------------------- - - /**@name Problem modifying methods */ - //@{ - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - virtual void setObjCoeff( int elementIndex, double elementValue ); - - /** Set a single column lower bound
      - Use -DBL_MAX for -infinity. */ - virtual void setColLower( int elementIndex, double elementValue ); - - /** Set a single column upper bound
      - Use DBL_MAX for infinity. */ - virtual void setColUpper( int elementIndex, double elementValue ); - - /** Set a single column lower and upper bound */ - virtual void setColBounds( int elementIndex, - double lower, double upper ); - - /** Set the bounds on a number of columns simultaneously
      - The default implementation just invokes setColLower() and - setColUpper() over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - either bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - virtual void setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set a single row lower bound
      - Use -DBL_MAX for -infinity. */ - virtual void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound
      - Use DBL_MAX for infinity. */ - virtual void setRowUpper( int elementIndex, double elementValue ) ; - - /** Set a single row lower and upper bound */ - virtual void setRowBounds( int elementIndex, - double lower, double upper ) ; - - /** Set the type of a single row
      */ - virtual void setRowType(int index, char sense, double rightHandSide, - double range); - - /** Set the bounds on a number of rows simultaneously
      - The default implementation just invokes setRowLower() and - setRowUpper() over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the constraints whose - either bound changes - @param boundList the new lower/upper bound pairs for the constraints - */ - virtual void setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set the type of a number of rows simultaneously
      - The default implementation just invokes setRowType() - over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the constraints whose - any characteristics changes - @param senseList the new senses - @param rhsList the new right hand sides - @param rangeList the new ranges - */ - virtual void setRowSetTypes(const int* indexFirst, - const int* indexLast, - const char* senseList, - const double* rhsList, - const double* rangeList); - /** Set the objective coefficients for all columns - array [getNumCols()] is an array of values for the objective. - This defaults to a series of set operations and is here for speed. - */ - virtual void setObjective(const double * array); - - /** Set the lower bounds for all columns - array [getNumCols()] is an array of values for the objective. - This defaults to a series of set operations and is here for speed. - */ - virtual void setColLower(const double * array); - - /** Set the upper bounds for all columns - array [getNumCols()] is an array of values for the objective. - This defaults to a series of set operations and is here for speed. - */ - virtual void setColUpper(const double * array); - -// using OsiSolverInterface::setRowName ; - /// Set name of row -// virtual void setRowName(int rowIndex, std::string & name) ; - virtual void setRowName(int rowIndex, std::string name) ; - -// using OsiSolverInterface::setColName ; - /// Set name of column -// virtual void setColName(int colIndex, std::string & name) ; - virtual void setColName(int colIndex, std::string name) ; - - //@} - - //------------------------------------------------------------------------- - /**@name Integrality related changing methods */ - //@{ - /** Set the index-th variable to be a continuous variable */ - virtual void setContinuous(int index); - /** Set the index-th variable to be an integer variable */ - virtual void setInteger(int index); - /** Set the variables listed in indices (which is of length len) to be - continuous variables */ - virtual void setContinuous(const int* indices, int len); - /** Set the variables listed in indices (which is of length len) to be - integer variables */ - virtual void setInteger(const int* indices, int len); - /// Number of SOS sets - inline int numberSOS() const - { return numberSOS_;} - /// SOS set info - inline const CoinSet * setInfo() const - { return setInfo_;} - /** \brief Identify integer variables and SOS and create corresponding objects. - - Record integer variables and create an OsiSimpleInteger object for each - one. All existing OsiSimpleInteger objects will be destroyed. - If the solver supports SOS then do the same for SOS. - If justCount then no objects created and we just store numberIntegers_ - Returns number of SOS - */ - - virtual int findIntegersAndSOS(bool justCount); - //@} - - //------------------------------------------------------------------------- - /// Set objective function sense (1 for min (default), -1 for max,) - virtual void setObjSense(double s ) - { modelPtr_->setOptimizationDirection( s < 0 ? -1 : 1); } - - /** Set the primal solution column values - - colsol[numcols()] is an array of values of the problem column - variables. These values are copied to memory owned by the - solver object or the solver. They will be returned as the - result of colsol() until changed by another call to - setColsol() or by a call to any solver routine. Whether the - solver makes use of the solution in any way is - solver-dependent. - */ - virtual void setColSolution(const double * colsol); - - /** Set dual solution vector - - rowprice[numrows()] is an array of values of the problem row - dual variables. These values are copied to memory owned by the - solver object or the solver. They will be returned as the - result of rowprice() until changed by another call to - setRowprice() or by a call to any solver routine. Whether the - solver makes use of the solution in any way is - solver-dependent. - */ - virtual void setRowPrice(const double * rowprice); - - //------------------------------------------------------------------------- - /**@name Methods to expand a problem.
      - Note that if a column is added then by default it will correspond to a - continuous variable. */ - //@{ - - //using OsiSolverInterface::addCol ; - /** */ - virtual void addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj); - /*! \brief Add a named column (primal variable) to the problem. - */ - virtual void addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj, std::string name) ; - /** Add a column (primal variable) to the problem. */ - virtual void addCol(int numberElements, const int * rows, const double * elements, - const double collb, const double colub, - const double obj) ; - /*! \brief Add a named column (primal variable) to the problem. - */ - virtual void addCol(int numberElements, - const int* rows, const double* elements, - const double collb, const double colub, - const double obj, std::string name) ; - /** */ - virtual void addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj); - /** */ - virtual void addCols(const int numcols, - const int * columnStarts, const int * rows, const double * elements, - const double* collb, const double* colub, - const double* obj); - /** */ - virtual void deleteCols(const int num, const int * colIndices); - - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub); - /** */ - /*! \brief Add a named row (constraint) to the problem. - - The default implementation adds the row, then changes the name. This - can surely be made more efficient within an OsiXXX class. - */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub, - std::string name) ; - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng); - /** Add a row (constraint) to the problem. */ - virtual void addRow(int numberElements, const int * columns, const double * element, - const double rowlb, const double rowub) ; - /*! \brief Add a named row (constraint) to the problem. - */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng, std::string name) ; - /** */ - virtual void addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const double* rowlb, const double* rowub); - /** */ - virtual void addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const char* rowsen, const double* rowrhs, - const double* rowrng); - - /** */ - virtual void addRows(const int numrows, - const int * rowStarts, const int * columns, const double * element, - const double* rowlb, const double* rowub); - /// - void modifyCoefficient(int row, int column, double newElement, - bool keepZero=false) - {modelPtr_->modifyCoefficient(row,column,newElement, keepZero);} - - /** */ - virtual void deleteRows(const int num, const int * rowIndices); - /** If solver wants it can save a copy of "base" (continuous) model here - */ - virtual void saveBaseModel() ; - /** Strip off rows to get to this number of rows. - If solver wants it can restore a copy of "base" (continuous) model here - */ - virtual void restoreBaseModel(int numberRows); - - //----------------------------------------------------------------------- - /** Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. - */ - virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts); - /** Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. - This uses array of pointers - */ - virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts); - /** Apply a collection of cuts. - - Only cuts which have an effectiveness >= effectivenessLb - are applied. -
        -
      • ReturnCode.getNumineffective() -- number of cuts which were - not applied because they had an - effectiveness < effectivenessLb -
      • ReturnCode.getNuminconsistent() -- number of invalid cuts -
      • ReturnCode.getNuminconsistentWrtIntegerModel() -- number of - cuts that are invalid with respect to this integer model -
      • ReturnCode.getNuminfeasible() -- number of cuts that would - make this integer model infeasible -
      • ReturnCode.getNumApplied() -- number of integer cuts which - were applied to the integer model -
      • cs.size() == getNumineffective() + - getNuminconsistent() + - getNuminconsistentWrtIntegerModel() + - getNuminfeasible() + - getNumApplied() -
      - */ - virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs, - double effectivenessLb = 0.0); - - //@} - //@} - - //--------------------------------------------------------------------------- - -public: - - /**@name Methods to input a problem */ - //@{ - /** Load in an problem by copying the arguments (the constraints on the - rows are given by lower and upper bounds). If a pointer is NULL then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - virtual void loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub); - - /** Load in an problem by assuming ownership of the arguments (the - constraints on the rows are given by lower and upper bounds). For - default values see the previous method.
      - WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - functions. - */ - virtual void assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - double*& rowlb, double*& rowub); - - /** Load in an problem by copying the arguments (the constraints on the - rows are given by sense/rhs/range triplets). If a pointer is NULL then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • obj: all variables have 0 objective coefficient -
      • rowsen: all rows are >= -
      • rowrhs: all right hand sides are 0 -
      • rowrng: 0 for the ranged rows -
      - */ - virtual void loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng); - - /** Load in an problem by assuming ownership of the arguments (the - constraints on the rows are given by sense/rhs/range triplets). For - default values see the previous method.
      - WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - functions. - */ - virtual void assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - char*& rowsen, double*& rowrhs, - double*& rowrng); - - /** Just like the other loadProblem() methods except that the matrix is - given as a ClpMatrixBase. */ - virtual void loadProblem(const ClpMatrixBase& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) ; - - /** Just like the other loadProblem() methods except that the matrix is - given in a standard column major ordered format (without gaps). */ - virtual void loadProblem(const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub); - - /** Just like the other loadProblem() methods except that the matrix is - given in a standard column major ordered format (without gaps). */ - virtual void loadProblem(const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng); - /// This loads a model from a coinModel object - returns number of errors - virtual int loadFromCoinModel ( CoinModel & modelObject, bool keepSolution=false); - - using OsiSolverInterface::readMps ; - /** Read an mps file from the given filename (defaults to Osi reader) - returns - number of errors (see OsiMpsReader class) */ - virtual int readMps(const char *filename, - const char *extension = "mps") ; - /** Read an mps file from the given filename returns - number of errors (see OsiMpsReader class) */ - int readMps(const char *filename,bool keepNames,bool allowErrors); - /// Read an mps file - virtual int readMps (const char *filename, const char*extension, - int & numberSets, CoinSet ** & sets); - - /** Write the problem into an mps file of the given filename. - If objSense is non zero then -1.0 forces the code to write a - maximization objective and +1.0 to write a minimization one. - If 0.0 then solver can do what it wants */ - virtual void writeMps(const char *filename, - const char *extension = "mps", - double objSense=0.0) const; - /** Write the problem into an mps file of the given filename, - names may be null. formatType is - 0 - normal - 1 - extra accuracy - 2 - IEEE hex (later) - - Returns non-zero on I/O error - */ - virtual int writeMpsNative(const char *filename, - const char ** rowNames, const char ** columnNames, - int formatType=0,int numberAcross=2, - double objSense=0.0) const ; - /// Read file in LP format (with names) - virtual int readLp(const char *filename, const double epsilon = 1e-5); - /** Write the problem into an Lp file of the given filename. - If objSense is non zero then -1.0 forces the code to write a - maximization objective and +1.0 to write a minimization one. - If 0.0 then solver can do what it wants. - This version calls writeLpNative with names */ - virtual void writeLp(const char *filename, - const char *extension = "lp", - double epsilon = 1e-5, - int numberAcross = 10, - int decimals = 5, - double objSense = 0.0, - bool useRowNames = true) const; - /** Write the problem into the file pointed to by the parameter fp. - Other parameters are similar to - those of writeLp() with first parameter filename. - */ - virtual void writeLp(FILE *fp, - double epsilon = 1e-5, - int numberAcross = 10, - int decimals = 5, - double objSense = 0.0, - bool useRowNames = true) const; - /** - I (JJF) am getting annoyed because I can't just replace a matrix. - The default behavior of this is do nothing so only use where that would not matter - e.g. strengthening a matrix for MIP - */ - virtual void replaceMatrixOptional(const CoinPackedMatrix & matrix); - /// And if it does matter (not used at present) - virtual void replaceMatrix(const CoinPackedMatrix & matrix) ; - //@} - - /**@name Message handling (extra for Clp messages). - Normally I presume you would want the same language. - If not then you could use underlying model pointer */ - //@{ - /** Pass in a message handler - - It is the client's responsibility to destroy a message handler installed - by this routine; it will not be destroyed when the solver interface is - destroyed. - */ - virtual void passInMessageHandler(CoinMessageHandler * handler); - /// Set language - void newLanguage(CoinMessages::Language language); - void setLanguage(CoinMessages::Language language) - {newLanguage(language);} - /// Set log level (will also set underlying solver's log level) - void setLogLevel(int value); - /// Create C++ lines to get to current state - void generateCpp( FILE * fp); - //@} - //--------------------------------------------------------------------------- - - /**@name Clp specific public interfaces */ - //@{ - /// Get pointer to Clp model - ClpSimplex * getModelPtr() const ; - /// Set pointer to Clp model and return old - inline ClpSimplex * swapModelPtr(ClpSimplex * newModel) - { ClpSimplex * model = modelPtr_; modelPtr_=newModel;return model;} - /// Get special options - inline unsigned int specialOptions() const - { return specialOptions_;} - void setSpecialOptions(unsigned int value); - /// Last algorithm used , 1 = primal, 2 = dual other unknown - inline int lastAlgorithm() const - { return lastAlgorithm_;} - /// Set last algorithm used , 1 = primal, 2 = dual other unknown - inline void setLastAlgorithm(int value) - { lastAlgorithm_ = value;} - /// Get scaling action option - inline int cleanupScaling() const - { return cleanupScaling_;} - /** Set Scaling option - When scaling is on it is possible that the scaled problem - is feasible but the unscaled is not. Clp returns a secondary - status code to that effect. This option allows for a cleanup. - If you use it I would suggest 1. - This only affects actions when scaled optimal - 0 - no action - 1 - clean up using dual if primal infeasibility - 2 - clean up using dual if dual infeasibility - 3 - clean up using dual if primal or dual infeasibility - 11,12,13 - as 1,2,3 but use primal - */ - inline void setCleanupScaling(int value) - { cleanupScaling_=value;} - /** Get smallest allowed element in cut. - If smaller than this then ignored */ - inline double smallestElementInCut() const - { return smallestElementInCut_;} - /** Set smallest allowed element in cut. - If smaller than this then ignored */ - inline void setSmallestElementInCut(double value) - { smallestElementInCut_=value;} - /** Get smallest change in cut. - If (upper-lower)*element < this then element is - taken out and cut relaxed. - (upper-lower) is taken to be at least 1.0 and - this is assumed >= smallestElementInCut_ - */ - inline double smallestChangeInCut() const - { return smallestChangeInCut_;} - /** Set smallest change in cut. - If (upper-lower)*element < this then element is - taken out and cut relaxed. - (upper-lower) is taken to be at least 1.0 and - this is assumed >= smallestElementInCut_ - */ - inline void setSmallestChangeInCut(double value) - { smallestChangeInCut_=value;} - /// Pass in initial solve options - inline void setSolveOptions(const ClpSolve & options) - { solveOptions_ = options;} - /** Tighten bounds - lightweight or very lightweight - 0 - normal, 1 lightweight but just integers, 2 lightweight and all - */ - virtual int tightenBounds(int lightweight=0); - /// See if any integer variables make infeasible other way - int infeasibleOtherWay(char * whichWay); - /// Return number of entries in L part of current factorization - virtual CoinBigIndex getSizeL() const; - /// Return number of entries in U part of current factorization - virtual CoinBigIndex getSizeU() const; - /// Get disaster handler - const OsiClpDisasterHandler * disasterHandler() const - { return disasterHandler_;} - /// Pass in disaster handler - void passInDisasterHandler(OsiClpDisasterHandler * handler); - /// Get fake objective - ClpLinearObjective * fakeObjective() const - { return fakeObjective_;} - /// Set fake objective (and take ownership) - void setFakeObjective(ClpLinearObjective * fakeObjective); - /// Set fake objective - void setFakeObjective(double * fakeObjective); - /*! \brief Set up solver for repeated use by Osi interface. - - The normal usage does things like keeping factorization around so can be - used. Will also do things like keep scaling and row copy of matrix if - matrix does not change. - - \p senseOfAdventure: - - 0 - safe stuff as above - - 1 - will take more risks - if it does not work then bug which will be - fixed - - 2 - don't bother doing most extreme termination checks e.g. don't bother - re-factorizing if less than 20 iterations. - - 3 - Actually safer than 1 (mainly just keeps factorization) - - \p printOut - - -1 always skip round common messages instead of doing some work - - 0 skip if normal defaults - - 1 leaves - */ - void setupForRepeatedUse(int senseOfAdventure=0, int printOut=0); - /// Synchronize model (really if no cuts in tree) - virtual void synchronizeModel(); - /*! \brief Set special options in underlying clp solver. - - Safe as const because #modelPtr_ is mutable. - */ - void setSpecialOptionsMutable(unsigned int value) const; - - //@} - - //--------------------------------------------------------------------------- - - /**@name Constructors and destructors */ - //@{ - /// Default Constructor - OsiClpSolverInterface (); - - /// Clone - virtual OsiSolverInterface * clone(bool copyData = true) const; - - /// Copy constructor - OsiClpSolverInterface (const OsiClpSolverInterface &); - - /// Borrow constructor - only delete one copy - OsiClpSolverInterface (ClpSimplex * rhs, bool reallyOwn=false); - - /// Releases so won't error - void releaseClp(); - - /// Assignment operator - OsiClpSolverInterface & operator=(const OsiClpSolverInterface& rhs); - - /// Destructor - virtual ~OsiClpSolverInterface (); - - /// Resets as if default constructor - virtual void reset(); - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected methods - //@{ - /** Apply a row cut (append to constraint matrix). */ - virtual void applyRowCut(const OsiRowCut& rc); - - /** Apply a column cut (adjust one or more bounds). */ - virtual void applyColCut(const OsiColCut& cc); - //@} - - //--------------------------------------------------------------------------- - -protected: - /**@name Protected methods */ - //@{ - /// The real work of a copy constructor (used by copy and assignment) - void gutsOfDestructor(); - - /// Deletes all mutable stuff - void freeCachedResults() const; - - /// Deletes all mutable stuff for row ranges etc - void freeCachedResults0() const; - - /// Deletes all mutable stuff for matrix etc - void freeCachedResults1() const; - - /// A method that fills up the rowsense_, rhs_ and rowrange_ arrays - void extractSenseRhsRange() const; - - /// - void fillParamMaps(); - /** Warm start - - NOTE artificials are treated as +1 elements so for <= rhs - artificial will be at lower bound if constraint is tight - - This means that Clpsimplex flips artificials as it works - in terms of row activities - */ - CoinWarmStartBasis getBasis(ClpSimplex * model) const; - /** Sets up working basis as a copy of input - - NOTE artificials are treated as +1 elements so for <= rhs - artificial will be at lower bound if constraint is tight - - This means that Clpsimplex flips artificials as it works - in terms of row activities - */ - void setBasis( const CoinWarmStartBasis & basis, ClpSimplex * model); - /// Crunch down problem a bit - void crunch(); - /// Extend scale factors - void redoScaleFactors(int numberRows,const CoinBigIndex * starts, - const int * indices, const double * elements); -public: - /** Sets up working basis as a copy of input and puts in as basis - */ - void setBasis( const CoinWarmStartBasis & basis); - /// Just puts current basis_ into ClpSimplex model - inline void setBasis( ) - { setBasis(basis_,modelPtr_);} - /// Warm start difference from basis_ to statusArray - CoinWarmStartDiff * getBasisDiff(const unsigned char * statusArray) const ; - /// Warm start from statusArray - CoinWarmStartBasis * getBasis(const unsigned char * statusArray) const ; - /// Delete all scale factor stuff and reset option - void deleteScaleFactors(); - /// If doing fast hot start then ranges are computed - inline const double * upRange() const - { return rowActivity_;} - inline const double * downRange() const - { return columnActivity_;} - /// Pass in range array - inline void passInRanges(int * array) - { whichRange_=array;} - /// Pass in sos stuff from AMPl - void setSOSData(int numberSOS,const char * type, - const int * start,const int * indices, const double * weights=NULL); - /// Compute largest amount any at continuous away from bound - void computeLargestAway(); - /// Get largest amount continuous away from bound - inline double largestAway() const - { return largestAway_;} - /// Set largest amount continuous away from bound - inline void setLargestAway(double value) - { largestAway_ = value;} - /// Sort of lexicographic resolve - void lexSolve(); - //@} - -protected: - /**@name Protected member data */ - //@{ - /// Clp model represented by this class instance - mutable ClpSimplex * modelPtr_; - //@} - /**@name Cached information derived from the OSL model */ - //@{ - /// Pointer to dense vector of row sense indicators - mutable char *rowsense_; - - /// Pointer to dense vector of row right-hand side values - mutable double *rhs_; - - /** Pointer to dense vector of slack upper bounds for range - constraints (undefined for non-range rows) - */ - mutable double *rowrange_; - - /** A pointer to the warmstart information to be used in the hotstarts. - This is NOT efficient and more thought should be given to it... */ - mutable CoinWarmStartBasis* ws_; - /** also save row and column information for hot starts - only used in hotstarts so can be casual */ - mutable double * rowActivity_; - mutable double * columnActivity_; - /// Stuff for fast dual - ClpNodeStuff stuff_; - /// Number of SOS sets - int numberSOS_; - /// SOS set info - CoinSet * setInfo_; - /// Alternate model (hot starts) - but also could be permanent and used for crunch - ClpSimplex * smallModel_; - /// factorization for hot starts - ClpFactorization * factorization_; - /** Smallest allowed element in cut. - If smaller than this then ignored */ - double smallestElementInCut_; - /** Smallest change in cut. - If (upper-lower)*element < this then element is - taken out and cut relaxed. */ - double smallestChangeInCut_; - /// Largest amount continuous away from bound - double largestAway_; - /// Arrays for hot starts - char * spareArrays_; - /** Warmstart information to be used in resolves. */ - CoinWarmStartBasis basis_; - /** The original iteration limit before hotstarts started. */ - int itlimOrig_; - - /*! \brief Last algorithm used - - Coded as - - 0 invalid - - 1 primal - - 2 dual - - -911 disaster in the algorithm that was attempted - - 999 current solution no longer optimal due to change in problem or - basis - */ - mutable int lastAlgorithm_; - - /// To say if destructor should delete underlying model - bool notOwned_; - - /// Pointer to row-wise copy of problem matrix coefficients. - mutable CoinPackedMatrix *matrixByRow_; - - /// Pointer to row-wise copy of continuous problem matrix coefficients. - CoinPackedMatrix *matrixByRowAtContinuous_; - - /// Pointer to integer information - char * integerInformation_; - - /** Pointer to variables for which we want range information - The number is in [0] - memory is not owned by OsiClp - */ - int * whichRange_; - - //std::map intParamMap_; - //std::map dblParamMap_; - //std::map strParamMap_; - - /*! \brief Faking min to get proper dual solution signs in simplex API */ - mutable bool fakeMinInSimplex_ ; - /*! \brief Linear objective - - Normally a pointer to the linear coefficient array in the clp objective. - An independent copy when #fakeMinInSimplex_ is true, because we need - something permanent to point to when #getObjCoefficients is called. - */ - mutable double *linearObjective_; - - /// To save data in OsiSimplex stuff - mutable ClpDataSave saveData_; - /// Options for initialSolve - ClpSolve solveOptions_; - /** Scaling option - When scaling is on it is possible that the scaled problem - is feasible but the unscaled is not. Clp returns a secondary - status code to that effect. This option allows for a cleanup. - If you use it I would suggest 1. - This only affects actions when scaled optimal - 0 - no action - 1 - clean up using dual if primal infeasibility - 2 - clean up using dual if dual infeasibility - 3 - clean up using dual if primal or dual infeasibility - 11,12,13 - as 1,2,3 but use primal - */ - int cleanupScaling_; - /** Special options - 0x80000000 off - 0 simple stuff for branch and bound - 1 try and keep work regions as much as possible - 2 do not use any perturbation - 4 allow exit before re-factorization - 8 try and re-use factorization if no cuts - 16 use standard strong branching rather than clp's - 32 Just go to first factorization in fast dual - 64 try and tighten bounds in crunch - 128 Model will only change in column bounds - 256 Clean up model before hot start - 512 Give user direct access to Clp regions in getBInvARow etc (i.e., - do not unscale, and do not return result in getBInv parameters; - you have to know where to look for the answer) - 1024 Don't "borrow" model in initialSolve - 2048 Don't crunch - 4096 quick check for optimality - Bits above 8192 give where called from in Cbc - At present 0 is normal, 1 doing fast hotstarts, 2 is can do quick check - 65536 Keep simple i.e. no crunch etc - 131072 Try and keep scaling factors around - 262144 Don't try and tighten bounds (funny global cuts) - 524288 Fake objective and 0-1 - 1048576 Don't recompute ray after crunch - 2097152 - */ - mutable unsigned int specialOptions_; - /// Copy of model when option 131072 set - ClpSimplex * baseModel_; - /// Number of rows when last "scaled" - int lastNumberRows_; - /// Continuous model - ClpSimplex * continuousModel_; - /// Possible disaster handler - OsiClpDisasterHandler * disasterHandler_ ; - /// Fake objective - ClpLinearObjective * fakeObjective_; - /// Row scale factors (has inverse at end) - CoinDoubleArrayWithLength rowScale_; - /// Column scale factors (has inverse at end) - CoinDoubleArrayWithLength columnScale_; - //@} -}; - -class OsiClpDisasterHandler : public ClpDisasterHandler { -public: - /**@name Virtual methods that the derived classe should provide. - */ - //@{ - /// Into simplex - virtual void intoSimplex(); - /// Checks if disaster - virtual bool check() const ; - /// saves information for next attempt - virtual void saveInfo(); - /// Type of disaster 0 can fix, 1 abort - virtual int typeOfDisaster(); - //@} - - - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - OsiClpDisasterHandler(OsiClpSolverInterface * model = NULL); - /** Destructor */ - virtual ~OsiClpDisasterHandler(); - // Copy - OsiClpDisasterHandler(const OsiClpDisasterHandler&); - // Assignment - OsiClpDisasterHandler& operator=(const OsiClpDisasterHandler&); - /// Clone - virtual ClpDisasterHandler * clone() const; - - //@} - - /**@name Sets/gets */ - - //@{ - /** set model. */ - void setOsiModel(OsiClpSolverInterface * model); - /// Get model - inline OsiClpSolverInterface * osiModel() const - { return osiModel_;} - /// Set where from - inline void setWhereFrom(int value) - { whereFrom_=value;} - /// Get where from - inline int whereFrom() const - { return whereFrom_;} - /// Set phase - inline void setPhase(int value) - { phase_=value;} - /// Get phase - inline int phase() const - { return phase_;} - /// are we in trouble - bool inTrouble() const; - - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Pointer to model - OsiClpSolverInterface * osiModel_; - /** Where from - 0 dual (resolve) - 1 crunch - 2 primal (resolve) - 4 dual (initialSolve) - 6 primal (initialSolve) - */ - int whereFrom_; - /** phase - 0 initial - 1 trying continuing with back in and maybe different perturb - 2 trying continuing with back in and different scaling - 3 trying dual from all slack - 4 trying primal from previous stored basis - */ - int phase_; - /// Are we in trouble - bool inTrouble_; - //@} -}; -// So unit test can find out if NDEBUG set -bool OsiClpHasNDEBUG(); -//############################################################################# -/** A function that tests the methods in the OsiClpSolverInterface class. */ -void OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); -#endif diff --git a/thirdparty/linux/include/coin1/OsiColCut.hpp b/thirdparty/linux/include/coin1/OsiColCut.hpp deleted file mode 100644 index c98eb5cc..00000000 --- a/thirdparty/linux/include/coin1/OsiColCut.hpp +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiColCut_H -#define OsiColCut_H - -#include - -#include "CoinPackedVector.hpp" - -#include "OsiCollections.hpp" -#include "OsiCut.hpp" - -/** Column Cut Class - -Column Cut Class has: -
        -
      • a sparse vector of column lower bounds -
      • a sparse vector of column upper bounds -
      -*/ -class OsiColCut : public OsiCut { - friend void OsiColCutUnitTest(const OsiSolverInterface * baseSiP, - const std::string & mpsDir); - -public: - - //---------------------------------------------------------------- - - /**@name Setting column bounds */ - //@{ - /// Set column lower bounds - inline void setLbs( - int nElements, - const int * colIndices, - const double * lbElements ); - - /// Set column lower bounds from a packed vector - inline void setLbs( const CoinPackedVector & lbs ); - - /// Set column upper bounds - inline void setUbs( - int nElements, - const int * colIndices, - const double * ubElements ); - - /// Set column upper bounds from a packed vector - inline void setUbs( const CoinPackedVector & ubs ); - //@} - - //---------------------------------------------------------------- - - /**@name Getting column bounds */ - //@{ - /// Get column lower bounds - inline const CoinPackedVector & lbs() const; - /// Get column upper bounds - inline const CoinPackedVector & ubs() const; - //@} - - /**@name Comparison operators */ - //@{ -#if __GNUC__ != 2 - using OsiCut::operator== ; -#endif - /** equal - true if lower bounds, upper bounds, - and OsiCut are equal. - */ - inline virtual bool operator==(const OsiColCut& rhs) const; - -#if __GNUC__ != 2 - using OsiCut::operator!= ; -#endif - /// not equal - inline virtual bool operator!=(const OsiColCut& rhs) const; - //@} - - - //---------------------------------------------------------------- - - /**@name Sanity checks on cut */ - //@{ - /** Returns true if the cut is consistent with respect to itself. - This checks to ensure that: -
        -
      • The bound vectors do not have duplicate indices, -
      • The bound vectors indices are >=0 -
      - */ - inline virtual bool consistent() const; - - /** Returns true if cut is consistent with respect to the solver - interface's model. This checks to ensure that - the lower & upperbound packed vectors: -
        -
      • do not have an index >= the number of column is the model. -
      - */ - inline virtual bool consistent(const OsiSolverInterface& im) const; - - /** Returns true if the cut is infeasible with respect to its bounds and the - column bounds in the solver interface's models. - This checks whether: -
        -
      • the maximum of the new and existing lower bounds is strictly - greater than the minimum of the new and existing upper bounds. -
      - */ - inline virtual bool infeasible(const OsiSolverInterface &im) const; - /** Returns infeasibility of the cut with respect to solution - passed in i.e. is positive if cuts off that solution. - solution is getNumCols() long.. - */ - virtual double violated(const double * solution) const; - //@} - - //---------------------------------------------------------------- - - /**@name Constructors and destructors */ - //@{ - /// Assignment operator - OsiColCut & operator=( const OsiColCut& rhs); - - /// Copy constructor - OsiColCut ( const OsiColCut &); - - /// Default Constructor - OsiColCut (); - - /// Clone - virtual OsiColCut * clone() const; - - /// Destructor - virtual ~OsiColCut (); - //@} - - /**@name Debug stuff */ - //@{ - /// Print cuts in collection - virtual void print() const; - //@} - -private: - - /**@name Private member data */ - //@{ - /// Lower bounds - CoinPackedVector lbs_; - /// Upper bounds - CoinPackedVector ubs_; - //@} - -}; - - - -//------------------------------------------------------------------- -// Set lower & upper bound vectors -//------------------------------------------------------------------- -void OsiColCut::setLbs( - int size, - const int * colIndices, - const double * lbElements ) -{ - lbs_.setVector(size,colIndices,lbElements); -} -// -void OsiColCut::setUbs( - int size, - const int * colIndices, - const double * ubElements ) -{ - ubs_.setVector(size,colIndices,ubElements); -} -// -void OsiColCut::setLbs( const CoinPackedVector & lbs ) -{ - lbs_ = lbs; -} -// -void OsiColCut::setUbs( const CoinPackedVector & ubs ) -{ - ubs_ = ubs; -} - -//------------------------------------------------------------------- -// Get Column Lower Bounds and Column Upper Bounds -//------------------------------------------------------------------- -const CoinPackedVector & OsiColCut::lbs() const -{ - return lbs_; -} -// -const CoinPackedVector & OsiColCut::ubs() const -{ - return ubs_; -} - -//---------------------------------------------------------------- -// == operator -//------------------------------------------------------------------- -bool -OsiColCut::operator==( - const OsiColCut& rhs) const -{ - if ( this->OsiCut::operator!=(rhs) ) - return false; - if ( lbs() != rhs.lbs() ) - return false; - if ( ubs() != rhs.ubs() ) - return false; - return true; -} -// -bool -OsiColCut::operator!=( - const OsiColCut& rhs) const -{ - return !( (*this)==rhs ); -} - -//---------------------------------------------------------------- -// consistent & infeasible -//------------------------------------------------------------------- -bool OsiColCut::consistent() const -{ - const CoinPackedVector & lb = lbs(); - const CoinPackedVector & ub = ubs(); - // Test for consistent cut. - // Are packed vectors consistent? - lb.duplicateIndex("consistent", "OsiColCut"); - ub.duplicateIndex("consistent", "OsiColCut"); - if ( lb.getMinIndex() < 0 ) return false; - if ( ub.getMinIndex() < 0 ) return false; - return true; -} -// -bool OsiColCut::consistent(const OsiSolverInterface& im) const -{ - const CoinPackedVector & lb = lbs(); - const CoinPackedVector & ub = ubs(); - - // Test for consistent cut. - if ( lb.getMaxIndex() >= im.getNumCols() ) return false; - if ( ub.getMaxIndex() >= im.getNumCols() ) return false; - - return true; -} - -#if 0 -bool OsiColCut::feasible(const OsiSolverInterface &im) const -{ - const double * oldColLb = im.getColLower(); - const double * oldColUb = im.getColUpper(); - const CoinPackedVector & cutLbs = lbs(); - const CoinPackedVector & cutUbs = ubs(); - int i; - - for ( i=0; i oldColLb[colIndx] ) - newLb = cutLbs.elements()[i]; - else - newLb = oldColLb[colIndx]; - - double newUb = oldColUb[colIndx]; - if ( cutUbs.indexExists(colIndx) ) - if ( cutUbs[colIndx] < newUb ) newUb = cutUbs[colIndx]; - if ( newLb > newUb ) - return false; - } - - for ( i=0; i newLb ) newLb = cutLbs[colIndx]; - if ( newUb < newLb ) - return false; - } - - return true; -} -#endif - - -bool OsiColCut::infeasible(const OsiSolverInterface &im) const -{ - const double * oldColLb = im.getColLower(); - const double * oldColUb = im.getColUpper(); - const CoinPackedVector & cutLbs = lbs(); - const CoinPackedVector & cutUbs = ubs(); - int i; - - for ( i=0; i oldColLb[colIndx] ? - cutLbs.getElements()[i] : oldColLb[colIndx]; - - double newUb = oldColUb[colIndx]; - if ( cutUbs.isExistingIndex(colIndx) ) - if ( cutUbs[colIndx] < newUb ) newUb = cutUbs[colIndx]; - if ( newLb > newUb ) - return true; - } - - for ( i=0; i newLb ) newLb = cutLbs[colIndx]; - if ( newUb < newLb ) - return true; - } - - return false; -} - -#endif diff --git a/thirdparty/linux/include/coin1/OsiCollections.hpp b/thirdparty/linux/include/coin1/OsiCollections.hpp deleted file mode 100644 index d68df1a9..00000000 --- a/thirdparty/linux/include/coin1/OsiCollections.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiCollections_H -#define OsiCollections_H - -#include - -//Forward declarations -class OsiColCut; -class OsiRowCut; -class OsiCut; - - - -/* Collection Classes */ - -/**@name Typedefs for Standard Template Library collections of Osi Objects. */ -//@{ -/// Vector of int -typedef std::vector OsiVectorInt; -/// Vector of double -typedef std::vector OsiVectorDouble; -/// Vector of OsiColCut pointers -typedef std::vector OsiVectorColCutPtr; -/// Vector of OsiRowCut pointers -typedef std::vector OsiVectorRowCutPtr; -/// Vector of OsiCut pointers -typedef std::vector OsiVectorCutPtr; -//@} - - - -#endif diff --git a/thirdparty/linux/include/coin1/OsiConfig.h b/thirdparty/linux/include/coin1/OsiConfig.h deleted file mode 100644 index 2e42bb90..00000000 --- a/thirdparty/linux/include/coin1/OsiConfig.h +++ /dev/null @@ -1,19 +0,0 @@ -/* src/Osi/config_osi.h. Generated by configure. */ -/* src/Osi/config_osi.h.in. */ - -#ifndef __CONFIG_OSI_H__ -#define __CONFIG_OSI_H__ - -/* Version number of project */ -#define OSI_VERSION "0.107.4" - -/* Major Version number of project */ -#define OSI_VERSION_MAJOR 0 - -/* Minor Version number of project */ -#define OSI_VERSION_MINOR 107 - -/* Release Version number of project */ -#define OSI_VERSION_RELEASE 4 - -#endif diff --git a/thirdparty/linux/include/coin1/OsiCut.hpp b/thirdparty/linux/include/coin1/OsiCut.hpp deleted file mode 100644 index 0b2cc5ca..00000000 --- a/thirdparty/linux/include/coin1/OsiCut.hpp +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiCut_H -#define OsiCut_H - -#include "OsiCollections.hpp" -#include "OsiSolverInterface.hpp" - -/** Base Class for cut. - -The Base cut class contains: -
        -
      • a measure of the cut's effectivness -
      -*/ - -/* - COIN_NOTEST_DUPLICATE is rooted in CoinUtils. Check there before you - meddle here. -*/ -#ifdef COIN_FAST_CODE -#ifndef COIN_NOTEST_DUPLICATE -#define COIN_NOTEST_DUPLICATE -#endif -#endif - -#ifndef COIN_NOTEST_DUPLICATE -#define COIN_DEFAULT_VALUE_FOR_DUPLICATE true -#else -#define COIN_DEFAULT_VALUE_FOR_DUPLICATE false -#endif - - -class OsiCut { - -public: - - //------------------------------------------------------------------- - /**@name Effectiveness */ - //@{ - /// Set effectiveness - inline void setEffectiveness( double e ); - /// Get effectiveness - inline double effectiveness() const; - //@} - - /**@name GloballyValid */ - //@{ - /// Set globallyValid (nonzero true) - inline void setGloballyValid( bool trueFalse ) - { globallyValid_=trueFalse ? 1 : 0;} - inline void setGloballyValid( ) - { globallyValid_=1;} - inline void setNotGloballyValid( ) - { globallyValid_=0;} - /// Get globallyValid - inline bool globallyValid() const - { return globallyValid_!=0;} - /// Set globallyValid as integer (nonzero true) - inline void setGloballyValidAsInteger( int trueFalse ) - { globallyValid_=trueFalse;} - /// Get globallyValid - inline int globallyValidAsInteger() const - { return globallyValid_;} - //@} - - /**@name Debug stuff */ - //@{ - /// Print cuts in collection - virtual void print() const {} - //@} - -#if 0 - / **@name Times used */ - / /@{ - / // Set times used - inline void setTimesUsed( int t ); - / // Increment times used - inline void incrementTimesUsed(); - / // Get times used - inline int timesUsed() const; - / /@} - - / **@name Times tested */ - / /@{ - / // Set times tested - inline void setTimesTested( int t ); - / // Increment times tested - inline void incrementTimesTested(); - / // Get times tested - inline int timesTested() const; - / /@} -#endif - - //---------------------------------------------------------------- - - /**@name Comparison operators */ - //@{ - ///equal. 2 cuts are equal if there effectiveness are equal - inline virtual bool operator==(const OsiCut& rhs) const; - /// not equal - inline virtual bool operator!=(const OsiCut& rhs) const; - /// less than. True if this.effectiveness < rhs.effectiveness - inline virtual bool operator< (const OsiCut& rhs) const; - /// less than. True if this.effectiveness > rhs.effectiveness - inline virtual bool operator> (const OsiCut& rhs) const; - //@} - - //---------------------------------------------------------------- - // consistent() - returns true if the cut is consistent with repect to itself. - // This might include checks to ensure that a packed vector - // itself does not have a negative index. - // consistent(const OsiSolverInterface& si) - returns true if cut is consistent with - // respect to the solver interface's model. This might include a check to - // make sure a column index is not greater than the number - // of columns in the problem. - // infeasible(const OsiSolverInterface& si) - returns true if the cut is infeasible - // "with respect to itself". This might include a check to ensure - // the lower bound is greater than the upper bound, or if the - // cut simply replaces bounds that the new bounds are feasible with - // respect to the old bounds. - //----------------------------------------------------------------- - /**@name Sanity checks on cut */ - //@{ - /** Returns true if the cut is consistent with respect to itself, - without considering any - data in the model. For example, it might check to ensure - that a column index is not negative. - */ - inline virtual bool consistent() const=0; - - /** Returns true if cut is consistent when considering the solver - interface's model. For example, it might check to ensure - that a column index is not greater than the number of columns - in the model. Assumes consistent() is true. - */ - inline virtual bool consistent(const OsiSolverInterface& si) const=0; - - /** Returns true if the cut is infeasible "with respect to itself" and - cannot be satisfied. This method does NOT check whether adding the - cut to the solver interface's model will make the -model- infeasble. - A cut which returns !infeasible(si) may very well make the model - infeasible. (Of course, adding a cut with returns infeasible(si) - will make the model infeasible.) - - The "with respect to itself" is in quotes becaues - in the case where the cut - simply replaces existing bounds, it may make - sense to test infeasibility with respect to the current bounds - held in the solver interface's model. For example, if the cut - has a single variable in it, it might check that the maximum - of new and existing lower bounds is greater than the minium of - the new and existing upper bounds. - - Assumes that consistent(si) is true.
      - Infeasible cuts can be a useful mechanism for a cut generator to - inform the solver interface that its detected infeasibility of the - problem. - */ - inline virtual bool infeasible(const OsiSolverInterface &si) const=0; - - /** Returns infeasibility of the cut with respect to solution - passed in i.e. is positive if cuts off that solution. - solution is getNumCols() long.. - */ - virtual double violated(const double * solution) const=0; - //@} - -protected: - - /**@name Constructors and destructors */ - //@{ - /// Default Constructor - OsiCut (); - - /// Copy constructor - OsiCut ( const OsiCut &); - - /// Assignment operator - OsiCut & operator=( const OsiCut& rhs); - - /// Destructor - virtual ~OsiCut (); - //@} - -private: - - /**@name Private member data */ - //@{ - /// Effectiveness - double effectiveness_; - /// If cut has global validity i.e. can be used anywhere in tree - int globallyValid_; -#if 0 - /// Times used - int timesUsed_; - /// Times tested - int timesTested_; -#endif - //@} -}; - - -//------------------------------------------------------------------- -// Set/Get member data -//------------------------------------------------------------------- -void OsiCut::setEffectiveness(double e) { effectiveness_=e; } -double OsiCut::effectiveness() const { return effectiveness_; } - -#if 0 -void OsiCut::setTimesUsed( int t ) { timesUsed_=t; } -void OsiCut::incrementTimesUsed() { timesUsed_++; } -int OsiCut::timesUsed() const { return timesUsed_; } - -void OsiCut::setTimesTested( int t ) { timesTested_=t; } -void OsiCut::incrementTimesTested() { timesTested_++; } -int OsiCut::timesTested() const{ return timesTested_; } -#endif - -//---------------------------------------------------------------- -// == operator -//------------------------------------------------------------------- -bool -OsiCut::operator==(const OsiCut& rhs) const -{ - return effectiveness()==rhs.effectiveness(); -} -bool -OsiCut::operator!=(const OsiCut& rhs) const -{ - return !( (*this)==rhs ); -} -bool -OsiCut::operator< (const OsiCut& rhs) const -{ - return effectiveness() (const OsiCut& rhs) const -{ - return effectiveness()>rhs.effectiveness(); -} -#endif diff --git a/thirdparty/linux/include/coin1/OsiCuts.hpp b/thirdparty/linux/include/coin1/OsiCuts.hpp deleted file mode 100644 index d4544025..00000000 --- a/thirdparty/linux/include/coin1/OsiCuts.hpp +++ /dev/null @@ -1,474 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiCuts_H -#define OsiCuts_H - -#include "CoinPragma.hpp" - -#include -#include -#include "OsiCollections.hpp" -#include "OsiRowCut.hpp" -#include "OsiColCut.hpp" -#include "CoinFloatEqual.hpp" - -/** Collections of row cuts and column cuts -*/ -class OsiCuts { - friend void OsiCutsUnitTest(); - -public: - /**@name Iterator classes - */ - //@{ - /** Iterator - - This is a class for iterating over the collection of cuts. - */ - class iterator { - friend class OsiCuts; - public: - iterator(OsiCuts& cuts); - iterator(const iterator & src); - iterator & operator=( const iterator& rhs); - ~iterator (); - OsiCut* operator*() const { return cutP_; } - iterator operator++(); - - iterator operator++(int) - { - iterator temp = *this; - ++*this; - return temp; - } - - bool operator==(const iterator& it) const { - return (colCutIndex_+rowCutIndex_)==(it.colCutIndex_+it.rowCutIndex_); - } - - bool operator!=(const iterator& it) const { - return !((*this)==it); - } - - bool operator<(const iterator& it) const { - return (colCutIndex_+rowCutIndex_)<(it.colCutIndex_+it.rowCutIndex_); - } - - private: - iterator(); - // *THINK* : how to inline these without sticking the code here (ugly...) - iterator begin(); - iterator end(); - OsiCuts& cuts_; - int rowCutIndex_; - int colCutIndex_; - OsiCut * cutP_; - }; - - /** Const Iterator - - This is a class for iterating over the collection of cuts. - */ - class const_iterator { - friend class OsiCuts; - public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef OsiCut* value_type; - typedef size_t difference_type; - typedef OsiCut ** pointer; - typedef OsiCut *& reference; - - public: - const_iterator(const OsiCuts& cuts); - const_iterator(const const_iterator & src); - const_iterator & operator=( const const_iterator& rhs); - ~const_iterator (); - const OsiCut* operator*() const { return cutP_; } - - const_iterator operator++(); - - const_iterator operator++(int) - { - const_iterator temp = *this; - ++*this; - return temp; - } - - bool operator==(const const_iterator& it) const { - return (colCutIndex_+rowCutIndex_)==(it.colCutIndex_+it.rowCutIndex_); - } - - bool operator!=(const const_iterator& it) const { - return !((*this)==it); - } - - bool operator<(const const_iterator& it) const { - return (colCutIndex_+rowCutIndex_)<(it.colCutIndex_+it.rowCutIndex_); - } - private: - inline const_iterator(); - // *THINK* : how to inline these without sticking the code here (ugly...) - const_iterator begin(); - const_iterator end(); - const OsiCuts * cutsPtr_; - int rowCutIndex_; - int colCutIndex_; - const OsiCut * cutP_; - }; - //@} - - //------------------------------------------------------------------- - // - // Cuts class definition begins here: - // - //------------------------------------------------------------------- - - /** \name Inserting a cut into collection */ - //@{ - /** \brief Insert a row cut */ - inline void insert( const OsiRowCut & rc ); - /** \brief Insert a row cut unless it is a duplicate - cut may get sorted. - Duplicate is defined as CoinAbsFltEq says same*/ - void insertIfNotDuplicate( OsiRowCut & rc , CoinAbsFltEq treatAsSame=CoinAbsFltEq(1.0e-12) ); - /** \brief Insert a row cut unless it is a duplicate - cut may get sorted. - Duplicate is defined as CoinRelFltEq says same*/ - void insertIfNotDuplicate( OsiRowCut & rc , CoinRelFltEq treatAsSame ); - /** \brief Insert a column cut */ - inline void insert( const OsiColCut & cc ); - - /** \brief Insert a row cut. - - The OsiCuts object takes control of the cut object. - On return, \c rcPtr is NULL. - */ - inline void insert( OsiRowCut * & rcPtr ); - /** \brief Insert a column cut. - - The OsiCuts object takes control of the cut object. - On return \c ccPtr is NULL. - */ - inline void insert( OsiColCut * & ccPtr ); -#if 0 - inline void insert( OsiCut * & cPtr ); -#endif - - /** \brief Insert a set of cuts */ - inline void insert(const OsiCuts & cs); - - //@} - - /**@name Number of cuts in collection */ - //@{ - /// Number of row cuts in collection - inline int sizeRowCuts() const; - /// Number of column cuts in collection - inline int sizeColCuts() const; - /// Number of cuts in collection - inline int sizeCuts() const; - //@} - - /**@name Debug stuff */ - //@{ - /// Print cuts in collection - inline void printCuts() const; - //@} - - /**@name Get a cut from collection */ - //@{ - /// Get pointer to i'th row cut - inline OsiRowCut * rowCutPtr(int i); - /// Get const pointer to i'th row cut - inline const OsiRowCut * rowCutPtr(int i) const; - /// Get pointer to i'th column cut - inline OsiColCut * colCutPtr(int i); - /// Get const pointer to i'th column cut - inline const OsiColCut * colCutPtr(int i) const; - - /// Get reference to i'th row cut - inline OsiRowCut & rowCut(int i); - /// Get const reference to i'th row cut - inline const OsiRowCut & rowCut(int i) const; - /// Get reference to i'th column cut - inline OsiColCut & colCut(int i); - /// Get const reference to i'th column cut - inline const OsiColCut & colCut(int i) const; - - /// Get const pointer to the most effective cut - inline const OsiCut * mostEffectiveCutPtr() const; - /// Get pointer to the most effective cut - inline OsiCut * mostEffectiveCutPtr(); - //@} - - /**@name Deleting cut from collection */ - //@{ - /// Remove i'th row cut from collection - inline void eraseRowCut(int i); - /// Remove i'th column cut from collection - inline void eraseColCut(int i); - /// Get pointer to i'th row cut and remove ptr from collection - inline OsiRowCut * rowCutPtrAndZap(int i); - /*! \brief Clear all row cuts without deleting them - - Handy in case one wants to use CGL without managing cuts in one of - the OSI containers. Client is ultimately responsible for deleting the - data structures holding the row cuts. - */ - inline void dumpCuts() ; - /*! \brief Selective delete and clear for row cuts. - - Deletes the cuts specified in \p to_erase then clears remaining cuts - without deleting them. A hybrid of eraseRowCut(int) and dumpCuts(). - Client is ultimately responsible for deleting the data structures - for row cuts not specified in \p to_erase. - */ - inline void eraseAndDumpCuts(const std::vector to_erase) ; - //@} - - /**@name Sorting collection */ - //@{ - /// Cuts with greatest effectiveness are first. - inline void sort(); - //@} - - - /**@name Iterators - Example of using an iterator to sum effectiveness - of all cuts in the collection. -
      -     double sumEff=0.0;
      -     for ( OsiCuts::iterator it=cuts.begin(); it!=cuts.end(); ++it )
      -           sumEff+= (*it)->effectiveness();
      -     
      - */ - //@{ - /// Get iterator to beginning of collection - inline iterator begin() { iterator it(*this); it.begin(); return it; } - /// Get const iterator to beginning of collection - inline const_iterator begin() const { const_iterator it(*this); it.begin(); return it; } - /// Get iterator to end of collection - inline iterator end() { iterator it(*this); it.end(); return it; } - /// Get const iterator to end of collection - inline const_iterator end() const { const_iterator it(*this); it.end(); return it; } - //@} - - - /**@name Constructors and destructors */ - //@{ - /// Default constructor - OsiCuts (); - - /// Copy constructor - OsiCuts ( const OsiCuts &); - - /// Assignment operator - OsiCuts & operator=( const OsiCuts& rhs); - - /// Destructor - virtual ~OsiCuts (); - //@} - -private: - //*@name Function operator for sorting cuts by efectiveness */ - //@{ - class OsiCutCompare - { - public: - /// Function for sorting cuts by effectiveness - inline bool operator()(const OsiCut * c1P,const OsiCut * c2P) - { return c1P->effectiveness() > c2P->effectiveness(); } - }; - //@} - - /**@name Private methods */ - //@{ - /// Copy internal data - void gutsOfCopy( const OsiCuts & source ); - /// Delete internal data - void gutsOfDestructor(); - //@} - - /**@name Private member data */ - //@{ - /// Vector of row cuts pointers - OsiVectorRowCutPtr rowCutPtrs_; - /// Vector of column cuts pointers - OsiVectorColCutPtr colCutPtrs_; - //@} - -}; - - -//------------------------------------------------------------------- -// insert cuts into collection -//------------------------------------------------------------------- -void OsiCuts::insert( const OsiRowCut & rc ) -{ - OsiRowCut * newCutPtr = rc.clone(); - //assert(dynamic_cast(newCutPtr) != NULL ); - rowCutPtrs_.push_back(static_cast(newCutPtr)); -} -void OsiCuts::insert( const OsiColCut & cc ) -{ - OsiColCut * newCutPtr = cc.clone(); - //assert(dynamic_cast(newCutPtr) != NULL ); - colCutPtrs_.push_back(static_cast(newCutPtr)); -} - -void OsiCuts::insert( OsiRowCut* & rcPtr ) -{ - rowCutPtrs_.push_back(rcPtr); - rcPtr = NULL; -} -void OsiCuts::insert( OsiColCut* &ccPtr ) -{ - colCutPtrs_.push_back(ccPtr); - ccPtr = NULL; -} -#if 0 -void OsiCuts::insert( OsiCut* & cPtr ) -{ - OsiRowCut * rcPtr = dynamic_cast(cPtr); - if ( rcPtr != NULL ) { - insert( rcPtr ); - cPtr = rcPtr; - } - else { - OsiColCut * ccPtr = dynamic_cast(cPtr); - assert( ccPtr != NULL ); - insert( ccPtr ); - cPtr = ccPtr; - } -} -#endif - -// LANNEZ SEBASTIEN added Thu May 25 01:22:51 EDT 2006 -void OsiCuts::insert(const OsiCuts & cs) -{ - for (OsiCuts::const_iterator it = cs.begin (); it != cs.end (); it++) - { - const OsiRowCut * rCut = dynamic_cast (*it); - const OsiColCut * cCut = dynamic_cast (*it); - assert (rCut || cCut); - if (rCut) - insert (*rCut); - else - insert (*cCut); - } -} - -//------------------------------------------------------------------- -// sort -//------------------------------------------------------------------- -void OsiCuts::sort() -{ - std::sort(colCutPtrs_.begin(),colCutPtrs_.end(),OsiCutCompare()); - std::sort(rowCutPtrs_.begin(),rowCutPtrs_.end(),OsiCutCompare()); -} - - -//------------------------------------------------------------------- -// Get number of in collections -//------------------------------------------------------------------- -int OsiCuts::sizeRowCuts() const { - return static_cast(rowCutPtrs_.size()); } -int OsiCuts::sizeColCuts() const { - return static_cast(colCutPtrs_.size()); } -int OsiCuts::sizeCuts() const { - return static_cast(sizeRowCuts()+sizeColCuts()); } - -//---------------------------------------------------------------- -// Get i'th cut from the collection -//---------------------------------------------------------------- -const OsiRowCut * OsiCuts::rowCutPtr(int i) const { return rowCutPtrs_[i]; } -const OsiColCut * OsiCuts::colCutPtr(int i) const { return colCutPtrs_[i]; } -OsiRowCut * OsiCuts::rowCutPtr(int i) { return rowCutPtrs_[i]; } -OsiColCut * OsiCuts::colCutPtr(int i) { return colCutPtrs_[i]; } - -const OsiRowCut & OsiCuts::rowCut(int i) const { return *rowCutPtr(i); } -const OsiColCut & OsiCuts::colCut(int i) const { return *colCutPtr(i); } -OsiRowCut & OsiCuts::rowCut(int i) { return *rowCutPtr(i); } -OsiColCut & OsiCuts::colCut(int i) { return *colCutPtr(i); } - -//---------------------------------------------------------------- -// Get most effective cut from collection -//---------------------------------------------------------------- -const OsiCut * OsiCuts::mostEffectiveCutPtr() const -{ - const_iterator b=begin(); - const_iterator e=end(); - return *(std::min_element(b,e,OsiCutCompare())); -} -OsiCut * OsiCuts::mostEffectiveCutPtr() -{ - iterator b=begin(); - iterator e=end(); - //return *(std::min_element(b,e,OsiCutCompare())); - OsiCut * retVal = NULL; - double maxEff = COIN_DBL_MIN; - for ( OsiCuts::iterator it=b; it!=e; ++it ) { - if (maxEff < (*it)->effectiveness() ) { - maxEff = (*it)->effectiveness(); - retVal = *it; - } - } - return retVal; -} - -//---------------------------------------------------------------- -// Print all cuts -//---------------------------------------------------------------- -void -OsiCuts::printCuts() const -{ - // do all column cuts first - int i; - int numberColCuts=sizeColCuts(); - for (i=0;iprint(); - } - int numberRowCuts=sizeRowCuts(); - for (i=0;iprint(); - } -} - -//---------------------------------------------------------------- -// Erase i'th cut from the collection -//---------------------------------------------------------------- -void OsiCuts::eraseRowCut(int i) -{ - delete rowCutPtrs_[i]; - rowCutPtrs_.erase( rowCutPtrs_.begin()+i ); -} -void OsiCuts::eraseColCut(int i) -{ - delete colCutPtrs_[i]; - colCutPtrs_.erase( colCutPtrs_.begin()+i ); -} -/// Get pointer to i'th row cut and remove ptr from collection -OsiRowCut * -OsiCuts::rowCutPtrAndZap(int i) -{ - OsiRowCut * cut = rowCutPtrs_[i]; - rowCutPtrs_[i]=NULL; - rowCutPtrs_.erase( rowCutPtrs_.begin()+i ); - return cut; -} -void OsiCuts::dumpCuts() -{ - rowCutPtrs_.clear() ; -} -void OsiCuts::eraseAndDumpCuts(const std::vector to_erase) -{ - for (unsigned i=0; i -

      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 -#include - -/* ========================================================================== */ -/* === SuiteSparse_long ===================================================== */ -/* ========================================================================== */ - -#ifndef SuiteSparse_long - -#if _WIN64 && !(defined PYTHON) && (defined _MSC_VER) - -#define SuiteSparse_long __int64 -#define SuiteSparse_long_max _I64_MAX -#define SuiteSparse_long_idd "I64d" - -#else - -#define SuiteSparse_long long -#define SuiteSparse_long_max LONG_MAX -#define SuiteSparse_long_idd "ld" - -#endif -#define SuiteSparse_long_id "%" SuiteSparse_long_idd -#endif - -/* For backward compatibility with prior versions of SuiteSparse. The UF_* - * macros are deprecated and will be removed in a future version. */ -#ifndef UF_long -#define UF_long SuiteSparse_long -#define UF_long_max SuiteSparse_long_max -#define UF_long_idd SuiteSparse_long_idd -#define UF_long_id SuiteSparse_long_id -#endif - -/* ========================================================================== */ -/* === SuiteSparse_config parameters and functions ========================== */ -/* ========================================================================== */ - -/* SuiteSparse-wide parameters will be placed in this struct. */ - -typedef struct SuiteSparse_config_struct -{ - void *(*malloc_memory) (size_t) ; /* pointer to malloc */ - void *(*realloc_memory) (void *, size_t) ; /* pointer to realloc */ - void (*free_memory) (void *) ; /* pointer to free */ - void *(*calloc_memory) (size_t, size_t) ; /* pointer to calloc */ - -} SuiteSparse_config ; - -void *SuiteSparse_malloc /* pointer to allocated block of memory */ -( - size_t nitems, /* number of items to malloc (>=1 is enforced) */ - size_t size_of_item, /* sizeof each item */ - int *ok, /* TRUE if successful, FALSE otherwise */ - SuiteSparse_config *config /* SuiteSparse-wide configuration */ -) ; - -void *SuiteSparse_free /* always returns NULL */ -( - void *p, /* block to free */ - SuiteSparse_config *config /* SuiteSparse-wide configuration */ -) ; - -void SuiteSparse_tic /* start the timer */ -( - double tic [2] /* output, contents undefined on input */ -) ; - -double SuiteSparse_toc /* return time in seconds since last tic */ -( - double tic [2] /* input: from last call to SuiteSparse_tic */ -) ; - -double SuiteSparse_time /* returns current wall clock time in seconds */ -( - void -) ; - -/* determine which timer to use, if any */ -#ifndef NTIMER -#ifdef _POSIX_C_SOURCE -#if _POSIX_C_SOURCE >= 199309L -#define SUITESPARSE_TIMER_ENABLED -#endif -#endif -#endif - -/* ========================================================================== */ -/* === SuiteSparse version ================================================== */ -/* ========================================================================== */ - -/* SuiteSparse is not a package itself, but a collection of packages, some of - * which must be used together (UMFPACK requires AMD, CHOLMOD requires AMD, - * COLAMD, CAMD, and CCOLAMD, etc). A version number is provided here for the - * collection itself. The versions of packages within each version of - * SuiteSparse are meant to work together. Combining one packge from one - * version of SuiteSparse, with another package from another version of - * SuiteSparse, may or may not work. - * - * SuiteSparse contains the following packages: - * - * SuiteSparse_config version 4.0.2 (version always the same as SuiteSparse) - * AMD version 2.3.1 - * BTF version 1.2.0 - * CAMD version 2.3.1 - * CCOLAMD version 2.8.0 - * CHOLMOD version 2.0.1 - * COLAMD version 2.8.0 - * CSparse version 3.1.1 - * CXSparse version 3.1.1 - * KLU version 1.2.1 - * LDL version 2.1.0 - * RBio version 2.1.1 - * SPQR version 1.3.1 (full name is SuiteSparseQR) - * UMFPACK version 5.6.1 - * MATLAB_Tools various packages & M-files - * - * Other package dependencies: - * BLAS required by CHOLMOD and UMFPACK - * LAPACK required by CHOLMOD - * METIS 4.0.1 required by CHOLMOD (optional) and KLU (optional) - */ - -#define SUITESPARSE_DATE "July 17, 2012" -#define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) -#define SUITESPARSE_MAIN_VERSION 4 -#define SUITESPARSE_SUB_VERSION 0 -#define SUITESPARSE_SUBSUB_VERSION 2 -#define SUITESPARSE_VERSION \ - SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) - -#ifdef __cplusplus -} -#endif -#endif diff --git a/thirdparty/linux/include/coin/amd.h b/thirdparty/linux/include/coin/amd.h deleted file mode 100644 index a38fd31b..00000000 --- a/thirdparty/linux/include/coin/amd.h +++ /dev/null @@ -1,411 +0,0 @@ -/* ========================================================================= */ -/* === AMD: approximate minimum degree ordering =========================== */ -/* ========================================================================= */ - -/* ------------------------------------------------------------------------- */ -/* AMD Version 2.2, Copyright (c) 2007 by Timothy A. Davis, */ -/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ -/* email: DrTimothyAldenDavis@gmail.com */ -/* ------------------------------------------------------------------------- */ - -/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky - * factorization of P*A*P' has fewer nonzeros and takes less work than the - * Cholesky factorization of A. If A is not symmetric, then it performs its - * ordering on the matrix A+A'. Two sets of user-callable routines are - * provided, one for int integers and the other for SuiteSparse_long integers. - * - * The method is based on the approximate minimum degree algorithm, discussed - * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm", - * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp. - * 886-905, 1996. This package can perform both the AMD ordering (with - * aggressive absorption), and the AMDBAR ordering (without aggressive - * absorption) discussed in the above paper. This package differs from the - * Fortran codes discussed in the paper: - * - * (1) it can ignore "dense" rows and columns, leading to faster run times - * (2) it computes the ordering of A+A' if A is not symmetric - * (3) it is followed by a depth-first post-ordering of the assembly tree - * (or supernodal elimination tree) - * - * For historical reasons, the Fortran versions, amd.f and amdbar.f, have - * been left (nearly) unchanged. They compute the identical ordering as - * described in the above paper. - */ - -#ifndef AMD_H -#define AMD_H - -/* make it easy for C++ programs to include AMD */ -#ifdef __cplusplus -extern "C" { -#endif - -/* get the definition of size_t: */ -#include - -#include "SuiteSparse_config.h" - -int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, - * AMD_INVALID, or AMD_OUT_OF_MEMORY */ -( - int n, /* A is n-by-n. n must be >= 0. */ - const int Ap [ ], /* column pointers for A, of size n+1 */ - const int Ai [ ], /* row indices of A, of size nz = Ap [n] */ - int P [ ], /* output permutation, of size n */ - double Control [ ], /* input Control settings, of size AMD_CONTROL */ - double Info [ ] /* output Info statistics, of size AMD_INFO */ -) ; - -SuiteSparse_long amd_l_order /* see above for description of arguments */ -( - SuiteSparse_long n, - const SuiteSparse_long Ap [ ], - const SuiteSparse_long Ai [ ], - SuiteSparse_long P [ ], - double Control [ ], - double Info [ ] -) ; - -/* Input arguments (not modified): - * - * n: the matrix A is n-by-n. - * Ap: an int/SuiteSparse_long array of size n+1, containing column - * pointers of A. - * Ai: an int/SuiteSparse_long array of size nz, containing the row - * indices of A, where nz = Ap [n]. - * Control: a double array of size AMD_CONTROL, containing control - * parameters. Defaults are used if Control is NULL. - * - * Output arguments (not defined on input): - * - * P: an int/SuiteSparse_long array of size n, containing the output - * permutation. If row i is the kth pivot row, then P [k] = i. In - * MATLAB notation, the reordered matrix is A (P,P). - * Info: a double array of size AMD_INFO, containing statistical - * information. Ignored if Info is NULL. - * - * On input, the matrix A is stored in column-oriented form. The row indices - * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1]. - * - * If the row indices appear in ascending order in each column, and there - * are no duplicate entries, then amd_order is slightly more efficient in - * terms of time and memory usage. If this condition does not hold, a copy - * of the matrix is created (where these conditions do hold), and the copy is - * ordered. This feature is new to v2.0 (v1.2 and earlier required this - * condition to hold for the input matrix). - * - * Row indices must be in the range 0 to - * n-1. Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros - * in A. The array Ap is of size n+1, and the array Ai is of size nz = Ap [n]. - * The matrix does not need to be symmetric, and the diagonal does not need to - * be present (if diagonal entries are present, they are ignored except for - * the output statistic Info [AMD_NZDIAG]). The arrays Ai and Ap are not - * modified. This form of the Ap and Ai arrays to represent the nonzero - * pattern of the matrix A is the same as that used internally by MATLAB. - * If you wish to use a more flexible input structure, please see the - * umfpack_*_triplet_to_col routines in the UMFPACK package, at - * http://www.suitesparse.com. - * - * Restrictions: n >= 0. Ap [0] = 0. Ap [j] <= Ap [j+1] for all j in the - * range 0 to n-1. nz = Ap [n] >= 0. Ai [0..nz-1] must be in the range 0 - * to n-1. Finally, Ai, Ap, and P must not be NULL. If any of these - * restrictions are not met, AMD returns AMD_INVALID. - * - * AMD returns: - * - * AMD_OK if the matrix is valid and sufficient memory can be allocated to - * perform the ordering. - * - * AMD_OUT_OF_MEMORY if not enough memory can be allocated. - * - * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is - * NULL. - * - * AMD_OK_BUT_JUMBLED if the matrix had unsorted columns, and/or duplicate - * entries, but was otherwise valid. - * - * The AMD routine first forms the pattern of the matrix A+A', and then - * computes a fill-reducing ordering, P. If P [k] = i, then row/column i of - * the original is the kth pivotal row. In MATLAB notation, the permuted - * matrix is A (P,P), except that 0-based indexing is used instead of the - * 1-based indexing in MATLAB. - * - * The Control array is used to set various parameters for AMD. If a NULL - * pointer is passed, default values are used. The Control array is not - * modified. - * - * Control [AMD_DENSE]: controls the threshold for "dense" rows/columns. - * A dense row/column in A+A' can cause AMD to spend a lot of time in - * ordering the matrix. If Control [AMD_DENSE] >= 0, rows/columns - * with more than Control [AMD_DENSE] * sqrt (n) entries are ignored - * during the ordering, and placed last in the output order. The - * default value of Control [AMD_DENSE] is 10. If negative, no - * rows/columns are treated as "dense". Rows/columns with 16 or - * fewer off-diagonal entries are never considered "dense". - * - * Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive - * absorption, in which a prior element is absorbed into the current - * element if is a subset of the current element, even if it is not - * adjacent to the current pivot element (refer to Amestoy, Davis, - * & Duff, 1996, for more details). The default value is nonzero, - * which means to perform aggressive absorption. This nearly always - * leads to a better ordering (because the approximate degrees are - * more accurate) and a lower execution time. There are cases where - * it can lead to a slightly worse ordering, however. To turn it off, - * set Control [AMD_AGGRESSIVE] to 0. - * - * Control [2..4] are not used in the current version, but may be used in - * future versions. - * - * The Info array provides statistics about the ordering on output. If it is - * not present, the statistics are not returned. This is not an error - * condition. - * - * Info [AMD_STATUS]: the return value of AMD, either AMD_OK, - * AMD_OK_BUT_JUMBLED, AMD_OUT_OF_MEMORY, or AMD_INVALID. - * - * Info [AMD_N]: n, the size of the input matrix - * - * Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n] - * - * Info [AMD_SYMMETRY]: the symmetry of the matrix A. It is the number - * of "matched" off-diagonal entries divided by the total number of - * off-diagonal entries. An entry A(i,j) is matched if A(j,i) is also - * an entry, for any pair (i,j) for which i != j. In MATLAB notation, - * S = spones (A) ; - * B = tril (S, -1) + triu (S, 1) ; - * symmetry = nnz (B & B') / nnz (B) ; - * - * Info [AMD_NZDIAG]: the number of entries on the diagonal of A. - * - * Info [AMD_NZ_A_PLUS_AT]: the number of nonzeros in A+A', excluding the - * diagonal. If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1) - * with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n - * (the smallest possible value). If A is perfectly unsymmetric - * (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for - * example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz - * (the largest possible value). - * - * Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were - * removed from A prior to ordering. These are placed last in the - * output order P. - * - * Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes. In the - * current version, this is 1.2 * Info [AMD_NZ_A_PLUS_AT] + 9*n - * times the size of an integer. This is at most 2.4nz + 9n. This - * excludes the size of the input arguments Ai, Ap, and P, which have - * a total size of nz + 2*n + 1 integers. - * - * Info [AMD_NCMPA]: the number of garbage collections performed. - * - * Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal). - * This is a slight upper bound because mass elimination is combined - * with the approximate degree update. It is a rough upper bound if - * there are many "dense" rows/columns. The rest of the statistics, - * below, are also slight or rough upper bounds, for the same reasons. - * The post-ordering of the assembly tree might also not exactly - * correspond to a true elimination tree postordering. - * - * Info [AMD_NDIV]: the number of divide operations for a subsequent LDL' - * or LU factorization of the permuted matrix A (P,P). - * - * Info [AMD_NMULTSUBS_LDL]: the number of multiply-subtract pairs for a - * subsequent LDL' factorization of A (P,P). - * - * Info [AMD_NMULTSUBS_LU]: the number of multiply-subtract pairs for a - * subsequent LU factorization of A (P,P), assuming that no numerical - * pivoting is required. - * - * Info [AMD_DMAX]: the maximum number of nonzeros in any column of L, - * including the diagonal. - * - * Info [14..19] are not used in the current version, but may be used in - * future versions. - */ - -/* ------------------------------------------------------------------------- */ -/* direct interface to AMD */ -/* ------------------------------------------------------------------------- */ - -/* amd_2 is the primary AMD ordering routine. It is not meant to be - * user-callable because of its restrictive inputs and because it destroys - * the user's input matrix. It does not check its inputs for errors, either. - * However, if you can work with these restrictions it can be faster than - * amd_order and use less memory (assuming that you can create your own copy - * of the matrix for AMD to destroy). Refer to AMD/Source/amd_2.c for a - * description of each parameter. */ - -void amd_2 -( - int n, - int Pe [ ], - int Iw [ ], - int Len [ ], - int iwlen, - int pfree, - int Nv [ ], - int Next [ ], - int Last [ ], - int Head [ ], - int Elen [ ], - int Degree [ ], - int W [ ], - double Control [ ], - double Info [ ] -) ; - -void amd_l2 -( - SuiteSparse_long n, - SuiteSparse_long Pe [ ], - SuiteSparse_long Iw [ ], - SuiteSparse_long Len [ ], - SuiteSparse_long iwlen, - SuiteSparse_long pfree, - SuiteSparse_long Nv [ ], - SuiteSparse_long Next [ ], - SuiteSparse_long Last [ ], - SuiteSparse_long Head [ ], - SuiteSparse_long Elen [ ], - SuiteSparse_long Degree [ ], - SuiteSparse_long W [ ], - double Control [ ], - double Info [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* amd_valid */ -/* ------------------------------------------------------------------------- */ - -/* Returns AMD_OK or AMD_OK_BUT_JUMBLED if the matrix is valid as input to - * amd_order; the latter is returned if the matrix has unsorted and/or - * duplicate row indices in one or more columns. Returns AMD_INVALID if the - * matrix cannot be passed to amd_order. For amd_order, the matrix must also - * be square. The first two arguments are the number of rows and the number - * of columns of the matrix. For its use in AMD, these must both equal n. - * - * NOTE: this routine returned TRUE/FALSE in v1.2 and earlier. - */ - -int amd_valid -( - int n_row, /* # of rows */ - int n_col, /* # of columns */ - const int Ap [ ], /* column pointers, of size n_col+1 */ - const int Ai [ ] /* row indices, of size Ap [n_col] */ -) ; - -SuiteSparse_long amd_l_valid -( - SuiteSparse_long n_row, - SuiteSparse_long n_col, - const SuiteSparse_long Ap [ ], - const SuiteSparse_long Ai [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* AMD memory manager and printf routines */ -/* ------------------------------------------------------------------------- */ - -/* The user can redefine these to change the malloc, free, and printf routines - * that AMD uses. */ - -#ifndef EXTERN -#define EXTERN extern -#endif - -EXTERN void *(*amd_malloc) (size_t) ; /* pointer to malloc */ -EXTERN void (*amd_free) (void *) ; /* pointer to free */ -EXTERN void *(*amd_realloc) (void *, size_t) ; /* pointer to realloc */ -EXTERN void *(*amd_calloc) (size_t, size_t) ; /* pointer to calloc */ -EXTERN int (*amd_printf) (const char *, ...) ; /* pointer to printf */ - -/* ------------------------------------------------------------------------- */ -/* AMD Control and Info arrays */ -/* ------------------------------------------------------------------------- */ - -/* amd_defaults: sets the default control settings */ -void amd_defaults (double Control [ ]) ; -void amd_l_defaults (double Control [ ]) ; - -/* amd_control: prints the control settings */ -void amd_control (double Control [ ]) ; -void amd_l_control (double Control [ ]) ; - -/* amd_info: prints the statistics */ -void amd_info (double Info [ ]) ; -void amd_l_info (double Info [ ]) ; - -#define AMD_CONTROL 5 /* size of Control array */ -#define AMD_INFO 20 /* size of Info array */ - -/* contents of Control */ -#define AMD_DENSE 0 /* "dense" if degree > Control [0] * sqrt (n) */ -#define AMD_AGGRESSIVE 1 /* do aggressive absorption if Control [1] != 0 */ - -/* default Control settings */ -#define AMD_DEFAULT_DENSE 10.0 /* default "dense" degree 10*sqrt(n) */ -#define AMD_DEFAULT_AGGRESSIVE 1 /* do aggressive absorption by default */ - -/* contents of Info */ -#define AMD_STATUS 0 /* return value of amd_order and amd_l_order */ -#define AMD_N 1 /* A is n-by-n */ -#define AMD_NZ 2 /* number of nonzeros in A */ -#define AMD_SYMMETRY 3 /* symmetry of pattern (1 is sym., 0 is unsym.) */ -#define AMD_NZDIAG 4 /* # of entries on diagonal */ -#define AMD_NZ_A_PLUS_AT 5 /* nz in A+A' */ -#define AMD_NDENSE 6 /* number of "dense" rows/columns in A */ -#define AMD_MEMORY 7 /* amount of memory used by AMD */ -#define AMD_NCMPA 8 /* number of garbage collections in AMD */ -#define AMD_LNZ 9 /* approx. nz in L, excluding the diagonal */ -#define AMD_NDIV 10 /* number of fl. point divides for LU and LDL' */ -#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */ -#define AMD_NMULTSUBS_LU 12 /* number of fl. point (*,-) pairs for LU */ -#define AMD_DMAX 13 /* max nz. in any column of L, incl. diagonal */ - -/* ------------------------------------------------------------------------- */ -/* return values of AMD */ -/* ------------------------------------------------------------------------- */ - -#define AMD_OK 0 /* success */ -#define AMD_OUT_OF_MEMORY -1 /* malloc failed, or problem too large */ -#define AMD_INVALID -2 /* input arguments are not valid */ -#define AMD_OK_BUT_JUMBLED 1 /* input matrix is OK for amd_order, but - * columns were not sorted, and/or duplicate entries were present. AMD had - * to do extra work before ordering the matrix. This is a warning, not an - * error. */ - -/* ========================================================================== */ -/* === AMD version ========================================================== */ -/* ========================================================================== */ - -/* AMD Version 1.2 and later include the following definitions. - * As an example, to test if the version you are using is 1.2 or later: - * - * #ifdef AMD_VERSION - * if (AMD_VERSION >= AMD_VERSION_CODE (1,2)) ... - * #endif - * - * This also works during compile-time: - * - * #if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE (1,2)) - * printf ("This is version 1.2 or later\n") ; - * #else - * printf ("This is an early version\n") ; - * #endif - * - * Versions 1.1 and earlier of AMD do not include a #define'd version number. - */ - -#define AMD_DATE "Jun 20, 2012" -#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define AMD_MAIN_VERSION 2 -#define AMD_SUB_VERSION 3 -#define AMD_SUBSUB_VERSION 1 -#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/thirdparty/linux/include/coin/amd_internal.h b/thirdparty/linux/include/coin/amd_internal.h deleted file mode 100644 index c5f54930..00000000 --- a/thirdparty/linux/include/coin/amd_internal.h +++ /dev/null @@ -1,347 +0,0 @@ -/* ========================================================================= */ -/* === amd_internal.h ====================================================== */ -/* ========================================================================= */ - -/* ------------------------------------------------------------------------- */ -/* AMD, Copyright (c) Timothy A. Davis, */ -/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ -/* email: DrTimothyAldenDavis@gmail.com */ -/* ------------------------------------------------------------------------- */ - -/* This file is for internal use in AMD itself, and does not normally need to - * be included in user code (it is included in UMFPACK, however). All others - * should use amd.h instead. - * - * The following compile-time definitions affect how AMD is compiled. - * - * -DNPRINT - * - * Disable all printing. stdio.h will not be included. Printing can - * be re-enabled at run-time by setting the global pointer amd_printf - * to printf (or mexPrintf for a MATLAB mexFunction). - * - * -DNMALLOC - * - * No memory manager is defined at compile-time. You MUST define the - * function pointers amd_malloc, amd_free, amd_realloc, and - * amd_calloc at run-time for AMD to work properly. - */ - -/* ========================================================================= */ -/* === NDEBUG ============================================================== */ -/* ========================================================================= */ - -/* - * Turning on debugging takes some work (see below). If you do not edit this - * file, then debugging is always turned off, regardless of whether or not - * -DNDEBUG is specified in your compiler options. - * - * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined, - * and mxAssert is used instead of assert. If debugging is not enabled, no - * MATLAB include files or functions are used. Thus, the AMD library libamd.a - * can be safely used in either a stand-alone C program or in another - * mexFunction, without any change. - */ - -/* - AMD will be exceedingly slow when running in debug mode. The next three - lines ensure that debugging is turned off. -*/ -#ifndef NDEBUG -#define NDEBUG -#endif - -/* - To enable debugging, uncomment the following line: -#undef NDEBUG -*/ - -/* ------------------------------------------------------------------------- */ -/* ANSI include files */ -/* ------------------------------------------------------------------------- */ - -/* from stdlib.h: size_t, malloc, free, realloc, and calloc */ -#include - -#if !defined(NPRINT) || !defined(NDEBUG) -/* from stdio.h: printf. Not included if NPRINT is defined at compile time. - * fopen and fscanf are used when debugging. */ -#include -#endif - -/* from limits.h: INT_MAX and LONG_MAX */ -#include - -/* from math.h: sqrt */ -#include - -/* ------------------------------------------------------------------------- */ -/* MATLAB include files (only if being used in or via MATLAB) */ -/* ------------------------------------------------------------------------- */ - -#ifdef MATLAB_MEX_FILE -#include "matrix.h" -#include "mex.h" -#endif - -/* ------------------------------------------------------------------------- */ -/* basic definitions */ -/* ------------------------------------------------------------------------- */ - -#ifdef FLIP -#undef FLIP -#endif - -#ifdef MAX -#undef MAX -#endif - -#ifdef MIN -#undef MIN -#endif - -#ifdef EMPTY -#undef EMPTY -#endif - -#ifdef GLOBAL -#undef GLOBAL -#endif - -#ifdef PRIVATE -#undef PRIVATE -#endif - -/* FLIP is a "negation about -1", and is used to mark an integer i that is - * normally non-negative. FLIP (EMPTY) is EMPTY. FLIP of a number > EMPTY - * is negative, and FLIP of a number < EMTPY is positive. FLIP (FLIP (i)) = i - * for all integers i. UNFLIP (i) is >= EMPTY. */ -#define EMPTY (-1) -#define FLIP(i) (-(i)-2) -#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i)) - -/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */ -#define MAX(a,b) (((a) > (b)) ? (a) : (b)) -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -/* logical expression of p implies q: */ -#define IMPLIES(p,q) (!(p) || (q)) - -/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in . */ -/* The Compaq Alpha also predefines TRUE and FALSE. */ -#ifdef TRUE -#undef TRUE -#endif -#ifdef FALSE -#undef FALSE -#endif - -#define TRUE (1) -#define FALSE (0) -#define PRIVATE static -#define GLOBAL -#define EMPTY (-1) - -/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */ -/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0). We */ -/* need to use the ANSI standard value of 0. */ -#ifdef NULL -#undef NULL -#endif - -#define NULL 0 - -/* largest value of size_t */ -#ifndef SIZE_T_MAX -#ifdef SIZE_MAX -/* C99 only */ -#define SIZE_T_MAX SIZE_MAX -#else -#define SIZE_T_MAX ((size_t) (-1)) -#endif -#endif - -/* ------------------------------------------------------------------------- */ -/* integer type for AMD: int or SuiteSparse_long */ -/* ------------------------------------------------------------------------- */ - -#include "amd.h" - -#if defined (DLONG) || defined (ZLONG) - -#define Int SuiteSparse_long -#define ID SuiteSparse_long_id -#define Int_MAX SuiteSparse_long_max - -#define AMD_order amd_l_order -#define AMD_defaults amd_l_defaults -#define AMD_control amd_l_control -#define AMD_info amd_l_info -#define AMD_1 amd_l1 -#define AMD_2 amd_l2 -#define AMD_valid amd_l_valid -#define AMD_aat amd_l_aat -#define AMD_postorder amd_l_postorder -#define AMD_post_tree amd_l_post_tree -#define AMD_dump amd_l_dump -#define AMD_debug amd_l_debug -#define AMD_debug_init amd_l_debug_init -#define AMD_preprocess amd_l_preprocess - -#else - -#define Int int -#define ID "%d" -#define Int_MAX INT_MAX - -#define AMD_order amd_order -#define AMD_defaults amd_defaults -#define AMD_control amd_control -#define AMD_info amd_info -#define AMD_1 amd_1 -#define AMD_2 amd_2 -#define AMD_valid amd_valid -#define AMD_aat amd_aat -#define AMD_postorder amd_postorder -#define AMD_post_tree amd_post_tree -#define AMD_dump amd_dump -#define AMD_debug amd_debug -#define AMD_debug_init amd_debug_init -#define AMD_preprocess amd_preprocess - -#endif - -/* ========================================================================= */ -/* === PRINTF macro ======================================================== */ -/* ========================================================================= */ - -/* All output goes through the PRINTF macro. */ -#define PRINTF(params) { if (amd_printf != NULL) (void) amd_printf params ; } - -/* ------------------------------------------------------------------------- */ -/* AMD routine definitions (not user-callable) */ -/* ------------------------------------------------------------------------- */ - -GLOBAL size_t AMD_aat -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int Len [ ], - Int Tp [ ], - double Info [ ] -) ; - -GLOBAL void AMD_1 -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int P [ ], - Int Pinv [ ], - Int Len [ ], - Int slen, - Int S [ ], - double Control [ ], - double Info [ ] -) ; - -GLOBAL void AMD_postorder -( - Int nn, - Int Parent [ ], - Int Npiv [ ], - Int Fsize [ ], - Int Order [ ], - Int Child [ ], - Int Sibling [ ], - Int Stack [ ] -) ; - -GLOBAL Int AMD_post_tree -( - Int root, - Int k, - Int Child [ ], - const Int Sibling [ ], - Int Order [ ], - Int Stack [ ] -#ifndef NDEBUG - , Int nn -#endif -) ; - -GLOBAL void AMD_preprocess -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int Rp [ ], - Int Ri [ ], - Int W [ ], - Int Flag [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* debugging definitions */ -/* ------------------------------------------------------------------------- */ - -#ifndef NDEBUG - -/* from assert.h: assert macro */ -#include - -#ifndef EXTERN -#define EXTERN extern -#endif - -EXTERN Int AMD_debug ; - -GLOBAL void AMD_debug_init ( char *s ) ; - -GLOBAL void AMD_dump -( - Int n, - Int Pe [ ], - Int Iw [ ], - Int Len [ ], - Int iwlen, - Int pfree, - Int Nv [ ], - Int Next [ ], - Int Last [ ], - Int Head [ ], - Int Elen [ ], - Int Degree [ ], - Int W [ ], - Int nel -) ; - -#ifdef ASSERT -#undef ASSERT -#endif - -/* Use mxAssert if AMD is compiled into a mexFunction */ -#ifdef MATLAB_MEX_FILE -#define ASSERT(expression) (mxAssert ((expression), "")) -#else -#define ASSERT(expression) (assert (expression)) -#endif - -#define AMD_DEBUG0(params) { PRINTF (params) ; } -#define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; } -#define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; } -#define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; } -#define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; } - -#else - -/* no debugging */ -#define ASSERT(expression) -#define AMD_DEBUG0(params) -#define AMD_DEBUG1(params) -#define AMD_DEBUG2(params) -#define AMD_DEBUG3(params) -#define AMD_DEBUG4(params) - -#endif diff --git a/thirdparty/linux/include/coin/ctrlc.h b/thirdparty/linux/include/coin/ctrlc.h deleted file mode 100644 index 61b717a0..00000000 --- a/thirdparty/linux/include/coin/ctrlc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * Interface for ECOS signal handling. - * - * This module is (c) Michael Grant, [mcg@cvxr.com] contributed by Github PR #82 - */ - -#ifndef __CTRLC_H__ -#define __CTRLC_H__ - -#include "glblopts.h" - -#if CTRLC > 0 - -#if defined MATLAB_MEX_FILE - -/* No header file available here; define the prototypes ourselves */ -extern bool utIsInterruptPending(void); -extern bool utSetInterruptEnabled(bool); - -#elif (defined _WIN32 || defined _WIN64 || defined _WINDLL ) - -/* Use Windows SetConsoleCtrlHandler for signal handling */ -#include - -#else - -/* Use POSIX clocl_gettime() for timing on non-Windows machines */ -#include - -#endif - -/* METHODS are the same for both */ -void init_ctrlc(void); -void remove_ctrlc(void); -int check_ctrlc(void); - -#else /* CTRLC = 0 */ - -/* No signal handling. */ -#define init_ctrlc() -#define remove_ctrlc() -#define check_ctrlc() 0 - -#endif /* END IF CTRLC > 0 */ - -#endif /* END IFDEF __TIMER_H__ */ - diff --git a/thirdparty/linux/include/coin/data1.h b/thirdparty/linux/include/coin/data1.h deleted file mode 100644 index e6480083..00000000 --- a/thirdparty/linux/include/coin/data1.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -idxint n = 223; -idxint m = 220; -idxint p = 114; -idxint l = 201; -idxint ncones = 6; -pfloat c[223] = {0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; -pfloat h[220] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; -idxint q[6] = {3, 3, 3, 3, 3, 4}; -idxint Gjc[224] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220}; -idxint Gir[220] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219}; -pfloat Gpr[220] = {-1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000}; -idxint Ajc[224] = {0, 111, 222, 322, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 539, 540, 541, 564, 565, 566, 589, 590, 591, 618, 619, 620, 632, 633, 634, 635, 636, 637, 638}; -idxint Air[638] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 112, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 113, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 3, 9, 15, 27, 53, 54, 57, 66, 67, 71, 74, 87, 92, 96, 98, 100, 101, 2, 8, 12, 19, 29, 30, 34, 37, 39, 42, 43, 44, 47, 50, 51, 56, 59, 70, 73, 79, 82, 85, 94, 102, 103, 0, 4, 7, 13, 14, 16, 17, 21, 23, 28, 31, 33, 36, 38, 60, 64, 78, 81, 88, 90, 91, 95, 99, 104, 105, 1, 6, 10, 20, 22, 26, 32, 35, 41, 46, 48, 49, 52, 55, 58, 65, 68, 69, 75, 76, 77, 80, 83, 84, 86, 93, 97, 106, 107, 5, 11, 18, 24, 25, 40, 45, 61, 62, 63, 72, 89, 108, 109, 110, 111, 112, 113}; -pfloat Apr[638] = {-6.748099080141577400e-001, 9.587587238674218900e-001, -3.380262965696901900e-001, -6.289006455522118100e-001, 1.458932368908371500e+000, 8.103505672584934100e-001, -8.308676110497204000e-002, 2.638152658681099300e+000, 1.000625209233638700e+000, 1.443285740856571400e-001, 1.198960671699122800e+000, 8.042866751960948700e-001, -2.146877760548437900e-002, 1.252109754253975600e+000, 1.681372772953815700e+000, 1.160558110039982400e+000, 8.971595941547876300e-001, 9.934462168535226300e-001, 4.030425643552826300e-003, 4.520907269135507900e-001, 1.957531681292445900e+000, 8.367513704018149100e-001, -8.919073879004054700e-001, 1.364968014685880000e-001, -5.391443069926015200e-001, 1.218605709809697200e+000, 1.379628849398701500e+000, 7.705722581573115600e-002, -9.721580354507602900e-001, 1.341091680254979900e+000, 1.416856131617781900e+000, 1.367782802004573000e+000, 9.310015370881947700e-001, 1.025960903569425500e+000, 4.418055920652105800e-001, 1.797608571927105100e-001, -1.566236421056189400e+000, -1.293790728779894400e-001, -2.548793507296202000e-001, -1.327158583802827700e+000, 8.378869252146687900e-001, 9.208088134425553900e-001, 8.954835779157467300e-001, 1.872488747783192400e+000, 1.607749082930002300e-001, 1.703097419135647200e+000, 1.485966470102646500e+000, 1.950727391193988900e+000, 1.261282074772785800e+000, 2.116080672704367100e+000, 4.418819171779880300e-001, -6.070414095655145600e-001, 2.236741804227308500e-001, -1.390565074056968600e+000, -3.689063294445240100e-001, 6.275925564016111600e-001, 9.419119351808997700e-001, 2.051844704916749900e-002, -2.055013180419911200e+000, -8.138411920140069500e-001, -1.670986440999406000e+000, -4.312826132928389000e-001, -1.317178055102502500e-001, 4.129877571668971700e-002, -1.178000809237306800e-001, -5.094809536848188300e-002, 4.887140456297478000e-001, -6.048920026011540600e-001, -1.622657687025348600e+000, 9.468924561461561400e-002, -1.076752006167445400e+000, -4.544402225817885700e-001, -1.138681599263542200e+000, 6.297099350763062400e-001, 7.161553122227841700e-001, -2.326213079050594200e-001, -2.421425730439526200e-001, -3.527400894253913700e-001, -5.991000491511071500e-001, -4.501982881436522000e-001, -1.073527618321097300e+000, -1.837831580649836900e+000, -1.093506922417250900e+000, 3.123080272148109900e-002, 4.764624397863112500e-001, -9.744593174286131400e-001, -5.475935551016516400e-001, -1.185577848308040100e+000, -1.512429413719079500e+000, -8.503358079552569800e-001, -1.048119449917124500e+000, -2.950353712891531400e-001, 4.436355670528358600e-001, -1.976143927829304500e+000, -1.154872945269262400e-001, -8.267783537066453200e-001, -2.524533500828647400e-001, -2.934013148063512300e-001, -9.559308197633347200e-001, -5.099545278978906400e-001, 7.104569782287112300e-001, 2.586151051423653000e-001, 9.670875274511733200e-001, -1.580472136196336100e-001, 4.036019169202506600e-001, -4.419329075671284400e-001, 1.335760493316310000e-001, -2.443367984060260100e-001, 5.346171843774407700e-001, 9.240837092450902800e-002, 1.000000000000000000e+000, -7.627629774659758300e+000, -8.317906940770274800e+000, -7.063111046330970300e+000, -8.991213209598194900e+000, -7.132056801314573300e+000, -6.933147988332642300e+000, -8.002850393982971200e+000, -7.763929473153173600e+000, -7.316196508551362500e+000, -6.857489440772187800e+000, -6.933435917031895100e+000, -8.453055934420948600e+000, -7.746956878849250200e+000, -6.987480243537588000e+000, -6.898256465718047200e+000, -7.035033952525910900e+000, -7.332300809407010800e+000, -8.868148466875196000e+000, -7.895445920224761800e+000, -8.477688226774738200e+000, -6.724790281248850500e+000, -8.026080227654171400e+000, -8.247796522362861500e+000, -7.893131787368933100e+000, -7.953077643849715300e+000, -7.085517647070380700e+000, -7.757918623860442500e+000, -9.404980440162075800e+000, -9.111021916635516900e+000, -6.753547752596220200e+000, -6.208328120779675900e+000, -7.460712402671073400e+000, -8.051154905293161700e+000, -6.979795864345947000e+000, -7.285373299414776400e+000, -7.935549231771511300e+000, -7.333663096710840700e+000, -7.549354579130950400e+000, -7.125439770244579300e+000, -8.444455837718113100e+000, -7.607705936847165300e+000, -6.947711222611268100e+000, -7.559561213742542300e+000, -6.633232534378238100e+000, -7.285067573640397100e+000, -7.198034090285221800e+000, -8.301173708858458500e+000, -7.740676955875905200e+000, -8.389317110487786200e+000, -7.030503781850090800e+000, 7.483837125022816400e-001, 9.972172897309477000e-001, 8.635272324715717000e-001, 3.437357445286000600e-001, 1.356057545748600200e+000, 7.747994541454063000e-001, -5.029337660688439900e-001, 7.320209587792132500e-001, 9.007328043370961300e-001, 1.839182838430090300e+000, -1.352604803382542600e+000, 1.440339792882617200e+000, 5.409160633286138600e-001, -9.096356667070149000e-002, 2.145906552675194100e-001, 1.749366326171780000e+000, 1.710862586429138200e+000, 5.617170924142114200e-001, 8.075937970441778900e-001, 5.294053117812258500e-001, 8.007328881544743000e-001, 6.824506852180559600e-001, -4.466422007073587200e-001, 4.125165857556476500e-001, 1.264599468598445900e+000, 1.195482116831558800e+000, 5.815701470999368200e-001, 1.480145121963046200e+000, 1.228974130124139900e+000, -9.887375252743877400e-001, 4.957232610676656800e-001, 2.201242074660017000e-001, -8.949779589135298300e-002, 4.463714750361750200e-001, 1.104458211701637000e+000, 1.146057798756675600e+000, 1.607064328082671100e+000, -3.342540671866551800e-001, -3.733869343080511400e-001, 1.376984209826379600e+000, 1.134842638638303900e+000, 1.578816025652644900e+000, 8.631161307174450800e-003, 6.628552272325566300e-001, -4.235551988694613600e-001, -5.931434773175525700e-002, 1.107744286910284700e+000, 1.308043758809049000e+000, 1.474220016986390400e+000, 6.094036504382410700e-001, 2.586151051423653000e-001, 7.690092056142631100e-001, -1.580472136196336100e-001, 2.410499789745967300e-001, -4.419329075671284400e-001, 6.725262868347948700e-001, -2.443367984060260100e-001, 9.310955439202097700e-001, 9.240837092450902800e-002, 9.816510048711224500e-001, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -5.000000000000000000e-001, -5.000000000000000000e-001, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000}; -idxint K0jc[558] = {0, 112, 224, 325, 329, 332, 335, 338, 341, 344, 347, 350, 353, 356, 359, 362, 365, 368, 371, 374, 377, 380, 383, 386, 389, 392, 395, 398, 401, 404, 407, 410, 413, 416, 419, 422, 425, 428, 431, 434, 437, 440, 443, 446, 449, 452, 455, 458, 461, 464, 467, 470, 473, 476, 479, 482, 485, 488, 491, 494, 497, 500, 503, 506, 509, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 590, 593, 596, 599, 602, 605, 608, 611, 614, 617, 620, 623, 626, 629, 632, 635, 638, 641, 644, 647, 650, 653, 656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, 731, 734, 737, 740, 743, 746, 749, 752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, 875, 878, 881, 884, 887, 890, 893, 896, 899, 902, 905, 908, 911, 914, 917, 920, 923, 926, 929, 946, 949, 952, 977, 980, 983, 1008, 1011, 1014, 1043, 1046, 1049, 1063, 1066, 1069, 1072, 1075, 1078, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1414}; -idxint K0ir[1415] = {0, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 334, 1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 335, 2, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 3, 333, 336, 337, 4, 223, 338, 5, 224, 339, 6, 225, 340, 7, 226, 341, 8, 227, 342, 9, 228, 343, 10, 229, 344, 11, 230, 345, 12, 231, 346, 13, 232, 347, 14, 233, 348, 15, 234, 349, 16, 235, 350, 17, 236, 351, 18, 237, 352, 19, 238, 353, 20, 239, 354, 21, 240, 355, 22, 241, 356, 23, 242, 357, 24, 243, 358, 25, 244, 359, 26, 245, 360, 27, 246, 361, 28, 247, 362, 29, 248, 363, 30, 249, 364, 31, 250, 365, 32, 251, 366, 33, 252, 367, 34, 253, 368, 35, 254, 369, 36, 255, 370, 37, 256, 371, 38, 257, 372, 39, 258, 373, 40, 259, 374, 41, 260, 375, 42, 261, 376, 43, 262, 377, 44, 263, 378, 45, 264, 379, 46, 265, 380, 47, 266, 381, 48, 267, 382, 49, 268, 383, 50, 269, 384, 51, 270, 385, 52, 271, 386, 53, 272, 387, 54, 273, 388, 55, 274, 389, 56, 275, 390, 57, 276, 391, 58, 277, 392, 59, 278, 393, 60, 279, 394, 61, 280, 395, 62, 281, 396, 63, 282, 397, 64, 283, 398, 65, 284, 399, 66, 285, 400, 67, 286, 401, 68, 287, 402, 69, 288, 403, 70, 289, 404, 71, 290, 405, 72, 291, 406, 73, 292, 407, 74, 293, 408, 75, 294, 409, 76, 295, 410, 77, 296, 411, 78, 297, 412, 79, 298, 413, 80, 299, 414, 81, 300, 415, 82, 301, 416, 83, 302, 417, 84, 303, 418, 85, 304, 419, 86, 305, 420, 87, 306, 421, 88, 307, 422, 89, 308, 423, 90, 309, 424, 91, 310, 425, 92, 311, 426, 93, 312, 427, 94, 313, 428, 95, 314, 429, 96, 315, 430, 97, 316, 431, 98, 317, 432, 99, 318, 433, 100, 319, 434, 101, 320, 435, 102, 321, 436, 103, 322, 437, 104, 223, 438, 105, 224, 439, 106, 225, 440, 107, 226, 441, 108, 227, 442, 109, 228, 443, 110, 229, 444, 111, 230, 445, 112, 231, 446, 113, 232, 447, 114, 233, 448, 115, 234, 449, 116, 235, 450, 117, 236, 451, 118, 237, 452, 119, 238, 453, 120, 239, 454, 121, 240, 455, 122, 241, 456, 123, 242, 457, 124, 243, 458, 125, 244, 459, 126, 245, 460, 127, 246, 461, 128, 247, 462, 129, 248, 463, 130, 249, 464, 131, 250, 465, 132, 251, 466, 133, 252, 467, 134, 253, 468, 135, 254, 469, 136, 255, 470, 137, 256, 471, 138, 257, 472, 139, 258, 473, 140, 259, 474, 141, 260, 475, 142, 261, 476, 143, 262, 477, 144, 263, 478, 145, 264, 479, 146, 265, 480, 147, 266, 481, 148, 267, 482, 149, 268, 483, 150, 269, 484, 151, 270, 485, 152, 271, 486, 153, 272, 487, 154, 273, 488, 155, 274, 489, 156, 275, 490, 157, 276, 491, 158, 277, 492, 159, 278, 493, 160, 279, 494, 161, 280, 495, 162, 281, 496, 163, 282, 497, 164, 283, 498, 165, 284, 499, 166, 285, 500, 167, 286, 501, 168, 287, 502, 169, 288, 503, 170, 289, 504, 171, 290, 505, 172, 291, 506, 173, 292, 507, 174, 293, 508, 175, 294, 509, 176, 295, 510, 177, 296, 511, 178, 297, 512, 179, 298, 513, 180, 299, 514, 181, 300, 515, 182, 301, 516, 183, 302, 517, 184, 303, 518, 185, 304, 519, 186, 305, 520, 187, 306, 521, 188, 307, 522, 189, 308, 523, 190, 309, 524, 191, 310, 525, 192, 311, 526, 193, 312, 527, 194, 313, 528, 195, 314, 529, 196, 315, 530, 197, 316, 531, 198, 317, 532, 199, 318, 533, 200, 319, 534, 201, 320, 535, 202, 321, 536, 203, 322, 537, 204, 226, 232, 238, 250, 276, 277, 280, 289, 290, 294, 297, 310, 315, 319, 321, 538, 205, 323, 539, 206, 324, 540, 207, 225, 231, 235, 242, 252, 253, 257, 260, 262, 265, 266, 267, 270, 273, 274, 279, 282, 293, 296, 302, 305, 308, 317, 541, 208, 325, 542, 209, 326, 543, 210, 223, 227, 230, 236, 237, 239, 240, 244, 246, 251, 254, 256, 259, 261, 283, 287, 301, 304, 311, 313, 314, 318, 322, 544, 211, 327, 545, 212, 328, 546, 213, 224, 229, 233, 243, 245, 249, 255, 258, 264, 269, 271, 272, 275, 278, 281, 288, 291, 292, 298, 299, 300, 303, 306, 307, 309, 316, 320, 547, 214, 329, 548, 215, 330, 549, 216, 228, 234, 241, 247, 248, 263, 268, 284, 285, 286, 295, 312, 550, 217, 331, 551, 218, 332, 552, 219, 333, 553, 220, 334, 554, 221, 335, 555, 222, 336, 556, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556}; -pfloat K0pr[1415] = {9.999999999999999500e-008, -6.748099080141577400e-001, 9.587587238674218900e-001, -3.380262965696901900e-001, -6.289006455522118100e-001, 1.458932368908371500e+000, 8.103505672584934100e-001, -8.308676110497204000e-002, 2.638152658681099300e+000, 1.000625209233638700e+000, 1.443285740856571400e-001, 1.198960671699122800e+000, 8.042866751960948700e-001, -2.146877760548437900e-002, 1.252109754253975600e+000, 1.681372772953815700e+000, 1.160558110039982400e+000, 8.971595941547876300e-001, 9.934462168535226300e-001, 4.030425643552826300e-003, 4.520907269135507900e-001, 1.957531681292445900e+000, 8.367513704018149100e-001, -8.919073879004054700e-001, 1.364968014685880000e-001, -5.391443069926015200e-001, 1.218605709809697200e+000, 1.379628849398701500e+000, 7.705722581573115600e-002, -9.721580354507602900e-001, 1.341091680254979900e+000, 1.416856131617781900e+000, 1.367782802004573000e+000, 9.310015370881947700e-001, 1.025960903569425500e+000, 4.418055920652105800e-001, 1.797608571927105100e-001, -1.566236421056189400e+000, -1.293790728779894400e-001, -2.548793507296202000e-001, -1.327158583802827700e+000, 8.378869252146687900e-001, 9.208088134425553900e-001, 8.954835779157467300e-001, 1.872488747783192400e+000, 1.607749082930002300e-001, 1.703097419135647200e+000, 1.485966470102646500e+000, 1.950727391193988900e+000, 1.261282074772785800e+000, 2.116080672704367100e+000, 4.418819171779880300e-001, -6.070414095655145600e-001, 2.236741804227308500e-001, -1.390565074056968600e+000, -3.689063294445240100e-001, 6.275925564016111600e-001, 9.419119351808997700e-001, 2.051844704916749900e-002, -2.055013180419911200e+000, -8.138411920140069500e-001, -1.670986440999406000e+000, -4.312826132928389000e-001, -1.317178055102502500e-001, 4.129877571668971700e-002, -1.178000809237306800e-001, -5.094809536848188300e-002, 4.887140456297478000e-001, -6.048920026011540600e-001, -1.622657687025348600e+000, 9.468924561461561400e-002, -1.076752006167445400e+000, -4.544402225817885700e-001, -1.138681599263542200e+000, 6.297099350763062400e-001, 7.161553122227841700e-001, -2.326213079050594200e-001, -2.421425730439526200e-001, -3.527400894253913700e-001, -5.991000491511071500e-001, -4.501982881436522000e-001, -1.073527618321097300e+000, -1.837831580649836900e+000, -1.093506922417250900e+000, 3.123080272148109900e-002, 4.764624397863112500e-001, -9.744593174286131400e-001, -5.475935551016516400e-001, -1.185577848308040100e+000, -1.512429413719079500e+000, -8.503358079552569800e-001, -1.048119449917124500e+000, -2.950353712891531400e-001, 4.436355670528358600e-001, -1.976143927829304500e+000, -1.154872945269262400e-001, -8.267783537066453200e-001, -2.524533500828647400e-001, -2.934013148063512300e-001, -9.559308197633347200e-001, -5.099545278978906400e-001, 7.104569782287112300e-001, 2.586151051423653000e-001, 9.670875274511733200e-001, -1.580472136196336100e-001, 4.036019169202506600e-001, -4.419329075671284400e-001, 1.335760493316310000e-001, -2.443367984060260100e-001, 5.346171843774407700e-001, 9.240837092450902800e-002, 1.000000000000000000e+000, 9.999999999999999500e-008, -7.627629774659758300e+000, -8.317906940770274800e+000, -7.063111046330970300e+000, -8.991213209598194900e+000, -7.132056801314573300e+000, -6.933147988332642300e+000, -8.002850393982971200e+000, -7.763929473153173600e+000, -7.316196508551362500e+000, -6.857489440772187800e+000, -6.933435917031895100e+000, -8.453055934420948600e+000, -7.746956878849250200e+000, -6.987480243537588000e+000, -6.898256465718047200e+000, -7.035033952525910900e+000, -7.332300809407010800e+000, -8.868148466875196000e+000, -7.895445920224761800e+000, -8.477688226774738200e+000, -6.724790281248850500e+000, -8.026080227654171400e+000, -8.247796522362861500e+000, -7.893131787368933100e+000, -7.953077643849715300e+000, -7.085517647070380700e+000, -7.757918623860442500e+000, -9.404980440162075800e+000, -9.111021916635516900e+000, -6.753547752596220200e+000, -6.208328120779675900e+000, -7.460712402671073400e+000, -8.051154905293161700e+000, -6.979795864345947000e+000, -7.285373299414776400e+000, -7.935549231771511300e+000, -7.333663096710840700e+000, -7.549354579130950400e+000, -7.125439770244579300e+000, -8.444455837718113100e+000, -7.607705936847165300e+000, -6.947711222611268100e+000, -7.559561213742542300e+000, -6.633232534378238100e+000, -7.285067573640397100e+000, -7.198034090285221800e+000, -8.301173708858458500e+000, -7.740676955875905200e+000, -8.389317110487786200e+000, -7.030503781850090800e+000, 7.483837125022816400e-001, 9.972172897309477000e-001, 8.635272324715717000e-001, 3.437357445286000600e-001, 1.356057545748600200e+000, 7.747994541454063000e-001, -5.029337660688439900e-001, 7.320209587792132500e-001, 9.007328043370961300e-001, 1.839182838430090300e+000, -1.352604803382542600e+000, 1.440339792882617200e+000, 5.409160633286138600e-001, -9.096356667070149000e-002, 2.145906552675194100e-001, 1.749366326171780000e+000, 1.710862586429138200e+000, 5.617170924142114200e-001, 8.075937970441778900e-001, 5.294053117812258500e-001, 8.007328881544743000e-001, 6.824506852180559600e-001, -4.466422007073587200e-001, 4.125165857556476500e-001, 1.264599468598445900e+000, 1.195482116831558800e+000, 5.815701470999368200e-001, 1.480145121963046200e+000, 1.228974130124139900e+000, -9.887375252743877400e-001, 4.957232610676656800e-001, 2.201242074660017000e-001, -8.949779589135298300e-002, 4.463714750361750200e-001, 1.104458211701637000e+000, 1.146057798756675600e+000, 1.607064328082671100e+000, -3.342540671866551800e-001, -3.733869343080511400e-001, 1.376984209826379600e+000, 1.134842638638303900e+000, 1.578816025652644900e+000, 8.631161307174450800e-003, 6.628552272325566300e-001, -4.235551988694613600e-001, -5.931434773175525700e-002, 1.107744286910284700e+000, 1.308043758809049000e+000, 1.474220016986390400e+000, 6.094036504382410700e-001, 2.586151051423653000e-001, 7.690092056142631100e-001, -1.580472136196336100e-001, 2.410499789745967300e-001, -4.419329075671284400e-001, 6.725262868347948700e-001, -2.443367984060260100e-001, 9.310955439202097700e-001, 9.240837092450902800e-002, 9.816510048711224500e-001, 1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -5.000000000000000000e-001, -5.000000000000000000e-001, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000}; -pfloat b[114] = {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, -0.5}; diff --git a/thirdparty/linux/include/coin/ecos.h b/thirdparty/linux/include/coin/ecos.h deleted file mode 100644 index 49d2b252..00000000 --- a/thirdparty/linux/include/coin/ecos.h +++ /dev/null @@ -1,323 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#ifndef __ECOS_H__ -#define __ECOS_H__ - -#include "glblopts.h" -#include "spla.h" -#include "cone.h" -#include "kkt.h" - -#if PROFILING > 0 -#include "timer.h" -#endif - -#if CTRLC > 0 -#include "ctrlc.h" -#endif - -/* ECOS VERSION NUMBER - FORMAT: X.Y.Z --------------------------------- */ -#define ECOS_VERSION ("2.0.4") - -/* DEFAULT SOLVER PARAMETERS AND SETTINGS STRUCT ----------------------- */ -#define MAXIT (100) /* maximum number of iterations */ -#define FEASTOL (1E-8) /* primal/dual infeasibility tolerance */ -#define ABSTOL (1E-8) /* absolute tolerance on duality gap */ -#define RELTOL (1E-8) /* relative tolerance on duality gap */ -#define FTOL_INACC (1E-4) /* inaccurate solution feasibility tol. */ -#define ATOL_INACC (5E-5) /* inaccurate solution absolute tol. */ -#define RTOL_INACC (5E-5) /* inaccurate solution relative tol. */ -#define GAMMA (0.99) /* scaling the final step length */ -#define STATICREG (1) /* static regularization: 0:off, 1:on */ -#define DELTASTAT (7E-8) /* regularization parameter */ -#define DELTA (2E-7) /* dyn. regularization parameter */ -#define EPS (1E-13) /* dyn. regularization threshold (do not 0!) */ -#define VERBOSE (1) /* bool for verbosity; PRINTLEVEL < 3 */ -#define NITREF (9) /* number of iterative refinement steps */ -#define IRERRFACT (6) /* factor by which IR should reduce err */ -#define LINSYSACC (1E-14) /* rel. accuracy of search direction */ -#define SIGMAMIN (1E-4) /* always do some centering */ -#define SIGMAMAX (1.0) /* never fully center */ -#define STEPMIN (1E-6) /* smallest step that we do take */ -#define STEPMAX (0.999) /* largest step allowed, also in affine dir. */ -#define SAFEGUARD (500) /* Maximum increase in PRES before - ECOS_NUMERICS is thrown. */ -/*Ecos exponential cone default settings*/ -#ifdef EXPCONE -#define MAX_BK (90) /*Maximum backtracking steps*/ -#define BK_SCALE (0.8) /*Backtracking constant*/ -#define MIN_DISTANCE (0.1) /* dont let sqrt(r), sqrt(-u) or sqrt(v) - become smaller than - MIN_DISTANCE*mu*/ -#define CENTRALITY (1) /*Centrality requirement*/ -#endif - - - -/* EQUILIBRATION METHOD ------------------------------------------------ */ -#define EQUILIBRATE (1) /* use equlibration of data matrices? >0: yes */ -#define EQUIL_ITERS (3) /* number of equilibration iterations */ -#define RUIZ_EQUIL /* define algorithm to use - if both are ... */ -/*#define ALTERNATING_EQUIL*/ /* ... commented out no equlibration is used */ - - -/* EXITCODES ----------------------------------------------------------- */ -#define ECOS_OPTIMAL (0) /* Problem solved to optimality */ -#define ECOS_PINF (1) /* Found certificate of primal infeasibility */ -#define ECOS_DINF (2) /* Found certificate of dual infeasibility */ -#define ECOS_INACC_OFFSET (10) /* Offset exitflag at inaccurate results */ -#define ECOS_MAXIT (-1) /* Maximum number of iterations reached */ -#define ECOS_NUMERICS (-2) /* Search direction unreliable */ -#define ECOS_OUTCONE (-3) /* s or z got outside the cone, numerics? */ -#define ECOS_SIGINT (-4) /* solver interrupted by a signal/ctrl-c */ -#define ECOS_FATAL (-7) /* Unknown problem in solver */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* SETTINGS STRUCT ----------------------------------------------------- */ -typedef struct settings{ - pfloat gamma; /* scaling the final step length */ - pfloat delta; /* regularization parameter */ - pfloat eps; /* regularization threshold */ - pfloat feastol; /* primal/dual infeasibility tolerance */ - pfloat abstol; /* absolute tolerance on duality gap */ - pfloat reltol; /* relative tolerance on duality gap */ - pfloat feastol_inacc; /* primal/dual infeasibility relaxed tolerance */ - pfloat abstol_inacc; /* absolute relaxed tolerance on duality gap */ - pfloat reltol_inacc; /* relative relaxed tolerance on duality gap */ - idxint nitref; /* number of iterative refinement steps */ - idxint maxit; /* maximum number of iterations */ - idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ -#ifdef EXPCONE /*Exponential cone settings*/ - idxint max_bk_iter; /* Maximum backtracking iterations */ - pfloat bk_scale; /* Backtracking scaling */ - pfloat centrality; /* Centrality bound, ignored when centrality vars = 0*/ -#endif -} settings; - - -/* INFO STRUCT --------------------------------------------------------- */ -typedef struct stats{ - pfloat pcost; - pfloat dcost; - pfloat pres; - pfloat dres; - pfloat pinf; - pfloat dinf; - pfloat pinfres; - pfloat dinfres; - pfloat gap; - pfloat relgap; - pfloat sigma; - pfloat mu; - pfloat step; - pfloat step_aff; - pfloat kapovert; - idxint iter; - idxint nitref1; - idxint nitref2; - idxint nitref3; -#if PROFILING > 0 - pfloat tsetup; - pfloat tsolve; -#endif -#if PROFILING > 1 - pfloat tfactor; - pfloat tkktsolve; - pfloat torder; - pfloat tkktcreate; - pfloat ttranspose; - pfloat tperm; - pfloat tfactor_t1; - pfloat tfactor_t2; -#endif -#ifdef EXPCONE - /* Counters for backtracking, each of these counts - * one condition that can fail and cause a backtrack - */ - idxint pob; /* Potential decreases */ - idxint cb; /* Centrality violations */ - idxint cob; /* The s'z of one cone is too small w.r.t. mu */ - idxint pb; /* Primal infeasibility */ - idxint db; /* Dual infeasibility */ - idxint affBack; /* Total affine backtracking steps */ - idxint cmbBack; /* Total combined backtracking steps */ - - pfloat centrality; /*Centrality at the end of the backtracking*/ -#endif - -} stats; - - -/* ALL DATA NEEDED BY SOLVER ------------------------------------------- */ -typedef struct pwork{ - /* dimensions */ - idxint n; /* number of primal variables x */ - idxint m; /* number of conically constrained variables s */ - idxint p; /* number of equality constraints */ - idxint D; /* degree of the cone */ - - /* variables */ - pfloat* x; /* primal variables */ - pfloat* y; /* multipliers for equality constaints */ - pfloat* z; /* multipliers for conic inequalities */ - pfloat* s; /* slacks for conic inequalities */ - pfloat* lambda; /* scaled variable */ - pfloat kap; /* kappa (homogeneous embedding) */ - pfloat tau; /* tau (homogeneous embedding) */ - - /* best iterate seen so far */ - /* variables */ - pfloat* best_x; /* primal variables */ - pfloat* best_y; /* multipliers for equality constaints */ - pfloat* best_z; /* multipliers for conic inequalities */ - pfloat* best_s; /* slacks for conic inequalities */ - pfloat best_kap; /* kappa (homogeneous embedding) */ - pfloat best_tau; /* tau (homogeneous embedding) */ - pfloat best_cx; - pfloat best_by; - pfloat best_hz; - stats* best_info; /* info of best iterate */ - - /* temporary stuff holding search direction etc. */ - pfloat* dsaff; - pfloat* dzaff; - pfloat* W_times_dzaff; - pfloat* dsaff_by_W; - pfloat* saff; - pfloat* zaff; - - /* cone */ - cone* C; - - /* problem data */ - spmat* A; spmat* G; pfloat* c; pfloat* b; pfloat* h; - - /* indices that map entries of A and G to the KKT matrix */ - idxint *AtoK; idxint *GtoK; - -#if defined EQUILIBRATE && EQUILIBRATE > 0 - /* equilibration vector */ - pfloat *xequil; - pfloat *Aequil; - pfloat *Gequil; -#endif - - /* scalings of problem data */ - pfloat resx0; pfloat resy0; pfloat resz0; - - /* residuals */ - pfloat *rx; pfloat *ry; pfloat *rz; pfloat rt; - pfloat hresx; pfloat hresy; pfloat hresz; - - /* norm iterates */ - pfloat nx,ny,nz,ns; - - /* temporary storage */ - pfloat cx; pfloat by; pfloat hz; pfloat sz; - - /* KKT System */ - kkt* KKT; - - /* info struct */ - stats* info; - - /* settings struct */ - settings* stgs; - -} pwork; - - -/* SOME USEFUL MACROS -------------------------------------------------- */ -#define MAX(X,Y) ((X) < (Y) ? (Y) : (X)) /* maximum of 2 expressions */ -/* safe division x/y where y is assumed to be positive! */ -#define SAFEDIV_POS(X,Y) ( (Y) < EPS ? ((X)/EPS) : (X)/(Y) ) - - -/* METHODS */ - -/* set up work space */ -/* could be done by codegen */ -pwork* ECOS_setup(idxint n, idxint m, idxint p, idxint l, idxint ncones, idxint* q, idxint nex, - pfloat* Gpr, idxint* Gjc, idxint* Gir, - pfloat* Apr, idxint* Ajc, idxint* Air, - pfloat* c, pfloat* h, pfloat* b); - - -#ifdef EXPCONE -pfloat expConeLineSearch(pwork* w, pfloat dtau, pfloat dkappa, idxint affine); -#endif - -/* solve */ -idxint ECOS_solve(pwork* w); - -/** - * Cleanup: free memory (not used for embedded solvers, only standalone) - * - * Use the second argument to give the number of variables to NOT free. - * This is useful if you want to use the result of the optimization without - * copying over the arrays. One use case is the MEX interface, where we - * do not want to free x,y,s,z (depending on the number of LHS). - */ -void ECOS_cleanup(pwork* w, idxint keepvars); - - -/** - * Version: returns the current version number - * Use a character array of length 7 to obtain the version number - * in the format - * x.y.zzz - * where x is the major, y the minor and zzz the build number - */ -const char* ECOS_ver(void); - - -/* ------------------- EXPERT LEVEL INTERFACES ---------------------- */ - -/* - * Updates one element of the RHS vector h of inequalities - * After the call, w->h[idx] = value (but equilibrated) - */ -void ecos_updateDataEntry_h(pwork* w, idxint idx, pfloat value); - -/* - * Updates one element of the OBJ vector c of inequalities - * After the call, w->c[idx] = value (but equilibrated) - */ -void ecos_updateDataEntry_c(pwork* w, idxint idx, pfloat value); - -/* - * Updates numerical data for G, A, c, h, and b, - * and re-equilibrates. - * Then updates the corresponding KKT entries. - */ -void ECOS_updateData(pwork *w, pfloat *Gpr, pfloat *Apr, - pfloat* c, pfloat* h, pfloat* b); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/thirdparty/linux/include/coin/ecos_bb.h b/thirdparty/linux/include/coin/ecos_bb.h deleted file mode 100644 index aec87430..00000000 --- a/thirdparty/linux/include/coin/ecos_bb.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -/* - * The branch and bound module is (c) Han Wang, Stanford University, - * [hanwang2@stanford.edu] - */ - -#ifndef __ecos_bb_H__ -#define __ecos_bb_H__ - -#include "ecos.h" -#include "spla.h" -#include "glblopts.h" - -/* Print verbosity */ -#define MI_PRINTLEVEL (1) - -/* ecos_bb configuration settings */ -#define MI_ABS_EPS (1E-6) -#define MI_REL_EPS (1E-3) -#define MI_MAXITER (1000) -#define MI_INT_TOL (FTOL_INACC) - -/* Flags */ -#define MI_SOLVED_NON_BRANCHABLE (3) -#define MI_SOLVED_BRANCHABLE (2) -#define MI_NOT_SOLVED (1) -#define MI_FREE (0) - -#define MI_ONE (1) -#define MI_ZERO (0) -#define MI_STAR (-1) - -/*** Exit flags ***/ -/*ECOS_BB found optimal solution*/ -#define MI_OPTIMAL_SOLN (ECOS_OPTIMAL) -/*ECOS_BB proved problem is infeasible*/ -#define MI_INFEASIBLE (ECOS_PINF) -/*ECOS_BB proved problem is unbounded*/ -#define MI_UNBOUNDED (ECOS_DINF) -/*ECOS_BB hit maximum iterations but a feasible solution was found and the best seen feasible solution was returned*/ -#define MI_MAXITER_FEASIBLE_SOLN (ECOS_OPTIMAL + ECOS_INACC_OFFSET) -/*ECOS_BB hit maximum iterations without finding a feasible solution*/ -#define MI_MAXITER_NO_SOLN (ECOS_PINF + ECOS_INACC_OFFSET) -/*ECOS_BB hit maximum iterations without finding a feasible solution that was unbounded*/ -#define MI_MAXITER_UNBOUNDED (ECOS_DINF + ECOS_INACC_OFFSET) - -/* Max integer and all smaller integer representable by single precision */ -#define MAX_FLOAT_INT (8388608) - -/* define INFINITY and isinf for MSFT */ -#ifdef _MSC_VER -#include "float.h" -#define INFINITY (DBL_MAX+DBL_MAX) -/* this will also return true if x is nan, but we don't check that anyway */ -#define isinf(x) (!_finite(x)) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct settings_bb{ - idxint maxit; /* maximum number of iterations */ - idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ - pfloat abs_tol_gap; /* termination criteria |U-L| */ - pfloat rel_tol_gap; /* termination criteria for |U-L|/|L| < 3 */ - pfloat integer_tol; /* integer rounding tolerance */ -} settings_bb; - -typedef struct node { - char status; - pfloat L; - pfloat U; - idxint split_idx; - pfloat split_val; -} node; - -/* Wrapper for mixed integer module */ -typedef struct ecos_bb_pwork{ - /* Mixed integer data */ - idxint num_bool_vars; - idxint num_int_vars; - - node* nodes; - char* bool_node_ids; - pfloat* int_node_ids; - - idxint* bool_vars_idx; - idxint* int_vars_idx; - - /* ECOS data */ - pwork* ecos_prob; - - /* Modified pointers to ecos internals */ - /* Use these to edit or reset the h variables */ - spmat* A; - spmat* G; - pfloat* c; - pfloat* b; - pfloat* h; - - /* best iterate seen so far */ - /* variables */ - pfloat* x; /* primal variables */ - pfloat* y; /* multipliers for equality constaints */ - pfloat* z; /* multipliers for conic inequalities */ - pfloat* s; /* slacks for conic inequalities */ - pfloat kap; /* kappa (homogeneous embedding) */ - pfloat tau; /* tau (homogeneous embedding) */ - stats* info; /* info of best iterate */ - pfloat global_U; - pfloat global_L; - - /* Tmp data */ - char* tmp_bool_node_id; - pfloat* tmp_int_node_id; - idxint iter; - - /* Stored pointers to prevent memory leaks */ - pfloat* Gpr_new; - idxint* Gjc_new; - idxint* Gir_new; - pfloat* h_new; - - /* settings struct */ - settings* ecos_stgs; - settings_bb* stgs; - idxint default_settings; - -} ecos_bb_pwork; - -ecos_bb_pwork* ECOS_BB_setup( - idxint n, idxint m, idxint p, - idxint l, idxint ncones, idxint* q, idxint nex, - pfloat* Gpr, idxint* Gjc, idxint* Gir, - pfloat* Apr, idxint* Ajc, idxint* Air, - pfloat* c, pfloat* h, pfloat* b, - idxint num_bool_vars, idxint* bool_vars_idx, - idxint num_int_vars, idxint* int_vars_idx, - settings_bb* stgs); - -idxint ECOS_BB_solve(ecos_bb_pwork* prob); - -void ECOS_BB_cleanup(ecos_bb_pwork* prob, idxint num_vars_keep); - -void updateDataEntry_h(ecos_bb_pwork* w, idxint idx, pfloat value); - -void updateDataEntry_c(ecos_bb_pwork* w, idxint idx, pfloat value); - -settings_bb* get_default_ECOS_BB_settings(); - -/* Calculate the offset into the node_id array */ -static inline char* get_bool_node_id(idxint idx, ecos_bb_pwork* prob){ - return &prob->bool_node_ids[prob->num_bool_vars * idx]; -} - -static inline pfloat* get_int_node_id(idxint idx, ecos_bb_pwork* prob){ - return &prob->int_node_ids[prob->num_int_vars * idx * 2]; -} - -static inline pfloat abs_2(pfloat number){ - return number < 0.0 ? -number : number; -} - -static inline pfloat pfloat_round(pfloat number){ - return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5); -} - -static inline pfloat pfloat_ceil(pfloat number, pfloat integer_tol){ - return (pfloat) (number < 0 ? (int) number : (int) (number+(1-integer_tol)) ); -} - -static inline pfloat pfloat_floor(pfloat number, pfloat integer_tol){ - return (pfloat) (number < 0 ? (int) (number-(1-integer_tol)) : (int) number); -} - -static inline idxint float_eqls(pfloat a, pfloat b, pfloat integer_tol){ - return abs_2(a - b) < integer_tol; -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/thirdparty/linux/include/coin/equil.h b/thirdparty/linux/include/coin/equil.h deleted file mode 100644 index d758f8bb..00000000 --- a/thirdparty/linux/include/coin/equil.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* Equilibration module (c) Eric Chu, March 2014 */ - -/** - * used predominantly in preproc.c - */ - -#include "ecos.h" - -#if defined EQUILIBRATE && EQUILIBRATE > 0 - -#ifndef __EQUIL_H__ -#define __EQUIL_H__ - -#include "glblopts.h" -#include "ecos.h" - -/** - * set_equilibration: This routine takes the workspace and sets - * the equilibration vectors. - */ -void set_equilibration(pwork *w); - -/** - * unset_equilibration: This routine takes the workspace and - * undoes the equilibration. - */ -void unset_equilibration(pwork *w); - - -#endif -#endif diff --git a/thirdparty/linux/include/coin/expcone.h b/thirdparty/linux/include/coin/expcone.h deleted file mode 100644 index 4c5fa817..00000000 --- a/thirdparty/linux/include/coin/expcone.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * The exponental cone module is (c) Santiago Akle, Stanford University, - * [akle@stanford.edu] - * - */ - -#include "cone.h" -#include "glblopts.h" -#include "wright_omega.h" -#include -#ifndef __ECOS_EXP_H__ -#define __ECOS_EXP_H__ - -#if defined EXPCONE -/* - * Exponential cone structure: We save the index where each expcone Hessian - * column starts in the csr format. For each cone we also allocate space for - * the gradient of the barrier at each cone and the values of entries of the - * Hessian matrix - */ -typedef struct expcone -{ - idxint colstart[3]; /* All cones are fixed size, we store the index - * where the column of the hessian starts in the - * permuted Newton system. - */ - pfloat v[6]; /* Uper triangular section of the hessian */ - pfloat g[3]; /* Gradient of the barrier */ -} expcone; - -/* - * Evaluates the Hessian of the exponential dual cone barrier at the triplet - * w[0],w[1],w[2], and stores the upper triangular part of the matrix mu*H(w) - * at v[0],...,v[5]. The entries of the Hessian are arranged columnwise into v - */ -void evalExpHessian(pfloat* w, pfloat* v, pfloat mu); - -/* - * Evaluates the gradient of the dual exponential cone barrier g^\star(z) at the triplet - * w[0],w[1],w[2], and stores the result at g[0],..,g[2]. - */ -void evalExpGradient(pfloat* w, pfloat* g); - -/* - * Computes f_e(s_e) + f^\star_e(z_e) - */ -pfloat evalBarrierValue(pfloat* siter, pfloat *ziter, idxint fc, idxint nexc); - -/* - * Multiplies by y+=muH*x - */ -void scaleToAddExpcone(pfloat* y, pfloat* x, expcone* expcones, idxint nexc, idxint fc); - -/* - * Returns 1 if s is primal feasible w.r.t the primal exponential - * cone and 0 i.o.c - */ -idxint evalExpPrimalFeas(pfloat *s, idxint nexc); - -/* - * Returns 1 if s is dual feasible w.r.t the dual exponential - * cone and 0 i.o.c - */ -idxint evalExpDualFeas(pfloat *s, idxint nexc); - -#endif -#endif /* End ifndef __ECOS_EXP_H__ */ - diff --git a/thirdparty/linux/include/coin/glblopts.h b/thirdparty/linux/include/coin/glblopts.h deleted file mode 100644 index 824570a3..00000000 --- a/thirdparty/linux/include/coin/glblopts.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -/* data type definitions used with ECOS */ - -#ifndef __GLBLOPTS_H__ -#define __GLBLOPTS_H__ - -/* DATA TYPES ---------------------------------------------------------- */ -typedef double pfloat; /* for numerical values */ - -/* SET PRINT LEVEL ----------------------------------------------------- */ -#define PRINTLEVEL (2) /* 0: no prints */ - /* 1: only final info */ - /* 2: progress print per iteration */ - /* 3: debug level, enables print & dump fcns. */ - -#define MATLAB_FLUSH_PRINTS - /* print each iteration directly to Matlab. */ - /* this options considerably slows down the */ - /* solver, but is useful if you solve big */ - /* problems. */ - -/* SET PROFILING LEVEL ------------------------------------------------- */ -#define PROFILING (1) /* 0: no timing information */ - /* 1: runtime (divided in setup and solve) */ - /* 2: detailed profiling */ - -/* SET DEBUG LEVEL ----------------------------------------------------- */ -#define DEBUG (0) /* 0: no debugging information */ - /* 1: debug info & dump intermediate results */ - /* (flag used only for development) */ - -/* NAN ----------------------------------------------------------------- */ -#ifndef NAN -#define NAN ((double)0x7ff8000000000000) -#endif - -/* INF ---------------------------------------------------------------- */ -#ifndef INFINITY -#define INFINITY ((double)0x7ff0000000000000) -#endif - -/* Exponential cone */ -#define EXPCONE /*When defined the exponential cone solver code is enabled*/ - -/* SYSTEM INCLUDES FOR PRINTING ---------------------------------------- */ -#if PRINTLEVEL > 0 -#ifdef MATLAB_MEX_FILE -#include "mex.h" -#define PRINTTEXT mexPrintf -#elif defined PYTHON -#include -#define PRINTTEXT PySys_WriteStdout -#else -#define PRINTTEXT printf -#endif -#include -#else -#define PRINTTEXT(...) -#endif - -#include "SuiteSparse_config.h" - -/* use this if pfloat is float: */ -/* #define NAN ((float)0x7fc00000) */ - -/* USE SAME NUMBER REPRESENTATION FOR INDEXING AS AMD AND LDL ---------- */ -typedef SuiteSparse_long idxint; - -/* SYSTEM INCLUDE IF COMPILING FOR MATLAB ------------------------------ */ -#ifdef MATLAB_MEX_FILE -#include "mex.h" -#endif - -/* CHOOSE RIGHT MEMORY MANAGER ----------------------------------------- */ -#ifdef MATLAB_MEX_FILE -#define MALLOC mxMalloc -#define FREE mxFree -#else -#define MALLOC malloc -#define FREE free -#endif - -/* Other commonly used macros ----------------------------------------- */ -#define inline __inline - -#endif diff --git a/thirdparty/linux/include/coin/ldl.h b/thirdparty/linux/include/coin/ldl.h deleted file mode 100644 index e468818f..00000000 --- a/thirdparty/linux/include/coin/ldl.h +++ /dev/null @@ -1,98 +0,0 @@ -/* ========================================================================== */ -/* === ldl.h: include file for the LDL package ============================= */ -/* ========================================================================== */ - -/* Copyright (c) Timothy A Davis, http://www.suitesparse.com. - * All Rights Reserved. See README for the License. - * - * Stripped down by Alexander Domahidi, 2012. - */ - -#include "../../include/glblopts.h" -#include "../../include/ecos.h" - -#include "SuiteSparse_config.h" - -#ifdef LDL_LONG -#define LDL_int SuiteSparse_long -#define LDL_ID SuiteSparse_long_id - -#define LDL_symbolic2 ldl_l_symbolic2 -#define LDL_numeric2 ldl_l_numeric2 -#define LDL_lsolve ldl_l_lsolve -#define LDL_lsolve2 ldl_l_lsolve2 -#define LDL_dsolve ldl_l_dsolve -#define LDL_ltsolve ldl_l_ltsolve - -#else -#define LDL_int int -#define LDL_ID "%d" - -#define LDL_symbolic2 ldl_symbolic2 -#define LDL_numeric2 ldl_numeric2 -#define LDL_lsolve ldl_lsolve -#define LDL_lsolve2 ldl_lsolve2 -#define LDL_dsolve ldl_dsolve -#define LDL_ltsolve ldl_ltsolve - -#endif - -/* ========================================================================== */ -/* === int version ========================================================== */ -/* ========================================================================== */ - -void ldl_symbolic2 (int n, int Ap [ ], int Ai [ ], int Lp [ ], int Parent [ ], int Lnz [ ], int Flag [ ]) ; - -int ldl_numeric2 (int n, int Ap [ ], int Ai [ ], double Ax [ ], - int Lp [ ], int Parent [ ], int Sign[], double eps, double delta, int Lnz [ ], int Li [ ], double Lx [ ], - double D [ ], double Y [ ], int Pattern [ ], int Flag [ ] -#if PROFILING > 1 - ,double *t1, double *t2 -#endif - ) ; - -void ldl_lsolve (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ]) ; -void ldl_lsolve2 (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ], double X [ ]) ; - -void ldl_dsolve (int n, double X [ ], double D [ ]) ; - -void ldl_ltsolve (int n, double X [ ], int Lp [ ], int Li [ ], - double Lx [ ]) ; - -/* ========================================================================== */ -/* === long version ========================================================= */ -/* ========================================================================== */ - -void ldl_l_symbolic2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], - SuiteSparse_long Ai [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Parent [ ], SuiteSparse_long Lnz [ ], - SuiteSparse_long Flag [ ]); - -SuiteSparse_long ldl_l_numeric2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], - SuiteSparse_long Ai [ ], double Ax [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Parent [ ], SuiteSparse_long Sign [ ], double eps, double delta, SuiteSparse_long Lnz [ ], - SuiteSparse_long Li [ ], double Lx [ ], double D [ ], double Y [ ], - SuiteSparse_long Pattern [ ], SuiteSparse_long Flag [ ] -#if PROFILING > 1 - ,double *t1, double *t2 -#endif - ) ; - -void ldl_l_lsolve (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ]) ; -void ldl_l_lsolve2 (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ], double X [ ]) ; - -void ldl_l_dsolve (SuiteSparse_long n, double X [ ], double D [ ]) ; - -void ldl_l_ltsolve (SuiteSparse_long n, double X [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Li [ ], double Lx [ ]) ; - -/* ========================================================================== */ -/* === LDL version ========================================================== */ -/* ========================================================================== */ - -#define LDL_DATE "April 6, 2013, with dynamic regularization by A. Domahidi" -#define LDL_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define LDL_MAIN_VERSION 2 -#define LDL_SUB_VERSION 1 -#define LDL_SUBSUB_VERSION 0 -#define LDL_VERSION LDL_VERSION_CODE(LDL_MAIN_VERSION,LDL_SUB_VERSION) diff --git a/thirdparty/linux/include/coin/splamm.h b/thirdparty/linux/include/coin/splamm.h deleted file mode 100644 index b3be9c3a..00000000 --- a/thirdparty/linux/include/coin/splamm.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -/* - * Sparse linear algebra library for setup phase, i.e. this module - * accesses malloc and hence should not go on an embedded platform. - */ - -#ifndef __SPLAMM_H__ -#define __SPLAMM_H__ - -#include "glblopts.h" -#include "spla.h" - - -/** - * Create a sparse matrix from existing arrays. - */ -spmat* createSparseMatrix(idxint m, idxint n, idxint nnz, idxint* jc, idxint* ir, pfloat* pr); - - -/** - * Create a new sparse matrix (uses MALLOC!) - */ -spmat* newSparseMatrix(idxint m, idxint n, idxint nnz); - -/** - * Create a new sparse matrix (uses FREE!) - */ -void freeSparseMatrix(spmat* M); - - -/** - * Transpose a matrix; returns A = M' (uses malloc!) - */ -spmat* transposeSparseMatrix(spmat* M, idxint* MtoMt); - - -/** - * Permutes a symmetric matrix with only the upper triangular part stored. - * Writes the upper triangular part of C = A(p,p) in column compressed - * storage format. - * - * The function additionally returns the mapping PK that maps the row indices - * of the sparse matrix A on the row indices of C, such that C[P[k]] = A[k]. - * - * NOTE: The matrix C and the vector PK are NOT created within this function - * - you need to allocate them beforehand!! - * - * If PK is NULL then the last output argument is ignored. - */ -void permuteSparseSymmetricMatrix(spmat* A, idxint* pinv, spmat* C, idxint* PK); - - -/** - * Returns the inverse of permutation p of length n. - */ -void pinv(idxint n, idxint* p, idxint* pinv); - - -/** - * Returns a copy of a sparse matrix A. - */ -spmat* copySparseMatrix(spmat* A); - -/* ============================= DEBUG FUNCTIONS ======================= */ -#if PRINTLEVEL > 0 - -/** - * Prints a dense matrix. - */ -void printDenseMatrix(pfloat *M, idxint dim1, idxint dim2, char *name); - - -/** - * Prints a dense integer matrix. - */ -void printDenseMatrix_i(idxint *M, idxint dim1, idxint dim2, char *name); - - -/** - * Prints a sparse matrix. - */ -void printSparseMatrix(spmat* M); - - -/** - * Dumps a sparse matrix in Matlab format. - * Use SPCONVERT to read in the file. - */ -void dumpSparseMatrix(spmat* M, char* fn); - - -/** - * Dumps a dense matrix of doubles to a CSV file. - */ -void dumpDenseMatrix(pfloat *M, int dim1, int dim2, char *fn); - -/** - * Dumps a dense matrix of integers to a CSV file. - */ -void dumpDenseMatrix_i(idxint *M, int dim1, int dim2, char *fn); - -#endif - -#endif diff --git a/thirdparty/linux/include/coin/timer.h b/thirdparty/linux/include/coin/timer.h deleted file mode 100644 index 7da68ff1..00000000 --- a/thirdparty/linux/include/coin/timer.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * ECOS - Embedded Conic Solver. - * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], - * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * Interface for the built-in timer of ECOS. - */ -#ifndef __TIMER_H__ -#define __TIMER_H__ - -#include "glblopts.h" - -#if PROFILING > 0 - -#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) - -/* Use Windows QueryPerformanceCounter for timing */ -#include - -typedef struct timer{ - LARGE_INTEGER tic; - LARGE_INTEGER toc; - LARGE_INTEGER freq; -} timer; - - -#elif (defined __APPLE__) - -#include - -/* Use MAC OSX mach_time for timing */ -typedef struct timer{ - uint64_t tic; - uint64_t toc; - mach_timebase_info_data_t tinfo; -} timer; - - - -#else - -/* Use POSIX clocl_gettime() for timing on non-Windows machines */ -#include -#include - -typedef struct timer{ - struct timespec tic; - struct timespec toc; -} timer; - -#endif - -/* METHODS are the same for both */ -void tic(timer* t); -pfloat toc(timer* t); - -#endif /* END IF PROFILING > 0 */ - -#endif -/* END IFDEF __TIMER_H__ */ diff --git a/thirdparty/linux/include/coin/wright_omega.h b/thirdparty/linux/include/coin/wright_omega.h deleted file mode 100644 index dd50a772..00000000 --- a/thirdparty/linux/include/coin/wright_omega.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Santiago Akle - * ICME Stanford University 2014 - * - * Computes the value \omega(z) defined as the solution y to - * the equation y+log(y) = z for z real and z>=1. - * Follows the recommendations by - * PIERS W. LAWRENCE, ROBERT M. CORLESS, and DAVID J. JEFFREY. - * Published in: - * Algorithm 917: Complex Double-Precision Evaluation of the Wright \omega Function - * ACM Transactions on Mathematical Software (TOMS) TOMS Homepage table of contents archive - * Volume 38 Issue 3, April 2012 - * Article No. 20 - * Publication Date 2012-04-01 (yyyy-mm-dd) - * Publisher ACM New York, NY, USA - * ISSN: 0098-3500 EISSN: 1557-7295 doi>10.1145/2168773.2168779 - */ - -#include "glblopts.h" - -#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) -#define _USE_MATH_DEFINES -#endif -#include - -pfloat wrightOmega(pfloat z); diff --git a/thirdparty/linux/include/coin1/CbcOrClpParam.cpp b/thirdparty/linux/include/coin1/CbcOrClpParam.cpp deleted file mode 100644 index b434fe08..00000000 --- a/thirdparty/linux/include/coin1/CbcOrClpParam.cpp +++ /dev/null @@ -1,4104 +0,0 @@ -/* $Id: CbcOrClpParam.cpp 2079 2015-01-05 13:11:35Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#include "CoinPragma.hpp" -#include "CoinTime.hpp" -#include "CbcOrClpParam.hpp" - -#include -#include -#include - -#ifdef COIN_HAS_CBC -#ifdef COIN_HAS_CLP -#include "OsiClpSolverInterface.hpp" -#include "ClpSimplex.hpp" -#endif -#include "CbcModel.hpp" -#endif -#include "CoinHelperFunctions.hpp" -#ifdef COIN_HAS_CLP -#include "ClpSimplex.hpp" -#include "ClpFactorization.hpp" -#endif -#ifdef COIN_HAS_READLINE -#include -#include -#endif -#ifdef COIN_HAS_CBC -// from CoinSolve -static char coin_prompt[] = "Coin:"; -#else -static char coin_prompt[] = "Clp:"; -#endif -#ifdef CLP_CILK -#ifndef CBC_THREAD -#define CBC_THREAD -#endif -#endif -#if defined(COIN_HAS_WSMP) && ! defined(USE_EKKWSSMP) -#ifndef CBC_THREAD -#define CBC_THREAD -#endif -#endif -#include "ClpConfig.h" -#ifdef CLP_HAS_ABC -#include "AbcCommon.hpp" -#endif -static bool doPrinting = true; -std::string afterEquals = ""; -static char printArray[200]; -#if COIN_INT_MAX==0 -#undef COIN_INT_MAX -#define COIN_INT_MAX 2147483647 -#endif -void setCbcOrClpPrinting(bool yesNo) -{ - doPrinting = yesNo; -} -//############################################################################# -// Constructors / Destructor / Assignment -//############################################################################# - -//------------------------------------------------------------------- -// Default Constructor -//------------------------------------------------------------------- -CbcOrClpParam::CbcOrClpParam () - : type_(CBC_PARAM_NOTUSED_INVALID), - lowerDoubleValue_(0.0), - upperDoubleValue_(0.0), - lowerIntValue_(0), - upperIntValue_(0), - lengthName_(0), - lengthMatch_(0), - definedKeyWords_(), - name_(), - shortHelp_(), - longHelp_(), - action_(CBC_PARAM_NOTUSED_INVALID), - currentKeyWord_(-1), - display_(0), - intValue_(-1), - doubleValue_(-1.0), - stringValue_(""), - whereUsed_(7), - fakeKeyWord_(-1), - fakeValue_(0) -{ -} -// Other constructors -CbcOrClpParam::CbcOrClpParam (std::string name, std::string help, - double lower, double upper, CbcOrClpParameterType type, - int display) - : type_(type), - lowerIntValue_(0), - upperIntValue_(0), - definedKeyWords_(), - name_(name), - shortHelp_(help), - longHelp_(), - action_(type), - currentKeyWord_(-1), - display_(display), - intValue_(-1), - doubleValue_(-1.0), - stringValue_(""), - whereUsed_(7), - fakeKeyWord_(-1), - fakeValue_(0) -{ - lowerDoubleValue_ = lower; - upperDoubleValue_ = upper; - gutsOfConstructor(); -} -CbcOrClpParam::CbcOrClpParam (std::string name, std::string help, - int lower, int upper, CbcOrClpParameterType type, - int display) - : type_(type), - lowerDoubleValue_(0.0), - upperDoubleValue_(0.0), - definedKeyWords_(), - name_(name), - shortHelp_(help), - longHelp_(), - action_(type), - currentKeyWord_(-1), - display_(display), - intValue_(-1), - doubleValue_(-1.0), - stringValue_(""), - whereUsed_(7), - fakeKeyWord_(-1), - fakeValue_(0) -{ - gutsOfConstructor(); - lowerIntValue_ = lower; - upperIntValue_ = upper; -} -// Other strings will be added by append -CbcOrClpParam::CbcOrClpParam (std::string name, std::string help, - std::string firstValue, - CbcOrClpParameterType type, int whereUsed, - int display) - : type_(type), - lowerDoubleValue_(0.0), - upperDoubleValue_(0.0), - lowerIntValue_(0), - upperIntValue_(0), - definedKeyWords_(), - name_(name), - shortHelp_(help), - longHelp_(), - action_(type), - currentKeyWord_(0), - display_(display), - intValue_(-1), - doubleValue_(-1.0), - stringValue_(""), - whereUsed_(whereUsed), - fakeKeyWord_(-1), - fakeValue_(0) -{ - gutsOfConstructor(); - definedKeyWords_.push_back(firstValue); -} -// Action -CbcOrClpParam::CbcOrClpParam (std::string name, std::string help, - CbcOrClpParameterType type, int whereUsed, - int display) - : type_(type), - lowerDoubleValue_(0.0), - upperDoubleValue_(0.0), - lowerIntValue_(0), - upperIntValue_(0), - definedKeyWords_(), - name_(name), - shortHelp_(help), - longHelp_(), - action_(type), - currentKeyWord_(-1), - display_(display), - intValue_(-1), - doubleValue_(-1.0), - stringValue_(""), - fakeKeyWord_(-1), - fakeValue_(0) -{ - whereUsed_ = whereUsed; - gutsOfConstructor(); -} - -//------------------------------------------------------------------- -// Copy constructor -//------------------------------------------------------------------- -CbcOrClpParam::CbcOrClpParam (const CbcOrClpParam & rhs) -{ - type_ = rhs.type_; - lowerDoubleValue_ = rhs.lowerDoubleValue_; - upperDoubleValue_ = rhs.upperDoubleValue_; - lowerIntValue_ = rhs.lowerIntValue_; - upperIntValue_ = rhs.upperIntValue_; - lengthName_ = rhs.lengthName_; - lengthMatch_ = rhs.lengthMatch_; - definedKeyWords_ = rhs.definedKeyWords_; - name_ = rhs.name_; - shortHelp_ = rhs.shortHelp_; - longHelp_ = rhs.longHelp_; - action_ = rhs.action_; - currentKeyWord_ = rhs.currentKeyWord_; - display_ = rhs.display_; - intValue_ = rhs.intValue_; - doubleValue_ = rhs.doubleValue_; - stringValue_ = rhs.stringValue_; - whereUsed_ = rhs.whereUsed_; - fakeKeyWord_ = rhs.fakeKeyWord_; - fakeValue_ = rhs.fakeValue_; -} - -//------------------------------------------------------------------- -// Destructor -//------------------------------------------------------------------- -CbcOrClpParam::~CbcOrClpParam () -{ -} - -//---------------------------------------------------------------- -// Assignment operator -//------------------------------------------------------------------- -CbcOrClpParam & -CbcOrClpParam::operator=(const CbcOrClpParam & rhs) -{ - if (this != &rhs) { - type_ = rhs.type_; - lowerDoubleValue_ = rhs.lowerDoubleValue_; - upperDoubleValue_ = rhs.upperDoubleValue_; - lowerIntValue_ = rhs.lowerIntValue_; - upperIntValue_ = rhs.upperIntValue_; - lengthName_ = rhs.lengthName_; - lengthMatch_ = rhs.lengthMatch_; - definedKeyWords_ = rhs.definedKeyWords_; - name_ = rhs.name_; - shortHelp_ = rhs.shortHelp_; - longHelp_ = rhs.longHelp_; - action_ = rhs.action_; - currentKeyWord_ = rhs.currentKeyWord_; - display_ = rhs.display_; - intValue_ = rhs.intValue_; - doubleValue_ = rhs.doubleValue_; - stringValue_ = rhs.stringValue_; - whereUsed_ = rhs.whereUsed_; - fakeKeyWord_ = rhs.fakeKeyWord_; - fakeValue_ = rhs.fakeValue_; - } - return *this; -} -void -CbcOrClpParam::gutsOfConstructor() -{ - std::string::size_type shriekPos = name_.find('!'); - lengthName_ = static_cast(name_.length()); - if ( shriekPos == std::string::npos ) { - //does not contain '!' - lengthMatch_ = lengthName_; - } else { - lengthMatch_ = static_cast(shriekPos); - name_ = name_.substr(0, shriekPos) + name_.substr(shriekPos + 1); - lengthName_--; - } -} -// Sets value of fake keyword to current size of keywords -void -CbcOrClpParam::setFakeKeyWord(int fakeValue) -{ - fakeKeyWord_ = static_cast(definedKeyWords_.size()); - assert (fakeKeyWord_>0); - fakeValue_ = fakeValue; - assert (fakeValue_>=0); -} -/* Returns current parameter option position - but if fake keyword returns fakeValue_ -*/ -int -CbcOrClpParam::currentOptionAsInteger ( ) const -{ - int fakeInteger; - return currentOptionAsInteger(fakeInteger); -} -/* Returns current parameter option position - but if fake keyword returns fakeValue_ and sets - fakeInteger to value -*/ -int -CbcOrClpParam::currentOptionAsInteger ( int & fakeInteger ) const -{ - fakeInteger=-COIN_INT_MAX; - if (fakeKeyWord_<0) { - return currentKeyWord_; - } else if (currentKeyWord_>=0&¤tKeyWord_ lengthName_) { - return 0; - } else { - unsigned int i; - for (i = 0; i < input.length(); i++) { - if (tolower(name_[i]) != tolower(input[i])) - break; - } - if (i < input.length()) { - return 0; - } else if (i >= lengthMatch_) { - return 1; - } else { - // matched but too short - return 2; - } - } -} -// Returns name which could match -std::string -CbcOrClpParam::matchName ( ) const -{ - if (lengthMatch_ == lengthName_) - return name_; - else - return name_.substr(0, lengthMatch_) + "(" + name_.substr(lengthMatch_) + ")"; -} - -// Returns parameter option which matches (-1 if none) -int -CbcOrClpParam::parameterOption ( std::string check ) const -{ - int numberItems = static_cast(definedKeyWords_.size()); - if (!numberItems) { - return -1; - } else { - int whichItem = 0; - unsigned int it; - for (it = 0; it < definedKeyWords_.size(); it++) { - std::string thisOne = definedKeyWords_[it]; - std::string::size_type shriekPos = thisOne.find('!'); - size_t length1 = thisOne.length(); - size_t length2 = length1; - if ( shriekPos != std::string::npos ) { - //contains '!' - length2 = shriekPos; - thisOne = thisOne.substr(0, shriekPos) + - thisOne.substr(shriekPos + 1); - length1 = thisOne.length(); - } - if (check.length() <= length1 && length2 <= check.length()) { - unsigned int i; - for (i = 0; i < check.length(); i++) { - if (tolower(thisOne[i]) != tolower(check[i])) - break; - } - if (i < check.length()) { - whichItem++; - } else if (i >= length2) { - break; - } - } else { - whichItem++; - } - } - if (whichItem < numberItems) { - return whichItem; - } else { - if (fakeKeyWord_<=0) - return -1; - // allow plus or minus - int n; - if (check.substr(0,4)=="plus"||check.substr(0,4)=="PLUS") { - n = 4; - } else if (check.substr(0,5)=="minus"||check.substr(0,5)=="MINUS") { - n = 5; - } else { - return -1; - } - int value = 0; - std::string field=check.substr(n); - if (field != "EOL") { - const char * start = field.c_str(); - char * endPointer = NULL; - // check valid - value = static_cast(strtol(start, &endPointer, 10)); - if (*endPointer != '\0') { - return -1; - } - if (n==4) - return value + 1000; - else - return -value - 1000; - } else { - return -1; - } - } - } -} -// Prints parameter options -void -CbcOrClpParam::printOptions ( ) const -{ - std::cout << "= 0 && currentKeyWord_ < static_cast(definedKeyWords_.size())); - std::string current = definedKeyWords_[currentKeyWord_]; - std::string::size_type shriekPos = current.find('!'); - if ( shriekPos != std::string::npos ) { - //contains '!' - current = current.substr(0, shriekPos) + - "(" + current.substr(shriekPos + 1) + ")"; - } - std::cout << ";\n\tcurrent " << current << ">" << std::endl; -} -// Print action and string -void -CbcOrClpParam::printString() const -{ - if (name_ == "directory") - std::cout << "Current working directory is " << stringValue_ << std::endl; - else if (name_.substr(0, 6) == "printM") - std::cout << "Current value of printMask is " << stringValue_ << std::endl; - else - std::cout << "Current default (if $ as parameter) for " << name_ - << " is " << stringValue_ << std::endl; -} -void CoinReadPrintit(const char * input) -{ - int length = static_cast(strlen(input)); - char temp[101]; - int i; - int n = 0; - for (i = 0; i < length; i++) { - if (input[i] == '\n') { - temp[n] = '\0'; - std::cout << temp << std::endl; - n = 0; - } else if (n >= 65 && input[i] == ' ') { - temp[n] = '\0'; - std::cout << temp << std::endl; - n = 0; - } else if (n || input[i] != ' ') { - temp[n++] = input[i]; - } - } - if (n) { - temp[n] = '\0'; - std::cout << temp << std::endl; - } -} -// Print Long help -void -CbcOrClpParam::printLongHelp() const -{ - if (type_ >= 1 && type_ < 400) { - CoinReadPrintit(longHelp_.c_str()); - if (type_ < CLP_PARAM_INT_SOLVERLOGLEVEL) { - printf("\n", lowerDoubleValue_, upperDoubleValue_, doubleValue_); - assert (upperDoubleValue_ > lowerDoubleValue_); - } else if (type_ < CLP_PARAM_STR_DIRECTION) { - printf("\n", lowerIntValue_, upperIntValue_, intValue_); - assert (upperIntValue_ > lowerIntValue_); - } else if (type_ < CLP_PARAM_ACTION_DIRECTORY) { - printOptions(); - } - } -} -#ifdef COIN_HAS_CBC -int -CbcOrClpParam::setDoubleParameter (OsiSolverInterface * model, double value) -{ - int returnCode; - setDoubleParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets double parameter and returns printable string and error code -const char * -CbcOrClpParam::setDoubleParameterWithMessage ( OsiSolverInterface * model, double value , int & returnCode) -{ - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - sprintf(printArray, "%g was provided for %s - valid range is %g to %g", - value, name_.c_str(), lowerDoubleValue_, upperDoubleValue_); - std::cout << value << " was provided for " << name_ << - " - valid range is " << lowerDoubleValue_ << " to " << - upperDoubleValue_ << std::endl; - returnCode = 1; - } else { - double oldValue = doubleValue_; - doubleValue_ = value; - switch (type_) { - case CLP_PARAM_DBL_DUALTOLERANCE: - model->getDblParam(OsiDualTolerance, oldValue); - model->setDblParam(OsiDualTolerance, value); - break; - case CLP_PARAM_DBL_PRIMALTOLERANCE: - model->getDblParam(OsiPrimalTolerance, oldValue); - model->setDblParam(OsiPrimalTolerance, value); - break; - default: - break; - } - sprintf(printArray, "%s was changed from %g to %g", - name_.c_str(), oldValue, value); - returnCode = 0; - } - return printArray; -} -#endif -#ifdef COIN_HAS_CLP -int -CbcOrClpParam::setDoubleParameter (ClpSimplex * model, double value) -{ - int returnCode; - setDoubleParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets int parameter and returns printable string and error code -const char * -CbcOrClpParam::setDoubleParameterWithMessage ( ClpSimplex * model, double value , int & returnCode) -{ - double oldValue = doubleValue_; - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - sprintf(printArray, "%g was provided for %s - valid range is %g to %g", - value, name_.c_str(), lowerDoubleValue_, upperDoubleValue_); - returnCode = 1; - } else { - sprintf(printArray, "%s was changed from %g to %g", - name_.c_str(), oldValue, value); - returnCode = 0; - doubleValue_ = value; - switch (type_) { - case CLP_PARAM_DBL_DUALTOLERANCE: - model->setDualTolerance(value); - break; - case CLP_PARAM_DBL_PRIMALTOLERANCE: - model->setPrimalTolerance(value); - break; - case CLP_PARAM_DBL_ZEROTOLERANCE: - model->setSmallElementValue(value); - break; - case CLP_PARAM_DBL_DUALBOUND: - model->setDualBound(value); - break; - case CLP_PARAM_DBL_PRIMALWEIGHT: - model->setInfeasibilityCost(value); - break; -#ifndef COIN_HAS_CBC - case CLP_PARAM_DBL_TIMELIMIT: - model->setMaximumSeconds(value); - break; -#endif - case CLP_PARAM_DBL_OBJSCALE: - model->setObjectiveScale(value); - break; - case CLP_PARAM_DBL_RHSSCALE: - model->setRhsScale(value); - break; - case CLP_PARAM_DBL_PRESOLVETOLERANCE: - model->setDblParam(ClpPresolveTolerance, value); - break; - default: - break; - } - } - return printArray; -} -double -CbcOrClpParam::doubleParameter (ClpSimplex * model) const -{ - double value; - switch (type_) { -#ifndef COIN_HAS_CBC - case CLP_PARAM_DBL_DUALTOLERANCE: - value = model->dualTolerance(); - break; - case CLP_PARAM_DBL_PRIMALTOLERANCE: - value = model->primalTolerance(); - break; -#endif - case CLP_PARAM_DBL_ZEROTOLERANCE: - value = model->getSmallElementValue(); - break; - case CLP_PARAM_DBL_DUALBOUND: - value = model->dualBound(); - break; - case CLP_PARAM_DBL_PRIMALWEIGHT: - value = model->infeasibilityCost(); - break; -#ifndef COIN_HAS_CBC - case CLP_PARAM_DBL_TIMELIMIT: - value = model->maximumSeconds(); - break; -#endif - case CLP_PARAM_DBL_OBJSCALE: - value = model->objectiveScale(); - break; - case CLP_PARAM_DBL_RHSSCALE: - value = model->rhsScale(); - break; - default: - value = doubleValue_; - break; - } - return value; -} -int -CbcOrClpParam::setIntParameter (ClpSimplex * model, int value) -{ - int returnCode; - setIntParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets int parameter and returns printable string and error code -const char * -CbcOrClpParam::setIntParameterWithMessage ( ClpSimplex * model, int value , int & returnCode) -{ - int oldValue = intValue_; - if (value < lowerIntValue_ || value > upperIntValue_) { - sprintf(printArray, "%d was provided for %s - valid range is %d to %d", - value, name_.c_str(), lowerIntValue_, upperIntValue_); - returnCode = 1; - } else { - intValue_ = value; - sprintf(printArray, "%s was changed from %d to %d", - name_.c_str(), oldValue, value); - returnCode = 0; - switch (type_) { - case CLP_PARAM_INT_SOLVERLOGLEVEL: - model->setLogLevel(value); - if (value > 2) - model->factorization()->messageLevel(8); - else - model->factorization()->messageLevel(0); - break; - case CLP_PARAM_INT_MAXFACTOR: - model->factorization()->maximumPivots(value); - break; - case CLP_PARAM_INT_PERTVALUE: - model->setPerturbation(value); - break; - case CLP_PARAM_INT_MAXITERATION: - model->setMaximumIterations(value); - break; - case CLP_PARAM_INT_SPECIALOPTIONS: - model->setSpecialOptions(value); - break; - case CLP_PARAM_INT_RANDOMSEED: - { - if (value==0) { - double time = fabs(CoinGetTimeOfDay()); - while (time>=COIN_INT_MAX) - time *= 0.5; - value = static_cast(time); - sprintf(printArray, "using time of day %s was changed from %d to %d", - name_.c_str(), oldValue, value); - } - model->setRandomSeed(value); - } - break; - case CLP_PARAM_INT_MORESPECIALOPTIONS: - model->setMoreSpecialOptions(value); - break; -#ifndef COIN_HAS_CBC -#ifdef CBC_THREAD - case CBC_PARAM_INT_THREADS: - model->setNumberThreads(value); - break; -#endif -#endif - default: - break; - } - } - return printArray; -} -int -CbcOrClpParam::intParameter (ClpSimplex * model) const -{ - int value; - switch (type_) { -#ifndef COIN_HAS_CBC - case CLP_PARAM_INT_SOLVERLOGLEVEL: - value = model->logLevel(); - break; -#endif - case CLP_PARAM_INT_MAXFACTOR: - value = model->factorization()->maximumPivots(); - break; - break; - case CLP_PARAM_INT_PERTVALUE: - value = model->perturbation(); - break; - case CLP_PARAM_INT_MAXITERATION: - value = model->maximumIterations(); - break; - case CLP_PARAM_INT_SPECIALOPTIONS: - value = model->specialOptions(); - break; - case CLP_PARAM_INT_RANDOMSEED: - value = model->randomNumberGenerator()->getSeed(); - break; - case CLP_PARAM_INT_MORESPECIALOPTIONS: - value = model->moreSpecialOptions(); - break; -#ifndef COIN_HAS_CBC -#ifdef CBC_THREAD - case CBC_PARAM_INT_THREADS: - value = model->numberThreads(); - break; -#endif -#endif - default: - value = intValue_; - break; - } - return value; -} -#endif -int -CbcOrClpParam::checkDoubleParameter (double value) const -{ - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - std::cout << value << " was provided for " << name_ << - " - valid range is " << lowerDoubleValue_ << " to " << - upperDoubleValue_ << std::endl; - return 1; - } else { - return 0; - } -} -#ifdef COIN_HAS_CBC -double -CbcOrClpParam::doubleParameter (OsiSolverInterface * -#ifndef NDEBUG - model -#endif - ) const -{ - double value = 0.0; - switch (type_) { - case CLP_PARAM_DBL_DUALTOLERANCE: - assert(model->getDblParam(OsiDualTolerance, value)); - break; - case CLP_PARAM_DBL_PRIMALTOLERANCE: - assert(model->getDblParam(OsiPrimalTolerance, value)); - break; - default: - return doubleValue_; - break; - } - return value; -} -int -CbcOrClpParam::setIntParameter (OsiSolverInterface * model, int value) -{ - int returnCode; - setIntParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets int parameter and returns printable string and error code -const char * -CbcOrClpParam::setIntParameterWithMessage ( OsiSolverInterface * model, int value , int & returnCode) -{ - if (value < lowerIntValue_ || value > upperIntValue_) { - sprintf(printArray, "%d was provided for %s - valid range is %d to %d", - value, name_.c_str(), lowerIntValue_, upperIntValue_); - returnCode = 1; - } else { - int oldValue = intValue_; - intValue_ = oldValue; - switch (type_) { - case CLP_PARAM_INT_SOLVERLOGLEVEL: - model->messageHandler()->setLogLevel(value); - break; - default: - break; - } - sprintf(printArray, "%s was changed from %d to %d", - name_.c_str(), oldValue, value); - returnCode = 0; - } - return printArray; -} -int -CbcOrClpParam::intParameter (OsiSolverInterface * model) const -{ - int value = 0; - switch (type_) { - case CLP_PARAM_INT_SOLVERLOGLEVEL: - value = model->messageHandler()->logLevel(); - break; - default: - value = intValue_; - break; - } - return value; -} -int -CbcOrClpParam::setDoubleParameter (CbcModel &model, double value) -{ - int returnCode=0; - setDoubleParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets double parameter and returns printable string and error code -const char * -CbcOrClpParam::setDoubleParameterWithMessage ( CbcModel & model, double value , int & returnCode) -{ - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - sprintf(printArray, "%g was provided for %s - valid range is %g to %g", - value, name_.c_str(), lowerDoubleValue_, upperDoubleValue_); - returnCode = 1; - } else { - double oldValue = doubleValue_; - doubleValue_ = value; - switch (type_) { - case CBC_PARAM_DBL_INFEASIBILITYWEIGHT: - oldValue = model.getDblParam(CbcModel::CbcInfeasibilityWeight); - model.setDblParam(CbcModel::CbcInfeasibilityWeight, value); - break; - case CBC_PARAM_DBL_INTEGERTOLERANCE: - oldValue = model.getDblParam(CbcModel::CbcIntegerTolerance); - model.setDblParam(CbcModel::CbcIntegerTolerance, value); - break; - case CBC_PARAM_DBL_INCREMENT: - oldValue = model.getDblParam(CbcModel::CbcCutoffIncrement); - model.setDblParam(CbcModel::CbcCutoffIncrement, value); - case CBC_PARAM_DBL_ALLOWABLEGAP: - oldValue = model.getDblParam(CbcModel::CbcAllowableGap); - model.setDblParam(CbcModel::CbcAllowableGap, value); - break; - case CBC_PARAM_DBL_GAPRATIO: - oldValue = model.getDblParam(CbcModel::CbcAllowableFractionGap); - model.setDblParam(CbcModel::CbcAllowableFractionGap, value); - break; - case CBC_PARAM_DBL_CUTOFF: - oldValue = model.getCutoff(); - model.setCutoff(value); - break; - case CBC_PARAM_DBL_TIMELIMIT_BAB: - oldValue = model.getDblParam(CbcModel::CbcMaximumSeconds) ; - { - //OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (model.solver()); - //ClpSimplex * lpSolver = clpSolver->getModelPtr(); - //lpSolver->setMaximumSeconds(value); - model.setDblParam(CbcModel::CbcMaximumSeconds, value) ; - } - break ; - case CLP_PARAM_DBL_DUALTOLERANCE: - case CLP_PARAM_DBL_PRIMALTOLERANCE: - setDoubleParameter(model.solver(), value); - return 0; // to avoid message - default: - break; - } - sprintf(printArray, "%s was changed from %g to %g", - name_.c_str(), oldValue, value); - returnCode = 0; - } - return printArray; -} -double -CbcOrClpParam::doubleParameter (CbcModel &model) const -{ - double value; - switch (type_) { - case CBC_PARAM_DBL_INFEASIBILITYWEIGHT: - value = model.getDblParam(CbcModel::CbcInfeasibilityWeight); - break; - case CBC_PARAM_DBL_INTEGERTOLERANCE: - value = model.getDblParam(CbcModel::CbcIntegerTolerance); - break; - case CBC_PARAM_DBL_INCREMENT: - value = model.getDblParam(CbcModel::CbcCutoffIncrement); - break; - case CBC_PARAM_DBL_ALLOWABLEGAP: - value = model.getDblParam(CbcModel::CbcAllowableGap); - break; - case CBC_PARAM_DBL_GAPRATIO: - value = model.getDblParam(CbcModel::CbcAllowableFractionGap); - break; - case CBC_PARAM_DBL_CUTOFF: - value = model.getCutoff(); - break; - case CBC_PARAM_DBL_TIMELIMIT_BAB: - value = model.getDblParam(CbcModel::CbcMaximumSeconds) ; - break ; - case CLP_PARAM_DBL_DUALTOLERANCE: - case CLP_PARAM_DBL_PRIMALTOLERANCE: - value = doubleParameter(model.solver()); - break; - default: - value = doubleValue_; - break; - } - return value; -} -int -CbcOrClpParam::setIntParameter (CbcModel &model, int value) -{ - int returnCode; - setIntParameterWithMessage(model, value, returnCode); - if (doPrinting && strlen(printArray)) - std::cout << printArray << std::endl; - return returnCode; -} -// Sets int parameter and returns printable string and error code -const char * -CbcOrClpParam::setIntParameterWithMessage ( CbcModel & model, int value , int & returnCode) -{ - if (value < lowerIntValue_ || value > upperIntValue_) { - sprintf(printArray, "%d was provided for %s - valid range is %d to %d", - value, name_.c_str(), lowerIntValue_, upperIntValue_); - returnCode = 1; - } else { - printArray[0] = '\0'; - if (value==intValue_) - return printArray; - int oldValue = intValue_; - intValue_ = value; - switch (type_) { - case CLP_PARAM_INT_LOGLEVEL: - oldValue = model.messageHandler()->logLevel(); - model.messageHandler()->setLogLevel(CoinAbs(value)); - break; - case CLP_PARAM_INT_SOLVERLOGLEVEL: - oldValue = model.solver()->messageHandler()->logLevel(); - model.solver()->messageHandler()->setLogLevel(value); - break; - case CBC_PARAM_INT_MAXNODES: - oldValue = model.getIntParam(CbcModel::CbcMaxNumNode); - model.setIntParam(CbcModel::CbcMaxNumNode, value); - break; - case CBC_PARAM_INT_MAXSOLS: - oldValue = model.getIntParam(CbcModel::CbcMaxNumSol); - model.setIntParam(CbcModel::CbcMaxNumSol, value); - break; - case CBC_PARAM_INT_MAXSAVEDSOLS: - oldValue = model.maximumSavedSolutions(); - model.setMaximumSavedSolutions(value); - break; - case CBC_PARAM_INT_STRONGBRANCHING: - oldValue = model.numberStrong(); - model.setNumberStrong(value); - break; - case CBC_PARAM_INT_NUMBERBEFORE: - oldValue = model.numberBeforeTrust(); - model.setNumberBeforeTrust(value); - break; - case CBC_PARAM_INT_NUMBERANALYZE: - oldValue = model.numberAnalyzeIterations(); - model.setNumberAnalyzeIterations(value); - break; - case CBC_PARAM_INT_CUTPASSINTREE: - oldValue = model.getMaximumCutPasses(); - model.setMaximumCutPasses(value); - break; - case CBC_PARAM_INT_CUTPASS: - oldValue = model.getMaximumCutPassesAtRoot(); - model.setMaximumCutPassesAtRoot(value); - break; -#ifdef COIN_HAS_CBC -#ifdef CBC_THREAD - case CBC_PARAM_INT_THREADS: - oldValue = model.getNumberThreads(); - model.setNumberThreads(value); - break; -#endif - case CBC_PARAM_INT_RANDOMSEED: - oldValue = model.getRandomSeed(); - model.setRandomSeed(value); - break; -#endif - default: - break; - } - sprintf(printArray, "%s was changed from %d to %d", - name_.c_str(), oldValue, value); - returnCode = 0; - } - return printArray; -} -int -CbcOrClpParam::intParameter (CbcModel &model) const -{ - int value; - switch (type_) { - case CLP_PARAM_INT_LOGLEVEL: - value = model.messageHandler()->logLevel(); - break; - case CLP_PARAM_INT_SOLVERLOGLEVEL: - value = model.solver()->messageHandler()->logLevel(); - break; - case CBC_PARAM_INT_MAXNODES: - value = model.getIntParam(CbcModel::CbcMaxNumNode); - break; - case CBC_PARAM_INT_MAXSOLS: - value = model.getIntParam(CbcModel::CbcMaxNumSol); - break; - case CBC_PARAM_INT_MAXSAVEDSOLS: - value = model.maximumSavedSolutions(); - break; - case CBC_PARAM_INT_STRONGBRANCHING: - value = model.numberStrong(); - break; - case CBC_PARAM_INT_NUMBERBEFORE: - value = model.numberBeforeTrust(); - break; - case CBC_PARAM_INT_NUMBERANALYZE: - value = model.numberAnalyzeIterations(); - break; - case CBC_PARAM_INT_CUTPASSINTREE: - value = model.getMaximumCutPasses(); - break; - case CBC_PARAM_INT_CUTPASS: - value = model.getMaximumCutPassesAtRoot(); - break; -#ifdef COIN_HAS_CBC -#ifdef CBC_THREAD - case CBC_PARAM_INT_THREADS: - value = model.getNumberThreads(); -#endif - case CBC_PARAM_INT_RANDOMSEED: - value = model.getRandomSeed(); - break; -#endif - default: - value = intValue_; - break; - } - return value; -} -#endif -// Sets current parameter option using string -void -CbcOrClpParam::setCurrentOption ( const std::string value ) -{ - int action = parameterOption(value); - if (action >= 0) - currentKeyWord_ = action; -} -// Sets current parameter option -void -CbcOrClpParam::setCurrentOption ( int value , bool printIt) -{ - if (printIt && value != currentKeyWord_) - std::cout << "Option for " << name_ << " changed from " - << definedKeyWords_[currentKeyWord_] << " to " - << definedKeyWords_[value] << std::endl; - - currentKeyWord_ = value; -} -// Sets current parameter option and returns printable string -const char * -CbcOrClpParam::setCurrentOptionWithMessage ( int value ) -{ - if (value != currentKeyWord_) { - char current[100]; - char newString[100]; - if (currentKeyWord_>=0&&(fakeKeyWord_<=0||currentKeyWord_=0&&(fakeKeyWord_<=0||value= 0) { - if (action == currentKeyWord_) - return NULL; - if (currentKeyWord_>=0&&(fakeKeyWord_<=0||currentKeyWord_ upperIntValue_) { - std::cout << value << " was provided for " << name_ << - " - valid range is " << lowerIntValue_ << " to " << - upperIntValue_ << std::endl; - } else { - intValue_ = value; - } -} -const char * -CbcOrClpParam::setIntValueWithMessage ( int value ) -{ - printArray[0] = '\0'; - if (value < lowerIntValue_ || value > upperIntValue_) { - sprintf(printArray, "%d was provided for %s - valid range is %d to %d", - value,name_.c_str(),lowerIntValue_,upperIntValue_); - } else { - if (value==intValue_) - return NULL; - sprintf(printArray, "%s was changed from %d to %d", - name_.c_str(), intValue_, value); - intValue_ = value; - } - return printArray; -} -void -CbcOrClpParam::setDoubleValue ( double value ) -{ - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - std::cout << value << " was provided for " << name_ << - " - valid range is " << lowerDoubleValue_ << " to " << - upperDoubleValue_ << std::endl; - } else { - doubleValue_ = value; - } -} -const char * -CbcOrClpParam::setDoubleValueWithMessage ( double value ) -{ - printArray[0] = '\0'; - if (value < lowerDoubleValue_ || value > upperDoubleValue_) { - sprintf(printArray, "%g was provided for %s - valid range is %g to %g", - value,name_.c_str(),lowerDoubleValue_,upperDoubleValue_); - } else { - if (value==doubleValue_) - return NULL; - sprintf(printArray, "%s was changed from %g to %g", - name_.c_str(), doubleValue_, value); - doubleValue_ = value; - } - return printArray; -} -void -CbcOrClpParam::setStringValue ( std::string value ) -{ - stringValue_ = value; -} -static char line[1000]; -static char * where = NULL; -extern int CbcOrClpRead_mode; -int CbcOrClpEnvironmentIndex = -1; -static size_t fillEnv() -{ -#if defined(_MSC_VER) || defined(__MSVCRT__) - return 0; -#else - // Don't think it will work on Windows - char * environ = getenv("CBC_CLP_ENVIRONMENT"); - size_t length = 0; - if (environ) { - length = strlen(environ); - if (CbcOrClpEnvironmentIndex < static_cast(length)) { - // find next non blank - char * whereEnv = environ + CbcOrClpEnvironmentIndex; - // munch white space - while (*whereEnv == ' ' || *whereEnv == '\t' || *whereEnv < ' ') - whereEnv++; - // copy - char * put = line; - while ( *whereEnv != '\0' ) { - if ( *whereEnv == ' ' || *whereEnv == '\t' || *whereEnv < ' ' ) { - break; - } - *put = *whereEnv; - put++; - assert (put - line < 1000); - whereEnv++; - } - CbcOrClpEnvironmentIndex = static_cast(whereEnv - environ); - *put = '\0'; - length = strlen(line); - } else { - length = 0; - } - } - if (!length) - CbcOrClpEnvironmentIndex = -1; - return length; -#endif -} -extern FILE * CbcOrClpReadCommand; -// Simple read stuff -std::string -CoinReadNextField() -{ - std::string field; - if (!where) { - // need new line -#ifdef COIN_HAS_READLINE - if (CbcOrClpReadCommand == stdin) { - // Get a line from the user. - where = readline (coin_prompt); - - // If the line has any text in it, save it on the history. - if (where) { - if ( *where) - add_history (where); - strcpy(line, where); - free(where); - } - } else { - where = fgets(line, 1000, CbcOrClpReadCommand); - } -#else - if (CbcOrClpReadCommand == stdin) { - fputs(coin_prompt,stdout); - fflush(stdout); - } - where = fgets(line, 1000, CbcOrClpReadCommand); -#endif - if (!where) - return field; // EOF - where = line; - // clean image - char * lastNonBlank = line - 1; - while ( *where != '\0' ) { - if ( *where != '\t' && *where < ' ' ) { - break; - } else if ( *where != '\t' && *where != ' ') { - lastNonBlank = where; - } - where++; - } - where = line; - *(lastNonBlank + 1) = '\0'; - } - // munch white space - while (*where == ' ' || *where == '\t') - where++; - char * saveWhere = where; - while (*where != ' ' && *where != '\t' && *where != '\0') - where++; - if (where != saveWhere) { - char save = *where; - *where = '\0'; - //convert to string - field = saveWhere; - *where = save; - } else { - where = NULL; - field = "EOL"; - } - return field; -} - -std::string -CoinReadGetCommand(int argc, const char *argv[]) -{ - std::string field = "EOL"; - // say no = - afterEquals = ""; - while (field == "EOL") { - if (CbcOrClpRead_mode > 0) { - if ((CbcOrClpRead_mode < argc && argv[CbcOrClpRead_mode]) || - CbcOrClpEnvironmentIndex >= 0) { - if (CbcOrClpEnvironmentIndex < 0) { - field = argv[CbcOrClpRead_mode++]; - } else { - if (fillEnv()) { - field = line; - } else { - // not there - continue; - } - } - if (field == "-") { - std::cout << "Switching to line mode" << std::endl; - CbcOrClpRead_mode = -1; - field = CoinReadNextField(); - } else if (field[0] != '-') { - if (CbcOrClpRead_mode != 2) { - // now allow std::cout<<"skipping non-command "< 0) { - if (CbcOrClpRead_mode < argc || CbcOrClpEnvironmentIndex >= 0) { - if (CbcOrClpEnvironmentIndex < 0) { - if (argv[CbcOrClpRead_mode][0] != '-') { - field = argv[CbcOrClpRead_mode++]; - } else if (!strcmp(argv[CbcOrClpRead_mode], "--")) { - field = argv[CbcOrClpRead_mode++]; - // -- means import from stdin - field = "-"; - } - } else { - fillEnv(); - field = line; - } - } - } else { - field = CoinReadNextField(); - } - } else { - field = afterEquals; - afterEquals = ""; - } - //std::cout< 0) { - if (CbcOrClpRead_mode < argc || CbcOrClpEnvironmentIndex >= 0) { - if (CbcOrClpEnvironmentIndex < 0) { - // may be negative value so do not check for - - field = argv[CbcOrClpRead_mode++]; - } else { - fillEnv(); - field = line; - } - } - } else { - field = CoinReadNextField(); - } - } else { - field = afterEquals; - afterEquals = ""; - } - long int value = 0; - //std::cout<(value); -} -double -CoinReadGetDoubleField(int argc, const char *argv[], int * valid) -{ - std::string field = "EOL"; - if (afterEquals == "") { - if (CbcOrClpRead_mode > 0) { - if (CbcOrClpRead_mode < argc || CbcOrClpEnvironmentIndex >= 0) { - if (CbcOrClpEnvironmentIndex < 0) { - // may be negative value so do not check for - - field = argv[CbcOrClpRead_mode++]; - } else { - fillEnv(); - field = line; - } - } - } else { - field = CoinReadNextField(); - } - } else { - field = afterEquals; - afterEquals = ""; - } - double value = 0.0; - //std::cout<= this treated as artificials in feasibility pump", - 0.0, COIN_DBL_MAX, CBC_PARAM_DBL_ARTIFICIALCOST, 1); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters-1].setLonghelp - ( - "0.0 off - otherwise variables with costs >= this are treated as artificials and fixed to lower bound in feasibility pump" - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("auto!Scale", "Whether to scale objective, rhs and bounds of problem if they look odd", - "off", CLP_PARAM_STR_AUTOSCALE, 7, 0); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "If you think you may get odd objective values or large equality rows etc then\ - it may be worth setting this true. It is still experimental and you may prefer\ - to use objective!Scale and rhs!Scale." - ); - parameters[numberParameters++] = - CbcOrClpParam("barr!ier", "Solve using primal dual predictor corrector algorithm", - CLP_PARAM_ACTION_BARRIER); - parameters[numberParameters-1].setLonghelp - ( - "This command solves the current model using the primal dual predictor \ -corrector algorithm. You may want to link in an alternative \ -ordering and factorization. It will also solve models \ -with quadratic objectives." - - ); - parameters[numberParameters++] = - CbcOrClpParam("basisI!n", "Import basis from bas file", - CLP_PARAM_ACTION_BASISIN, 3); - parameters[numberParameters-1].setLonghelp - ( - "This will read an MPS format basis file from the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set. If you have libz then it can read compressed\ - files 'xxxxxxxx.gz' or xxxxxxxx.bz2." - ); - parameters[numberParameters++] = - CbcOrClpParam("basisO!ut", "Export basis as bas file", - CLP_PARAM_ACTION_BASISOUT); - parameters[numberParameters-1].setLonghelp - ( - "This will write an MPS format basis file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'default.bas'." - ); - parameters[numberParameters++] = - CbcOrClpParam("biasLU", "Whether factorization biased towards U", - "UU", CLP_PARAM_STR_BIASLU, 2, 0); - parameters[numberParameters-1].append("UX"); - parameters[numberParameters-1].append("LX"); - parameters[numberParameters-1].append("LL"); - parameters[numberParameters-1].setCurrentOption("LX"); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("branch!AndCut", "Do Branch and Cut", - CBC_PARAM_ACTION_BAB); - parameters[numberParameters-1].setLonghelp - ( - "This does branch and cut. There are many parameters which can affect the performance. \ -First just try with default settings and look carefully at the log file. Did cuts help? Did they take too long? \ -Look at output to see which cuts were effective and then do some tuning. You will see that the \ -options for cuts are off, on, root and ifmove, forceon. Off is \ -obvious, on means that this cut generator will be tried in the branch and cut tree (you can fine tune using \ -'depth'). Root means just at the root node while 'ifmove' means that cuts will be used in the tree if they \ -look as if they are doing some good and moving the objective value. Forceon is same as on but forces code to use \ -cut generator at every node. For probing forceonbut just does fixing probing in tree - not strengthening etc. \ -If pre-processing reduced the size of the \ -problem or strengthened many coefficients then it is probably wise to leave it on. Switch off heuristics \ -which did not provide solutions. The other major area to look at is the search. Hopefully good solutions \ -were obtained fairly early in the search so the important point is to select the best variable to branch on. \ -See whether strong branching did a good job - or did it just take a lot of iterations. Adjust the strongBranching \ -and trustPseudoCosts parameters. If cuts did a good job, then you may wish to \ -have more rounds of cuts - see passC!uts and passT!ree." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("bscale", "Whether to scale in barrier (and ordering speed)", - "off", CLP_PARAM_STR_BARRIERSCALE, 7, 0); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("off1"); - parameters[numberParameters-1].append("on1"); - parameters[numberParameters-1].append("off2"); - parameters[numberParameters-1].append("on2"); - parameters[numberParameters++] = - CbcOrClpParam("chol!esky", "Which cholesky algorithm", - "native", CLP_PARAM_STR_CHOLESKY, 7); - parameters[numberParameters-1].append("dense"); - //#ifdef FOREIGN_BARRIER -#ifdef COIN_HAS_WSMP - parameters[numberParameters-1].append("fudge!Long"); - parameters[numberParameters-1].append("wssmp"); -#else - parameters[numberParameters-1].append("fudge!Long_dummy"); - parameters[numberParameters-1].append("wssmp_dummy"); -#endif -#if defined(COIN_HAS_AMD) || defined(COIN_HAS_CHOLMOD) || defined(COIN_HAS_GLPK) - parameters[numberParameters-1].append("Uni!versityOfFlorida"); -#else - parameters[numberParameters-1].append("Uni!versityOfFlorida_dummy"); -#endif -#ifdef TAUCS_BARRIER - parameters[numberParameters-1].append("Taucs"); -#else - parameters[numberParameters-1].append("Taucs_dummy"); -#endif -#ifdef COIN_HAS_MUMPS - parameters[numberParameters-1].append("Mumps"); -#else - parameters[numberParameters-1].append("Mumps_dummy"); -#endif - parameters[numberParameters-1].setLonghelp - ( - "For a barrier code to be effective it needs a good Cholesky ordering and factorization. \ -The native ordering and factorization is not state of the art, although acceptable. \ -You may want to link in one from another source. See Makefile.locations for some \ -possibilities." - ); - //#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("clique!Cuts", "Whether to use Clique cuts", - "off", CBC_PARAM_STR_CLIQUECUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on clique cuts (either at root or in entire tree) \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("combine!Solutions", "Whether to use combine solution heuristic", - "off", CBC_PARAM_STR_COMBINE); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("onquick"); - parameters[numberParameters-1].append("bothquick"); - parameters[numberParameters-1].append("beforequick"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a heuristic which does branch and cut on the problem given by just \ -using variables which have appeared in one or more solutions. \ -It obviously only tries after two or more solutions. \ -See Rounding for meaning of on,both,before" - ); - parameters[numberParameters++] = - CbcOrClpParam("combine2!Solutions", "Whether to use crossover solution heuristic", - "off", CBC_PARAM_STR_CROSSOVER2); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a heuristic which does branch and cut on the problem given by \ -fixing variables which have same value in two or more solutions. \ -It obviously only tries after two or more solutions. \ -See Rounding for meaning of on,both,before" - ); - parameters[numberParameters++] = - CbcOrClpParam("constraint!fromCutoff", "Whether to use cutoff as constraint", - "off", CBC_PARAM_STR_CUTOFF_CONSTRAINT); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("variable"); - parameters[numberParameters-1].append("forcevariable"); - parameters[numberParameters-1].append("conflict"); - parameters[numberParameters-1].setLonghelp - ( - "This adds the objective as a constraint with best solution as RHS" - ); - parameters[numberParameters++] = - CbcOrClpParam("cost!Strategy", "How to use costs as priorities", - "off", CBC_PARAM_STR_COSTSTRATEGY); - parameters[numberParameters-1].append("pri!orities"); - parameters[numberParameters-1].append("column!Order?"); - parameters[numberParameters-1].append("01f!irst?"); - parameters[numberParameters-1].append("01l!ast?"); - parameters[numberParameters-1].append("length!?"); - parameters[numberParameters-1].append("singletons"); - parameters[numberParameters-1].append("nonzero"); - parameters[numberParameters-1].append("general!Force?"); - parameters[numberParameters-1].setLonghelp - ( - "This orders the variables in order of their absolute costs - with largest cost ones being branched on \ -first. This primitive strategy can be surprsingly effective. The column order\ - option is obviously not on costs but easy to code here." - ); - parameters[numberParameters++] = - CbcOrClpParam("cplex!Use", "Whether to use Cplex!", - "off", CBC_PARAM_STR_CPX); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - " If the user has Cplex, but wants to use some of Cbc's heuristics \ -then you can! If this is on, then Cbc will get to the root node and then \ -hand over to Cplex. If heuristics find a solution this can be significantly \ -quicker. You will probably want to switch off Cbc's cuts as Cplex thinks \ -they are genuine constraints. It is also probable that you want to switch \ -off preprocessing, although for difficult problems it is worth trying \ -both." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("cpp!Generate", "Generates C++ code", - -1, 50000, CLP_PARAM_INT_CPP, 1); - parameters[numberParameters-1].setLonghelp - ( - "Once you like what the stand-alone solver does then this allows \ -you to generate user_driver.cpp which approximates the code. \ -0 gives simplest driver, 1 generates saves and restores, 2 \ -generates saves and restores even for variables at default value. \ -4 bit in cbc generates size dependent code rather than computed values. \ -This is now deprecated as you can call stand-alone solver - see \ -Cbc/examples/driver4.cpp." - ); -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("crash", "Whether to create basis for problem", - "off", CLP_PARAM_STR_CRASH); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("so!low_halim"); - parameters[numberParameters-1].append("lots"); -#ifdef CLP_INHERIT_MODE - parameters[numberParameters-1].append("dual"); - parameters[numberParameters-1].append("dw"); - parameters[numberParameters-1].append("idiot"); -#else - parameters[numberParameters-1].append("idiot1"); - parameters[numberParameters-1].append("idiot2"); - parameters[numberParameters-1].append("idiot3"); - parameters[numberParameters-1].append("idiot4"); - parameters[numberParameters-1].append("idiot5"); - parameters[numberParameters-1].append("idiot6"); - parameters[numberParameters-1].append("idiot7"); -#endif - parameters[numberParameters-1].setLonghelp - ( - "If crash is set on and there is an all slack basis then Clp will flip or put structural\ - variables into basis with the aim of getting dual feasible. On the whole dual seems to be\ - better without it and there are alternative types of 'crash' for primal e.g. 'idiot' or 'sprint'. \ -I have also added a variant due to Solow and Halim which is as on but just flip."); - parameters[numberParameters++] = - CbcOrClpParam("cross!over", "Whether to get a basic solution after barrier", - "on", CLP_PARAM_STR_CROSSOVER); - parameters[numberParameters-1].append("off"); - parameters[numberParameters-1].append("maybe"); - parameters[numberParameters-1].append("presolve"); - parameters[numberParameters-1].setLonghelp - ( - "Interior point algorithms do not obtain a basic solution (and \ -the feasibility criterion is a bit suspect (JJF)). This option will crossover \ -to a basic solution suitable for ranging or branch and cut. With the current state \ -of quadratic it may be a good idea to switch off crossover for quadratic (and maybe \ -presolve as well) - the option maybe does this." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("csv!Statistics", "Create one line of statistics", - CLP_PARAM_ACTION_CSVSTATISTICS, 2, 1); - parameters[numberParameters-1].setLonghelp - ( - "This appends statistics to given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set. Adds header if file empty or does not exist." - ); - parameters[numberParameters++] = - CbcOrClpParam("cutD!epth", "Depth in tree at which to do cuts", - -1, 999999, CBC_PARAM_INT_CUTDEPTH); - parameters[numberParameters-1].setLonghelp - ( - "Cut generators may be - off, on only at root, on if they look possible \ -and on. If they are done every node then that is that, but it may be worth doing them \ -every so often. The original method was every so many nodes but it is more logical \ -to do it whenever depth in tree is a multiple of K. This option does that and defaults \ -to -1 (off -> code decides)." - ); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("cutL!ength", "Length of a cut", - -1, COIN_INT_MAX, CBC_PARAM_INT_CUTLENGTH); - parameters[numberParameters-1].setLonghelp - ( - "At present this only applies to Gomory cuts. -1 (default) leaves as is. \ -Any value >0 says that all cuts <= this length can be generated both at \ -root node and in tree. 0 says to use some dynamic lengths. If value >=10,000,000 \ -then the length in tree is value%10000000 - so 10000100 means unlimited length \ -at root and 100 in tree." - ); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("cuto!ff", "All solutions must be better than this", - -1.0e60, 1.0e60, CBC_PARAM_DBL_CUTOFF); - parameters[numberParameters-1].setDoubleValue(1.0e50); - parameters[numberParameters-1].setLonghelp - ( - "All solutions must be better than this value (in a minimization sense). \ -This is also set by code whenever it obtains a solution and is set to value of \ -objective for solution minus cutoff increment." - ); - parameters[numberParameters++] = - CbcOrClpParam("cuts!OnOff", "Switches all cuts on or off", - "off", CBC_PARAM_STR_CUTSSTRATEGY); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].setLonghelp - ( - "This can be used to switch on or off all cuts (apart from Reduce and Split). Then you can do \ -individual ones off or on \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("debug!In", "read valid solution from file", - CLP_PARAM_ACTION_DEBUG, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This will read a solution file from the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set.\n\n\ -If set to create it will create a file called debug.file after search.\n\n\ -The idea is that if you suspect a bad cut generator \ -you can do a good run with debug set to 'create' and then switch on the cuts you suspect and \ -re-run with debug set to 'debug.file' The create case has same effect as saveSolution." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("decomp!ose", "Whether to try decomposition", - -COIN_INT_MAX, COIN_INT_MAX, CLP_PARAM_INT_DECOMPOSE_BLOCKS, 1); - parameters[numberParameters-1].setLonghelp - ( - "0 - off, 1 choose blocks >1 use as blocks \ -Dantzig Wolfe if primal, Benders if dual \ -- uses sprint pass for number of passes" - ); - parameters[numberParameters-1].setIntValue(0); -#if CLP_MULTIPLE_FACTORIZATIONS >0 - parameters[numberParameters++] = - CbcOrClpParam("dense!Threshold", "Whether to use dense factorization", - -1, 10000, CBC_PARAM_INT_DENSE, 1); - parameters[numberParameters-1].setLonghelp - ( - "If processed problem <= this use dense factorization" - ); - parameters[numberParameters-1].setIntValue(-1); -#endif -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("depth!MiniBab", "Depth at which to try mini BAB", - -COIN_INT_MAX, COIN_INT_MAX, CBC_PARAM_INT_DEPTHMINIBAB); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters-1].setLonghelp - ( - "Rather a complicated parameter but can be useful. -1 means off for large problems but on as if -12 for problems where rows+columns<500, -2 \ -means use Cplex if it is linked in. Otherwise if negative then go into depth first complete search fast branch and bound when depth>= -value-2 (so -3 will use this at depth>=1). This mode is only switched on after 500 nodes. If you really want to switch it off for small problems then set this to -999. If >=0 the value doesn't matter very much. The code will do approximately 100 nodes of fast branch and bound every now and then at depth>=5. The actual logic is too twisted to describe here." - ); - parameters[numberParameters++] = - CbcOrClpParam("dextra3", "Extra double parameter 3", - -COIN_DBL_MAX, COIN_DBL_MAX, CBC_PARAM_DBL_DEXTRA3, 0); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters++] = - CbcOrClpParam("dextra4", "Extra double parameter 4", - -COIN_DBL_MAX, COIN_DBL_MAX, CBC_PARAM_DBL_DEXTRA4, 0); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters++] = - CbcOrClpParam("dextra5", "Extra double parameter 5", - -COIN_DBL_MAX, COIN_DBL_MAX, CBC_PARAM_DBL_DEXTRA5, 0); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters++] = - CbcOrClpParam("Dins", "Whether to try Distance Induced Neighborhood Search", - "off", CBC_PARAM_STR_DINS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("often"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on Distance induced neighborhood Search. \ -See Rounding for meaning of on,both,before" - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("direction", "Minimize or Maximize", - "min!imize", CLP_PARAM_STR_DIRECTION); - parameters[numberParameters-1].append("max!imize"); - parameters[numberParameters-1].append("zero"); - parameters[numberParameters-1].setLonghelp - ( - "The default is minimize - use 'direction maximize' for maximization.\n\ -You can also use the parameters 'maximize' or 'minimize'." - ); - parameters[numberParameters++] = - CbcOrClpParam("directory", "Set Default directory for import etc.", - CLP_PARAM_ACTION_DIRECTORY); - parameters[numberParameters-1].setLonghelp - ( - "This sets the directory which import, export, saveModel, restoreModel etc will use.\ - It is initialized to './'" - ); - parameters[numberParameters++] = - CbcOrClpParam("dirSample", "Set directory where the COIN-OR sample problems are.", - CLP_PARAM_ACTION_DIRSAMPLE, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This sets the directory where the COIN-OR sample problems reside. It is\ - used only when -unitTest is passed to clp. clp will pick up the test problems\ - from this directory.\ - It is initialized to '../../Data/Sample'" - ); - parameters[numberParameters++] = - CbcOrClpParam("dirNetlib", "Set directory where the netlib problems are.", - CLP_PARAM_ACTION_DIRNETLIB, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This sets the directory where the netlib problems reside. One can get\ - the netlib problems from COIN-OR or from the main netlib site. This\ - parameter is used only when -netlib is passed to clp. clp will pick up the\ - netlib problems from this directory. If clp is built without zlib support\ - then the problems must be uncompressed.\ - It is initialized to '../../Data/Netlib'" - ); - parameters[numberParameters++] = - CbcOrClpParam("dirMiplib", "Set directory where the miplib 2003 problems are.", - CBC_PARAM_ACTION_DIRMIPLIB, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This sets the directory where the miplib 2003 problems reside. One can\ - get the miplib problems from COIN-OR or from the main miplib site. This\ - parameter is used only when -miplib is passed to cbc. cbc will pick up the\ - miplib problems from this directory. If cbc is built without zlib support\ - then the problems must be uncompressed.\ - It is initialized to '../../Data/miplib3'" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("diveO!pt", "Diving options", - -1, 200000, CBC_PARAM_INT_DIVEOPT, 1); - parameters[numberParameters-1].setLonghelp - ( - "If >2 && <20 then modify diving options - \ - \n\t3 only at root and if no solution, \ - \n\t4 only at root and if this heuristic has not got solution, \ - \n\t5 decay only if no solution, \ - \n\t6 if depth <3 or decay, \ - \n\t7 run up to 2 times if solution found 4 otherwise, \ - \n\t>10 All only at root (DivingC normal as value-10), \ - \n\t>20 All with value-20)." - ); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("diveS!olves", "Diving solve option", - -1, 200000, CBC_PARAM_INT_DIVEOPTSOLVES, 1); - parameters[numberParameters-1].setLonghelp - ( - "If >0 then do up to this many solves. Last digit is ignored \ -and used for extra options - \ - \n\t1-3 allow fixing of satisfied integers (but not at bound) \ - \n\t1 switch off above for that dive if goes infeasible \ - \n\t2 switch off above permanently if goes infeasible" - ); - parameters[numberParameters-1].setIntValue(100); - parameters[numberParameters++] = - CbcOrClpParam("DivingS!ome", "Whether to try Diving heuristics", - "off", CBC_PARAM_STR_DIVINGS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a random diving heuristic at various times. \ -C - Coefficient, F - Fractional, G - Guided, L - LineSearch, P - PseudoCost, V - VectorLength. \ -You may prefer to use individual on/off \ -See Rounding for meaning of on,both,before" - ); - parameters[numberParameters++] = - CbcOrClpParam("DivingC!oefficient", "Whether to try DiveCoefficient", - "off", CBC_PARAM_STR_DIVINGC); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("DivingF!ractional", "Whether to try DiveFractional", - "off", CBC_PARAM_STR_DIVINGF); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("DivingG!uided", "Whether to try DiveGuided", - "off", CBC_PARAM_STR_DIVINGG); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("DivingL!ineSearch", "Whether to try DiveLineSearch", - "off", CBC_PARAM_STR_DIVINGL); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("DivingP!seudoCost", "Whether to try DivePseudoCost", - "off", CBC_PARAM_STR_DIVINGP); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("DivingV!ectorLength", "Whether to try DiveVectorLength", - "off", CBC_PARAM_STR_DIVINGV); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters++] = - CbcOrClpParam("doH!euristic", "Do heuristics before any preprocessing", - CBC_PARAM_ACTION_DOHEURISTIC, 3); - parameters[numberParameters-1].setLonghelp - ( - "Normally heuristics are done in branch and bound. It may be useful to do them outside. \ -Only those heuristics with 'both' or 'before' set will run. \ -Doing this may also set cutoff, which can help with preprocessing." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("dualB!ound", "Initially algorithm acts as if no \ -gap between bounds exceeds this value", - 1.0e-20, 1.0e12, CLP_PARAM_DBL_DUALBOUND); - parameters[numberParameters-1].setLonghelp - ( - "The dual algorithm in Clp is a single phase algorithm as opposed to a two phase\ - algorithm where you first get feasible then optimal. If a problem has both upper and\ - lower bounds then it is trivial to get dual feasible by setting non basic variables\ - to correct bound. If the gap between the upper and lower bounds of a variable is more\ - than the value of dualBound Clp introduces fake bounds so that it can make the problem\ - dual feasible. This has the same effect as a composite objective function in the\ - primal algorithm. Too high a value may mean more iterations, while too low a bound means\ - the code may go all the way and then have to increase the bounds. OSL had a heuristic to\ - adjust bounds, maybe we need that here." - ); - parameters[numberParameters++] = - CbcOrClpParam("dualize", "Solves dual reformulation", - 0, 4, CLP_PARAM_INT_DUALIZE, 1); - parameters[numberParameters-1].setLonghelp - ( - "Don't even think about it." - ); - parameters[numberParameters++] = - CbcOrClpParam("dualP!ivot", "Dual pivot choice algorithm", - "auto!matic", CLP_PARAM_STR_DUALPIVOT, 7, 1); - parameters[numberParameters-1].append("dant!zig"); - parameters[numberParameters-1].append("partial"); - parameters[numberParameters-1].append("steep!est"); - parameters[numberParameters-1].setLonghelp - ( - "Clp can use any pivot selection algorithm which the user codes as long as it\ - implements the features in the abstract pivot base class. The Dantzig method is implemented\ - to show a simple method but its use is deprecated. Steepest is the method of choice and there\ - are two variants which keep all weights updated but only scan a subset each iteration.\ - Partial switches this on while automatic decides at each iteration based on information\ - about the factorization." - ); - parameters[numberParameters++] = - CbcOrClpParam("dualS!implex", "Do dual simplex algorithm", - CLP_PARAM_ACTION_DUALSIMPLEX); - parameters[numberParameters-1].setLonghelp - ( - "This command solves the continuous relaxation of the current model using the dual steepest edge algorithm.\ -The time and iterations may be affected by settings such as presolve, scaling, crash\ - and also by dual pivot method, fake bound on variables and dual and primal tolerances." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("dualT!olerance", "For an optimal solution \ -no dual infeasibility may exceed this value", - 1.0e-20, 1.0e12, CLP_PARAM_DBL_DUALTOLERANCE); - parameters[numberParameters-1].setLonghelp - ( - "Normally the default tolerance is fine, but you may want to increase it a\ - bit if a dual run seems to be having a hard time. One method which can be faster is \ -to use a large tolerance e.g. 1.0e-4 and dual and then clean up problem using primal and the \ -correct tolerance (remembering to switch off presolve for this final short clean up phase)." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("dw!Heuristic", "Whether to try DW heuristic", - "off", CBC_PARAM_STR_DW); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "See Rounding for meaning of on,both,before" - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("either!Simplex", "Do dual or primal simplex algorithm", - CLP_PARAM_ACTION_EITHERSIMPLEX); - parameters[numberParameters-1].setLonghelp - ( - "This command solves the continuous relaxation of the current model using the dual or primal algorithm,\ - based on a dubious analysis of model." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("end", "Stops clp execution", - CLP_PARAM_ACTION_EXIT); - parameters[numberParameters-1].setLonghelp - ( - "This stops execution ; end, exit, quit and stop are synonyms" - ); - parameters[numberParameters++] = - CbcOrClpParam("environ!ment", "Read commands from environment", - CLP_PARAM_ACTION_ENVIRONMENT, 7, 0); - parameters[numberParameters-1].setLonghelp - ( - "This starts reading from environment variable CBC_CLP_ENVIRONMENT." - ); - parameters[numberParameters++] = - CbcOrClpParam("error!sAllowed", "Whether to allow import errors", - "off", CLP_PARAM_STR_ERRORSALLOWED, 3); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "The default is not to use any model which had errors when reading the mps file.\ - Setting this to 'on' will allow all errors from which the code can recover\ - simply by ignoring the error. There are some errors from which the code can not recover \ -e.g. no ENDATA. This has to be set before import i.e. -errorsAllowed on -import xxxxxx.mps." - ); - parameters[numberParameters++] = - CbcOrClpParam("exit", "Stops clp execution", - CLP_PARAM_ACTION_EXIT); - parameters[numberParameters-1].setLonghelp - ( - "This stops the execution of Clp, end, exit, quit and stop are synonyms" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("exper!iment", "Whether to use testing features", - -1, 200, CBC_PARAM_INT_EXPERIMENT, 0); - parameters[numberParameters-1].setLonghelp - ( - "Defines how adventurous you want to be in using new ideas. \ -0 then no new ideas, 1 fairly sensible, 2 a bit dubious, 3 you are on your own!" - ); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters++] = - CbcOrClpParam("expensive!Strong", "Whether to do even more strong branching", - 0, COIN_INT_MAX, CBC_PARAM_INT_STRONG_STRATEGY, 0); - parameters[numberParameters-1].setLonghelp - ( - "Strategy for extra strong branching \n\ -\n\t0 - normal\n\ -\n\twhen to do all fractional\n\ -\n\t1 - root node\n\ -\n\t2 - depth less than modifier\n\ -\n\t4 - if objective == best possible\n\ -\n\t6 - as 2+4\n\ -\n\twhen to do all including satisfied\n\ -\n\t10 - root node etc.\n\ -\n\tIf >=100 then do when depth <= strategy/100 (otherwise 5)" - ); - parameters[numberParameters-1].setIntValue(0); -#endif - parameters[numberParameters++] = - CbcOrClpParam("export", "Export model as mps file", - CLP_PARAM_ACTION_EXPORT); - parameters[numberParameters-1].setLonghelp - ( - "This will write an MPS format file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'default.mps'. \ -It can be useful to get rid of the original names and go over to using Rnnnnnnn and Cnnnnnnn. This can be done by setting 'keepnames' off before importing mps file." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("extra1", "Extra integer parameter 1", - -COIN_INT_MAX, COIN_INT_MAX, CBC_PARAM_INT_EXTRA1, 0); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("extra2", "Extra integer parameter 2", - -100, COIN_INT_MAX, CBC_PARAM_INT_EXTRA2, 0); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("extra3", "Extra integer parameter 3", - -1, COIN_INT_MAX, CBC_PARAM_INT_EXTRA3, 0); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("extra4", "Extra integer parameter 4", - -1, COIN_INT_MAX, CBC_PARAM_INT_EXTRA4, 0); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters-1].setLonghelp - ( - "This switches on yet more special options!! \ -The bottom digit is a strategy when to used shadow price stuff e.g. 3 \ -means use until a solution is found. The next two digits say what sort \ -of dual information to use. After that it goes back to powers of 2 so -\n\ -\n\t1000 - switches on experimental hotstart\n\ -\n\t2,4,6000 - switches on experimental methods of stopping cuts\n\ -\n\t8000 - increase minimum drop gradually\n\ -\n\t16000 - switches on alternate gomory criterion" - ); - parameters[numberParameters++] = - CbcOrClpParam("extraV!ariables", "Allow creation of extra integer variables", - -COIN_INT_MAX, COIN_INT_MAX, CBC_PARAM_INT_EXTRA_VARIABLES, 0); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters-1].setLonghelp - ( - "This switches on creation of extra integer variables \ -to gather all variables with same cost." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("fact!orization", "Which factorization to use", - "normal", CLP_PARAM_STR_FACTORIZATION); - parameters[numberParameters-1].append("dense"); - parameters[numberParameters-1].append("simple"); - parameters[numberParameters-1].append("osl"); - parameters[numberParameters-1].setLonghelp - ( -#ifndef ABC_INHERIT - "The default is to use the normal CoinFactorization, but \ -other choices are a dense one, osl's or one designed for small problems." -#else - "Normally the default is to use the normal CoinFactorization, but \ -other choices are a dense one, osl's or one designed for small problems. \ -However if at Aboca then the default is CoinAbcFactorization and other choices are \ -a dense one, one designed for small problems or if enabled a long factorization." -#endif - ); - parameters[numberParameters++] = - CbcOrClpParam("fakeB!ound", "All bounds <= this value - DEBUG", - 1.0, 1.0e15, CLP_PARAM_ACTION_FAKEBOUND, 0); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("feas!ibilityPump", "Whether to try Feasibility Pump", - "off", CBC_PARAM_STR_FPUMP); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on feasibility pump heuristic at root. This is due to Fischetti, Lodi and Glover \ -and uses a sequence of Lps to try and get an integer feasible solution. \ -Some fine tuning is available by passFeasibilityPump and also pumpTune. \ -See Rounding for meaning of on,both,before" - ); - parameters[numberParameters++] = - CbcOrClpParam("fix!OnDj", "Try heuristic based on fixing variables with \ -reduced costs greater than this", - -1.0e20, 1.0e20, CBC_PARAM_DBL_DJFIX, 1); - parameters[numberParameters-1].setLonghelp - ( - "If this is set integer variables with reduced costs greater than this will be fixed \ -before branch and bound - use with extreme caution!" - ); - parameters[numberParameters++] = - CbcOrClpParam("flow!CoverCuts", "Whether to use Flow Cover cuts", - "off", CBC_PARAM_STR_FLOWCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].setFakeKeyWord(3); - parameters[numberParameters-1].setLonghelp - ( - "This switches on flow cover cuts (either at root or in entire tree) \ -See branchAndCut for information on options. \ -Can also enter testing values by plusnn (==ifmove)" - ); - parameters[numberParameters++] = - CbcOrClpParam("force!Solution", "Whether to use given solution as crash for BAB", - -1, 20000000, CLP_PARAM_INT_USESOLUTION); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters-1].setLonghelp - ( - "-1 off. If 1 then tries to branch to solution given by AMPL or priorities file. \ -If 0 then just tries to set as best solution \ -If >1 then also does that many nodes on fixed problem." - ); - parameters[numberParameters++] = - CbcOrClpParam("fraction!forBAB", "Fraction in feasibility pump", - 1.0e-5, 1.1, CBC_PARAM_DBL_SMALLBAB, 1); - parameters[numberParameters-1].setDoubleValue(0.5); - parameters[numberParameters-1].setLonghelp - ( - "After a pass in feasibility pump, variables which have not moved \ -about are fixed and if the preprocessed model is small enough a few nodes \ -of branch and bound are done on reduced problem. Small problem has to be less than this fraction of original." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("gamma!(Delta)", "Whether to regularize barrier", - "off", CLP_PARAM_STR_GAMMA, 7, 1); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("gamma"); - parameters[numberParameters-1].append("delta"); - parameters[numberParameters-1].append("onstrong"); - parameters[numberParameters-1].append("gammastrong"); - parameters[numberParameters-1].append("deltastrong"); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("GMI!Cuts", "Whether to use alternative Gomory cuts", - "off", CBC_PARAM_STR_GMICUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("endonly"); - parameters[numberParameters-1].append("long"); - parameters[numberParameters-1].append("longroot"); - parameters[numberParameters-1].append("longifmove"); - parameters[numberParameters-1].append("forceLongOn"); - parameters[numberParameters-1].append("longendonly"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on an alternative Gomory cut generator (either at root or in entire tree) \ -This version is by Giacomo Nannicini and may be more robust \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("gomory!Cuts", "Whether to use Gomory cuts", - "off", CBC_PARAM_STR_GOMORYCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].append("forceandglobal"); - parameters[numberParameters-1].append("forceLongOn"); - parameters[numberParameters-1].append("long"); - parameters[numberParameters-1].setLonghelp - ( - "The original cuts - beware of imitations! Having gone out of favor, they are now more \ -fashionable as LP solvers are more robust and they interact well with other cuts. They will almost always \ -give cuts (although in this executable they are limited as to number of variables in cut). \ -However the cuts may be dense so it is worth experimenting (Long allows any length). \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("greedy!Heuristic", "Whether to use a greedy heuristic", - "off", CBC_PARAM_STR_GREEDY); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - //parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].setLonghelp - ( - "Switches on a greedy heuristic which will try and obtain a solution. It may just fix a \ -percentage of variables and then try a small branch and cut run. \ -See Rounding for meaning of on,both,before" - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("gsolu!tion", "Puts glpk solution to file", - CLP_PARAM_ACTION_GMPL_SOLUTION); - parameters[numberParameters-1].setLonghelp - ( - "Will write a glpk solution file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'stdout' (this defaults to ordinary solution if stdout). \ -If problem created from gmpl model - will do any reports." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("heur!isticsOnOff", "Switches most heuristics on or off", - "off", CBC_PARAM_STR_HEURISTICSTRATEGY); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "This can be used to switch on or off all heuristics. Then you can do \ -individual ones off or on. CbcTreeLocal is not included as it dramatically \ -alters search." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("help", "Print out version, non-standard options and some help", - CLP_PARAM_ACTION_HELP, 3); - parameters[numberParameters-1].setLonghelp - ( - "This prints out some help to get user started. If you have printed this then \ -you should be past that stage:-)" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("hOp!tions", "Heuristic options", - -9999999, 9999999, CBC_PARAM_INT_HOPTIONS, 1); - parameters[numberParameters-1].setLonghelp - ( - "1 says stop heuristic immediately allowable gap reached. \ -Others are for feasibility pump - \ -2 says do exact number of passes given, \ -4 only applies if initial cutoff given and says relax after 50 passes, \ -while 8 will adapt cutoff rhs after first solution if it looks as if code is stalling." - ); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters++] = - CbcOrClpParam("hot!StartMaxIts", "Maximum iterations on hot start", - 0, COIN_INT_MAX, CBC_PARAM_INT_MAXHOTITS); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("idiot!Crash", "Whether to try idiot crash", - -1, 99999999, CLP_PARAM_INT_IDIOT); - parameters[numberParameters-1].setLonghelp - ( - "This is a type of 'crash' which works well on some homogeneous problems.\ - It works best on problems with unit elements and rhs but will do something to any model. It should only be\ - used before primal. It can be set to -1 when the code decides for itself whether to use it,\ - 0 to switch off or n > 0 to do n passes." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("import", "Import model from mps file", - CLP_PARAM_ACTION_IMPORT, 3); - parameters[numberParameters-1].setLonghelp - ( - "This will read an MPS format file from the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set. If you have libgz then it can read compressed\ - files 'xxxxxxxx.gz' or 'xxxxxxxx.bz2'. \ -If 'keepnames' is off, then names are dropped -> Rnnnnnnn and Cnnnnnnn." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("inc!rement", "A valid solution must be at least this \ -much better than last integer solution", - -1.0e20, 1.0e20, CBC_PARAM_DBL_INCREMENT); - parameters[numberParameters-1].setLonghelp - ( - "Whenever a solution is found the bound on solutions is set to solution (in a minimization\ -sense) plus this. If it is not set then the code will try and work one out e.g. if \ -all objective coefficients are multiples of 0.01 and only integer variables have entries in \ -objective then this can be set to 0.01. Be careful if you set this negative!" - ); - parameters[numberParameters++] = - CbcOrClpParam("inf!easibilityWeight", "Each integer infeasibility is expected \ -to cost this much", - 0.0, 1.0e20, CBC_PARAM_DBL_INFEASIBILITYWEIGHT, 1); - parameters[numberParameters-1].setLonghelp - ( - "A primitive way of deciding which node to explore next. Satisfying each integer infeasibility is \ -expected to cost this much." - ); - parameters[numberParameters++] = - CbcOrClpParam("initialS!olve", "Solve to continuous", - CLP_PARAM_ACTION_SOLVECONTINUOUS); - parameters[numberParameters-1].setLonghelp - ( - "This just solves the problem to continuous - without adding any cuts" - ); - parameters[numberParameters++] = - CbcOrClpParam("integerT!olerance", "For an optimal solution \ -no integer variable may be this away from an integer value", - 1.0e-20, 0.5, CBC_PARAM_DBL_INTEGERTOLERANCE); - parameters[numberParameters-1].setLonghelp - ( - "Beware of setting this smaller than the primal tolerance." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("keepN!ames", "Whether to keep names from import", - "on", CLP_PARAM_STR_KEEPNAMES); - parameters[numberParameters-1].append("off"); - parameters[numberParameters-1].setLonghelp - ( - "It saves space to get rid of names so if you need to you can set this to off. \ -This needs to be set before the import of model - so -keepnames off -import xxxxx.mps." - ); - parameters[numberParameters++] = - CbcOrClpParam("KKT", "Whether to use KKT factorization", - "off", CLP_PARAM_STR_KKT, 7, 1); - parameters[numberParameters-1].append("on"); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("knapsack!Cuts", "Whether to use Knapsack cuts", - "off", CBC_PARAM_STR_KNAPSACKCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].append("forceandglobal"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on knapsack cuts (either at root or in entire tree) \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("lagomory!Cuts", "Whether to use Lagrangean Gomory cuts", - "off", CBC_PARAM_STR_LAGOMORYCUTS); - parameters[numberParameters-1].append("endonlyroot"); - parameters[numberParameters-1].append("endcleanroot"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("endonly"); - parameters[numberParameters-1].append("endclean"); - parameters[numberParameters-1].append("endboth"); - parameters[numberParameters-1].append("onlyaswell"); - parameters[numberParameters-1].append("cleanaswell"); - parameters[numberParameters-1].append("bothaswell"); - parameters[numberParameters-1].append("onlyinstead"); - parameters[numberParameters-1].append("cleaninstead"); - parameters[numberParameters-1].append("bothinstead"); - parameters[numberParameters-1].append("onlyaswellroot"); - parameters[numberParameters-1].append("cleanaswellroot"); - parameters[numberParameters-1].append("bothaswellroot"); - parameters[numberParameters-1].setLonghelp - ( - "This is a gross simplification of 'A Relax-and-Cut Framework for Gomory's Mixed-Integer Cuts' \ -by Matteo Fischetti & Domenico Salvagnin. This simplification \ -just uses original constraints while modifying objective using other cuts. \ -So you don't use messy constraints generated by Gomory etc. \ -A variant is to allow non messy cuts e.g. clique cuts. \ -So 'only' does this while clean also allows integral valued cuts. \ -'End' is recommended which waits until other cuts have finished and then \ -does a few passes. \ -The length options for gomory cuts are used." - ); - parameters[numberParameters++] = - CbcOrClpParam("latwomir!Cuts", "Whether to use Lagrangean TwoMir cuts", - "off", CBC_PARAM_STR_LATWOMIRCUTS); - parameters[numberParameters-1].append("endonlyroot"); - parameters[numberParameters-1].append("endcleanroot"); - parameters[numberParameters-1].append("endbothroot"); - parameters[numberParameters-1].append("endonly"); - parameters[numberParameters-1].append("endclean"); - parameters[numberParameters-1].append("endboth"); - parameters[numberParameters-1].append("onlyaswell"); - parameters[numberParameters-1].append("cleanaswell"); - parameters[numberParameters-1].append("bothaswell"); - parameters[numberParameters-1].append("onlyinstead"); - parameters[numberParameters-1].append("cleaninstead"); - parameters[numberParameters-1].append("bothinstead"); - parameters[numberParameters-1].setLonghelp - ( - "This is a lagrangean relaxation for TwoMir cuts. See \ -lagomoryCuts for description of options." - ); - parameters[numberParameters++] = - CbcOrClpParam("lift!AndProjectCuts", "Whether to use Lift and Project cuts", - "off", CBC_PARAM_STR_LANDPCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].setLonghelp - ( - "Lift and project cuts. \ -May be slow \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("local!TreeSearch", "Whether to use local treesearch", - "off", CBC_PARAM_STR_LOCALTREE); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a local search algorithm when a solution is found. This is from \ -Fischetti and Lodi and is not really a heuristic although it can be used as one. \ -When used from Coin solve it has limited functionality. It is not switched on when \ -heuristics are switched on." - ); -#endif -#ifndef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("log!Level", "Level of detail in Solver output", - -1, 999999, CLP_PARAM_INT_SOLVERLOGLEVEL); -#else - parameters[numberParameters++] = - CbcOrClpParam("log!Level", "Level of detail in Coin branch and Cut output", - -63, 63, CLP_PARAM_INT_LOGLEVEL); - parameters[numberParameters-1].setIntValue(1); -#endif - parameters[numberParameters-1].setLonghelp - ( - "If 0 then there should be no output in normal circumstances. 1 is probably the best\ - value for most uses, while 2 and 3 give more information." - ); - parameters[numberParameters++] = - CbcOrClpParam("max!imize", "Set optimization direction to maximize", - CLP_PARAM_ACTION_MAXIMIZE, 7); - parameters[numberParameters-1].setLonghelp - ( - "The default is minimize - use 'maximize' for maximization.\n\ -You can also use the parameters 'direction maximize'." - ); -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("maxF!actor", "Maximum number of iterations between \ -refactorizations", - 1, 999999, CLP_PARAM_INT_MAXFACTOR); - parameters[numberParameters-1].setLonghelp - ( - "If this is at its initial value of 200 then in this executable clp will guess at a\ - value to use. Otherwise the user can set a value. The code may decide to re-factorize\ - earlier for accuracy." - ); - parameters[numberParameters++] = - CbcOrClpParam("maxIt!erations", "Maximum number of iterations before \ -stopping", - 0, 2147483647, CLP_PARAM_INT_MAXITERATION); - parameters[numberParameters-1].setLonghelp - ( - "This can be used for testing purposes. The corresponding library call\n\ - \tsetMaximumIterations(value)\n can be useful. If the code stops on\ - seconds or by an interrupt this will be treated as stopping on maximum iterations. This is ignored in branchAndCut - use maxN!odes." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("maxN!odes", "Maximum number of nodes to do", - -1, 2147483647, CBC_PARAM_INT_MAXNODES); - parameters[numberParameters-1].setLonghelp - ( - "This is a repeatable way to limit search. Normally using time is easier \ -but then the results may not be repeatable." - ); - parameters[numberParameters++] = - CbcOrClpParam("maxSaved!Solutions", "Maximum number of solutions to save", - 0, 2147483647, CBC_PARAM_INT_MAXSAVEDSOLS); - parameters[numberParameters-1].setLonghelp - ( - "Number of solutions to save." - ); - parameters[numberParameters++] = - CbcOrClpParam("maxSo!lutions", "Maximum number of solutions to get", - 1, 2147483647, CBC_PARAM_INT_MAXSOLS); - parameters[numberParameters-1].setLonghelp - ( - "You may want to stop after (say) two solutions or an hour. \ -This is checked every node in tree, so it is possible to get more solutions from heuristics." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("min!imize", "Set optimization direction to minimize", - CLP_PARAM_ACTION_MINIMIZE, 7); - parameters[numberParameters-1].setLonghelp - ( - "The default is minimize - use 'maximize' for maximization.\n\ -This should only be necessary if you have previously set maximization \ -You can also use the parameters 'direction minimize'." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("mipO!ptions", "Dubious options for mip", - 0, COIN_INT_MAX, CBC_PARAM_INT_MIPOPTIONS, 0); - parameters[numberParameters++] = - CbcOrClpParam("more!MipOptions", "More dubious options for mip", - -1, COIN_INT_MAX, CBC_PARAM_INT_MOREMIPOPTIONS, 0); - parameters[numberParameters++] = - CbcOrClpParam("more2!MipOptions", "More more dubious options for mip", - -1, COIN_INT_MAX, CBC_PARAM_INT_MOREMOREMIPOPTIONS, 0); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters++] = - CbcOrClpParam("mixed!IntegerRoundingCuts", "Whether to use Mixed Integer Rounding cuts", - "off", CBC_PARAM_STR_MIXEDCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on mixed integer rounding cuts (either at root or in entire tree) \ -See branchAndCut for information on options." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("mess!ages", "Controls if Clpnnnn is printed", - "off", CLP_PARAM_STR_MESSAGES); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ("The default behavior is to put out messages such as:\n\ - Clp0005 2261 Objective 109.024 Primal infeas 944413 (758)\n\ -but this program turns this off to make it look more friendly. It can be useful\ - to turn them back on if you want to be able to 'grep' for particular messages or if\ - you intend to override the behavior of a particular message. This only affects Clp not Cbc." - ); - parameters[numberParameters++] = - CbcOrClpParam("miplib", "Do some of miplib test set", - CBC_PARAM_ACTION_MIPLIB, 3, 1); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("mips!tart", "reads an initial feasible solution from file", - CBC_PARAM_ACTION_MIPSTART); - parameters[numberParameters-1].setLonghelp - ("\ -The MIPStart allows one to enter an initial integer feasible solution \ -to CBC. Values of the main decision variables which are active (have \ -non-zero values) in this solution are specified in a text file. The \ -text file format used is the same of the solutions saved by CBC, but \ -not all fields are required to be filled. First line may contain the \ -solution status and will be ignored, remaining lines contain column \ -indexes, names and values as in this example:\n\ -\n\ -Stopped on iterations - objective value 57597.00000000\n\ - 0 x(1,1,2,2) 1 \n\ - 1 x(3,1,3,2) 1 \n\ - 5 v(5,1) 2 \n\ - 33 x(8,1,5,2) 1 \n\ - ...\n\ -\n\ -Column indexes are also ignored since pre-processing can change them. \ -There is no need to include values for continuous or integer auxiliary \ -variables, since they can be computed based on main decision variables. \ -Starting CBC with an integer feasible solution can dramatically improve \ -its performance: several MIP heuristics (e.g. RINS) rely on having at \ -least one feasible solution available and can start immediately if the \ -user provides one. Feasibility Pump (FP) is a heuristic which tries to \ -overcome the problem of taking too long to find feasible solution (or \ -not finding at all), but it not always succeeds. If you provide one \ -starting solution you will probably save some time by disabling FP. \ -\n\n\ -Knowledge specific to your problem can be considered to write an \ -external module to quickly produce an initial feasible solution - some \ -alternatives are the implementation of simple greedy heuristics or the \ -solution (by CBC for example) of a simpler model created just to find \ -a feasible solution. \ -\n\n\ -Question and suggestions regarding MIPStart can be directed to\n\ -haroldo.santos@gmail.com.\ -"); -#endif - parameters[numberParameters++] = - CbcOrClpParam("moreS!pecialOptions", "Yet more dubious options for Simplex - see ClpSimplex.hpp", - 0, COIN_INT_MAX, CLP_PARAM_INT_MORESPECIALOPTIONS, 0); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("moreT!une", "Yet more dubious ideas for feasibility pump", - 0, 100000000, CBC_PARAM_INT_FPUMPTUNE2, 0); - parameters[numberParameters-1].setLonghelp - ( - "Yet more ideas for Feasibility Pump \n\ -\t/100000 == 1 use box constraints and original obj in cleanup\n\ -\t/1000 == 1 Pump will run twice if no solution found\n\ -\t/1000 == 2 Pump will only run after root cuts if no solution found\n\ -\t/1000 >10 as above but even if solution found\n\ -\t/100 == 1,3.. exact 1.0 for objective values\n\ -\t/100 == 2,3.. allow more iterations per pass\n\ -\t n fix if value of variable same for last n iterations." - ); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters++] = - CbcOrClpParam("multiple!RootPasses", "Do multiple root passes to collect cuts and solutions", - 0, 100000000, CBC_PARAM_INT_MULTIPLEROOTS, 0); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters-1].setLonghelp - ( - "Do (in parallel if threads enabled) the root phase this number of times \ - and collect all solutions and cuts generated. The actual format is aabbcc \ -where aa is number of extra passes, if bb is non zero \ -then it is number of threads to use (otherwise uses threads setting) and \ -cc is number of times to do root phase. Yet another one from the Italian idea factory \ -(This time - Andrea Lodi , Matteo Fischetti , Michele Monaci , Domenico Salvagnin , \ -and Andrea Tramontani). \ -The solvers do not interact with each other. However if extra passes are specified \ -then cuts are collected and used in later passes - so there is interaction there." - ); - parameters[numberParameters++] = - CbcOrClpParam("naive!Heuristics", "Whether to try some stupid heuristic", - "off", CBC_PARAM_STR_NAIVE, 7, 1); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "Really silly stuff e.g. fix all integers with costs to zero!. \ -Doh option does heuristic before preprocessing" ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("netlib", "Solve entire netlib test set", - CLP_PARAM_ACTION_NETLIB_EITHER, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp and then solves the netlib test set using dual or primal.\ -The user can set options before e.g. clp -presolve off -netlib" - ); - parameters[numberParameters++] = - CbcOrClpParam("netlibB!arrier", "Solve entire netlib test set with barrier", - CLP_PARAM_ACTION_NETLIB_BARRIER, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp and then solves the netlib test set using barrier.\ -The user can set options before e.g. clp -kkt on -netlib" - ); - parameters[numberParameters++] = - CbcOrClpParam("netlibD!ual", "Solve entire netlib test set (dual)", - CLP_PARAM_ACTION_NETLIB_DUAL, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp and then solves the netlib test set using dual.\ -The user can set options before e.g. clp -presolve off -netlib" - ); - parameters[numberParameters++] = - CbcOrClpParam("netlibP!rimal", "Solve entire netlib test set (primal)", - CLP_PARAM_ACTION_NETLIB_PRIMAL, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp and then solves the netlib test set using primal.\ -The user can set options before e.g. clp -presolve off -netlibp" - ); - parameters[numberParameters++] = - CbcOrClpParam("netlibT!une", "Solve entire netlib test set with 'best' algorithm", - CLP_PARAM_ACTION_NETLIB_TUNE, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp and then solves the netlib test set using whatever \ -works best. I know this is cheating but it also stresses the code better by doing a \ -mixture of stuff. The best algorithm was chosen on a Linux ThinkPad using native cholesky \ -with University of Florida ordering." - ); - parameters[numberParameters++] = - CbcOrClpParam("network", "Tries to make network matrix", - CLP_PARAM_ACTION_NETWORK, 7, 0); - parameters[numberParameters-1].setLonghelp - ( - "Clp will go faster if the matrix can be converted to a network. The matrix\ - operations may be a bit faster with more efficient storage, but the main advantage\ - comes from using a network factorization. It will probably not be as fast as a \ -specialized network code." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("nextB!estSolution", "Prints next best saved solution to file", - CLP_PARAM_ACTION_NEXTBESTSOLUTION); - parameters[numberParameters-1].setLonghelp - ( - "To write best solution, just use solution. This prints next best (if exists) \ - and then deletes it. \ - This will write a primitive solution file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'stdout'. The amount of output can be varied using printi!ngOptions or printMask." - ); - parameters[numberParameters++] = - CbcOrClpParam("node!Strategy", "What strategy to use to select nodes", - "hybrid", CBC_PARAM_STR_NODESTRATEGY); - parameters[numberParameters-1].append("fewest"); - parameters[numberParameters-1].append("depth"); - parameters[numberParameters-1].append("upfewest"); - parameters[numberParameters-1].append("downfewest"); - parameters[numberParameters-1].append("updepth"); - parameters[numberParameters-1].append("downdepth"); - parameters[numberParameters-1].setLonghelp - ( - "Normally before a solution the code will choose node with fewest infeasibilities. \ -You can choose depth as the criterion. You can also say if up or down branch must \ -be done first (the up down choice will carry on after solution). \ -Default has now been changed to hybrid which is breadth first on small depth nodes then fewest." - ); - parameters[numberParameters++] = - CbcOrClpParam("numberA!nalyze", "Number of analysis iterations", - -COIN_INT_MAX, COIN_INT_MAX, CBC_PARAM_INT_NUMBERANALYZE, 0); - parameters[numberParameters-1].setLonghelp - ( - "This says how many iterations to spend at root node analyzing problem. \ -This is a first try and will hopefully become more sophisticated." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("objective!Scale", "Scale factor to apply to objective", - -1.0e20, 1.0e20, CLP_PARAM_DBL_OBJSCALE, 1); - parameters[numberParameters-1].setLonghelp - ( - "If the objective function has some very large values, you may wish to scale them\ - internally by this amount. It can also be set by autoscale. It is applied after scaling. You are unlikely to need this." - ); - parameters[numberParameters-1].setDoubleValue(1.0); -#endif -#ifdef COIN_HAS_CBC -#ifdef COIN_HAS_NTY - parameters[numberParameters++] = - CbcOrClpParam("Orbit!alBranching", "Whether to try orbital branching", - "off", CBC_PARAM_STR_ORBITAL); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("strong"); - parameters[numberParameters-1].append("force"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on Orbital branching. \ -On just adds orbital, strong tries extra fixing in strong branching"); -#endif - parameters[numberParameters++] = - CbcOrClpParam("outDup!licates", "takes duplicate rows etc out of integer model", - CLP_PARAM_ACTION_OUTDUPROWS, 7, 0); -#endif - parameters[numberParameters++] = - CbcOrClpParam("output!Format", "Which output format to use", - 1, 6, CLP_PARAM_INT_OUTPUTFORMAT); - parameters[numberParameters-1].setLonghelp - ( - "Normally export will be done using normal representation for numbers and two values\ - per line. You may want to do just one per line (for grep or suchlike) and you may wish\ - to save with absolute accuracy using a coded version of the IEEE value. A value of 2 is normal.\ - otherwise odd values gives one value per line, even two. Values 1,2 give normal format, 3,4\ - gives greater precision, while 5,6 give IEEE values. When used for exporting a basis 1 does not save \ -values, 2 saves values, 3 with greater accuracy and 4 in IEEE." - ); -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("para!metrics", "Import data from file and do parametrics", - CLP_PARAM_ACTION_PARAMETRICS, 3); - parameters[numberParameters-1].setLonghelp - ( - "This will read a file with parametric data from the given file name \ -and then do parametrics. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set. This can not read from compressed files. \ -File is in modified csv format - a line ROWS will be followed by rows data \ -while a line COLUMNS will be followed by column data. The last line \ -should be ENDATA. The ROWS line must exist and is in the format \ -ROWS, inital theta, final theta, interval theta, n where n is 0 to get \ -CLPI0062 message at interval or at each change of theta \ -and 1 to get CLPI0063 message at each iteration. If interval theta is 0.0 \ -or >= final theta then no interval reporting. n may be missed out when it is \ -taken as 0. If there is Row data then \ -there is a headings line with allowed headings - name, number, \ -lower(rhs change), upper(rhs change), rhs(change). Either the lower and upper \ -fields should be given or the rhs field. \ -The optional COLUMNS line is followed by a headings line with allowed \ -headings - name, number, objective(change), lower(change), upper(change). \ - Exactly one of name and number must be given for either section and \ -missing ones have value 0.0." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("passC!uts", "Number of cut passes at root node", - -9999999, 9999999, CBC_PARAM_INT_CUTPASS); - parameters[numberParameters-1].setLonghelp - ( - "The default is 100 passes if less than 500 columns, 100 passes (but \ -stop if drop small if less than 5000 columns, 20 otherwise" - ); - parameters[numberParameters++] = - CbcOrClpParam("passF!easibilityPump", "How many passes in feasibility pump", - 0, 10000, CBC_PARAM_INT_FPUMPITS); - parameters[numberParameters-1].setLonghelp - ( - "This fine tunes Feasibility Pump by doing more or fewer passes." - ); - parameters[numberParameters-1].setIntValue(20); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("passP!resolve", "How many passes in presolve", - -200, 100, CLP_PARAM_INT_PRESOLVEPASS, 1); - parameters[numberParameters-1].setLonghelp - ( - "Normally Presolve does 10 passes but you may want to do less to make it\ - more lightweight or do more if improvements are still being made. As Presolve will return\ - if nothing is being taken out, you should not normally need to use this fine tuning." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("passT!reeCuts", "Number of cut passes in tree", - -9999999, 9999999, CBC_PARAM_INT_CUTPASSINTREE); - parameters[numberParameters-1].setLonghelp - ( - "The default is one pass" - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("pertV!alue", "Method of perturbation", - -5000, 102, CLP_PARAM_INT_PERTVALUE, 1); - parameters[numberParameters++] = - CbcOrClpParam("perturb!ation", "Whether to perturb problem", - "on", CLP_PARAM_STR_PERTURBATION); - parameters[numberParameters-1].append("off"); - parameters[numberParameters-1].setLonghelp - ( - "Perturbation helps to stop cycling, but Clp uses other measures for this.\ - However large problems and especially ones with unit elements and unit rhs or costs\ - benefit from perturbation. Normally Clp tries to be intelligent, but you can switch this off.\ - The Clp library has this off by default. This program has it on by default." - ); - parameters[numberParameters++] = - CbcOrClpParam("PFI", "Whether to use Product Form of Inverse in simplex", - "off", CLP_PARAM_STR_PFI, 7, 0); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "By default clp uses Forrest-Tomlin L-U update. If you are masochistic you can switch it off." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("pivotAndC!omplement", "Whether to try Pivot and Complement heuristic", - "off", CBC_PARAM_STR_PIVOTANDCOMPLEMENT); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "stuff needed. \ -Doh option does heuristic before preprocessing" ); - parameters[numberParameters++] = - CbcOrClpParam("pivotAndF!ix", "Whether to try Pivot and Fix heuristic", - "off", CBC_PARAM_STR_PIVOTANDFIX); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "stuff needed. \ -Doh option does heuristic before preprocessing" ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("plus!Minus", "Tries to make +- 1 matrix", - CLP_PARAM_ACTION_PLUSMINUS, 7, 0); - parameters[numberParameters-1].setLonghelp - ( - "Clp will go slightly faster if the matrix can be converted so that the elements are\ - not stored and are known to be unit. The main advantage is memory use. Clp may automatically\ - see if it can convert the problem so you should not need to use this." - ); - parameters[numberParameters++] = - CbcOrClpParam("pO!ptions", "Dubious print options", - 0, COIN_INT_MAX, CLP_PARAM_INT_PRINTOPTIONS, 1); - parameters[numberParameters-1].setIntValue(0); - parameters[numberParameters-1].setLonghelp - ( - "If this is > 0 then presolve will give more information and branch and cut will give statistics" - ); - parameters[numberParameters++] = - CbcOrClpParam("preO!pt", "Presolve options", - 0, COIN_INT_MAX, CLP_PARAM_INT_PRESOLVEOPTIONS, 0); -#endif - parameters[numberParameters++] = - CbcOrClpParam("presolve", "Whether to presolve problem", - "on", CLP_PARAM_STR_PRESOLVE); - parameters[numberParameters-1].append("off"); - parameters[numberParameters-1].append("more"); - parameters[numberParameters-1].append("file"); - parameters[numberParameters-1].setLonghelp - ( - "Presolve analyzes the model to find such things as redundant equations, equations\ - which fix some variables, equations which can be transformed into bounds etc etc. For the\ - initial solve of any problem this is worth doing unless you know that it will have no effect. \ -on will normally do 5 passes while using 'more' will do 10. If the problem is very large you may need \ -to write the original to file using 'file'." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("preprocess", "Whether to use integer preprocessing", - "off", CBC_PARAM_STR_PREPROCESS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("save"); - parameters[numberParameters-1].append("equal"); - parameters[numberParameters-1].append("sos"); - parameters[numberParameters-1].append("trysos"); - parameters[numberParameters-1].append("equalall"); - parameters[numberParameters-1].append("strategy"); - parameters[numberParameters-1].append("aggregate"); - parameters[numberParameters-1].append("forcesos"); - parameters[numberParameters-1].setLonghelp - ( - "This tries to reduce size of model in a similar way to presolve and \ -it also tries to strengthen the model - this can be very useful and is worth trying. \ - Save option saves on file presolved.mps. equal will turn <= cliques into \ -==. sos will create sos sets if all 0-1 in sets (well one extra is allowed) \ -and no overlaps. trysos is same but allows any number extra. equalall will turn all \ -valid inequalities into equalities with integer slacks. strategy is as \ -on but uses CbcStrategy." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("preT!olerance", "Tolerance to use in presolve", - 1.0e-20, 1.0e12, CLP_PARAM_DBL_PRESOLVETOLERANCE); - parameters[numberParameters-1].setLonghelp - ( - "The default is 1.0e-8 - you may wish to try 1.0e-7 if presolve says the problem is \ -infeasible and you have awkward numbers and you are sure the problem is really feasible." - ); - parameters[numberParameters++] = - CbcOrClpParam("primalP!ivot", "Primal pivot choice algorithm", - "auto!matic", CLP_PARAM_STR_PRIMALPIVOT, 7, 1); - parameters[numberParameters-1].append("exa!ct"); - parameters[numberParameters-1].append("dant!zig"); - parameters[numberParameters-1].append("part!ial"); - parameters[numberParameters-1].append("steep!est"); - parameters[numberParameters-1].append("change"); - parameters[numberParameters-1].append("sprint"); - parameters[numberParameters-1].setLonghelp - ( - "Clp can use any pivot selection algorithm which the user codes as long as it\ - implements the features in the abstract pivot base class. The Dantzig method is implemented\ - to show a simple method but its use is deprecated. Exact devex is the method of choice and there\ - are two variants which keep all weights updated but only scan a subset each iteration.\ - Partial switches this on while change initially does dantzig until the factorization\ - becomes denser. This is still a work in progress." - ); - parameters[numberParameters++] = - CbcOrClpParam("primalS!implex", "Do primal simplex algorithm", - CLP_PARAM_ACTION_PRIMALSIMPLEX); - parameters[numberParameters-1].setLonghelp - ( - "This command solves the continuous relaxation of the current model using the primal algorithm.\ - The default is to use exact devex.\ - The time and iterations may be affected by settings such as presolve, scaling, crash\ - and also by column selection method, infeasibility weight and dual and primal tolerances." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("primalT!olerance", "For an optimal solution \ -no primal infeasibility may exceed this value", - 1.0e-20, 1.0e12, CLP_PARAM_DBL_PRIMALTOLERANCE); - parameters[numberParameters-1].setLonghelp - ( - "Normally the default tolerance is fine, but you may want to increase it a\ - bit if a primal run seems to be having a hard time" - ); -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("primalW!eight", "Initially algorithm acts as if it \ -costs this much to be infeasible", - 1.0e-20, 1.0e20, CLP_PARAM_DBL_PRIMALWEIGHT); - parameters[numberParameters-1].setLonghelp - ( - "The primal algorithm in Clp is a single phase algorithm as opposed to a two phase\ - algorithm where you first get feasible then optimal. So Clp is minimizing this weight times\ - the sum of primal infeasibilities plus the true objective function (in minimization sense).\ - Too high a value may mean more iterations, while too low a bound means\ - the code may go all the way and then have to increase the weight in order to get feasible.\ - OSL had a heuristic to\ - adjust bounds, maybe we need that here." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("printi!ngOptions", "Print options", - "normal", CLP_PARAM_STR_INTPRINT, 3); - parameters[numberParameters-1].append("integer"); - parameters[numberParameters-1].append("special"); - parameters[numberParameters-1].append("rows"); - parameters[numberParameters-1].append("all"); - parameters[numberParameters-1].append("csv"); - parameters[numberParameters-1].append("bound!ranging"); - parameters[numberParameters-1].append("rhs!ranging"); - parameters[numberParameters-1].append("objective!ranging"); - parameters[numberParameters-1].append("stats"); - parameters[numberParameters-1].append("boundsint"); - parameters[numberParameters-1].append("boundsall"); - parameters[numberParameters-1].setLonghelp - ( - "This changes the amount and format of printing a solution:\nnormal - nonzero column variables \n\ -integer - nonzero integer column variables\n\ -special - in format suitable for OsiRowCutDebugger\n\ -rows - nonzero column variables and row activities\n\ -all - all column variables and row activities.\n\ -\nFor non-integer problems 'integer' and 'special' act like 'normal'. \ -Also see printMask for controlling output." - ); - parameters[numberParameters++] = - CbcOrClpParam("printM!ask", "Control printing of solution on a mask", - CLP_PARAM_ACTION_PRINTMASK, 3); - parameters[numberParameters-1].setLonghelp - ( - "If set then only those names which match mask are printed in a solution. \ -'?' matches any character and '*' matches any set of characters. \ - The default is '' i.e. unset so all variables are printed. \ -This is only active if model has names." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("prio!rityIn", "Import priorities etc from file", - CBC_PARAM_ACTION_PRIORITYIN, 3); - parameters[numberParameters-1].setLonghelp - ( - "This will read a file with priorities from the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to '', i.e. it must be set. This can not read from compressed files. \ -File is in csv format with allowed headings - name, number, priority, direction, up, down, solution. Exactly one of\ - name and number must be given." - ); - parameters[numberParameters++] = - CbcOrClpParam("probing!Cuts", "Whether to use Probing cuts", - "off", CBC_PARAM_STR_PROBINGCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].append("forceonglobal"); - parameters[numberParameters-1].append("forceOnBut"); - parameters[numberParameters-1].append("forceOnStrong"); - parameters[numberParameters-1].append("forceOnButStrong"); - parameters[numberParameters-1].append("strongRoot"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on probing cuts (either at root or in entire tree) \ -See branchAndCut for information on options. \ -but strong options do more probing" - ); - parameters[numberParameters++] = - CbcOrClpParam("proximity!Search", "Whether to do proximity search heuristic", - "off", CBC_PARAM_STR_PROXIMITY); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("10"); - parameters[numberParameters-1].append("100"); - parameters[numberParameters-1].append("300"); - // but allow numbers after this (returning 1) - parameters[numberParameters-1].setFakeKeyWord(1); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a heuristic which looks for a solution close \ -to incumbent solution (Fischetti and Monaci). \ -See Rounding for meaning of on,both,before. \ -Can also set different maxNode settings by plusnnnn (and are 'on'(on==30))." - ); - parameters[numberParameters++] = - CbcOrClpParam("pumpC!utoff", "Fake cutoff for use in feasibility pump", - -COIN_DBL_MAX, COIN_DBL_MAX, CBC_PARAM_DBL_FAKECUTOFF); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters-1].setLonghelp - ( - "0.0 off - otherwise add a constraint forcing objective below this value\ - in feasibility pump" - ); - parameters[numberParameters++] = - CbcOrClpParam("pumpI!ncrement", "Fake increment for use in feasibility pump", - -COIN_DBL_MAX, COIN_DBL_MAX, CBC_PARAM_DBL_FAKEINCREMENT, 1); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters-1].setLonghelp - ( - "0.0 off - otherwise use as absolute increment to cutoff \ -when solution found in feasibility pump" - ); - parameters[numberParameters++] = - CbcOrClpParam("pumpT!une", "Dubious ideas for feasibility pump", - 0, 100000000, CBC_PARAM_INT_FPUMPTUNE); - parameters[numberParameters-1].setLonghelp - ( - "This fine tunes Feasibility Pump \n\ -\t>=10000000 use as objective weight switch\n\ -\t>=1000000 use as accumulate switch\n\ -\t>=1000 use index+1 as number of large loops\n\ -\t==100 use objvalue +0.05*fabs(objvalue) as cutoff OR fakeCutoff if set\n\ -\t%100 == 10,20 affects how each solve is done\n\ -\t1 == fix ints at bounds, 2 fix all integral ints, 3 and continuous at bounds. \ -If accumulate is on then after a major pass, variables which have not moved \ -are fixed and a small branch and bound is tried." - ); - parameters[numberParameters-1].setIntValue(0); -#endif - parameters[numberParameters++] = - CbcOrClpParam("quit", "Stops clp execution", - CLP_PARAM_ACTION_EXIT); - parameters[numberParameters-1].setLonghelp - ( - "This stops the execution of Clp, end, exit, quit and stop are synonyms" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("randomC!bcSeed", "Random seed for Cbc", - -1, COIN_INT_MAX, CBC_PARAM_INT_RANDOMSEED); - parameters[numberParameters-1].setLonghelp - ( - "This sets a random seed for Cbc \ -- 0 says use time of day, -1 is as now." - ); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("randomi!zedRounding", "Whether to try randomized rounding heuristic", - "off", CBC_PARAM_STR_RANDROUND); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "stuff needed. \ -Doh option does heuristic before preprocessing" ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("randomS!eed", "Random seed for Clp", - 0, COIN_INT_MAX, CLP_PARAM_INT_RANDOMSEED); - parameters[numberParameters-1].setLonghelp - ( - "This sets a random seed for Clp \ -- 0 says use time of day." - ); - parameters[numberParameters-1].setIntValue(1234567); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("ratio!Gap", "Stop when gap between best possible and \ -best less than this fraction of larger of two", - 0.0, 1.0e20, CBC_PARAM_DBL_GAPRATIO); - parameters[numberParameters-1].setDoubleValue(0.0); - parameters[numberParameters-1].setLonghelp - ( - "If the gap between best solution and best possible solution is less than this fraction \ -of the objective value at the root node then the search will terminate. See 'allowableGap' for a \ -way of using absolute value rather than fraction." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("restoreS!olution", "reads solution from file", - CLP_PARAM_ACTION_RESTORESOL); - parameters[numberParameters-1].setLonghelp - ( - "This will read a binary solution file from the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'solution.file'. This reads in a file from saveSolution" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("readSt!ored", "Import stored cuts from file", - CLP_PARAM_ACTION_STOREDFILE, 3, 0); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("reallyO!bjectiveScale", "Scale factor to apply to objective in place", - -1.0e20, 1.0e20, CLP_PARAM_DBL_OBJSCALE2, 0); - parameters[numberParameters-1].setLonghelp - ( - "You can set this to -1.0 to test maximization or other to stress code" - ); - parameters[numberParameters-1].setDoubleValue(1.0); - parameters[numberParameters++] = - CbcOrClpParam("reallyS!cale", "Scales model in place", - CLP_PARAM_ACTION_REALLY_SCALE, 7, 0); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("reduce!AndSplitCuts", "Whether to use Reduce-and-Split cuts", - "off", CBC_PARAM_STR_REDSPLITCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on reduce and split cuts (either at root or in entire tree). \ -May be slow \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("reduce2!AndSplitCuts", "Whether to use Reduce-and-Split cuts - style 2", - "off", CBC_PARAM_STR_REDSPLIT2CUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("longOn"); - parameters[numberParameters-1].append("longRoot"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on reduce and split cuts (either at root or in entire tree) \ -This version is by Giacomo Nannicini based on Francois Margot's version \ -Standard setting only uses rows in tableau <=256, long uses all \ -May be slow \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("reduce2!AndSplitCuts", "Whether to use Reduce-and-Split cuts - style 2", - "off", CBC_PARAM_STR_REDSPLIT2CUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("longOn"); - parameters[numberParameters-1].append("longRoot"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on reduce and split cuts (either at root or in entire tree) \ -This version is by Giacomo Nannicini based on Francois Margot's version \ -Standard setting only uses rows in tableau <=256, long uses all \ -See branchAndCut for information on options." - ); - parameters[numberParameters++] = - CbcOrClpParam("residual!CapacityCuts", "Whether to use Residual Capacity cuts", - "off", CBC_PARAM_STR_RESIDCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].setLonghelp - ( - "Residual capacity cuts. \ -See branchAndCut for information on options." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("restore!Model", "Restore model from binary file", - CLP_PARAM_ACTION_RESTORE, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This reads data save by saveModel from the given file. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'default.prob'." - ); - parameters[numberParameters++] = - CbcOrClpParam("reverse", "Reverses sign of objective", - CLP_PARAM_ACTION_REVERSE, 7, 0); - parameters[numberParameters-1].setLonghelp - ( - "Useful for testing if maximization works correctly" - ); - parameters[numberParameters++] = - CbcOrClpParam("rhs!Scale", "Scale factor to apply to rhs and bounds", - -1.0e20, 1.0e20, CLP_PARAM_DBL_RHSSCALE, 0); - parameters[numberParameters-1].setLonghelp - ( - "If the rhs or bounds have some very large meaningful values, you may wish to scale them\ - internally by this amount. It can also be set by autoscale. This should not be needed." - ); - parameters[numberParameters-1].setDoubleValue(1.0); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("Rens", "Whether to try Relaxation Enforced Neighborhood Search", - "off", CBC_PARAM_STR_RENS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("200"); - parameters[numberParameters-1].append("1000"); - parameters[numberParameters-1].append("10000"); - parameters[numberParameters-1].append("dj"); - parameters[numberParameters-1].append("djbefore"); - parameters[numberParameters-1].append("usesolution"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on Relaxation enforced neighborhood Search. \ -on just does 50 nodes \ -200 or 1000 does that many nodes. \ -Doh option does heuristic before preprocessing" ); - parameters[numberParameters++] = - CbcOrClpParam("Rins", "Whether to try Relaxed Induced Neighborhood Search", - "off", CBC_PARAM_STR_RINS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("often"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on Relaxed induced neighborhood Search. \ -Doh option does heuristic before preprocessing" ); - parameters[numberParameters++] = - CbcOrClpParam("round!ingHeuristic", "Whether to use Rounding heuristic", - "off", CBC_PARAM_STR_ROUNDING); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on a simple (but effective) rounding heuristic at each node of tree. \ -On means do in solve i.e. after preprocessing, \ -Before means do if doHeuristics used, off otherwise, \ -and both means do if doHeuristics and in solve." - ); - -#endif - parameters[numberParameters++] = - CbcOrClpParam("saveM!odel", "Save model to binary file", - CLP_PARAM_ACTION_SAVE, 7, 1); - parameters[numberParameters-1].setLonghelp - ( - "This will save the problem to the given file name for future use\ - by restoreModel. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'default.prob'." - ); - parameters[numberParameters++] = - CbcOrClpParam("saveS!olution", "saves solution to file", - CLP_PARAM_ACTION_SAVESOL); - parameters[numberParameters-1].setLonghelp - ( - "This will write a binary solution file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'solution.file'. To read the file use fread(int) twice to pick up number of rows \ -and columns, then fread(double) to pick up objective value, then pick up row activities, row duals, column \ -activities and reduced costs - see bottom of CbcOrClpParam.cpp for code that reads or writes file. \ -If name contains '_fix_read_' then does not write but reads and will fix all variables" - ); - parameters[numberParameters++] = - CbcOrClpParam("scal!ing", "Whether to scale problem", - "off", CLP_PARAM_STR_SCALING); - parameters[numberParameters-1].append("equi!librium"); - parameters[numberParameters-1].append("geo!metric"); - parameters[numberParameters-1].append("auto!matic"); - parameters[numberParameters-1].append("dynamic"); - parameters[numberParameters-1].append("rows!only"); - parameters[numberParameters-1].setLonghelp - ( - "Scaling can help in solving problems which might otherwise fail because of lack of\ - accuracy. It can also reduce the number of iterations. It is not applied if the range\ - of elements is small. When unscaled it is possible that there may be small primal and/or\ - infeasibilities." - ); - parameters[numberParameters-1].setCurrentOption(3); // say auto -#ifndef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("sec!onds", "Maximum seconds", - -1.0, 1.0e12, CLP_PARAM_DBL_TIMELIMIT); - parameters[numberParameters-1].setLonghelp - ( - "After this many seconds clp will act as if maximum iterations had been reached \ -(if value >=0)." - ); -#else - parameters[numberParameters++] = - CbcOrClpParam("sec!onds", "maximum seconds", - -1.0, 1.0e12, CBC_PARAM_DBL_TIMELIMIT_BAB); - parameters[numberParameters-1].setLonghelp - ( - "After this many seconds coin solver will act as if maximum nodes had been reached." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("sleep", "for debug", - CLP_PARAM_ACTION_DUMMY, 7, 0); - parameters[numberParameters-1].setLonghelp - ( - "If passed to solver fom ampl, then ampl will wait so that you can copy .nl file for debug." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("slow!cutpasses", "Maximum number of tries for slower cuts", - -1, COIN_INT_MAX, CBC_PARAM_INT_MAX_SLOW_CUTS); - parameters[numberParameters-1].setLonghelp - ( - "Some cut generators are fairly slow - this limits the number of times they are tried." - ); - parameters[numberParameters-1].setIntValue(10); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("slp!Value", "Number of slp passes before primal", - -50000, 50000, CLP_PARAM_INT_SLPVALUE, 1); - parameters[numberParameters-1].setLonghelp - ( - "If you are solving a quadratic problem using primal then it may be helpful to do some \ -sequential Lps to get a good approximate solution." - ); -#if CLP_MULTIPLE_FACTORIZATIONS > 0 - parameters[numberParameters++] = - CbcOrClpParam("small!Factorization", "Whether to use small factorization", - -1, 10000, CBC_PARAM_INT_SMALLFACT, 1); - parameters[numberParameters-1].setLonghelp - ( - "If processed problem <= this use small factorization" - ); - parameters[numberParameters-1].setIntValue(-1); -#endif -#endif - parameters[numberParameters++] = - CbcOrClpParam("solu!tion", "Prints solution to file", - CLP_PARAM_ACTION_SOLUTION); - parameters[numberParameters-1].setLonghelp - ( - "This will write a primitive solution file to the given file name. It will use the default\ - directory given by 'directory'. A name of '$' will use the previous value for the name. This\ - is initialized to 'stdout'. The amount of output can be varied using printi!ngOptions or printMask." - ); -#ifdef COIN_HAS_CLP -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("solv!e", "Solve problem", - CBC_PARAM_ACTION_BAB); - parameters[numberParameters-1].setLonghelp - ( - "If there are no integer variables then this just solves LP. If there are integer variables \ -this does branch and cut." - ); - parameters[numberParameters++] = - CbcOrClpParam("sos!Options", "Whether to use SOS from AMPL", - "off", CBC_PARAM_STR_SOS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setCurrentOption("on"); - parameters[numberParameters-1].setLonghelp - ( - "Normally if AMPL says there are SOS variables they should be used, but sometime sthey should\ - be turned off - this does so." - ); - parameters[numberParameters++] = - CbcOrClpParam("slog!Level", "Level of detail in (LP) Solver output", - -1, 63, CLP_PARAM_INT_SOLVERLOGLEVEL); - parameters[numberParameters-1].setLonghelp - ( - "If 0 then there should be no output in normal circumstances. 1 is probably the best\ - value for most uses, while 2 and 3 give more information. This parameter is only used inside MIP - for Clp use 'log'" - ); -#else - // allow solve as synonym for possible dual - parameters[numberParameters++] = - CbcOrClpParam("solv!e", "Solve problem using dual simplex (probably)", - CLP_PARAM_ACTION_EITHERSIMPLEX); - parameters[numberParameters-1].setLonghelp - ( - "Just so can use solve for clp as well as in cbc" - ); -#endif -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("spars!eFactor", "Whether factorization treated as sparse", - "on", CLP_PARAM_STR_SPARSEFACTOR, 7, 0); - parameters[numberParameters-1].append("off"); - parameters[numberParameters++] = - CbcOrClpParam("special!Options", "Dubious options for Simplex - see ClpSimplex.hpp", - 0, COIN_INT_MAX, CLP_PARAM_INT_SPECIALOPTIONS, 0); - parameters[numberParameters++] = - CbcOrClpParam("sprint!Crash", "Whether to try sprint crash", - -1, 5000000, CLP_PARAM_INT_SPRINT); - parameters[numberParameters-1].setLonghelp - ( - "For long and thin problems this program may solve a series of small problems\ - created by taking a subset of the columns. I introduced the idea as 'Sprint' after\ - an LP code of that name of the 60's which tried the same tactic (not totally successfully).\ - Cplex calls it 'sifting'. -1 is automatic choice, 0 is off, n is number of passes" - ); - parameters[numberParameters++] = - CbcOrClpParam("stat!istics", "Print some statistics", - CLP_PARAM_ACTION_STATISTICS); - parameters[numberParameters-1].setLonghelp - ( - "This command prints some statistics for the current model.\ - If log level >1 then more is printed.\ - These are for presolved model if presolve on (and unscaled)." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("stop", "Stops clp execution", - CLP_PARAM_ACTION_EXIT); - parameters[numberParameters-1].setLonghelp - ( - "This stops the execution of Clp, end, exit, quit and stop are synonyms" - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("strat!egy", "Switches on groups of features", - 0, 2, CBC_PARAM_INT_STRATEGY); - parameters[numberParameters-1].setLonghelp - ( - "This turns on newer features. \ -Use 0 for easy problems, 1 is default, 2 is aggressive. \ -1 uses Gomory cuts using tolerance of 0.01 at root, \ -does a possible restart after 100 nodes if can fix many \ -and activates a diving and RINS heuristic and makes feasibility pump \ -more aggressive. \ -This does not apply to unit tests (where 'experiment' may have similar effects)." - ); - parameters[numberParameters-1].setIntValue(1); -#ifdef CBC_KEEP_DEPRECATED - parameters[numberParameters++] = - CbcOrClpParam("strengthen", "Create strengthened problem", - CBC_PARAM_ACTION_STRENGTHEN, 3); - parameters[numberParameters-1].setLonghelp - ( - "This creates a new problem by applying the root node cuts. All tight constraints \ -will be in resulting problem" - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("strong!Branching", "Number of variables to look at in strong branching", - 0, COIN_INT_MAX, CBC_PARAM_INT_STRONGBRANCHING); - parameters[numberParameters-1].setLonghelp - ( - "In order to decide which variable to branch on, the code will choose up to this number \ -of unsatisfied variables to do mini up and down branches on. Then the most effective one is chosen. \ -If a variable is branched on many times then the previous average up and down costs may be used - \ -see number before trust." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("subs!titution", "How long a column to substitute for in presolve", - 0, 10000, CLP_PARAM_INT_SUBSTITUTION, 0); - parameters[numberParameters-1].setLonghelp - ( - "Normally Presolve gets rid of 'free' variables when there are no more than 3 \ - variables in column. If you increase this the number of rows may decrease but number of \ - elements may increase." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("testO!si", "Test OsiObject stuff", - -1, COIN_INT_MAX, CBC_PARAM_INT_TESTOSI, 0); -#endif -#ifdef CBC_THREAD - parameters[numberParameters++] = - CbcOrClpParam("thread!s", "Number of threads to try and use", - -100, 100000, CBC_PARAM_INT_THREADS, 1); - parameters[numberParameters-1].setLonghelp - ( - "To use multiple threads, set threads to number wanted. It may be better \ -to use one or two more than number of cpus available. If 100+n then n threads and \ -search is repeatable (maybe be somewhat slower), \ -if 200+n use threads for root cuts, 400+n threads used in sub-trees." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("tighten!Factor", "Tighten bounds using this times largest \ -activity at continuous solution", - 1.0e-3, 1.0e20, CBC_PARAM_DBL_TIGHTENFACTOR, 0); - parameters[numberParameters-1].setLonghelp - ( - "This sleazy trick can help on some problems." - ); -#endif -#ifdef COIN_HAS_CLP - parameters[numberParameters++] = - CbcOrClpParam("tightLP", "Poor person's preSolve for now", - CLP_PARAM_ACTION_TIGHTEN, 7, 0); -#endif - parameters[numberParameters++] = - CbcOrClpParam("timeM!ode", "Whether to use CPU or elapsed time", - "cpu", CLP_PARAM_STR_TIME_MODE); - parameters[numberParameters-1].append("elapsed"); - parameters[numberParameters-1].setLonghelp - ( - "cpu uses CPU time for stopping, while elapsed uses elapsed time. \ -(On Windows, elapsed time is always used)." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("trust!PseudoCosts", "Number of branches before we trust pseudocosts", - -3, 2000000000, CBC_PARAM_INT_NUMBERBEFORE); - parameters[numberParameters-1].setLonghelp - ( - "Using strong branching computes pseudo-costs. After this many times for a variable we just \ -trust the pseudo costs and do not do any more strong branching." - ); -#endif -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("tune!PreProcess", "Dubious tuning parameters", - 0, 2000000000, CLP_PARAM_INT_PROCESSTUNE, 1); - parameters[numberParameters-1].setLonghelp - ( - "Format aabbcccc - \n If aa then this is number of major passes (i.e. with presolve) \n \ -If bb and bb>0 then this is number of minor passes (if unset or 0 then 10) \n \ -cccc is bit set \n 0 - 1 Heavy probing \n 1 - 2 Make variables integer if possible (if obj value)\n \ -2 - 4 As above but even if zero objective value\n \ -7 - 128 Try and create cliques\n 8 - 256 If all +1 try hard for dominated rows\n \ -10 - 1024 Use a larger feasibility tolerance in presolve\n \ -11 - 2048 Try probing before creating cliques" - ); - parameters[numberParameters++] = - CbcOrClpParam("two!MirCuts", "Whether to use Two phase Mixed Integer Rounding cuts", - "off", CBC_PARAM_STR_TWOMIRCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].append("forceandglobal"); - parameters[numberParameters-1].append("forceLongOn"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on two phase mixed integer rounding cuts (either at root or in entire tree) \ -See branchAndCut for information on options." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("unitTest", "Do unit test", - CLP_PARAM_ACTION_UNITTEST, 3, 1); - parameters[numberParameters-1].setLonghelp - ( - "This exercises the unit test for clp" - ); - parameters[numberParameters++] = - CbcOrClpParam("userClp", "Hand coded Clp stuff", - CLP_PARAM_ACTION_USERCLP, 0, 0); - parameters[numberParameters-1].setLonghelp - ( - "There are times e.g. when using AMPL interface when you may wish to do something unusual. \ -Look for USERCLP in main driver and modify sample code." - ); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("userCbc", "Hand coded Cbc stuff", - CBC_PARAM_ACTION_USERCBC, 0, 0); - parameters[numberParameters-1].setLonghelp - ( - "There are times e.g. when using AMPL interface when you may wish to do something unusual. \ -Look for USERCBC in main driver and modify sample code. \ -It is possible you can get same effect by using example driver4.cpp." - ); - parameters[numberParameters++] = - CbcOrClpParam("Vnd!VariableNeighborhoodSearch", "Whether to try Variable Neighborhood Search", - "off", CBC_PARAM_STR_VND); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("both"); - parameters[numberParameters-1].append("before"); - parameters[numberParameters-1].append("intree"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on variable neighborhood Search. \ -Doh option does heuristic before preprocessing" ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("vector", "Whether to use vector? Form of matrix in simplex", - "off", CLP_PARAM_STR_VECTOR, 7, 0); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].setLonghelp - ( - "If this is on ClpPackedMatrix uses extra column copy in odd format." - ); - parameters[numberParameters++] = - CbcOrClpParam("verbose", "Switches on longer help on single ?", - 0, 31, CLP_PARAM_INT_VERBOSE, 0); - parameters[numberParameters-1].setLonghelp - ( - "Set to 1 to get short help with ? list, 2 to get long help, 3 for both. (add 4 to just get ampl ones)." - ); - parameters[numberParameters-1].setIntValue(0); -#ifdef COIN_HAS_CBC - parameters[numberParameters++] = - CbcOrClpParam("vub!heuristic", "Type of vub heuristic", - -2, 20, CBC_PARAM_INT_VUBTRY, 0); - parameters[numberParameters-1].setLonghelp - ( - "If set will try and fix some integer variables" - ); - parameters[numberParameters-1].setIntValue(-1); - parameters[numberParameters++] = - CbcOrClpParam("zero!HalfCuts", "Whether to use zero half cuts", - "off", CBC_PARAM_STR_ZEROHALFCUTS); - parameters[numberParameters-1].append("on"); - parameters[numberParameters-1].append("root"); - parameters[numberParameters-1].append("ifmove"); - parameters[numberParameters-1].append("forceOn"); - parameters[numberParameters-1].append("onglobal"); - parameters[numberParameters-1].setLonghelp - ( - "This switches on zero-half cuts (either at root or in entire tree) \ -See branchAndCut for information on options. This implementation was written by \ -Alberto Caprara." - ); -#endif - parameters[numberParameters++] = - CbcOrClpParam("zeroT!olerance", "Kill all coefficients \ -whose absolute value is less than this value", - 1.0e-100, 1.0e-5, CLP_PARAM_DBL_ZEROTOLERANCE); - parameters[numberParameters-1].setLonghelp - ( - "This applies to reading mps files (and also lp files \ -if KILL_ZERO_READLP defined)" - ); - parameters[numberParameters-1].setDoubleValue(1.0e-20); - assert(numberParameters < CBCMAXPARAMETERS); -} -// Given a parameter type - returns its number in list -int whichParam (CbcOrClpParameterType name, - int numberParameters, CbcOrClpParam *const parameters) -{ - int i; - for (i = 0; i < numberParameters; i++) { - if (parameters[i].type() == name) - break; - } - assert (i < numberParameters); - return i; -} -#ifdef COIN_HAS_CLP -/* Restore a solution from file. - mode 0 normal, 1 swap rows and columns and primal and dual - if 2 set then also change signs -*/ -void restoreSolution(ClpSimplex * lpSolver, std::string fileName, int mode) -{ - FILE * fp = fopen(fileName.c_str(), "rb"); - if (fp) { - int numberRows = lpSolver->numberRows(); - int numberColumns = lpSolver->numberColumns(); - int numberRowsFile; - int numberColumnsFile; - double objectiveValue; - size_t nRead; - nRead = fread(&numberRowsFile, sizeof(int), 1, fp); - if (nRead != 1) - throw("Error in fread"); - nRead = fread(&numberColumnsFile, sizeof(int), 1, fp); - if (nRead != 1) - throw("Error in fread"); - nRead = fread(&objectiveValue, sizeof(double), 1, fp); - if (nRead != 1) - throw("Error in fread"); - double * dualRowSolution = lpSolver->dualRowSolution(); - double * primalRowSolution = lpSolver->primalRowSolution(); - double * dualColumnSolution = lpSolver->dualColumnSolution(); - double * primalColumnSolution = lpSolver->primalColumnSolution(); - if (mode) { - // swap - int k = numberRows; - numberRows = numberColumns; - numberColumns = k; - double * temp; - temp = dualRowSolution; - dualRowSolution = primalColumnSolution; - primalColumnSolution = temp; - temp = dualColumnSolution; - dualColumnSolution = primalRowSolution; - primalRowSolution = temp; - } - if (numberRows > numberRowsFile || numberColumns > numberColumnsFile) { - std::cout << "Mismatch on rows and/or columns - giving up" << std::endl; - } else { - lpSolver->setObjectiveValue(objectiveValue); - if (numberRows == numberRowsFile && numberColumns == numberColumnsFile) { - nRead = fread(primalRowSolution, sizeof(double), numberRows, fp); - if (nRead != static_cast(numberRows)) - throw("Error in fread"); - nRead = fread(dualRowSolution, sizeof(double), numberRows, fp); - if (nRead != static_cast(numberRows)) - throw("Error in fread"); - nRead = fread(primalColumnSolution, sizeof(double), numberColumns, fp); - if (nRead != static_cast(numberColumns)) - throw("Error in fread"); - nRead = fread(dualColumnSolution, sizeof(double), numberColumns, fp); - if (nRead != static_cast(numberColumns)) - throw("Error in fread"); - } else { - std::cout << "Mismatch on rows and/or columns - truncating" << std::endl; - double * temp = new double [CoinMax(numberRowsFile, numberColumnsFile)]; - nRead = fread(temp, sizeof(double), numberRowsFile, fp); - if (nRead != static_cast(numberRowsFile)) - throw("Error in fread"); - CoinMemcpyN(temp, numberRows, primalRowSolution); - nRead = fread(temp, sizeof(double), numberRowsFile, fp); - if (nRead != static_cast(numberRowsFile)) - throw("Error in fread"); - CoinMemcpyN(temp, numberRows, dualRowSolution); - nRead = fread(temp, sizeof(double), numberColumnsFile, fp); - if (nRead != static_cast(numberColumnsFile)) - throw("Error in fread"); - CoinMemcpyN(temp, numberColumns, primalColumnSolution); - nRead = fread(temp, sizeof(double), numberColumnsFile, fp); - if (nRead != static_cast(numberColumnsFile)) - throw("Error in fread"); - CoinMemcpyN(temp, numberColumns, dualColumnSolution); - delete [] temp; - } - if (mode == 3) { - int i; - for (i = 0; i < numberRows; i++) { - primalRowSolution[i] = -primalRowSolution[i]; - dualRowSolution[i] = -dualRowSolution[i]; - } - for (i = 0; i < numberColumns; i++) { - primalColumnSolution[i] = -primalColumnSolution[i]; - dualColumnSolution[i] = -dualColumnSolution[i]; - } - } - } - fclose(fp); - } else { - std::cout << "Unable to open file " << fileName << std::endl; - } -} -// Dump a solution to file -void saveSolution(const ClpSimplex * lpSolver, std::string fileName) -{ - if (strstr(fileName.c_str(), "_fix_read_")) { - FILE * fp = fopen(fileName.c_str(), "rb"); - if (fp) { - ClpSimplex * solver = const_cast(lpSolver); - restoreSolution(solver, fileName, 0); - // fix all - int logLevel = solver->logLevel(); - int iColumn; - int numberColumns = solver->numberColumns(); - double * primalColumnSolution = - solver->primalColumnSolution(); - double * columnLower = solver->columnLower(); - double * columnUpper = solver->columnUpper(); - for (iColumn = 0; iColumn < numberColumns; iColumn++) { - double value = primalColumnSolution[iColumn]; - if (value > columnUpper[iColumn]) { - if (value > columnUpper[iColumn] + 1.0e-6 && logLevel > 1) - printf("%d value of %g - bounds %g %g\n", - iColumn, value, columnLower[iColumn], columnUpper[iColumn]); - value = columnUpper[iColumn]; - } else if (value < columnLower[iColumn]) { - if (value < columnLower[iColumn] - 1.0e-6 && logLevel > 1) - printf("%d value of %g - bounds %g %g\n", - iColumn, value, columnLower[iColumn], columnUpper[iColumn]); - value = columnLower[iColumn]; - } - columnLower[iColumn] = value; - columnUpper[iColumn] = value; - } - return; - } - } - FILE * fp = fopen(fileName.c_str(), "wb"); - if (fp) { - int numberRows = lpSolver->numberRows(); - int numberColumns = lpSolver->numberColumns(); - double objectiveValue = lpSolver->objectiveValue(); - size_t nWrite; - nWrite = fwrite(&numberRows, sizeof(int), 1, fp); - if (nWrite != 1) - throw("Error in fwrite"); - nWrite = fwrite(&numberColumns, sizeof(int), 1, fp); - if (nWrite != 1) - throw("Error in fwrite"); - nWrite = fwrite(&objectiveValue, sizeof(double), 1, fp); - if (nWrite != 1) - throw("Error in fwrite"); - double * dualRowSolution = lpSolver->dualRowSolution(); - double * primalRowSolution = lpSolver->primalRowSolution(); - nWrite = fwrite(primalRowSolution, sizeof(double), numberRows, fp); - if (nWrite != static_cast(numberRows)) - throw("Error in fwrite"); - nWrite = fwrite(dualRowSolution, sizeof(double), numberRows, fp); - if (nWrite != static_cast(numberRows)) - throw("Error in fwrite"); - double * dualColumnSolution = lpSolver->dualColumnSolution(); - double * primalColumnSolution = lpSolver->primalColumnSolution(); - nWrite = fwrite(primalColumnSolution, sizeof(double), numberColumns, fp); - if (nWrite != static_cast(numberColumns)) - throw("Error in fwrite"); - nWrite = fwrite(dualColumnSolution, sizeof(double), numberColumns, fp); - if (nWrite != static_cast(numberColumns)) - throw("Error in fwrite"); - fclose(fp); - } else { - std::cout << "Unable to open file " << fileName << std::endl; - } -} -#endif diff --git a/thirdparty/linux/include/coin1/CbcOrClpParam.hpp b/thirdparty/linux/include/coin1/CbcOrClpParam.hpp deleted file mode 100644 index d76d966f..00000000 --- a/thirdparty/linux/include/coin1/CbcOrClpParam.hpp +++ /dev/null @@ -1,531 +0,0 @@ - -/* $Id: CbcOrClpParam.hpp 2070 2014-11-18 11:12:54Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifdef USE_CBCCONFIG -# include "CbcConfig.h" -#else -# include "ClpConfig.h" -#endif - -#ifndef CbcOrClpParam_H -#define CbcOrClpParam_H -/** - This has parameter handling stuff which can be shared between Cbc and Clp (and Dylp etc). - - This (and .cpp) should be copied so that it is the same in Cbc/Test and Clp/Test. - I know this is not elegant but it seems simplest. - - It uses COIN_HAS_CBC for parameters wanted by CBC - It uses COIN_HAS_CLP for parameters wanted by CLP (or CBC using CLP) - It could use COIN_HAS_DYLP for parameters wanted by DYLP - It could use COIN_HAS_DYLP_OR_CLP for parameters wanted by DYLP or CLP etc etc - - */ -class OsiSolverInterface; -class CbcModel; -class ClpSimplex; -/*! \brief Parameter codes - - Parameter type ranges are allocated as follows -

    2. - Create a copy of the original problem. -
    3. -
    4. - Subject the copy to a series of transformations (the presolve - methods) to produce a presolved model. Each transformation is also - expected to provide a method to reverse the transformation (the - postsolve method). The postsolve methods are collected in a - linked list; the postsolve method for the final presolve transformation - is at the head of the list. -
    5. -
    6. - Hand the presolved problem to the solver for optimization. -
    7. -
    8. - Apply the collected postsolve methods to the presolved problem - and solution, restating the solution in terms of the original problem. -
    9. - - - The COIN presolve algorithms are unaware of OSI. The OsiPresolve class takes - care of the interface. Given an OsiSolverInterface \c origModel, it will take - care of creating a clone properly loaded with the presolved problem and ready - for optimization. After optimization, it will apply postsolve - transformations and load the result back into \c origModel. - - Assuming a problem has been loaded into an - \c OsiSolverInterface \c origModel, a bare-bones application looks like this: - \code - OsiPresolve pinfo ; - OsiSolverInterface *presolvedModel ; - // Return an OsiSolverInterface loaded with the presolved problem. - presolvedModel = pinfo.presolvedModel(*origModel,1.0e-8,false,numberPasses) ; - presolvedModel->initialSolve() ; - // Restate the solution and load it back into origModel. - pinfo.postsolve(true) ; - delete presolvedModel ; - \endcode -*/ - - - -class OsiPresolve { -public: - /// Default constructor (empty object) - OsiPresolve(); - - /// Virtual destructor - virtual ~OsiPresolve(); - - /*! \brief Create a new OsiSolverInterface loaded with the presolved problem. - - This method implements the first two steps described in the class - documentation. It clones \c origModel and applies presolve - transformations, storing the resulting list of postsolve - transformations. It returns a pointer to a new OsiSolverInterface loaded - with the presolved problem, or NULL if the problem is infeasible or - unbounded. If \c keepIntegers is true then bounds may be tightened in - the original. Bounds will be moved by up to \c feasibilityTolerance to - try and stay feasible. When \c doStatus is true, the current solution will - be transformed to match the presolved model. - - This should be paired with postsolve(). It is up to the client to - destroy the returned OsiSolverInterface, after calling postsolve(). - - This method is virtual. Override this method if you need to customize - the steps of creating a model to apply presolve transformations. - - In some sense, a wrapper for presolve(CoinPresolveMatrix*). - */ - virtual OsiSolverInterface *presolvedModel(OsiSolverInterface & origModel, - double feasibilityTolerance=0.0, - bool keepIntegers=true, - int numberPasses=5, - const char * prohibited=NULL, - bool doStatus=true, - const char * rowProhibited=NULL); - - /*! \brief Restate the solution to the presolved problem in terms of the - original problem and load it into the original model. - - postsolve() restates the solution in terms of the original problem and - updates the original OsiSolverInterface supplied to presolvedModel(). If - the problem has not been solved to optimality, there are no guarantees. - If you are using an algorithm like simplex that has a concept of a basic - solution, then set updateStatus - - The advantage of going back to the original problem is that it - will be exactly as it was, i.e., 0.0 will not become 1.0e-19. - - Note that if you modified the original problem after presolving, then you - must ``undo'' these modifications before calling postsolve(). - - In some sense, a wrapper for postsolve(CoinPostsolveMatrix&). - */ - virtual void postsolve(bool updateStatus=true); - - /*! \brief Return a pointer to the presolved model. */ - OsiSolverInterface * model() const; - - /// Return a pointer to the original model - OsiSolverInterface * originalModel() const; - - /// Set the pointer to the original model - void setOriginalModel(OsiSolverInterface *model); - - /// Return a pointer to the original columns - const int * originalColumns() const; - - /// Return a pointer to the original rows - const int * originalRows() const; - - /// Return number of rows in original model - inline int getNumRows() const - { return nrows_;} - - /// Return number of columns in original model - inline int getNumCols() const - { return ncols_;} - - /** "Magic" number. If this is non-zero then any elements with this value - may change and so presolve is very limited in what can be done - to the row and column. This is for non-linear problems. - */ - inline void setNonLinearValue(double value) - { nonLinearValue_ = value;} - inline double nonLinearValue() const - { return nonLinearValue_;} - /*! \brief Fine control over presolve actions - - Set/clear the following bits to allow or suppress actions: - - 0x01 allow duplicate column processing on integer columns - and dual stuff on integers - - 0x02 switch off actions which can change +1 to something else - (doubleton, tripleton, implied free) - - 0x04 allow transfer of costs from singletons and between integer - variables (when advantageous) - - 0x08 do not allow x+y+z=1 transform - - 0x10 allow actions that don't easily unroll - - 0x20 allow dubious gub element reduction - - GUB element reduction is only partially implemented in CoinPresolve (see - gubrow_action) and willl cause an abort at postsolve. It's not clear - what's meant by `dual stuff on integers'. - -- lh, 110605 -- - */ - inline void setPresolveActions(int action) - { presolveActions_ = (presolveActions_&0xffff0000)|(action&0xffff);} - -private: - /*! Original model (solver interface loaded with the original problem). - - Must not be destroyed until after postsolve(). - */ - OsiSolverInterface * originalModel_; - - /*! Presolved model (solver interface loaded with the presolved problem) - - Must be destroyed by the client (using delete) after postsolve(). - */ - OsiSolverInterface * presolvedModel_; - - /*! "Magic" number. If this is non-zero then any elements with this value - may change and so presolve is very limited in what can be done - to the row and column. This is for non-linear problems. - One could also allow for cases where sign of coefficient is known. - */ - double nonLinearValue_; - - /// Original column numbers - int * originalColumn_; - - /// Original row numbers - int * originalRow_; - - /// The list of transformations applied. - const CoinPresolveAction *paction_; - - /*! \brief Number of columns in original model. - - The problem will expand back to its former size as postsolve - transformations are applied. It is efficient to allocate data structures - for the final size of the problem rather than expand them as needed. - */ - int ncols_; - - /*! \brief Number of rows in original model. */ - int nrows_; - - /*! \brief Number of nonzero matrix coefficients in the original model. */ - CoinBigIndex nelems_; - - /** Whether we want to skip dual part of presolve etc. - 1 bit allows duplicate column processing on integer columns - and dual stuff on integers - 4 transfers costs to integer variables - */ - int presolveActions_; - /// Number of major passes - int numberPasses_; - -protected: - /*! \brief Apply presolve transformations to the problem. - - Handles the core activity of applying presolve transformations. - - If you want to apply the individual presolve routines differently, or - perhaps add your own to the mix, define a derived class and override - this method - */ - virtual const CoinPresolveAction *presolve(CoinPresolveMatrix *prob); - - /*! \brief Reverse presolve transformations to recover the solution - to the original problem. - - Handles the core activity of applying postsolve transformations. - - Postsolving is pretty generic; just apply the transformations in reverse - order. You will probably only be interested in overriding this method if - you want to add code to test for consistency while debugging new presolve - techniques. - */ - virtual void postsolve(CoinPostsolveMatrix &prob); - - /*! \brief Destroys queued postsolve actions. - - E.g., when presolve() determines the problem is infeasible, so that - it will not be necessary to actually solve the presolved problem and - convert the result back to the original problem. - */ - void gutsOfDestroy(); -}; -#endif diff --git a/thirdparty/linux/include/coin1/OsiRowCut.hpp b/thirdparty/linux/include/coin1/OsiRowCut.hpp deleted file mode 100644 index 13328024..00000000 --- a/thirdparty/linux/include/coin1/OsiRowCut.hpp +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiRowCut_H -#define OsiRowCut_H - -#include "CoinPackedVector.hpp" - -#include "OsiCollections.hpp" -#include "OsiCut.hpp" - -//#define OSI_INLINE_ROWCUT_METHODS -#ifdef OSI_INLINE_ROWCUT_METHODS -#define OsiRowCut_inline inline -#else -#define OsiRowCut_inline -#endif - -/** Row Cut Class - -A row cut has: -
        -
      • a lower bound
        -
      • an upper bound
        -
      • a vector of row elements -
      -*/ -class OsiRowCut : public OsiCut { - friend void OsiRowCutUnitTest(const OsiSolverInterface * baseSiP, - const std::string & mpsDir); - -public: - - /**@name Row bounds */ - //@{ - /// Get lower bound - OsiRowCut_inline double lb() const; - /// Set lower bound - OsiRowCut_inline void setLb(double lb); - /// Get upper bound - OsiRowCut_inline double ub() const; - /// Set upper bound - OsiRowCut_inline void setUb(double ub); - //@} - - /**@name Row rhs, sense, range */ - //@{ - /// Get sense ('E', 'G', 'L', 'N', 'R') - char sense() const; - /// Get right-hand side - double rhs() const; - /// Get range (ub - lb for 'R' rows, 0 otherwise) - double range() const; - //@} - - //------------------------------------------------------------------- - /**@name Row elements */ - //@{ - /// Set row elements - OsiRowCut_inline void setRow( - int size, - const int * colIndices, - const double * elements, - bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); - /// Set row elements from a packed vector - OsiRowCut_inline void setRow( const CoinPackedVector & v ); - /// Get row elements - OsiRowCut_inline const CoinPackedVector & row() const; - /// Get row elements for changing - OsiRowCut_inline CoinPackedVector & mutableRow() ; - //@} - - /**@name Comparison operators */ - //@{ -#if __GNUC__ != 2 - using OsiCut::operator== ; -#endif - /** equal - true if lower bound, upper bound, row elements, - and OsiCut are equal. - */ - OsiRowCut_inline bool operator==(const OsiRowCut& rhs) const; - -#if __GNUC__ != 2 - using OsiCut::operator!= ; -#endif - /// not equal - OsiRowCut_inline bool operator!=(const OsiRowCut& rhs) const; - //@} - - - //---------------------------------------------------------------- - /**@name Sanity checks on cut */ - //@{ - /** Returns true if the cut is consistent. - This checks to ensure that: -
        -
      • The row element vector does not have duplicate indices -
      • The row element vector indices are >= 0 -
      - */ - OsiRowCut_inline bool consistent() const; - - /** Returns true if cut is consistent with respect to the solver - interface's model. - This checks to ensure that -
        -
      • The row element vector indices are < the number of columns - in the model -
      - */ - OsiRowCut_inline bool consistent(const OsiSolverInterface& im) const; - - /** Returns true if the row cut itself is infeasible and cannot be satisfied. - This checks whether -
        -
      • the lower bound is strictly greater than the - upper bound. -
      - */ - OsiRowCut_inline bool infeasible(const OsiSolverInterface &im) const; - /** Returns infeasibility of the cut with respect to solution - passed in i.e. is positive if cuts off that solution. - solution is getNumCols() long.. - */ - virtual double violated(const double * solution) const; - //@} - - /**@name Arithmetic operators. Apply CoinPackedVector methods to the vector */ - //@{ - /// add value to every vector entry - void operator+=(double value) - { row_ += value; } - - /// subtract value from every vector entry - void operator-=(double value) - { row_ -= value; } - - /// multiply every vector entry by value - void operator*=(double value) - { row_ *= value; } - - /// divide every vector entry by value - void operator/=(double value) - { row_ /= value; } - //@} - - /// Allow access row sorting function - void sortIncrIndex() - {row_.sortIncrIndex();} - - /**@name Constructors and destructors */ - //@{ - /// Assignment operator - OsiRowCut & operator=( const OsiRowCut& rhs); - - /// Copy constructor - OsiRowCut ( const OsiRowCut &); - - /// Clone - virtual OsiRowCut * clone() const; - - /// Default Constructor - OsiRowCut (); - - /** \brief Ownership Constructor - - This constructor assumes ownership of the vectors passed as parameters - for indices and elements. \p colIndices and \p elements will be NULL - on return. - */ - OsiRowCut(double cutlb, double cutub, - int capacity, int size, - int *&colIndices, double *&elements); - - /// Destructor - virtual ~OsiRowCut (); - //@} - - /**@name Debug stuff */ - //@{ - /// Print cuts in collection - virtual void print() const ; - //@} - -private: - - - /**@name Private member data */ - //@{ - /// Row elements - CoinPackedVector row_; - /// Row lower bound - double lb_; - /// Row upper bound - double ub_; - //@} -}; - -#ifdef OSI_INLINE_ROWCUT_METHODS - -//------------------------------------------------------------------- -// Set/Get lower & upper bounds -//------------------------------------------------------------------- -double OsiRowCut::lb() const { return lb_; } -void OsiRowCut::setLb(double lb) { lb_ = lb; } -double OsiRowCut::ub() const { return ub_; } -void OsiRowCut::setUb(double ub) { ub_ = ub; } - -//------------------------------------------------------------------- -// Set row elements -//------------------------------------------------------------------- -void OsiRowCut::setRow(int size, - const int * colIndices, const double * elements) -{ - row_.setVector(size,colIndices,elements); -} -void OsiRowCut::setRow( const CoinPackedVector & v ) -{ - row_ = v; -} - -//------------------------------------------------------------------- -// Get the row -//------------------------------------------------------------------- -const CoinPackedVector & OsiRowCut::row() const -{ - return row_; -} - -//------------------------------------------------------------------- -// Get the row so we can change -//------------------------------------------------------------------- -CoinPackedVector & OsiRowCut::mutableRow() -{ - return row_; -} - -//---------------------------------------------------------------- -// == operator -//------------------------------------------------------------------- -bool -OsiRowCut::operator==(const OsiRowCut& rhs) const -{ - if ( this->OsiCut::operator!=(rhs) ) return false; - if ( row() != rhs.row() ) return false; - if ( lb() != rhs.lb() ) return false; - if ( ub() != rhs.ub() ) return false; - return true; -} -bool -OsiRowCut::operator!=(const OsiRowCut& rhs) const -{ - return !( (*this)==rhs ); -} - - -//---------------------------------------------------------------- -// consistent & infeasible -//------------------------------------------------------------------- -bool OsiRowCut::consistent() const -{ - const CoinPackedVector & r=row(); - r.duplicateIndex("consistent", "OsiRowCut"); - if ( r.getMinIndex() < 0 ) return false; - return true; -} -bool OsiRowCut::consistent(const OsiSolverInterface& im) const -{ - const CoinPackedVector & r=row(); - if ( r.getMaxIndex() >= im.getNumCols() ) return false; - - return true; -} -bool OsiRowCut::infeasible(const OsiSolverInterface &im) const -{ - if ( lb() > ub() ) return true; - - return false; -} - -#endif - -/** Row Cut Class which refers back to row which created it. - It may be useful to strengthen a row rather than add a cut. To do this - we need to know which row is strengthened. This trivial extension - to OsiRowCut does that. - -*/ -class OsiRowCut2 : public OsiRowCut { - -public: - - /**@name Which row */ - //@{ - /// Get row - inline int whichRow() const - { return whichRow_;} - /// Set row - inline void setWhichRow(int row) - { whichRow_=row;} - //@} - - /**@name Constructors and destructors */ - //@{ - /// Assignment operator - OsiRowCut2 & operator=( const OsiRowCut2& rhs); - - /// Copy constructor - OsiRowCut2 ( const OsiRowCut2 &); - - /// Clone - virtual OsiRowCut * clone() const; - - /// Default Constructor - OsiRowCut2 (int row=-1); - - /// Destructor - virtual ~OsiRowCut2 (); - //@} - -private: - - - /**@name Private member data */ - //@{ - /// Which row - int whichRow_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/OsiRowCutDebugger.hpp b/thirdparty/linux/include/coin1/OsiRowCutDebugger.hpp deleted file mode 100644 index 548e8e3f..00000000 --- a/thirdparty/linux/include/coin1/OsiRowCutDebugger.hpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiRowCutDebugger_H -#define OsiRowCutDebugger_H - -/*! \file OsiRowCutDebugger.hpp - - \brief Provides a facility to validate cut constraints to ensure that they - do not cut off a given solution. -*/ - -#include - -#include "OsiCuts.hpp" -#include "OsiSolverInterface.hpp" - -/*! \brief Validate cuts against a known solution - - OsiRowCutDebugger provides a facility for validating cuts against a known - solution for a problem. The debugger knows an optimal solution for many of - the miplib3 problems. Check the source for - #activate(const OsiSolverInterface&,const char*) - in OsiRowCutDebugger.cpp for the full set of known problems. - - A full solution vector can be supplied as a parameter with - (#activate(const OsiSolverInterface&,const double*,bool)). - Only the integer values need to be valid. - The default behaviour is to solve an lp relaxation with the integer - variables fixed to the specified values and use the optimal solution to fill - in the continuous variables in the solution. - The debugger can be instructed to preserve the continuous variables (useful - when debugging solvers where the linear relaxation doesn't capture all the - constraints). - - Note that the solution must match the problem held in the solver interface. - If you want to use the row cut debugger on a problem after applying presolve - transformations, your solution must match the presolved problem. (But see - #redoSolution().) -*/ -class OsiRowCutDebugger { - friend void OsiRowCutDebuggerUnitTest(const OsiSolverInterface * siP, - const std::string & mpsDir); - -public: - - /*! @name Validate Row Cuts - - Check that the specified cuts do not cut off the known solution. - */ - //@{ - /*! \brief Check that the set of cuts does not cut off the solution known - to the debugger. - - Check if any generated cuts cut off the solution known to the debugger! - If so then print offending cuts. Return the number of invalid cuts. - */ - virtual int validateCuts(const OsiCuts & cs, int first, int last) const; - - /*! \brief Check that the cut does not cut off the solution known to the - debugger. - - Return true if cut is invalid - */ - virtual bool invalidCut(const OsiRowCut & rowcut) const; - - /*! \brief Returns true if the solution held in the solver is compatible - with the known solution. - - More specifically, returns true if the known solution satisfies the column - bounds held in the solver. - */ - bool onOptimalPath(const OsiSolverInterface &si) const; - //@} - - /*! @name Activate the Debugger - - The debugger is considered to be active when it holds a known solution. - */ - //@{ - /*! \brief Activate a debugger using the name of a problem. - - The debugger knows an optimal solution for most of miplib3. Check the - source code for the full list. Returns true if the debugger is - successfully activated. - */ - bool activate(const OsiSolverInterface &si, const char *model) ; - - /*! \brief Activate a debugger using a full solution array. - - The solution must have one entry for every variable, but only the entries - for integer values are used. By default the debugger will solve an lp - relaxation with the integer variables fixed and fill in values for the - continuous variables from this solution. If the debugger should preserve - the given values for the continuous variables, set \p keepContinuous to - \c true. - - Returns true if debugger activates successfully. - */ - bool activate(const OsiSolverInterface &si, const double* solution, - bool keepContinuous = false) ; - - /// Returns true if the debugger is active - bool active() const; - //@} - - /*! @name Query or Manipulate the Known Solution */ - //@{ - /// Return the known solution - inline const double * optimalSolution() const - { return knownSolution_;} - - /// Return the number of columns in the known solution - inline int numberColumns() const { return (numberColumns_) ; } - - /// Return the value of the objective for the known solution - inline double optimalValue() const { return knownValue_;} - - /*! \brief Edit the known solution to reflect column changes - - Given a translation array \p originalColumns[numberColumns] which can - translate current column indices to original column indices, this method - will edit the solution held in the debugger so that it matches the current - set of columns. - - Useful when the original problem is preprocessed prior to cut generation. - The debugger does keep a record of the changes. - */ - void redoSolution(int numberColumns, const int *originalColumns); - - /// Print optimal solution (returns -1 bad debug, 0 on optimal, 1 not) - int printOptimalSolution(const OsiSolverInterface & si) const; - //@} - - /**@name Constructors and Destructors */ - //@{ - /// Default constructor - no checking - OsiRowCutDebugger (); - - /*! \brief Constructor with name of model. - - See #activate(const OsiSolverInterface&,const char*). - */ - OsiRowCutDebugger(const OsiSolverInterface &si, const char *model) ; - - /*! \brief Constructor with full solution. - - See #activate(const OsiSolverInterface&,const double*,bool). - */ - OsiRowCutDebugger(const OsiSolverInterface &si, const double *solution, - bool enforceOptimality = false) ; - - /// Copy constructor - OsiRowCutDebugger(const OsiRowCutDebugger &); - - /// Assignment operator - OsiRowCutDebugger& operator=(const OsiRowCutDebugger& rhs); - - /// Destructor - virtual ~OsiRowCutDebugger (); - //@} - -private: - - // Private member data - - /**@name Private member data */ - //@{ - /// Value of known solution - double knownValue_; - - /*! \brief Number of columns in known solution - - This must match the number of columns reported by the solver. - */ - int numberColumns_; - - /// array specifying integer variables - bool * integerVariable_; - - /// array specifying known solution - double * knownSolution_; - //@} -}; - -#endif diff --git a/thirdparty/linux/include/coin1/OsiSolverBranch.hpp b/thirdparty/linux/include/coin1/OsiSolverBranch.hpp deleted file mode 100644 index 98c4343b..00000000 --- a/thirdparty/linux/include/coin1/OsiSolverBranch.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2005, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiSolverBranch_H -#define OsiSolverBranch_H - -class OsiSolverInterface; -#include "CoinWarmStartBasis.hpp" - -//############################################################################# - -/** Solver Branch Class - - This provides information on a branch as a set of tighter bounds on both ways -*/ - -class OsiSolverBranch { - -public: - ///@name Add and Get methods - //@{ - /// Add a simple branch (i.e. first sets ub of floor(value), second lb of ceil(value)) - void addBranch(int iColumn, double value); - - /// Add bounds - way =-1 is first , +1 is second - void addBranch(int way,int numberTighterLower, const int * whichLower, const double * newLower, - int numberTighterUpper, const int * whichUpper, const double * newUpper); - /// Add bounds - way =-1 is first , +1 is second - void addBranch(int way,int numberColumns,const double * oldLower, const double * newLower, - const double * oldUpper, const double * newUpper); - - /// Apply bounds - void applyBounds(OsiSolverInterface & solver,int way) const; - /// Returns true if current solution satsifies one side of branch - bool feasibleOneWay(const OsiSolverInterface & solver) const; - /// Starts - inline const int * starts() const - { return start_;} - /// Which variables - inline const int * which() const - { return indices_;} - /// Bounds - inline const double * bounds() const - { return bound_;} - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - OsiSolverBranch(); - - /// Copy constructor - OsiSolverBranch(const OsiSolverBranch & rhs); - - /// Assignment operator - OsiSolverBranch & operator=(const OsiSolverBranch & rhs); - - /// Destructor - ~OsiSolverBranch (); - - //@} - -private: - ///@name Private member data - //@{ - /// Start of lower first, upper first, lower second, upper second - int start_[5]; - /// Column numbers (if >= numberColumns treat as rows) - int * indices_; - /// New bounds - double * bound_; - //@} -}; -//############################################################################# - -/** Solver Result Class - - This provides information on a result as a set of tighter bounds on both ways -*/ - -class OsiSolverResult { - -public: - ///@name Add and Get methods - //@{ - /// Create result - void createResult(const OsiSolverInterface & solver,const double * lowerBefore, - const double * upperBefore); - - /// Restore result - void restoreResult(OsiSolverInterface & solver) const; - - /// Get basis - inline const CoinWarmStartBasis & basis() const - { return basis_;} - - /// Objective value (as minimization) - inline double objectiveValue() const - { return objectiveValue_;} - - /// Primal solution - inline const double * primalSolution() const - { return primalSolution_;} - - /// Dual solution - inline const double * dualSolution() const - { return dualSolution_;} - - /// Extra fixed - inline const OsiSolverBranch & fixed() const - { return fixed_;} - //@} - - - ///@name Constructors and destructors - //@{ - /// Default Constructor - OsiSolverResult(); - - /// Constructor from solver - OsiSolverResult(const OsiSolverInterface & solver,const double * lowerBefore, - const double * upperBefore); - - /// Copy constructor - OsiSolverResult(const OsiSolverResult & rhs); - - /// Assignment operator - OsiSolverResult & operator=(const OsiSolverResult & rhs); - - /// Destructor - ~OsiSolverResult (); - - //@} - -private: - ///@name Private member data - //@{ - /// Value of objective (if >= OsiSolverInterface::getInfinity() then infeasible) - double objectiveValue_; - /// Warm start information - CoinWarmStartBasis basis_; - /// Primal solution (numberColumns) - double * primalSolution_; - /// Dual solution (numberRows) - double * dualSolution_; - /// Which extra variables have been fixed (only way==-1 counts) - OsiSolverBranch fixed_; - //@} -}; -#endif diff --git a/thirdparty/linux/include/coin1/OsiSolverInterface.hpp b/thirdparty/linux/include/coin1/OsiSolverInterface.hpp deleted file mode 100644 index a581961d..00000000 --- a/thirdparty/linux/include/coin1/OsiSolverInterface.hpp +++ /dev/null @@ -1,2143 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiSolverInterface_H -#define OsiSolverInterface_H - -#include -#include -#include - -#include "CoinTypes.hpp" -#include "CoinMessageHandler.hpp" -#include "CoinPackedVectorBase.hpp" -#include "CoinPackedMatrix.hpp" -#include "CoinWarmStart.hpp" -#include "CoinFinite.hpp" -#include "CoinError.hpp" - -#include "OsiCollections.hpp" -#include "OsiSolverParameters.hpp" - -class CoinSnapshot; -class CoinLpIO; -class CoinMpsIO; - -class OsiCuts; -class OsiAuxInfo; -class OsiRowCut; -class OsiRowCutDebugger; -class CoinSet; -class CoinBuild; -class CoinModel; -class OsiSolverBranch; -class OsiSolverResult; -class OsiObject; - - -//############################################################################# - -/*! \brief Abstract Base Class for describing an interface to a solver. - - Many OsiSolverInterface query methods return a const pointer to the - requested read-only data. If the model data is changed or the solver - is called, these pointers may no longer be valid and should be - refreshed by invoking the member function to obtain an updated copy - of the pointer. - For example: - \code - OsiSolverInterface solverInterfacePtr ; - const double * ruBnds = solverInterfacePtr->getRowUpper(); - solverInterfacePtr->applyCuts(someSetOfCuts); - // ruBnds is no longer a valid pointer and must be refreshed - ruBnds = solverInterfacePtr->getRowUpper(); - \endcode - - Querying a problem that has no data associated with it will result in - zeros for the number of rows and columns, and NULL pointers from - the methods that return vectors. -*/ - -class OsiSolverInterface { - friend void OsiSolverInterfaceCommonUnitTest( - const OsiSolverInterface* emptySi, - const std::string & mpsDir, - const std::string & netlibDir); - friend void OsiSolverInterfaceMpsUnitTest( - const std::vector & vecSiP, - const std::string & mpsDir); - -public: - - /// Internal class for obtaining status from the applyCuts method - class ApplyCutsReturnCode { - friend class OsiSolverInterface; - friend class OsiClpSolverInterface; - friend class OsiGrbSolverInterface; - - public: - ///@name Constructors and desctructors - //@{ - /// Default constructor - ApplyCutsReturnCode(): - intInconsistent_(0), - extInconsistent_(0), - infeasible_(0), - ineffective_(0), - applied_(0) {} - /// Copy constructor - ApplyCutsReturnCode(const ApplyCutsReturnCode & rhs): - intInconsistent_(rhs.intInconsistent_), - extInconsistent_(rhs.extInconsistent_), - infeasible_(rhs.infeasible_), - ineffective_(rhs.ineffective_), - applied_(rhs.applied_) {} - /// Assignment operator - ApplyCutsReturnCode & operator=(const ApplyCutsReturnCode& rhs) - { - if (this != &rhs) { - intInconsistent_ = rhs.intInconsistent_; - extInconsistent_ = rhs.extInconsistent_; - infeasible_ = rhs.infeasible_; - ineffective_ = rhs.ineffective_; - applied_ = rhs.applied_; - } - return *this; - } - /// Destructor - ~ApplyCutsReturnCode(){} - //@} - - /**@name Accessing return code attributes */ - //@{ - /// Number of logically inconsistent cuts - inline int getNumInconsistent() const - {return intInconsistent_;} - /// Number of cuts inconsistent with the current model - inline int getNumInconsistentWrtIntegerModel() const - {return extInconsistent_;} - /// Number of cuts that cause obvious infeasibility - inline int getNumInfeasible() const - {return infeasible_;} - /// Number of redundant or ineffective cuts - inline int getNumIneffective() const - {return ineffective_;} - /// Number of cuts applied - inline int getNumApplied() const - {return applied_;} - //@} - - private: - /**@name Private methods */ - //@{ - /// Increment logically inconsistent cut counter - inline void incrementInternallyInconsistent(){intInconsistent_++;} - /// Increment model-inconsistent counter - inline void incrementExternallyInconsistent(){extInconsistent_++;} - /// Increment infeasible cut counter - inline void incrementInfeasible(){infeasible_++;} - /// Increment ineffective cut counter - inline void incrementIneffective(){ineffective_++;} - /// Increment applied cut counter - inline void incrementApplied(){applied_++;} - //@} - - ///@name Private member data - //@{ - /// Counter for logically inconsistent cuts - int intInconsistent_; - /// Counter for model-inconsistent cuts - int extInconsistent_; - /// Counter for infeasible cuts - int infeasible_; - /// Counter for ineffective cuts - int ineffective_; - /// Counter for applied cuts - int applied_; - //@} - }; - - //--------------------------------------------------------------------------- - - ///@name Solve methods - //@{ - /// Solve initial LP relaxation - virtual void initialSolve() = 0; - - /*! \brief Resolve an LP relaxation after problem modification - - Note the `re-' in `resolve'. initialSolve() should be used to solve the - problem for the first time. - */ - virtual void resolve() = 0; - - /// Invoke solver's built-in enumeration algorithm - virtual void branchAndBound() = 0; - -#ifdef CBC_NEXT_VERSION - /* - Would it make sense to collect all of these routines in a `MIP Helper' - section? It'd make it easier for users and implementors to find them. - */ - /** - Solve 2**N (N==depth) problems and return solutions and bases. - There are N branches each of which changes bounds on both sides - as given by branch. The user should provide an array of (empty) - results which will be filled in. See OsiSolveResult for more details - (in OsiSolveBranch.?pp) but it will include a basis and primal solution. - - The order of results is left to right at feasible leaf nodes so first one - is down, down, ..... - - Returns number of feasible leaves. Also sets number of solves done and number - of iterations. - - This is provided so a solver can do faster. - - If forceBranch true then branch done even if satisfied - */ - virtual int solveBranches(int depth,const OsiSolverBranch * branch, - OsiSolverResult * result, - int & numberSolves, int & numberIterations, - bool forceBranch=false); -#endif - //@} - - //--------------------------------------------------------------------------- - /**@name Parameter set/get methods - - The set methods return true if the parameter was set to the given value, - false otherwise. When a set method returns false, the original value (if - any) should be unchanged. There can be various reasons for failure: the - given parameter is not applicable for the solver (e.g., refactorization - frequency for the volume algorithm), the parameter is not yet - implemented for the solver or simply the value of the parameter is out - of the range the solver accepts. If a parameter setting call returns - false check the details of your solver. - - The get methods return true if the given parameter is applicable for the - solver and is implemented. In this case the value of the parameter is - returned in the second argument. Otherwise they return false. - - \note - There is a default implementation of the set/get - methods, namely to store/retrieve the given value using an array in the - base class. A specific solver implementation can use this feature, for - example, to store parameters that should be used later on. Implementors - of a solver interface should overload these functions to provide the - proper interface to and accurately reflect the capabilities of a - specific solver. - - The format for hints is slightly different in that a boolean specifies - the sense of the hint and an enum specifies the strength of the hint. - Hints should be initialised when a solver is instantiated. - (See OsiSolverParameters.hpp for defined hint parameters and strength.) - When specifying the sense of the hint, a value of true means to work with - the hint, false to work against it. For example, -
        -
      • \code setHintParam(OsiDoScale,true,OsiHintTry) \endcode - is a mild suggestion to the solver to scale the constraint - system. -
      • \code setHintParam(OsiDoScale,false,OsiForceDo) \endcode - tells the solver to disable scaling, or throw an exception if - it cannot comply. -
      - As another example, a solver interface could use the value and strength - of the \c OsiDoReducePrint hint to adjust the amount of information - printed by the interface and/or solver. The extent to which a solver - obeys hints is left to the solver. The value and strength returned by - \c getHintParam will match the most recent call to \c setHintParam, - and will not necessarily reflect the solver's ability to comply with the - hint. If the hint strength is \c OsiForceDo, the solver is required to - throw an exception if it cannot perform the specified action. - - \note - As with the other set/get methods, there is a default implementation - which maintains arrays in the base class for hint sense and strength. - The default implementation does not store the \c otherInformation - pointer, and always throws an exception for strength \c OsiForceDo. - Implementors of a solver interface should override these functions to - provide the proper interface to and accurately reflect the capabilities - of a specific solver. - */ - //@{ - //! Set an integer parameter - virtual bool setIntParam(OsiIntParam key, int value) { - if (key == OsiLastIntParam) return (false) ; - intParam_[key] = value; - return true; - } - //! Set a double parameter - virtual bool setDblParam(OsiDblParam key, double value) { - if (key == OsiLastDblParam) return (false) ; - dblParam_[key] = value; - return true; - } - //! Set a string parameter - virtual bool setStrParam(OsiStrParam key, const std::string & value) { - if (key == OsiLastStrParam) return (false) ; - strParam_[key] = value; - return true; - } - /*! \brief Set a hint parameter - - The \c otherInformation parameter can be used to pass in an arbitrary - block of information which is interpreted by the OSI and the underlying - solver. Users are cautioned that this hook is solver-specific. - - Implementors: - The default implementation completely ignores \c otherInformation and - always throws an exception for OsiForceDo. This is almost certainly not - the behaviour you want; you really should override this method. - */ - virtual bool setHintParam(OsiHintParam key, bool yesNo=true, - OsiHintStrength strength=OsiHintTry, - void * /*otherInformation*/ = NULL) { - if (key==OsiLastHintParam) - return false; - hintParam_[key] = yesNo; - hintStrength_[key] = strength; - if (strength == OsiForceDo) - throw CoinError("OsiForceDo illegal", - "setHintParam", "OsiSolverInterface"); - return true; - } - //! Get an integer parameter - virtual bool getIntParam(OsiIntParam key, int& value) const { - if (key == OsiLastIntParam) return (false) ; - value = intParam_[key]; - return true; - } - //! Get a double parameter - virtual bool getDblParam(OsiDblParam key, double& value) const { - if (key == OsiLastDblParam) return (false) ; - value = dblParam_[key]; - return true; - } - //! Get a string parameter - virtual bool getStrParam(OsiStrParam key, std::string& value) const { - if (key == OsiLastStrParam) return (false) ; - value = strParam_[key]; - return true; - } - /*! \brief Get a hint parameter (all information) - - Return all available information for the hint: sense, strength, - and any extra information associated with the hint. - - Implementors: The default implementation will always set - \c otherInformation to NULL. This is almost certainly not the - behaviour you want; you really should override this method. - */ - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength, - void *& otherInformation) const { - if (key==OsiLastHintParam) - return false; - yesNo = hintParam_[key]; - strength = hintStrength_[key]; - otherInformation=NULL; - return true; - } - /*! \brief Get a hint parameter (sense and strength only) - - Return only the sense and strength of the hint. - */ - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength) const { - if (key==OsiLastHintParam) - return false; - yesNo = hintParam_[key]; - strength = hintStrength_[key]; - return true; - } - /*! \brief Get a hint parameter (sense only) - - Return only the sense (true/false) of the hint. - */ - virtual bool getHintParam(OsiHintParam key, bool& yesNo) const { - if (key==OsiLastHintParam) - return false; - yesNo = hintParam_[key]; - return true; - } - /*! \brief Copy all parameters in this section from one solver to another - - Note that the current implementation also copies the appData block, - message handler, and rowCutDebugger. Arguably these should have - independent copy methods. - */ - void copyParameters(OsiSolverInterface & rhs); - - /** \brief Return the integrality tolerance of the underlying solver. - - We should be able to get an integrality tolerance, but - until that time just use the primal tolerance - - \todo - This method should be replaced; it's architecturally wrong. This - should be an honest dblParam with a keyword. Underlying solvers - that do not support integer variables should return false for set and - get on this parameter. Underlying solvers that support integrality - should add this to the parameters they support, using whatever - tolerance is appropriate. -lh, 091021- - */ - inline double getIntegerTolerance() const - { return dblParam_[OsiPrimalTolerance];} - //@} - - //--------------------------------------------------------------------------- - ///@name Methods returning info on how the solution process terminated - //@{ - /// Are there numerical difficulties? - virtual bool isAbandoned() const = 0; - /// Is optimality proven? - virtual bool isProvenOptimal() const = 0; - /// Is primal infeasibility proven? - virtual bool isProvenPrimalInfeasible() const = 0; - /// Is dual infeasibility proven? - virtual bool isProvenDualInfeasible() const = 0; - /// Is the given primal objective limit reached? - virtual bool isPrimalObjectiveLimitReached() const; - /// Is the given dual objective limit reached? - virtual bool isDualObjectiveLimitReached() const; - /// Iteration limit reached? - virtual bool isIterationLimitReached() const = 0; - //@} - - //--------------------------------------------------------------------------- - /** \name Warm start methods - - Note that the warm start methods return a generic CoinWarmStart object. - The precise characteristics of this object are solver-dependent. Clients - who wish to maintain a maximum degree of solver independence should take - care to avoid unnecessary assumptions about the properties of a warm start - object. - */ - //@{ - /*! \brief Get an empty warm start object - - This routine returns an empty warm start object. Its purpose is - to provide a way for a client to acquire a warm start object of the - appropriate type for the solver, which can then be resized and modified - as desired. - */ - - virtual CoinWarmStart *getEmptyWarmStart () const = 0 ; - - /** \brief Get warm start information. - - Return warm start information for the current state of the solver - interface. If there is no valid warm start information, an empty warm - start object wil be returned. - */ - virtual CoinWarmStart* getWarmStart() const = 0; - /** \brief Get warm start information. - - Return warm start information for the current state of the solver - interface. If there is no valid warm start information, an empty warm - start object wil be returned. This does not necessarily create an - object - may just point to one. must Delete set true if user - should delete returned object. - */ - virtual CoinWarmStart* getPointerToWarmStart(bool & mustDelete) ; - - /** \brief Set warm start information. - - Return true or false depending on whether the warm start information was - accepted or not. - By definition, a call to setWarmStart with a null parameter should - cause the solver interface to refresh its warm start information - from the underlying solver. - */ - virtual bool setWarmStart(const CoinWarmStart* warmstart) = 0; - //@} - - //--------------------------------------------------------------------------- - /**@name Hot start methods - - Primarily used in strong branching. The user can create a hot start - object --- a snapshot of the optimization process --- then reoptimize - over and over again, starting from the same point. - - \note -
        -
      • Between hot started optimizations only bound changes are allowed. -
      • The copy constructor and assignment operator should NOT copy any - hot start information. -
      • The default implementation simply extracts a warm start object in - \c markHotStart, resets to the warm start object in - \c solveFromHotStart, and deletes the warm start object in - \c unmarkHotStart. - Actual solver implementations are encouraged to do better. -
      - - */ - //@{ - /// Create a hot start snapshot of the optimization process. - virtual void markHotStart(); - /// Optimize starting from the hot start snapshot. - virtual void solveFromHotStart(); - /// Delete the hot start snapshot. - virtual void unmarkHotStart(); - //@} - - //--------------------------------------------------------------------------- - /**@name Problem query methods - - Querying a problem that has no data associated with it will result in - zeros for the number of rows and columns, and NULL pointers from the - methods that return vectors. - - Const pointers returned from any data-query method are valid as long as - the data is unchanged and the solver is not called. - */ - //@{ - /// Get the number of columns - virtual int getNumCols() const = 0; - - /// Get the number of rows - virtual int getNumRows() const = 0; - - /// Get the number of nonzero elements - virtual int getNumElements() const = 0; - - /// Get the number of integer variables - virtual int getNumIntegers() const ; - - /// Get a pointer to an array[getNumCols()] of column lower bounds - virtual const double * getColLower() const = 0; - - /// Get a pointer to an array[getNumCols()] of column upper bounds - virtual const double * getColUpper() const = 0; - - /*! \brief Get a pointer to an array[getNumRows()] of row constraint senses. - -
        -
      • 'L': <= constraint -
      • 'E': = constraint -
      • 'G': >= constraint -
      • 'R': ranged constraint -
      • 'N': free constraint -
      - */ - virtual const char * getRowSense() const = 0; - - /*! \brief Get a pointer to an array[getNumRows()] of row right-hand sides - -
        -
      • if getRowSense()[i] == 'L' then - getRightHandSide()[i] == getRowUpper()[i] -
      • if getRowSense()[i] == 'G' then - getRightHandSide()[i] == getRowLower()[i] -
      • if getRowSense()[i] == 'R' then - getRightHandSide()[i] == getRowUpper()[i] -
      • if getRowSense()[i] == 'N' then - getRightHandSide()[i] == 0.0 -
      - */ - virtual const double * getRightHandSide() const = 0; - - /*! \brief Get a pointer to an array[getNumRows()] of row ranges. - -
        -
      • if getRowSense()[i] == 'R' then - getRowRange()[i] == getRowUpper()[i] - getRowLower()[i] -
      • if getRowSense()[i] != 'R' then - getRowRange()[i] is 0.0 -
      - */ - virtual const double * getRowRange() const = 0; - - /// Get a pointer to an array[getNumRows()] of row lower bounds - virtual const double * getRowLower() const = 0; - - /// Get a pointer to an array[getNumRows()] of row upper bounds - virtual const double * getRowUpper() const = 0; - - /*! \brief Get a pointer to an array[getNumCols()] of objective - function coefficients. - */ - virtual const double * getObjCoefficients() const = 0; - - /*! \brief Get the objective function sense - - - 1 for minimisation (default) - - -1 for maximisation - */ - virtual double getObjSense() const = 0; - - /// Return true if the variable is continuous - virtual bool isContinuous(int colIndex) const = 0; - - /// Return true if the variable is binary - virtual bool isBinary(int colIndex) const; - - /*! \brief Return true if the variable is integer. - - This method returns true if the variable is binary or general integer. - */ - virtual bool isInteger(int colIndex) const; - - /// Return true if the variable is general integer - virtual bool isIntegerNonBinary(int colIndex) const; - - /// Return true if the variable is binary and not fixed - virtual bool isFreeBinary(int colIndex) const; - - /*! \brief Return an array[getNumCols()] of column types - - \deprecated See #getColType - */ - inline const char *columnType(bool refresh=false) const - { return getColType(refresh); } - - /*! \brief Return an array[getNumCols()] of column types - - - 0 - continuous - - 1 - binary - - 2 - general integer - - If \p refresh is true, the classification of integer variables as - binary or general integer will be reevaluated. If the current bounds - are [0,1], or if the variable is fixed at 0 or 1, it will be classified - as binary, otherwise it will be classified as general integer. - */ - virtual const char * getColType(bool refresh=false) const; - - /// Get a pointer to a row-wise copy of the matrix - virtual const CoinPackedMatrix * getMatrixByRow() const = 0; - - /// Get a pointer to a column-wise copy of the matrix - virtual const CoinPackedMatrix * getMatrixByCol() const = 0; - - /*! \brief Get a pointer to a mutable row-wise copy of the matrix. - - Returns NULL if the request is not meaningful (i.e., the OSI will not - recognise any modifications to the matrix). - */ - virtual CoinPackedMatrix * getMutableMatrixByRow() const {return NULL;} - - /*! \brief Get a pointer to a mutable column-wise copy of the matrix - - Returns NULL if the request is not meaningful (i.e., the OSI will not - recognise any modifications to the matrix). - */ - virtual CoinPackedMatrix * getMutableMatrixByCol() const {return NULL;} - - /// Get the solver's value for infinity - virtual double getInfinity() const = 0; - //@} - - /**@name Solution query methods */ - //@{ - /// Get a pointer to an array[getNumCols()] of primal variable values - virtual const double * getColSolution() const = 0; - - /** Get a pointer to an array[getNumCols()] of primal variable values - guaranteed to be between the column lower and upper bounds. - */ - virtual const double * getStrictColSolution(); - - /// Get pointer to array[getNumRows()] of dual variable values - virtual const double * getRowPrice() const = 0; - - /// Get a pointer to an array[getNumCols()] of reduced costs - virtual const double * getReducedCost() const = 0; - - /** Get a pointer to array[getNumRows()] of row activity levels. - - The row activity for a row is the left-hand side evaluated at the - current solution. - */ - virtual const double * getRowActivity() const = 0; - - /// Get the objective function value. - virtual double getObjValue() const = 0; - - /** Get the number of iterations it took to solve the problem (whatever - `iteration' means to the solver). - */ - virtual int getIterationCount() const = 0; - - /** Get as many dual rays as the solver can provide. In case of proven - primal infeasibility there should (with high probability) be at least - one. - - The first getNumRows() ray components will always be associated with - the row duals (as returned by getRowPrice()). If \c fullRay is true, - the final getNumCols() entries will correspond to the ray components - associated with the nonbasic variables. If the full ray is requested - and the method cannot provide it, it will throw an exception. - - \note - Implementors of solver interfaces note that the double pointers in - the vector should point to arrays of length getNumRows() (fullRay = - false) or (getNumRows()+getNumCols()) (fullRay = true) and they should - be allocated with new[]. - - \note - Clients of solver interfaces note that it is the client's - responsibility to free the double pointers in the vector using - delete[]. Clients are reminded that a problem can be dual and primal - infeasible. - */ - virtual std::vector getDualRays(int maxNumRays, - bool fullRay = false) const = 0; - - /** Get as many primal rays as the solver can provide. In case of proven - dual infeasibility there should (with high probability) be at least - one. - - \note - Implementors of solver interfaces note that the double pointers in - the vector should point to arrays of length getNumCols() and they - should be allocated with new[]. - - \note - Clients of solver interfaces note that it is the client's - responsibility to free the double pointers in the vector using - delete[]. Clients are reminded that a problem can be dual and primal - infeasible. - */ - virtual std::vector getPrimalRays(int maxNumRays) const = 0; - - /** Get vector of indices of primal variables which are integer variables - but have fractional values in the current solution. */ - virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05) - const; - //@} - - //------------------------------------------------------------------------- - /**@name Methods to modify the objective, bounds, and solution - - For functions which take a set of indices as parameters - (\c setObjCoeffSet(), \c setColSetBounds(), \c setRowSetBounds(), - \c setRowSetTypes()), the parameters follow the C++ STL iterator - convention: \c indexFirst points to the first index in the - set, and \c indexLast points to a position one past the last index - in the set. - - */ - //@{ - /** Set an objective function coefficient */ - virtual void setObjCoeff( int elementIndex, double elementValue ) = 0; - - /** Set a set of objective function coefficients */ - virtual void setObjCoeffSet(const int* indexFirst, - const int* indexLast, - const double* coeffList); - - /** Set the objective coefficients for all columns. - - array [getNumCols()] is an array of values for the objective. - This defaults to a series of set operations and is here for speed. - */ - virtual void setObjective(const double * array); - - /** Set the objective function sense. - - Use 1 for minimisation (default), -1 for maximisation. - - \note - Implementors note that objective function sense is a parameter of - the OSI, not a property of the problem. Objective sense can be - set prior to problem load and should not be affected by loading a - new problem. - */ - virtual void setObjSense(double s) = 0; - - - /** Set a single column lower bound. - Use -getInfinity() for -infinity. */ - virtual void setColLower( int elementIndex, double elementValue ) = 0; - - /** Set the lower bounds for all columns. - - array [getNumCols()] is an array of values for the lower bounds. - This defaults to a series of set operations and is here for speed. - */ - virtual void setColLower(const double * array); - - /** Set a single column upper bound. - Use getInfinity() for infinity. */ - virtual void setColUpper( int elementIndex, double elementValue ) = 0; - - /** Set the upper bounds for all columns. - - array [getNumCols()] is an array of values for the upper bounds. - This defaults to a series of set operations and is here for speed. - */ - virtual void setColUpper(const double * array); - - - /** Set a single column lower and upper bound. - The default implementation just invokes setColLower() and - setColUpper() */ - virtual void setColBounds( int elementIndex, - double lower, double upper ) { - setColLower(elementIndex, lower); - setColUpper(elementIndex, upper); - } - - /** Set the upper and lower bounds of a set of columns. - - The default implementation just invokes setColBounds() over and over - again. For each column, boundList must contain both a lower and - upper bound, in that order. - */ - virtual void setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set a single row lower bound. - Use -getInfinity() for -infinity. */ - virtual void setRowLower( int elementIndex, double elementValue ) = 0; - - /** Set a single row upper bound. - Use getInfinity() for infinity. */ - virtual void setRowUpper( int elementIndex, double elementValue ) = 0; - - /** Set a single row lower and upper bound. - The default implementation just invokes setRowLower() and - setRowUpper() */ - virtual void setRowBounds( int elementIndex, - double lower, double upper ) { - setRowLower(elementIndex, lower); - setRowUpper(elementIndex, upper); - } - - /** Set the bounds on a set of rows. - - The default implementation just invokes setRowBounds() over and over - again. For each row, boundList must contain both a lower and - upper bound, in that order. - */ - virtual void setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - - /** Set the type of a single row */ - virtual void setRowType(int index, char sense, double rightHandSide, - double range) = 0; - - /** Set the type of a set of rows. - The default implementation just invokes setRowType() - over and over again. - */ - virtual void setRowSetTypes(const int* indexFirst, - const int* indexLast, - const char* senseList, - const double* rhsList, - const double* rangeList); - - /** Set the primal solution variable values - - colsol[getNumCols()] is an array of values for the primal variables. - These values are copied to memory owned by the solver interface - object or the solver. They will be returned as the result of - getColSolution() until changed by another call to setColSolution() or - by a call to any solver routine. Whether the solver makes use of the - solution in any way is solver-dependent. - */ - virtual void setColSolution(const double *colsol) = 0; - - /** Set dual solution variable values - - rowprice[getNumRows()] is an array of values for the dual variables. - These values are copied to memory owned by the solver interface - object or the solver. They will be returned as the result of - getRowPrice() until changed by another call to setRowPrice() or by a - call to any solver routine. Whether the solver makes use of the - solution in any way is solver-dependent. - */ - virtual void setRowPrice(const double * rowprice) = 0; - - /** Fix variables at bound based on reduced cost - - For variables currently at bound, fix the variable at bound if the - reduced cost exceeds the gap. Return the number of variables fixed. - - If justInteger is set to false, the routine will also fix continuous - variables, but the test still assumes a delta of 1.0. - */ - virtual int reducedCostFix(double gap, bool justInteger=true); - //@} - - //------------------------------------------------------------------------- - /**@name Methods to set variable type */ - //@{ - /** Set the index-th variable to be a continuous variable */ - virtual void setContinuous(int index) = 0; - /** Set the index-th variable to be an integer variable */ - virtual void setInteger(int index) = 0; - /** Set the variables listed in indices (which is of length len) to be - continuous variables */ - virtual void setContinuous(const int* indices, int len); - /** Set the variables listed in indices (which is of length len) to be - integer variables */ - virtual void setInteger(const int* indices, int len); - //@} - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- - - /*! \brief Data type for name vectors. */ - typedef std::vector OsiNameVec ; - - /*! \name Methods for row and column names - - Osi defines three name management disciplines: `auto names' (0), `lazy - names' (1), and `full names' (2). See the description of - #OsiNameDiscipline for details. Changing the name discipline (via - setIntParam()) will not automatically add or remove name information, - but setting the discipline to auto will make existing information - inaccessible until the discipline is reset to lazy or full. - - By definition, a row index of getNumRows() (i.e., one larger than - the largest valid row index) refers to the objective function. - - OSI users and implementors: While the OSI base class can define an - interface and provide rudimentary support, use of names really depends - on support by the OsiXXX class to ensure that names are managed - correctly. If an OsiXXX class does not support names, it should return - false for calls to getIntParam() or setIntParam() that reference - OsiNameDiscipline. - */ - //@{ - - /*! \brief Generate a standard name of the form Rnnnnnnn or Cnnnnnnn - - Set \p rc to 'r' for a row name, 'c' for a column name. - The `nnnnnnn' part is generated from ndx and will contain 7 digits - by default, padded with zeros if necessary. As a special case, - ndx = getNumRows() is interpreted as a request for the name of the - objective function. OBJECTIVE is returned, truncated to digits+1 - characters to match the row and column names. - */ - virtual std::string dfltRowColName(char rc, - int ndx, unsigned digits = 7) const ; - - /*! \brief Return the name of the objective function */ - - virtual std::string getObjName (unsigned maxLen = static_cast(std::string::npos)) const ; - - /*! \brief Set the name of the objective function */ - - virtual inline void setObjName (std::string name) - { objName_ = name ; } - - /*! \brief Return the name of the row. - - The routine will always return some name, regardless of the name - discipline or the level of support by an OsiXXX derived class. Use - maxLen to limit the length. - */ - virtual std::string getRowName(int rowIndex, - unsigned maxLen = static_cast(std::string::npos)) const ; - - /*! \brief Return a pointer to a vector of row names - - If the name discipline (#OsiNameDiscipline) is auto, the return value - will be a vector of length zero. If the name discipline is lazy, the - vector will contain only names supplied by the client and will be no - larger than needed to hold those names; entries not supplied will be - null strings. In particular, the objective name is not - included in the vector for lazy names. If the name discipline is - full, the vector will have getNumRows() names, either supplied or - generated, plus one additional entry for the objective name. - */ - virtual const OsiNameVec &getRowNames() ; - - /*! \brief Set a row name - - Quietly does nothing if the name discipline (#OsiNameDiscipline) is - auto. Quietly fails if the row index is invalid. - */ - virtual void setRowName(int ndx, std::string name) ; - - /*! \brief Set multiple row names - - The run of len entries starting at srcNames[srcStart] are installed as - row names starting at row index tgtStart. The base class implementation - makes repeated calls to setRowName. - */ - virtual void setRowNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len row names starting at index tgtStart - - The specified row names are removed and the remaining row names are - copied down to close the gap. - */ - virtual void deleteRowNames(int tgtStart, int len) ; - - /*! \brief Return the name of the column - - The routine will always return some name, regardless of the name - discipline or the level of support by an OsiXXX derived class. Use - maxLen to limit the length. - */ - virtual std::string getColName(int colIndex, - unsigned maxLen = static_cast(std::string::npos)) const ; - - /*! \brief Return a pointer to a vector of column names - - If the name discipline (#OsiNameDiscipline) is auto, the return value - will be a vector of length zero. If the name discipline is lazy, the - vector will contain only names supplied by the client and will be no - larger than needed to hold those names; entries not supplied will be - null strings. If the name discipline is full, the vector will have - getNumCols() names, either supplied or generated. - */ - virtual const OsiNameVec &getColNames() ; - - /*! \brief Set a column name - - Quietly does nothing if the name discipline (#OsiNameDiscipline) is - auto. Quietly fails if the column index is invalid. - */ - virtual void setColName(int ndx, std::string name) ; - - /*! \brief Set multiple column names - - The run of len entries starting at srcNames[srcStart] are installed as - column names starting at column index tgtStart. The base class - implementation makes repeated calls to setColName. - */ - virtual void setColNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len column names starting at index tgtStart - - The specified column names are removed and the remaining column names - are copied down to close the gap. - */ - virtual void deleteColNames(int tgtStart, int len) ; - - - /*! \brief Set row and column names from a CoinMpsIO object. - - Also sets the name of the objective function. If the name discipline - is auto, you get what you asked for. This routine does not use - setRowName or setColName. - */ - void setRowColNames(const CoinMpsIO &mps) ; - - /*! \brief Set row and column names from a CoinModel object. - - If the name discipline is auto, you get what you asked for. - This routine does not use setRowName or setColName. - */ - void setRowColNames(CoinModel &mod) ; - - /*! \brief Set row and column names from a CoinLpIO object. - - Also sets the name of the objective function. If the name discipline is - auto, you get what you asked for. This routine does not use setRowName - or setColName. - */ - void setRowColNames(CoinLpIO &mod) ; - - //@} - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- - /**@name Methods to modify the constraint system. - - Note that new columns are added as continuous variables. - */ - //@{ - - /** Add a column (primal variable) to the problem. */ - virtual void addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj) = 0; - - /*! \brief Add a named column (primal variable) to the problem. - - The default implementation adds the column, then changes the name. This - can surely be made more efficient within an OsiXXX class. - */ - virtual void addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj, std::string name) ; - - /** Add a column (primal variable) to the problem. */ - virtual void addCol(int numberElements, - const int* rows, const double* elements, - const double collb, const double colub, - const double obj) ; - - /*! \brief Add a named column (primal variable) to the problem. - - The default implementation adds the column, then changes the name. This - can surely be made more efficient within an OsiXXX class. - */ - virtual void addCol(int numberElements, - const int* rows, const double* elements, - const double collb, const double colub, - const double obj, std::string name) ; - - /** Add a set of columns (primal variables) to the problem. - - The default implementation simply makes repeated calls to - addCol(). - */ - virtual void addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj); - - /** Add a set of columns (primal variables) to the problem. - - The default implementation simply makes repeated calls to - addCol(). - */ - virtual void addCols(const int numcols, const int* columnStarts, - const int* rows, const double* elements, - const double* collb, const double* colub, - const double* obj); - - /// Add columns using a CoinBuild object - void addCols(const CoinBuild & buildObject); - - /** Add columns from a model object. returns - -1 if object in bad state (i.e. has row information) - otherwise number of errors - modelObject non const as can be regularized as part of build - */ - int addCols(CoinModel & modelObject); - -#if 0 - /** */ - virtual void addCols(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj); -#endif - - /** \brief Remove a set of columns (primal variables) from the - problem. - - The solver interface for a basis-oriented solver will maintain valid - warm start information if all deleted variables are nonbasic. - */ - virtual void deleteCols(const int num, const int * colIndices) = 0; - - /*! \brief Add a row (constraint) to the problem. */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub) = 0; - - /*! \brief Add a named row (constraint) to the problem. - - The default implementation adds the row, then changes the name. This - can surely be made more efficient within an OsiXXX class. - */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub, - std::string name) ; - - /*! \brief Add a row (constraint) to the problem. */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng) = 0; - - /*! \brief Add a named row (constraint) to the problem. - - The default implementation adds the row, then changes the name. This - can surely be made more efficient within an OsiXXX class. - */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng, std::string name) ; - - /*! Add a row (constraint) to the problem. - - Converts to addRow(CoinPackedVectorBase&,const double,const double). - */ - virtual void addRow(int numberElements, - const int *columns, const double *element, - const double rowlb, const double rowub) ; - - /*! Add a set of rows (constraints) to the problem. - - The default implementation simply makes repeated calls to - addRow(). - */ - virtual void addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const double* rowlb, const double* rowub); - - /** Add a set of rows (constraints) to the problem. - - The default implementation simply makes repeated calls to - addRow(). - */ - virtual void addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const char* rowsen, const double* rowrhs, - const double* rowrng); - - /** Add a set of rows (constraints) to the problem. - - The default implementation simply makes repeated calls to - addRow(). - */ - virtual void addRows(const int numrows, const int *rowStarts, - const int *columns, const double *element, - const double *rowlb, const double *rowub); - - /// Add rows using a CoinBuild object - void addRows(const CoinBuild &buildObject); - - /*! Add rows from a CoinModel object. - - Returns -1 if the object is in the wrong state (i.e., has - column-major information), otherwise the number of errors. - - The modelObject is not const as it can be regularized as part of - the build. - */ - int addRows(CoinModel &modelObject); - -#if 0 - /** */ - virtual void addRows(const CoinPackedMatrix& matrix, - const double* rowlb, const double* rowub); - /** */ - virtual void addRows(const CoinPackedMatrix& matrix, - const char* rowsen, const double* rowrhs, - const double* rowrng); -#endif - - /** \brief Delete a set of rows (constraints) from the problem. - - The solver interface for a basis-oriented solver will maintain valid - warm start information if all deleted rows are loose. - */ - virtual void deleteRows(const int num, const int * rowIndices) = 0; - - /** \brief Replace the constraint matrix - - I (JJF) am getting annoyed because I can't just replace a matrix. - The default behavior of this is do nothing so only use where that would - not matter, e.g. strengthening a matrix for MIP. - */ - virtual void replaceMatrixOptional(const CoinPackedMatrix & ) {} - - /** \brief Replace the constraint matrix - - And if it does matter (not used at present) - */ - virtual void replaceMatrix(const CoinPackedMatrix & ) {abort();} - - /** \brief Save a copy of the base model - - If solver wants it can save a copy of "base" (continuous) model here. - */ - virtual void saveBaseModel() {} - - /** \brief Reduce the constraint system to the specified number of - constraints. - - If solver wants it can restore a copy of "base" (continuous) model - here. - - \note - The name is somewhat misleading. Implementors should consider - the opportunity to optimise behaviour in the common case where - \p numberRows is exactly the number of original constraints. Do not, - however, neglect the possibility that \p numberRows does not equal - the number of original constraints. - */ - virtual void restoreBaseModel(int numberRows); - //----------------------------------------------------------------------- - /** Apply a collection of cuts. - - Only cuts which have an effectiveness >= effectivenessLb - are applied. -
        -
      • ReturnCode.getNumineffective() -- number of cuts which were - not applied because they had an - effectiveness < effectivenessLb -
      • ReturnCode.getNuminconsistent() -- number of invalid cuts -
      • ReturnCode.getNuminconsistentWrtIntegerModel() -- number of - cuts that are invalid with respect to this integer model -
      • ReturnCode.getNuminfeasible() -- number of cuts that would - make this integer model infeasible -
      • ReturnCode.getNumApplied() -- number of integer cuts which - were applied to the integer model -
      • cs.size() == getNumineffective() + - getNuminconsistent() + - getNuminconsistentWrtIntegerModel() + - getNuminfeasible() + - getNumApplied() -
      - */ - virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs, - double effectivenessLb = 0.0); - - /** Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. - Would be even more efficient to pass an array of pointers. - */ - virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts); - - /** Apply a collection of row cuts which are all effective. - This is passed in as an array of pointers. - */ - virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts); - - /// Deletes branching information before columns deleted - void deleteBranchingInfo(int numberDeleted, const int * which); - - //@} - - //--------------------------------------------------------------------------- - - /**@name Methods for problem input and output */ - //@{ - /*! \brief Load in a problem by copying the arguments. The constraints on - the rows are given by lower and upper bounds. - - If a pointer is 0 then the following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - - Note that the default values for rowub and rowlb produce the - constraint -infty <= ax <= infty. This is probably not what you want. - */ - virtual void loadProblem (const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) = 0; - - /*! \brief Load in a problem by assuming ownership of the arguments. - The constraints on the rows are given by lower and upper bounds. - - For default argument values see the matching loadProblem method. - - \warning - The arguments passed to this method will be freed using the - C++ delete and delete[] functions. - */ - virtual void assignProblem (CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - double*& rowlb, double*& rowub) = 0; - - /*! \brief Load in a problem by copying the arguments. - The constraints on the rows are given by sense/rhs/range triplets. - - If a pointer is 0 then the following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • obj: all variables have 0 objective coefficient -
      • rowsen: all rows are >= -
      • rowrhs: all right hand sides are 0 -
      • rowrng: 0 for the ranged rows -
      - - Note that the default values for rowsen, rowrhs, and rowrng produce the - constraint ax >= 0. - */ - virtual void loadProblem (const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) = 0; - - /*! \brief Load in a problem by assuming ownership of the arguments. - The constraints on the rows are given by sense/rhs/range triplets. - - For default argument values see the matching loadProblem method. - - \warning - The arguments passed to this method will be freed using the - C++ delete and delete[] functions. - */ - virtual void assignProblem (CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - char*& rowsen, double*& rowrhs, - double*& rowrng) = 0; - - /*! \brief Load in a problem by copying the arguments. The constraint - matrix is is specified with standard column-major - column starts / row indices / coefficients vectors. - The constraints on the rows are given by lower and upper bounds. - - The matrix vectors must be gap-free. Note that start must - have numcols+1 entries so that the length of the last column - can be calculated as start[numcols]-start[numcols-1]. - - See the previous loadProblem method using rowlb and rowub for default - argument values. - */ - virtual void loadProblem (const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) = 0; - - /*! \brief Load in a problem by copying the arguments. The constraint - matrix is is specified with standard column-major - column starts / row indices / coefficients vectors. - The constraints on the rows are given by sense/rhs/range triplets. - - The matrix vectors must be gap-free. Note that start must - have numcols+1 entries so that the length of the last column - can be calculated as start[numcols]-start[numcols-1]. - - See the previous loadProblem method using sense/rhs/range for default - argument values. - */ - virtual void loadProblem (const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) = 0; - - /*! \brief Load a model from a CoinModel object. Return the number of - errors encountered. - - The modelObject parameter cannot be const as it may be changed as part - of process. If keepSolution is true will try and keep warmStart. - */ - virtual int loadFromCoinModel (CoinModel & modelObject, - bool keepSolution=false); - - /*! \brief Read a problem in MPS format from the given filename. - - The default implementation uses CoinMpsIO::readMps() to read - the MPS file and returns the number of errors encountered. - */ - virtual int readMps (const char *filename, - const char *extension = "mps") ; - - /*! \brief Read a problem in MPS format from the given full filename. - - This uses CoinMpsIO::readMps() to read the MPS file and returns the - number of errors encountered. It also may return an array of set - information - */ - virtual int readMps (const char *filename, const char*extension, - int & numberSets, CoinSet ** & sets); - - /*! \brief Read a problem in GMPL format from the given filenames. - - The default implementation uses CoinMpsIO::readGMPL(). This capability - is available only if the third-party package Glpk is installed. - */ - virtual int readGMPL (const char *filename, const char *dataname=NULL); - - /*! \brief Write the problem in MPS format to the specified file. - - If objSense is non-zero, a value of -1.0 causes the problem to be - written with a maximization objective; +1.0 forces a minimization - objective. If objSense is zero, the choice is left to the implementation. - */ - virtual void writeMps (const char *filename, - const char *extension = "mps", - double objSense=0.0) const = 0; - - /*! \brief Write the problem in MPS format to the specified file with - more control over the output. - - Row and column names may be null. - formatType is -
        -
      • 0 - normal -
      • 1 - extra accuracy -
      • 2 - IEEE hex -
      - - Returns non-zero on I/O error - */ - int writeMpsNative (const char *filename, - const char ** rowNames, const char ** columnNames, - int formatType=0,int numberAcross=2, - double objSense=0.0, int numberSOS=0, - const CoinSet * setInfo=NULL) const ; - -/***********************************************************************/ -// Lp files - - /** Write the problem into an Lp file of the given filename with the - specified extension. - Coefficients with value less than epsilon away from an integer value - are written as integers. - Write at most numberAcross monomials on a line. - Write non integer numbers with decimals digits after the decimal point. - - The written problem is always a minimization problem. - If the current problem is a maximization problem, the - intended objective function for the written problem is the current - objective function multiplied by -1. If the current problem is a - minimization problem, the intended objective function for the - written problem is the current objective function. - If objSense < 0, the intended objective function is multiplied by -1 - before writing the problem. It is left unchanged otherwise. - - Write objective function name and constraint names if useRowNames is - true. This version calls writeLpNative(). - */ - virtual void writeLp(const char *filename, - const char *extension = "lp", - double epsilon = 1e-5, - int numberAcross = 10, - int decimals = 5, - double objSense = 0.0, - bool useRowNames = true) const; - - /** Write the problem into the file pointed to by the parameter fp. - Other parameters are similar to - those of writeLp() with first parameter filename. - */ - virtual void writeLp(FILE *fp, - double epsilon = 1e-5, - int numberAcross = 10, - int decimals = 5, - double objSense = 0.0, - bool useRowNames = true) const; - - /** Write the problem into an Lp file. Parameters are similar to - those of writeLp(), but in addition row names and column names - may be given. - - Parameter rowNames may be NULL, in which case default row names - are used. If rowNames is not NULL, it must have exactly one entry - per row in the problem and one additional - entry (rowNames[getNumRows()] with the objective function name. - These getNumRows()+1 entries must be distinct. If this is not the - case, default row names - are used. In addition, format restrictions are imposed on names - (see CoinLpIO::is_invalid_name() for details). - - Similar remarks can be made for the parameter columnNames which - must either be NULL or have exactly getNumCols() distinct entries. - - Write objective function name and constraint names if - useRowNames is true. */ - int writeLpNative(const char *filename, - char const * const * const rowNames, - char const * const * const columnNames, - const double epsilon = 1.0e-5, - const int numberAcross = 10, - const int decimals = 5, - const double objSense = 0.0, - const bool useRowNames = true) const; - - /** Write the problem into the file pointed to by the parameter fp. - Other parameters are similar to - those of writeLpNative() with first parameter filename. - */ - int writeLpNative(FILE *fp, - char const * const * const rowNames, - char const * const * const columnNames, - const double epsilon = 1.0e-5, - const int numberAcross = 10, - const int decimals = 5, - const double objSense = 0.0, - const bool useRowNames = true) const; - - /// Read file in LP format from file with name filename. - /// See class CoinLpIO for description of this format. - virtual int readLp(const char *filename, const double epsilon = 1e-5); - - /// Read file in LP format from the file pointed to by fp. - /// See class CoinLpIO for description of this format. - int readLp(FILE *fp, const double epsilon = 1e-5); - - //@} - - //--------------------------------------------------------------------------- - - /**@name Miscellaneous */ - //@{ - /** Check two models against each other. Return nonzero if different. - Ignore names if that set. - (Note initial version does not check names) - May modify both models by cleaning up - */ - int differentModel(OsiSolverInterface & other, - bool ignoreNames=true); -#ifdef COIN_SNAPSHOT - /// Return a CoinSnapshot - virtual CoinSnapshot * snapshot(bool createArrays=true) const; -#endif -#ifdef COIN_FACTORIZATION_INFO - /// Return number of entries in L part of current factorization - virtual CoinBigIndex getSizeL() const; - /// Return number of entries in U part of current factorization - virtual CoinBigIndex getSizeU() const; -#endif - //@} - - //--------------------------------------------------------------------------- - - /**@name Setting/Accessing application data */ - //@{ - /** Set application data. - - This is a pointer that the application can store into and - retrieve from the solver interface. - This field is available for the application to optionally - define and use. - */ - void setApplicationData (void * appData); - /** Create a clone of an Auxiliary Information object. - The base class just stores an application data pointer - but can be more general. Application data pointer is - designed for one user while this can be extended to cope - with more general extensions. - */ - void setAuxiliaryInfo(OsiAuxInfo * auxiliaryInfo); - - /// Get application data - void * getApplicationData() const; - /// Get pointer to auxiliary info object - OsiAuxInfo * getAuxiliaryInfo() const; - //@} - //--------------------------------------------------------------------------- - - /**@name Message handling - - See the COIN library documentation for additional information about - COIN message facilities. - - */ - //@{ - /** Pass in a message handler - - It is the client's responsibility to destroy a message handler installed - by this routine; it will not be destroyed when the solver interface is - destroyed. - */ - virtual void passInMessageHandler(CoinMessageHandler * handler); - /// Set language - void newLanguage(CoinMessages::Language language); - inline void setLanguage(CoinMessages::Language language) - {newLanguage(language);} - /// Return a pointer to the current message handler - inline CoinMessageHandler * messageHandler() const - {return handler_;} - /// Return the current set of messages - inline CoinMessages messages() - {return messages_;} - /// Return a pointer to the current set of messages - inline CoinMessages * messagesPointer() - {return &messages_;} - /// Return true if default handler - inline bool defaultHandler() const - { return defaultHandler_;} - //@} - //--------------------------------------------------------------------------- - /**@name Methods for dealing with discontinuities other than integers. - - Osi should be able to know about SOS and other types. This is an optional - section where such information can be stored. - - */ - //@{ - /** \brief Identify integer variables and create corresponding objects. - - Record integer variables and create an OsiSimpleInteger object for each - one. All existing OsiSimpleInteger objects will be destroyed. - If justCount then no objects created and we just store numberIntegers_ - */ - - void findIntegers(bool justCount); - /** \brief Identify integer variables and SOS and create corresponding objects. - - Record integer variables and create an OsiSimpleInteger object for each - one. All existing OsiSimpleInteger objects will be destroyed. - If the solver supports SOS then do the same for SOS. - - If justCount then no objects created and we just store numberIntegers_ - Returns number of SOS - */ - - virtual int findIntegersAndSOS(bool justCount); - /// Get the number of objects - inline int numberObjects() const { return numberObjects_;} - /// Set the number of objects - inline void setNumberObjects(int number) - { numberObjects_=number;} - - /// Get the array of objects - inline OsiObject ** objects() const { return object_;} - - /// Get the specified object - const inline OsiObject * object(int which) const { return object_[which];} - /// Get the specified object - inline OsiObject * modifiableObject(int which) const { return object_[which];} - - /// Delete all object information - void deleteObjects(); - - /** Add in object information. - - Objects are cloned; the owner can delete the originals. - */ - void addObjects(int numberObjects, OsiObject ** objects); - /** Use current solution to set bounds so current integer feasible solution will stay feasible. - Only feasible bounds will be used, even if current solution outside bounds. The amount of - such violation will be returned (and if small can be ignored) - */ - double forceFeasible(); - //@} - //--------------------------------------------------------------------------- - - /*! @name Methods related to testing generated cuts - - See the documentation for OsiRowCutDebugger for additional details. - */ - //@{ - /*! \brief Activate the row cut debugger. - - If \p modelName is in the set of known models then all cuts are - checked to see that they do NOT cut off the optimal solution known - to the debugger. - */ - virtual void activateRowCutDebugger (const char *modelName); - - /*! \brief Activate the row cut debugger using a full solution array. - - - Activate the debugger for a model not included in the debugger's - internal database. Cuts will be checked to see that they do NOT - cut off the given solution. - - \p solution must be a full solution vector, but only the integer - variables need to be correct. The debugger will fill in the continuous - variables by solving an lp relaxation with the integer variables - fixed as specified. If the given values for the continuous variables - should be preserved, set \p keepContinuous to true. - */ - virtual void activateRowCutDebugger(const double *solution, - bool enforceOptimality = true); - - /*! \brief Get the row cut debugger provided the solution known to the - debugger is within the feasible region held in the solver. - - If there is a row cut debugger object associated with model AND if - the solution known to the debugger is within the solver's current - feasible region (i.e., the column bounds held in the solver are - compatible with the known solution) then a pointer to the debugger - is returned which may be used to test validity of cuts. - - Otherwise NULL is returned - */ - const OsiRowCutDebugger *getRowCutDebugger() const; - - /*! \brief Get the row cut debugger object - - Return the row cut debugger object if it exists. One common usage of - this method is to obtain a debugger object in order to execute - OsiRowCutDebugger::redoSolution (so that the stored solution is again - compatible with the problem held in the solver). - */ - OsiRowCutDebugger * getRowCutDebuggerAlways() const; - //@} - - /*! \name OsiSimplexInterface - \brief Simplex Interface - - Methods for an advanced interface to a simplex solver. The interface - comprises two groups of methods. Group 1 contains methods for tableau - access. Group 2 contains methods for dictating individual simplex pivots. - */ - //@{ - - /*! \brief Return the simplex implementation level. - - The return codes are: - - 0: the simplex interface is not implemented. - - 1: the Group 1 (tableau access) methods are implemented. - - 2: the Group 2 (pivoting) methods are implemented - - The codes are cumulative - a solver which implements Group 2 also - implements Group 1. - */ - virtual int canDoSimplexInterface() const ; - //@} - - /*! \name OsiSimplex Group 1 - \brief Tableau access methods. - - This group of methods provides access to rows and columns of the basis - inverse and to rows and columns of the tableau. - */ - //@{ - - /*! \brief Prepare the solver for the use of tableau access methods. - - Prepares the solver for the use of the tableau access methods, if - any such preparation is required. - - The \c const attribute is required due to the places this method - may be called (e.g., within CglCutGenerator::generateCuts()). - */ - virtual void enableFactorization() const ; - - /*! \brief Undo the effects of #enableFactorization. */ - virtual void disableFactorization() const ; - - /*! \brief Check if an optimal basis is available. - - Returns true if the problem has been solved to optimality and a - basis is available. This should be used to see if the tableau access - operations are possible and meaningful. - - \note - Implementors please note that this method may be called - before #enableFactorization. - */ - virtual bool basisIsAvailable() const ; - - /// Synonym for #basisIsAvailable - inline bool optimalBasisIsAvailable() const { return basisIsAvailable() ; } - - /*! \brief Retrieve status information for column and row variables. - - This method returns status as integer codes: -
        -
      • 0: free -
      • 1: basic -
      • 2: nonbasic at upper bound -
      • 3: nonbasic at lower bound -
      - - The #getWarmStart method provides essentially the same functionality - for a simplex-oriented solver, but the implementation details are very - different. - - \note - Logical variables associated with rows are all assumed to have +1 - coefficients, so for a <= constraint the logical will be at lower - bound if the constraint is tight. - - \note - Implementors may choose to implement this method as a wrapper which - converts a CoinWarmStartBasis to the requested representation. - */ - virtual void getBasisStatus(int* cstat, int* rstat) const ; - - /*! \brief Set the status of column and row variables and update - the basis factorization and solution. - - Status information should be coded as documented for #getBasisStatus. - Returns 0 if all goes well, 1 if something goes wrong. - - This method differs from #setWarmStart in the format of the input - and in its immediate effect. Think of it as #setWarmStart immediately - followed by #resolve, but no pivots are allowed. - - \note - Implementors may choose to implement this method as a wrapper that calls - #setWarmStart and #resolve if the no pivot requirement can be satisfied. - */ - virtual int setBasisStatus(const int* cstat, const int* rstat) ; - - /*! \brief Calculate duals and reduced costs for the given objective - coefficients. - - The solver's objective coefficient vector is not changed. - */ - virtual void getReducedGradient(double* columnReducedCosts, - double* duals, const double* c) const ; - - /*! \brief Get a row of the tableau - - If \p slack is not null, it will be loaded with the coefficients for - the artificial (logical) variables (i.e., the row of the basis inverse). - */ - virtual void getBInvARow(int row, double* z, double* slack = NULL) const ; - - /*! \brief Get a row of the basis inverse */ - virtual void getBInvRow(int row, double* z) const ; - - /*! \brief Get a column of the tableau */ - virtual void getBInvACol(int col, double* vec) const ; - - /*! \brief Get a column of the basis inverse */ - virtual void getBInvCol(int col, double* vec) const ; - - /*! \brief Get indices of basic variables - - If the logical (artificial) for row i is basic, the index should be coded - as (#getNumCols + i). - The order of indices must match the order of elements in the vectors - returned by #getBInvACol and #getBInvCol. - */ - virtual void getBasics(int* index) const ; - - //@} - - /*! \name OsiSimplex Group 2 - \brief Pivoting methods - - This group of methods provides for control of individual pivots by a - simplex solver. - */ - //@{ - - /**Enables normal operation of subsequent functions. - This method is supposed to ensure that all typical things (like - reduced costs, etc.) are updated when individual pivots are executed - and can be queried by other methods. says whether will be - doing primal or dual - */ - virtual void enableSimplexInterface(bool doingPrimal) ; - - ///Undo whatever setting changes the above method had to make - virtual void disableSimplexInterface() ; - /** Perform a pivot by substituting a colIn for colOut in the basis. - The status of the leaving variable is given in outStatus. Where - 1 is to upper bound, -1 to lower bound - Return code was undefined - now for OsiClp is 0 for okay, - 1 if inaccuracy forced re-factorization (should be okay) and - -1 for singular factorization - */ - virtual int pivot(int colIn, int colOut, int outStatus) ; - - /** Obtain a result of the primal pivot - Outputs: colOut -- leaving column, outStatus -- its status, - t -- step size, and, if dx!=NULL, *dx -- primal ray direction. - Inputs: colIn -- entering column, sign -- direction of its change (+/-1). - Both for colIn and colOut, artificial variables are index by - the negative of the row index minus 1. - Return code (for now): 0 -- leaving variable found, - -1 -- everything else? - Clearly, more informative set of return values is required - Primal and dual solutions are updated - */ - virtual int primalPivotResult(int colIn, int sign, - int& colOut, int& outStatus, - double& t, CoinPackedVector* dx); - - /** Obtain a result of the dual pivot (similar to the previous method) - Differences: entering variable and a sign of its change are now - the outputs, the leaving variable and its statuts -- the inputs - If dx!=NULL, then *dx contains dual ray - Return code: same - */ - virtual int dualPivotResult(int& colIn, int& sign, - int colOut, int outStatus, - double& t, CoinPackedVector* dx) ; - //@} - - //--------------------------------------------------------------------------- - - ///@name Constructors and destructors - //@{ - /// Default Constructor - OsiSolverInterface(); - - /** Clone - - The result of calling clone(false) is defined to be equivalent to - calling the default constructor OsiSolverInterface(). - */ - virtual OsiSolverInterface * clone(bool copyData = true) const = 0; - - /// Copy constructor - OsiSolverInterface(const OsiSolverInterface &); - - /// Assignment operator - OsiSolverInterface & operator=(const OsiSolverInterface& rhs); - - /// Destructor - virtual ~OsiSolverInterface (); - - /** Reset the solver interface. - - A call to reset() returns the solver interface to the same state as - it would have if it had just been constructed by calling the default - constructor OsiSolverInterface(). - */ - virtual void reset(); - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected methods - //@{ - /** Apply a row cut (append to the constraint matrix). */ - virtual void applyRowCut( const OsiRowCut & rc ) = 0; - - /** Apply a column cut (adjust the bounds of one or more variables). */ - virtual void applyColCut( const OsiColCut & cc ) = 0; - - /** A quick inlined function to convert from the lb/ub style of - constraint definition to the sense/rhs/range style */ - inline void - convertBoundToSense(const double lower, const double upper, - char& sense, double& right, double& range) const; - /** A quick inlined function to convert from the sense/rhs/range style - of constraint definition to the lb/ub style */ - inline void - convertSenseToBound(const char sense, const double right, - const double range, - double& lower, double& upper) const; - /** A quick inlined function to force a value to be between a minimum and - a maximum value */ - template inline T - forceIntoRange(const T value, const T lower, const T upper) const { - return value < lower ? lower : (value > upper ? upper : value); - } - /** Set OsiSolverInterface object state for default constructor - - This routine establishes the initial values of data fields in the - OsiSolverInterface object when the object is created using the - default constructor. - */ - void setInitialData(); - //@} - - ///@name Protected member data - //@{ - /*! \brief Pointer to row cut debugger object - - Mutable so that we can update the solution held in the debugger while - maintaining const'ness for the Osi object. - */ - mutable OsiRowCutDebugger * rowCutDebugger_; - // Why not just make useful stuff protected? - /// Message handler - CoinMessageHandler * handler_; - /** Flag to say if the currrent handler is the default handler. - Indicates if the solver interface object is responsible - for destruction of the handler (true) or if the client is - responsible (false). - */ - bool defaultHandler_; - /// Messages - CoinMessages messages_; - /// Number of integers - int numberIntegers_; - /// Total number of objects - int numberObjects_; - - /// Integer and ... information (integer info normally at beginning) - OsiObject ** object_; - /** Column type - 0 - continuous - 1 - binary (may get fixed later) - 2 - general integer (may get fixed later) - */ - mutable char * columnType_; - - //@} - - //--------------------------------------------------------------------------- - -private: - ///@name Private member data - //@{ - /// Pointer to user-defined data structure - and more if user wants - OsiAuxInfo * appDataEtc_; - /// Array of integer parameters - int intParam_[OsiLastIntParam]; - /// Array of double parameters - double dblParam_[OsiLastDblParam]; - /// Array of string parameters - std::string strParam_[OsiLastStrParam]; - /// Array of hint parameters - bool hintParam_[OsiLastHintParam]; - /// Array of hint strengths - OsiHintStrength hintStrength_[OsiLastHintParam]; - /** Warm start information used for hot starts when the default - hot start implementation is used. */ - CoinWarmStart* ws_; - /// Column solution satisfying lower and upper column bounds - std::vector strictColSolution_; - - /// Row names - OsiNameVec rowNames_ ; - /// Column names - OsiNameVec colNames_ ; - /// Objective name - std::string objName_ ; - - //@} -}; - -//############################################################################# -/** A quick inlined function to convert from the lb/ub style of constraint - definition to the sense/rhs/range style */ -inline void -OsiSolverInterface::convertBoundToSense(const double lower, const double upper, - char& sense, double& right, - double& range) const -{ - double inf = getInfinity(); - range = 0.0; - if (lower > -inf) { - if (upper < inf) { - right = upper; - if (upper==lower) { - sense = 'E'; - } else { - sense = 'R'; - range = upper - lower; - } - } else { - sense = 'G'; - right = lower; - } - } else { - if (upper < inf) { - sense = 'L'; - right = upper; - } else { - sense = 'N'; - right = 0.0; - } - } -} - -//----------------------------------------------------------------------------- -/** A quick inlined function to convert from the sense/rhs/range style of - constraint definition to the lb/ub style */ -inline void -OsiSolverInterface::convertSenseToBound(const char sense, const double right, - const double range, - double& lower, double& upper) const -{ - double inf=getInfinity(); - switch (sense) { - case 'E': - lower = upper = right; - break; - case 'L': - lower = -inf; - upper = right; - break; - case 'G': - lower = right; - upper = inf; - break; - case 'R': - lower = right - range; - upper = right; - break; - case 'N': - lower = -inf; - upper = inf; - break; - } -} - -#endif diff --git a/thirdparty/linux/include/coin1/OsiSolverParameters.hpp b/thirdparty/linux/include/coin1/OsiSolverParameters.hpp deleted file mode 100644 index 5f607f5a..00000000 --- a/thirdparty/linux/include/coin1/OsiSolverParameters.hpp +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef OsiSolverParameters_H -#define OsiSolverParameters_H - -enum OsiIntParam { - /*! \brief Iteration limit for initial solve and resolve. - - The maximum number of iterations (whatever that means for the given - solver) the solver can execute in the OsiSolverinterface::initialSolve() - and OsiSolverinterface::resolve() methods before terminating. - */ - OsiMaxNumIteration = 0, - /*! \brief Iteration limit for hot start - - The maximum number of iterations (whatever that means for the given - solver) the solver can execute in the - OsiSolverinterface::solveFromHotStart() method before terminating. - */ - OsiMaxNumIterationHotStart, - /*! \brief Handling of row and column names. - - The name discipline specifies how the solver will handle row and column - names: - - 0: Auto names: Names cannot be set by the client. Names of the form - Rnnnnnnn or Cnnnnnnn are generated on demand when a name for a - specific row or column is requested; nnnnnnn is derived from the row - or column index. Requests for a vector of names return a vector with - zero entries. - - 1: Lazy names: Names supplied by the client are retained. Names of the - form Rnnnnnnn or Cnnnnnnn are generated on demand if no name has been - supplied by the client. Requests for a vector of names return a - vector sized to the largest index of a name supplied by the client; - some entries in the vector may be null strings. - - 2: Full names: Names supplied by the client are retained. Names of the - form Rnnnnnnn or Cnnnnnnn are generated on demand if no name has been - supplied by the client. Requests for a vector of names return a - vector sized to match the constraint system, and all entries will - contain either the name specified by the client or a generated name. - */ - OsiNameDiscipline, - /*! \brief End marker. - - Used by OsiSolverInterface to allocate a fixed-sized array to store - integer parameters. - */ - OsiLastIntParam -} ; - -enum OsiDblParam { - /*! \brief Dual objective limit. - - This is to be used as a termination criteria in algorithms where the dual - objective changes monotonically (e.g., dual simplex, volume algorithm). - */ - OsiDualObjectiveLimit = 0, - /*! \brief Primal objective limit. - - This is to be used as a termination criteria in algorithms where the - primal objective changes monotonically (e.g., primal simplex) - */ - OsiPrimalObjectiveLimit, - /*! \brief Dual feasibility tolerance. - - The maximum amount a dual constraint can be violated and still be - considered feasible. - */ - OsiDualTolerance, - /*! \brief Primal feasibility tolerance. - - The maximum amount a primal constraint can be violated and still be - considered feasible. - */ - OsiPrimalTolerance, - /** The value of any constant term in the objective function. */ - OsiObjOffset, - /*! \brief End marker. - - Used by OsiSolverInterface to allocate a fixed-sized array to store - double parameters. - */ - OsiLastDblParam -}; - - -enum OsiStrParam { - /*! \brief The name of the loaded problem. - - This is the string specified on the Name card of an mps file. - */ - OsiProbName = 0, - /*! \brief The name of the solver. - - This parameter is read-only. - */ - OsiSolverName, - /*! \brief End marker. - - Used by OsiSolverInterface to allocate a fixed-sized array to store - string parameters. - */ - OsiLastStrParam -}; - -enum OsiHintParam { - /** Whether to do a presolve in initialSolve */ - OsiDoPresolveInInitial = 0, - /** Whether to use a dual algorithm in initialSolve. - The reverse is to use a primal algorithm */ - OsiDoDualInInitial, - /** Whether to do a presolve in resolve */ - OsiDoPresolveInResolve, - /** Whether to use a dual algorithm in resolve. - The reverse is to use a primal algorithm */ - OsiDoDualInResolve, - /** Whether to scale problem */ - OsiDoScale, - /** Whether to create a non-slack basis (only in initialSolve) */ - OsiDoCrash, - /** Whether to reduce amount of printout, e.g., for branch and cut */ - OsiDoReducePrint, - /** Whether we are in branch and cut - so can modify behavior */ - OsiDoInBranchAndCut, - /** Just a marker, so that OsiSolverInterface can allocate a static sized - array to store parameters. */ - OsiLastHintParam -}; - -enum OsiHintStrength { - /** Ignore hint (default) */ - OsiHintIgnore = 0, - /** This means it is only a hint */ - OsiHintTry, - /** This means do hint if at all possible */ - OsiHintDo, - /** And this means throw an exception if not possible */ - OsiForceDo -}; - -#endif diff --git a/thirdparty/linux/include/coin1/OsiSymSolverInterface.hpp b/thirdparty/linux/include/coin1/OsiSymSolverInterface.hpp deleted file mode 100644 index 46f6514a..00000000 --- a/thirdparty/linux/include/coin1/OsiSymSolverInterface.hpp +++ /dev/null @@ -1,806 +0,0 @@ -/*===========================================================================*/ -/* */ -/* This file is part of the SYMPHONY Branch, Cut, and Price Callable */ -/* Library. */ -/* */ -/* SYMPHONY was jointly developed by Ted Ralphs (tkralphs@lehigh.edu) and */ -/* Laci Ladanyi (ladanyi@us.ibm.com). */ -/* */ -/* (c) Copyright 2004-2006 Ted Ralphs and Lehigh University. */ -/* All Rights Reserved. */ -/* */ -/* The authors of this file are Menal Guzelsoy and Ted Ralphs */ -/* */ -/* This software is licensed under the Eclipse Public License. Please see */ -/* accompanying file for terms. */ -/* */ -/*===========================================================================*/ - -#ifndef OsiSymSolverInterface_hpp -#define OsiSymSolverInterface_hpp - -#include "OsiSolverInterface.hpp" -#include "OsiSymSolverParameters.hpp" -#include "SymWarmStart.hpp" - -#include - -typedef struct SYM_ENVIRONMENT sym_environment; - -//############################################################################# - -/** OSI Solver Interface for SYMPHONY - - Many OsiSolverInterface query methods return a const pointer to the - requested read-only data. If the model data is changed or the solver - is called, these pointers may no longer be valid and should be - refreshed by invoking the member function to obtain an updated copy - of the pointer. - For example: - \code - OsiSolverInterface solverInterfacePtr ; - const double * ruBnds = solverInterfacePtr->getRowUpper(); - solverInterfacePtr->applyCuts(someSetOfCuts); - // ruBnds is no longer a valid pointer and must be refreshed - ruBnds = solverInterfacePtr->getRowUpper(); - \endcode - - Querying a problem that has no data associated with it will result in - zeros for the number of rows and columns, and NULL pointers from - the methods that return vectors. -*/ - -class OsiSymSolverInterface : virtual public OsiSolverInterface { - friend void OsiSymSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); - -public: - ///@name Solve methods - //@{ - /// Solve initial LP relaxation - virtual void initialSolve(); - - /// Resolve an IP problem modification - virtual void resolve(); - - /// Invoke solver's built-in enumeration algorithm - virtual void branchAndBound(); - - /// Invoke solver's multi-criteria enumeration algorithm - virtual void multiCriteriaBranchAndBound(); - - /// Get a lower bound for the new rhs problem using the warm start tree. - virtual double getLbForNewRhs(int cnt, int *index, - double * value); - /// Get an upper bound for the new rhs problem using the warm start tree. - virtual double getUbForNewRhs(int cnt, int *index, - double * value); -#if 0 - /// Get a lower bound for the new obj problem using the warm start tree. - virtual double getLbForNewObj(int cnt, int *index, - double * value); - /// Get an upper bound for the new obj problem using the warm start tree. -#endif - virtual double getUbForNewObj(int cnt, int *index, - double * value); - - //@} - - //--------------------------------------------------------------------------- - /**@name Parameter set/get methods - - The set methods return true if the parameter was set to the given value, - false otherwise. There can be various reasons for failure: the given - parameter is not applicable for the solver (e.g., refactorization - frequency for the volume algorithm), the parameter is not yet implemented - for the solver or simply the value of the parameter is out of the range - the solver accepts. If a parameter setting call returns false check the - details of your solver. - - The get methods return true if the given parameter is applicable for the - solver and is implemented. In this case the value of the parameter is - returned in the second argument. Otherwise they return false. - - */ - //@{ - // Set an integer parameter - virtual bool setIntParam(OsiIntParam key, int value); - - // Set SYMPHONY int parameter - virtual bool setSymParam(OsiSymIntParam key, int value); - - // Set SYMPHONY int parameter directly by the C interface parameter name - virtual bool setSymParam(const std::string key, int value); - - - // Set an double parameter - virtual bool setDblParam(OsiDblParam key, double value); - - // Set SYMPHONY double parameter - virtual bool setSymParam(OsiSymDblParam key, double value); - - // Set SYMPHONY double parameter directly by the C interface parameter name - virtual bool setSymParam(const std::string key, double value); - - - - // Set a string parameter - virtual bool setStrParam(OsiStrParam key, const std::string & value); - - // Set SYMPHONY string parameter - virtual bool setSymParam(OsiSymStrParam key, const std::string & value); - - // Set SYMPHONY string parameter directly by the C interface parameter name - virtual bool setSymParam(const std::string key, const std::string value); - - - - // Get an integer parameter - virtual bool getIntParam(OsiIntParam key, int& value) const; - - // Get SYMPHONY int parameter - virtual bool getSymParam(OsiSymIntParam key, int& value) const; - - // Get SYMPHONY int parameter directly by the C interface parameter name - virtual bool getSymParam(const std::string key, int& value) const; - - - // Get an double parameter - virtual bool getDblParam(OsiDblParam key, double& value) const; - - // Get SYMPHONY double parameter - virtual bool getSymParam(OsiSymDblParam key, double& value) const; - - // Get SYMPHONY double parameter directly by the C interface parameter name - virtual bool getSymParam(const std::string key, double& value) const; - - - - // Get a string parameter - virtual bool getStrParam(OsiStrParam key, std::string& value) const; - - // Get SYMPHONY string parameter - virtual bool getSymParam(OsiSymStrParam key, std::string& value) const; - - // Get SYMPHONY string parameter directly by the C interface parameter name - virtual bool getSymParam(const std::string key, std::string& value) const; - - //@} - - //--------------------------------------------------------------------------- - ///@name Methods returning info on how the solution process terminated - //@{ - /// Are there numerical difficulties? - virtual bool isAbandoned() const; - - /// Is optimality proven? - virtual bool isProvenOptimal() const; - - /// Is primal infeasiblity proven? - virtual bool isProvenPrimalInfeasible() const; - - /// Is dual infeasiblity proven? - virtual bool isProvenDualInfeasible() const { - throw CoinError("Error: Function not implemented", - "isProvenDualInfeasible", "OsiSymSolverInterface"); - } - /// Is the given primal objective limit reached? - //virtual bool isPrimalObjectiveLimitReached() const; - - /// Is the given dual objective limit reached? - //virtual bool isDualObjectiveLimitReached() const{ - // throw CoinError("Error: Function not implemented", - // "isDualObjectiveLimitReached", "OsiSymSolverInterface"); - //} - /// Iteration limit reached? - virtual bool isIterationLimitReached() const; - - /// Time limit reached? - virtual bool isTimeLimitReached() const; - - /// Target gap achieved? - virtual bool isTargetGapReached() const; - - //@} - - //--------------------------------------------------------------------------- - /**@name Warm start methods */ - //@{ - /*! \brief Get an empty warm start object - - This routine returns an empty warm start object. Its purpose is - to provide a way to give a client a warm start object of the - appropriate type, which can resized and modified as desired. - */ - - virtual CoinWarmStart *getEmptyWarmStart () const{ - throw CoinError("Error: Function not implemented", - "getEmptyWarmStart", "OsiSymSolverInterface"); - } - - /** Get warm start information. - - If there is no valid solution, an empty warm start object (0 rows, 0 - columns) wil be returned. - */ - - /* - virtual CoinWarmStart* getWarmStart(bool keepTreeInSymEnv = false) const; - */ - - virtual CoinWarmStart* getWarmStart() const; - - /** Set warm start information. - - Return true/false depending on whether the warm start information was - accepted or not. */ - virtual bool setWarmStart(const CoinWarmStart* warmstart); - //@} - - //--------------------------------------------------------------------------- - /**@name Problem query methods - - Querying a problem that has no data associated with it will result in - zeros for the number of rows and columns, and NULL pointers from - the methods that return vectors. - - Const pointers returned from any data-query method are valid as - long as the data is unchanged and the solver is not called. - */ - //@{ - /// Get pointer to SYMPHONY environment (eventually we won't need this) - sym_environment *getSymphonyEnvironment() const {return env_;} - - /// Get number of columns - virtual int getNumCols() const; - - /// Get number of rows - virtual int getNumRows() const; - - /// Get number of nonzero elements - virtual int getNumElements() const; - - /// Get pointer to array[getNumCols()] of column lower bounds - virtual const double * getColLower() const; - - /// Get pointer to array[getNumCols()] of column upper bounds - virtual const double * getColUpper() const; - - /** Get pointer to array[getNumRows()] of row constraint senses. -
        -
      • 'L': <= constraint -
      • 'E': = constraint -
      • 'G': >= constraint -
      • 'R': ranged constraint -
      • 'N': free constraint -
      - */ - virtual const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of row right-hand sides -
        -
      • if getRowSense()[i] == 'L' then - getRightHandSide()[i] == getRowUpper()[i] -
      • if getRowSense()[i] == 'G' then - getRightHandSide()[i] == getRowLower()[i] -
      • if getRowSense()[i] == 'R' then - getRightHandSide()[i] == getRowUpper()[i] -
      • if getRowSense()[i] == 'N' then - getRightHandSide()[i] == 0.0 -
      - */ - virtual const double * getRightHandSide() const; - - /** Get pointer to array[getNumRows()] of row ranges. -
        -
      • if getRowSense()[i] == 'R' then - getRowRange()[i] == getRowUpper()[i] - getRowLower()[i] -
      • if getRowSense()[i] != 'R' then - getRowRange()[i] is 0.0 -
      - */ - virtual const double * getRowRange() const; - - /// Get pointer to array[getNumRows()] of row lower bounds - virtual const double * getRowLower() const; - - /// Get pointer to array[getNumRows()] of row upper bounds - virtual const double * getRowUpper() const; - - /// Get pointer to array[getNumCols()] of objective function coefficients - virtual const double * getObjCoefficients() const; - - /** Get pointer to array[getNumCols()] of second - objective function coefficients if loaded before. - */ - virtual const double * getObj2Coefficients() const; - - /// Get objective function sense (1 for min (default), -1 for max) - virtual double getObjSense() const; - - /// Return true if variable is continuous - virtual bool isContinuous(int colIndex) const; - - /// Return true if variable is binary - virtual bool isBinary(int colIndex) const; - - /** Return true if column is integer. - Note: This function returns true if the the column - is binary or a general integer. - */ - virtual bool isInteger(int colIndex) const; - - /// Return true if variable is general integer - virtual bool isIntegerNonBinary(int colIndex) const; - - /// Return true if variable is binary and not fixed at either bound - virtual bool isFreeBinary(int colIndex) const; - - /// Get pointer to row-wise copy of matrix - virtual const CoinPackedMatrix * getMatrixByRow() const; - - /// Get pointer to column-wise copy of matrix - virtual const CoinPackedMatrix * getMatrixByCol() const; - - /// Get solver's value for infinity - virtual double getInfinity() const; - - //@} - - /**@name Solution query methods */ - //@{ - /// Get pointer to array[getNumCols()] of primal variable values - virtual const double * getColSolution() const; - - /// Get pointer to array[getNumRows()] of dual variable values - virtual const double * getRowPrice() const; - - /// Get a pointer to array[getNumCols()] of reduced costs - virtual const double * getReducedCost() const; - - /** Get pointer to array[getNumRows()] of row activity levels (constraint - matrix times the solution vector). */ - virtual const double * getRowActivity() const; - - /// Get objective function value - virtual double getObjValue() const; - - /// Get the current upper/lower bound - virtual double getPrimalBound() const; - - /** Get the number of iterations it took to solve the problem (whatever - ``iteration'' means to the solver). */ - virtual int getIterationCount() const; - - /** Get as many dual rays as the solver can provide. In case of proven - primal infeasibility there should be at least one. - - \note - Implementors of solver interfaces note that - the double pointers in the vector should point to arrays of length - getNumRows() and they should be allocated via new[]. - - \note - Clients of solver interfaces note that - it is the client's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getDualRays(int maxNumRays, - bool fullRay = false) const{ - throw CoinError("Error: Function not implemented", - "getDualRays", "OsiSymSolverInterface"); - } - /** Get as many primal rays as the solver can provide. (In case of proven - dual infeasibility there should be at least one.) - - NOTE for implementers of solver interfaces:
      - The double pointers in the vector should point to arrays of length - getNumCols() and they should be allocated via new[].
      - - NOTE for users of solver interfaces:
      - It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getPrimalRays(int maxNumRays) const{ - throw CoinError("Error: Function not implemented", - "getPrimalRays", "OsiSymSolverInterface"); - } - - //@} - - //------------------------------------------------------------------------- - /**@name Methods to modify the objective, bounds, and solution - - For functions which take a set of indices as parameters - (\c setObjCoeffSet(), \c setColSetBounds(), \c setRowSetBounds(), - \c setRowSetTypes()), the parameters follow the C++ STL iterator - convention: \c indexFirst points to the first index in the - set, and \c indexLast points to a position one past the last index - in the set. - - */ - //@{ - /** Set an objective function coefficient */ - virtual void setObjCoeff( int elementIndex, double elementValue ); - - /** Set an objective function coefficient for the second objective */ - virtual void setObj2Coeff( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColLower ; - /** Set a single column lower bound. - Use -getInfinity() for -infinity. */ - virtual void setColLower( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColUpper ; - /** Set a single column upper bound. - Use getInfinity() for infinity. */ - virtual void setColUpper( int elementIndex, double elementValue ); - - /** Set a single row lower bound. - Use -getInfinity() for -infinity. */ - virtual void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound. - Use getInfinity() for infinity. */ - virtual void setRowUpper( int elementIndex, double elementValue ); - - /** Set the type of a single row */ - virtual void setRowType(int index, char sense, double rightHandSide, - double range); - - /// Set the objective function sense. - /// (1 for min (default), -1 for max) - virtual void setObjSense(double s); - - /** Set the primal solution variable values - - colsol[getNumCols()] is an array of values for the primal variables. - These values are copied to memory owned by the solver interface object - or the solver. They will be returned as the result of getColSolution() - until changed by another call to setColSolution() or by a call to any - solver routine. Whether the solver makes use of the solution in any - way is solver-dependent. - */ - virtual void setColSolution(const double *colsol); - - /** Set the a priori upper/lower bound */ - - virtual void setPrimalBound(const double bound); - - /** Set dual solution variable values - - rowprice[getNumRows()] is an array of values for the dual - variables. These values are copied to memory owned by the solver - interface object or the solver. They will be returned as the result of - getRowPrice() until changed by another call to setRowPrice() or by a - call to any solver routine. Whether the solver makes use of the - solution in any way is solver-dependent. - */ - - virtual void setRowPrice(const double * rowprice); - - //@} - - //------------------------------------------------------------------------- - /**@name Methods to set variable type */ - //@{ - - using OsiSolverInterface::setContinuous ; - /** Set the index-th variable to be a continuous variable */ - virtual void setContinuous(int index); - - using OsiSolverInterface::setInteger ; - /** Set the index-th variable to be an integer variable */ - virtual void setInteger(int index); - - - using OsiSolverInterface::setColName ; - virtual void setColName(char **colname); - - //@} - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- - /**@name Methods to expand a problem. - - Note that new columns are added as continuous variables. - - */ - //@{ - - using OsiSolverInterface::addCol ; - /** Add a column (primal variable) to the problem. */ - virtual void addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj); - - /** Remove a set of columns (primal variables) from the problem. */ - virtual void deleteCols(const int num, const int * colIndices); - - using OsiSolverInterface::addRow ; - /** Add a row (constraint) to the problem. */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub); - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng); - - /** Delete a set of rows (constraints) from the problem. */ - virtual void deleteRows(const int num, const int * rowIndices); - - //@} - - //--------------------------------------------------------------------------- - - /**@name Methods to input a problem */ - //@{ - - virtual void loadProblem(); - - /** Load in an problem by copying the arguments (the constraints on the - rows are given by lower and upper bounds). If a pointer is 0 then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • rowub: all rows have upper bound infinity -
      • rowlb: all rows have lower bound -infinity -
      • obj: all variables have 0 objective coefficient -
      - */ - virtual void loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub); - - /** Load in an problem by assuming ownership of the arguments (the - constraints on the rows are given by lower and upper bounds). - For default values see the previous method. - - \warning - The arguments passed to this method will be - freed using the C++ delete and delete[] - functions. - */ - virtual void assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - double*& rowlb, double*& rowub); - - /** Load in an problem by copying the arguments (the constraints on the - rows are given by sense/rhs/range triplets). If a pointer is 0 then the - following values are the default: -
        -
      • colub: all columns have upper bound infinity -
      • collb: all columns have lower bound 0 -
      • obj: all variables have 0 objective coefficient -
      • rowsen: all rows are >= -
      • rowrhs: all right hand sides are 0 -
      • rowrng: 0 for the ranged rows -
      - */ - virtual void loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng); - - /** Load in an problem by assuming ownership of the arguments (the - constraints on the rows are given by sense/rhs/range triplets). For - default values see the previous method. - - \warning - The arguments passed to this method will be - freed using the C++ delete and delete[] - functions. - */ - virtual void assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, double*& obj, - char*& rowsen, double*& rowrhs, - double*& rowrng); - - /** Just like the other loadProblem() methods except that the matrix is - given in a standard column major ordered format (without gaps). */ - virtual void loadProblem(const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub); - - /** Just like the other loadProblem() methods except that the matrix is - given in a standard column major ordered format (without gaps). */ - virtual void loadProblem(const int numcols, const int numrows, - const CoinBigIndex * start, const int* index, - const double* value, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng); - - /** Write the problem in MPS format to the specified file. - - If objSense is non-zero, a value of -1.0 causes the problem to be - written with a maximization objective; +1.0 forces a minimization - objective. If objSense is zero, the choice is left to implementation. - */ - virtual void writeMps(const char *filename, - const char *extension = "mps", - double objSense=0.0) const; - - void parseCommandLine(int argc, char **argv); - - using OsiSolverInterface::readMps ; - virtual int readMps(const char * infile, const char *extension = "mps"); - - virtual int readGMPL(const char * modelFile, const char * dataFile=NULL); - - void findInitialBounds(); - - int createPermanentCutPools(); - - //@} - - //--------------------------------------------------------------------------- - - enum keepCachedFlag { - /// discard all cached data (default) - KEEPCACHED_NONE = 0, - /// column information: objective values, lower and upper bounds, variable types - KEEPCACHED_COLUMN = 1, - /// row information: right hand sides, ranges and senses, lower and upper bounds for row - KEEPCACHED_ROW = 2, - /// problem matrix: matrix ordered by column and by row - KEEPCACHED_MATRIX = 4, - /// LP solution: primal and dual solution, reduced costs, row activities - KEEPCACHED_RESULTS = 8, - /// only discard cached LP solution - KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX, - /// keep all cached data (similar to getMutableLpPtr()) - KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS, - /// free only cached column and LP solution information - FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN, - /// free only cached row and LP solution information - FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW, - /// free only cached matrix and LP solution information - FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX, - /// free only cached LP solution information - FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS - }; - - ///@name Constructors and destructors - //@{ - /// Default Constructor - OsiSymSolverInterface(); - - /** Clone - - The result of calling clone(false) is defined to be equivalent to - calling the default constructor OsiSolverInterface(). - */ - virtual OsiSolverInterface * clone(bool copyData = true) const; - - /// Copy constructor - OsiSymSolverInterface(const OsiSymSolverInterface &); - - /// Assignment operator - OsiSymSolverInterface & operator=(const OsiSymSolverInterface& rhs); - - /// Destructor - virtual ~OsiSymSolverInterface (); - - /** Reset the solver interface. - - A call to reset() returns the solver interface to the same state as - it would have if it had just been constructed by calling the default - constructor OsiSolverInterface(). - */ - virtual void reset(); - //@} - - //--------------------------------------------------------------------------- - -protected: - ///@name Protected methods - //@{ - /** Apply a row cut (append to the constraint matrix). */ - virtual void applyRowCut( const OsiRowCut & rc ); - - /** Apply a column cut (adjust the bounds of one or more variables). */ - virtual void applyColCut( const OsiColCut & cc ); - - /** Set OsiSolverInterface object state for default constructor - - This routine establishes the initial values of data fields in the - OsiSolverInterface object when the object is created using the - default constructor. - */ - - void setInitialData(); - //@} - -private: - - /// The real work of the constructor - void gutsOfConstructor(); - - /// The real work of the destructor - void gutsOfDestructor(); - - /// free cached column rim vectors - void freeCachedColRim(); - - /// free cached row rim vectors - void freeCachedRowRim(); - - /// free cached result vectors - void freeCachedResults(); - - /// free cached matrices - void freeCachedMatrix(); - - /// free all cached data (except specified entries, see getLpPtr()) - void freeCachedData( int keepCached = KEEPCACHED_NONE ); - - /// free all allocated memory - void freeAllMemory(); - - /**@name Private member data */ - //@{ - /// The pointer to the SYMPHONY problem environment - sym_environment *env_; - //@} - - /// Pointer to objective vector - mutable double *obj_; - - /// Pointer to second objective vector to be used in bicriteria solver - mutable double *obj2_; - - /// Pointer to dense vector of variable lower bounds - mutable double *collower_; - - /// Pointer to dense vector of variable lower bounds - mutable double *colupper_; - - /// Pointer to dense vector of variable lower bounds - mutable double *colredcost_; - - /// Pointer to dense vector of row sense indicators - mutable char *rowsense_; - - /// Pointer to dense vector of row right-hand side values - mutable double *rhs_; - - /** Pointer to dense vector of slack upper bounds for range constraints - (undefined for non-range rows) - */ - mutable double *rowrange_; - - /// Pointer to dense vector of row lower bounds - mutable double *rowlower_; - - /// Pointer to dense vector of row upper bounds - mutable double *rowupper_; - - /// Pointer to dense vector of row prices - mutable double *rowprice_; - - /// Pointer to primal solution vector - mutable double *colsol_; - - /// Pointer to row activity (slack) vector - mutable double *rowact_; - - /// Pointer to row-wise copy of problem matrix coefficients. - mutable CoinPackedMatrix *matrixByRow_; - - /// Pointer to row-wise copy of problem matrix coefficients. - mutable CoinPackedMatrix *matrixByCol_; - -}; - -//############################################################################# -/** A function that tests the methods in the OsiSymSolverInterface class. */ -void OsiSymSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); - -#endif diff --git a/thirdparty/linux/include/coin1/OsiSymSolverParameters.hpp b/thirdparty/linux/include/coin1/OsiSymSolverParameters.hpp deleted file mode 100644 index 041accec..00000000 --- a/thirdparty/linux/include/coin1/OsiSymSolverParameters.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/*===========================================================================*/ -/* */ -/* This file is part of the SYMPHONY Branch, Cut, and Price Callable */ -/* Library. */ -/* */ -/* SYMPHONY was jointly developed by Ted Ralphs (tkralphs@lehigh.edu) and */ -/* Laci Ladanyi (ladanyi@us.ibm.com). */ -/* */ -/* (c) Copyright 2004-2006 Ted Ralphs and Lehigh University. */ -/* All Rights Reserved. */ -/* */ -/* The authors of this file are Menal Guzelsoy and Ted Ralphs */ -/* */ -/* This software is licensed under the Eclipse Public License. Please see */ -/* accompanying file for terms. */ -/* */ -/*===========================================================================*/ - -#ifndef OsiSymSolverParameters_hpp -#define OsiSymSolverParameters_hpp - -enum OsiSymIntParam { - /** This controls the level of output */ - OsiSymMaxActiveNodes, - OsiSymVerbosity, - OsiSymNodeLimit, - OsiSymFindFirstFeasible, - OsiSymSearchStrategy, - OsiSymUsePermanentCutPools, - OsiSymKeepWarmStart, - OsiSymDoReducedCostFixing, - OsiSymMCFindSupportedSolutions, - OsiSymSensitivityAnalysis, - OsiSymRandomSeed, - OsiSymDivingStrategy, - OsiSymDivingK, - OsiSymDivingThreshold, - OsiSymTrimWarmTree, - OsiSymGenerateCglGomoryCuts, - OsiSymGenerateCglKnapsackCuts, - OsiSymGenerateCglOddHoleCuts, - OsiSymGenerateCglProbingCuts, - OsiSymGenerateCglFlowAndCoverCuts, - OsiSymGenerateCglRoundingCuts, - OsiSymGenerateCglLiftAndProjectCuts, - OsiSymGenerateCglCliqueCuts -}; - -enum OsiSymDblParam { - /** The granularity is the actual minimum difference in objective function - value for two solutions that actually have do different objective - function values. For integer programs with integral objective function - coefficients, this would be 1, for instance. */ - OsiSymGranularity, - OsiSymTimeLimit, - OsiSymGapLimit, - OsiSymUpperBound, - OsiSymLowerBound -}; - -enum OsiSymStrParam { -}; - -#endif diff --git a/thirdparty/linux/include/coin1/OsiUnitTests.hpp b/thirdparty/linux/include/coin1/OsiUnitTests.hpp deleted file mode 100644 index fbb4fc1e..00000000 --- a/thirdparty/linux/include/coin1/OsiUnitTests.hpp +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (C) 2010 -// All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -/*! \file OsiUnitTests.hpp - - Utility methods for OSI unit tests. -*/ - -#ifndef OSISOLVERINTERFACETEST_HPP_ -#define OSISOLVERINTERFACETEST_HPP_ - -#include -#include -#include -#include -#include -#include -#include -#include - -class OsiSolverInterface; -class CoinPackedVectorBase; - -/** A function that tests that a lot of problems given in MPS files (mostly the NETLIB problems) solve properly with all the specified solvers. - * - * The routine creates a vector of NetLib problems (problem name, objective, - * various other characteristics), and a vector of solvers to be tested. - * - * Each solver is run on each problem. The run is deemed successful if the - * solver reports the correct problem size after loading and returns the - * correct objective value after optimization. - - * If multiple solvers are available, the results are compared pairwise against - * the results reported by adjacent solvers in the solver vector. Due to - * limitations of the volume solver, it must be the last solver in vecEmptySiP. - */ -void OsiSolverInterfaceMpsUnitTest - (const std::vector & vecEmptySiP, - const std::string& mpsDir); - -/** A function that tests the methods in the OsiSolverInterface class. - * Some time ago, if this method is compiled with optimization, - * the compilation took 10-15 minutes and the machine pages (has 256M core memory!)... - */ -void OsiSolverInterfaceCommonUnitTest - (const OsiSolverInterface* emptySi, - const std::string& mpsDir, - const std::string& netlibDir); - -/** A function that tests the methods in the OsiColCut class. */ -void OsiColCutUnitTest - (const OsiSolverInterface * baseSiP, - const std::string & mpsDir); - -/** A function that tests the methods in the OsiRowCut class. */ -void OsiRowCutUnitTest - (const OsiSolverInterface * baseSiP, - const std::string & mpsDir); - -/** A function that tests the methods in the OsiRowCutDebugger class. */ -void OsiRowCutDebuggerUnitTest - (const OsiSolverInterface * siP, - const std::string & mpsDir); - -/** A function that tests the methods in the OsiCuts class. */ -void OsiCutsUnitTest(); - -/// A namespace so we can define a few `global' variables to use during tests. -namespace OsiUnitTest { - -class TestOutcomes; - -/*! \brief Verbosity level of unit tests - - 0 (default) for minimal output; larger numbers produce more output -*/ -extern unsigned int verbosity; - -/*! \brief Behaviour on failing a test - - - 0 (= default) continue - - 1 press any key to continue - - 2 stop with abort() -*/ -extern unsigned int haltonerror; - -/*! \brief Test outcomes - - A global TestOutcomes object to store test outcomes during the run of the unit test - for an OSI. - */ -extern TestOutcomes outcomes; - -/*! \brief Print an error message - - Formatted as "XxxSolverInterface testing issue: message" where Xxx is the string - provided as \p solverName. - - Flushes std::cout before printing to std::cerr. -*/ -void failureMessage(const std::string &solverName, - const std::string &message) ; -/// \overload -void failureMessage(const OsiSolverInterface &si, - const std::string &message) ; - -/*! \brief Print an error message, specifying the test name and condition - - Formatted as "XxxSolverInterface testing issue: testname failed: testcond" where - Xxx is the OsiStrParam::OsiSolverName parameter of the \p si. - Flushes std::cout before printing to std::cerr. -*/ -void failureMessage(const std::string &solverName, - const std::string &testname, const std::string &testcond) ; - -/// \overload -void failureMessage(const OsiSolverInterface &si, - const std::string &testname, const std::string &testcond) ; - -/*! \brief Print a message. - - Prints the message as given. Flushes std::cout before printing to std::cerr. -*/ -void testingMessage(const char *const msg) ; - -/*! \brief Utility method to check equality - - Tests for equality using CoinRelFltEq with tolerance \p tol. Understands the - notion of solver infinity and obtains the value for infinity from the solver - interfaces supplied as parameters. -*/ -bool equivalentVectors(const OsiSolverInterface * si1, - const OsiSolverInterface * si2, - double tol, const double * v1, const double * v2, int size) ; - -/*! \brief Compare two problems for equality - - Compares the problems held in the two solvers: constraint matrix, row and column - bounds, column type, and objective. Rows are checked using upper and lower bounds - and using sense, bound, and range. -*/ -bool compareProblems(OsiSolverInterface *osi1, OsiSolverInterface *osi2) ; - -/*! \brief Compare a packed vector with an expanded vector - - Checks that all values present in the packed vector are present in the full vector - and checks that there are no extra entries in the full vector. Uses CoinRelFltEq - with the default tolerance. -*/ -bool isEquivalent(const CoinPackedVectorBase &pv, int n, const double *fv) ; - -/*! \brief Process command line parameters. - - An unrecognised keyword which is not in the \p ignorekeywords map will trigger the - help message and a return value of false. For each keyword in \p ignorekeywords, you - can specify the number of following parameters that should be ignored. - - This should be replaced with the one of the standard CoinUtils parameter mechanisms. - */ -bool processParameters (int argc, const char **argv, - std::map& parms, - const std::map& ignorekeywords = std::map()); - -/// A single test outcome record. -class TestOutcome { - public: - /// Test result - typedef enum { - NOTE = 0, - PASSED = 1, - WARNING = 2, - ERROR = 3, - LAST = 4 - } SeverityLevel; - /// Print strings for SeverityLevel - static std::string SeverityLevelName[LAST]; - /// Name of component under test - std::string component; - /// Name of test - std::string testname; - /// Condition being tested - std::string testcond; - /// Test result - SeverityLevel severity; - /// Set to true if problem is expected - bool expected; - /// Name of code file where test executed - std::string filename; - /// Line number in code file where test executed - int linenumber; - /// Standard constructor - TestOutcome(const std::string& comp, const std::string& tst, - const char* cond, SeverityLevel sev, - const char* file, int line, bool exp = false) - : component(comp),testname(tst),testcond(cond),severity(sev), - expected(exp),filename(file),linenumber(line) - { } - /// Print the test outcome - void print() const; -}; - -/// Utility class to maintain a list of test outcomes. -class TestOutcomes : public std::list { - public: - /// Add an outcome to the list - void add(std::string comp, std::string tst, const char* cond, - TestOutcome::SeverityLevel sev, const char* file, int line, - bool exp = false) - { push_back(TestOutcome(comp,tst,cond,sev,file,line,exp)); } - - /*! \brief Add an outcome to the list - - Get the component name from the solver interface. - */ - void add(const OsiSolverInterface& si, std::string tst, const char* cond, - TestOutcome::SeverityLevel sev, const char* file, int line, - bool exp = false); - /// Print the list of outcomes - void print() const; - /*! \brief Count total and expected outcomes at given severity level - - Given a severity level, walk the list of outcomes and count the total number - of outcomes at this severity level and the number expected. - */ - void getCountBySeverity(TestOutcome::SeverityLevel sev, - int& total, int& expected) const; -}; - -/// Convert parameter to a string (stringification) -#define OSIUNITTEST_QUOTEME_(x) #x -/// Convert to string with one level of expansion of the parameter -#define OSIUNITTEST_QUOTEME(x) OSIUNITTEST_QUOTEME_(x) - -template -bool OsiUnitTestAssertSeverityExpected( - bool condition, const char * condition_str, const char *filename, - int line, const Component& component, const std::string& testname, - TestOutcome::SeverityLevel severity, bool expected) -{ - if (condition) { - OsiUnitTest::outcomes.add(component, testname, condition_str, - OsiUnitTest::TestOutcome::PASSED, filename, line, false); - if (OsiUnitTest::verbosity >= 2) { - std::ostringstream successmsg; - successmsg << __FILE__ << ":" << __LINE__ << ": " << testname - << " (condition \'" << condition_str << "\') passed.\n"; - OsiUnitTest::testingMessage(successmsg.str().c_str()); - } - return true; - } - OsiUnitTest::outcomes.add(component, testname, condition_str, - severity, filename, line, expected); - OsiUnitTest::failureMessage(component, testname, condition_str); - switch (OsiUnitTest::haltonerror) { - case 2: - { if (severity >= OsiUnitTest::TestOutcome::ERROR ) std::abort(); break; } - case 1: - { std::cout << std::endl << "press any key to continue..." << std::endl; - std::getchar(); - break ; } - default: ; - } - return false; -} - -/// Add a test outcome to the list held in OsiUnitTest::outcomes -#define OSIUNITTEST_ADD_OUTCOME(component,testname,testcondition,severity,expected) \ - OsiUnitTest::outcomes.add(component,testname,testcondition,severity,\ - __FILE__,__LINE__,expected) -/*! \brief Test for a condition and record the result - - Test \p condition and record the result in OsiUnitTest::outcomes. - If it succeeds, record the result as OsiUnitTest::TestOutcome::PASSED and print - a message for OsiUnitTest::verbosity >= 2. - If it fails, record the test as failed with \p severity and \p expected and - react as specified by OsiUnitTest::haltonerror. - - \p failurecode is executed when failure is not fatal. -*/ -#define OSIUNITTEST_ASSERT_SEVERITY_EXPECTED(condition,failurecode,component,\ - testname, severity, expected) \ -{ \ - if (!OsiUnitTestAssertSeverityExpected(condition, #condition, \ - __FILE__, __LINE__, component, testname, severity, expected)) { \ - failurecode; \ - } \ -} - -/*! \brief Perform a test with severity OsiUnitTest::TestOutcome::ERROR, failure not - expected. -*/ -#define OSIUNITTEST_ASSERT_ERROR(condition, failurecode, component, testname) \ - OSIUNITTEST_ASSERT_SEVERITY_EXPECTED(condition,failurecode,component,testname,\ - OsiUnitTest::TestOutcome::ERROR,false) - -/*! \brief Perform a test with severity OsiUnitTest::TestOutcome::WARNING, failure - not expected. -*/ -#define OSIUNITTEST_ASSERT_WARNING(condition, failurecode, component, testname) \ - OSIUNITTEST_ASSERT_SEVERITY_EXPECTED(condition,failurecode,component,testname,\ - OsiUnitTest::TestOutcome::WARNING,false) - -/*! \brief Perform a test surrounded by a try/catch block - - \p trycode is executed in a try/catch block; if there's no throw the test is deemed - to have succeeded and is recorded in OsiUnitTest::outcomes with status - OsiUnitTest::TestOutcome::PASSED. If the \p trycode throws a CoinError, the failure - is recorded with status \p severity and \p expected and the value of - OsiUnitTest::haltonerror is consulted. If the failure is not fatal, \p catchcode is - executed. If any other error is thrown, the failure is recorded as for a CoinError - and \p catchcode is executed (haltonerror is not consulted). -*/ -#define OSIUNITTEST_CATCH_SEVERITY_EXPECTED(trycode, catchcode, component, testname,\ - severity, expected) \ -{ \ - try { \ - trycode; \ - OSIUNITTEST_ADD_OUTCOME(component,testname,#trycode " did not throw exception",\ - OsiUnitTest::TestOutcome::PASSED,false); \ - if (OsiUnitTest::verbosity >= 2) { \ - std::string successmsg( __FILE__ ":" OSIUNITTEST_QUOTEME(__LINE__) ": "); \ - successmsg = successmsg + testname; \ - successmsg = successmsg + " (code \'" #trycode "\') did not throw exception"; \ - successmsg = successmsg + ".\n" ; \ - OsiUnitTest::testingMessage(successmsg.c_str()); \ - } \ - } catch (CoinError& e) { \ - std::stringstream errmsg; \ - errmsg << #trycode " threw CoinError: " << e.message(); \ - if (e.className().length() > 0) \ - errmsg << " in " << e.className(); \ - if (e.methodName().length() > 0) \ - errmsg << " in " << e.methodName(); \ - if (e.lineNumber() >= 0) \ - errmsg << " at " << e.fileName() << ":" << e.lineNumber(); \ - OSIUNITTEST_ADD_OUTCOME(component,testname,errmsg.str().c_str(),\ - severity,expected); \ - OsiUnitTest::failureMessage(component,testname,errmsg.str().c_str()); \ - switch(OsiUnitTest::haltonerror) { \ - case 2: \ - { if (severity >= OsiUnitTest::TestOutcome::ERROR) abort(); break; } \ - case 1: \ - { std::cout << std::endl << "press any key to continue..." << std::endl; \ - getchar(); \ - break ; } \ - default: ; \ - } \ - catchcode; \ - } catch (...) { \ - std::string errmsg; \ - errmsg = #trycode; \ - errmsg = errmsg + " threw unknown exception"; \ - OSIUNITTEST_ADD_OUTCOME(component,testname,errmsg.c_str(),severity,false); \ - OsiUnitTest::failureMessage(component,testname,errmsg.c_str()); \ - catchcode; \ - } \ -} - -/*! \brief Perform a try/catch test with severity OsiUnitTest::TestOutcome::ERROR, - failure not expected. -*/ -#define OSIUNITTEST_CATCH_ERROR(trycode, catchcode, component, testname) \ - OSIUNITTEST_CATCH_SEVERITY_EXPECTED(trycode, catchcode, component, testname, OsiUnitTest::TestOutcome::ERROR, false) - -/*! \brief Perform a try/catch test with severity OsiUnitTest::TestOutcome::WARNING, - failure not expected. -*/ -#define OSIUNITTEST_CATCH_WARNING(trycode, catchcode, component, testname) \ - OSIUNITTEST_CATCH_SEVERITY_EXPECTED(trycode, catchcode, component, testname, OsiUnitTest::TestOutcome::WARNING, false) - -} // end namespace OsiUnitTest - -#endif /*OSISOLVERINTERFACETEST_HPP_*/ diff --git a/thirdparty/linux/include/coin1/PardisoLoader.h b/thirdparty/linux/include/coin1/PardisoLoader.h deleted file mode 100644 index 0942521a..00000000 --- a/thirdparty/linux/include/coin1/PardisoLoader.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2008 GAMS Development and others - All Rights Reserved. - This code is published under the Eclipse Public License. - - $Id: PardisoLoader.h 2204 2013-04-13 13:49:26Z stefan $ - - Author: Stefan Vigerske -*/ - -#ifndef PARDISOLOADER_H_ -#define PARDISOLOADER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - /** Tries to load a dynamically linked library with Pardiso. - * Return a failure if the library cannot be loaded or not all Pardiso symbols are found. - * @param libname The name under which the Pardiso lib can be found, or NULL to use a default name (libpardiso.SHAREDLIBEXT). - * @param msgbuf A buffer where we can store a failure message. Assumed to be NOT NULL! - * @param msglen Length of the message buffer. - * @return Zero on success, nonzero on failure. - */ - int LSL_loadPardisoLib(const char* libname, char* msgbuf, int msglen); - - /** Unloads a loaded Pardiso library. - * @return Zero on success, nonzero on failure. - */ - int LSL_unloadPardisoLib(); - - /** Indicates whether a Pardiso library has been successfully loaded. - * @return Zero if not loaded, nonzero if handle is loaded - */ - int LSL_isPardisoLoaded(); - - /** Returns name of the shared library that should contain Pardiso */ - char* LSL_PardisoLibraryName(); -#ifdef __cplusplus -} -#endif - -#endif /*PARADISOLOADER_H_*/ diff --git a/thirdparty/linux/include/coin1/SymConfig.h b/thirdparty/linux/include/coin1/SymConfig.h deleted file mode 100644 index d3c548e7..00000000 --- a/thirdparty/linux/include/coin1/SymConfig.h +++ /dev/null @@ -1,19 +0,0 @@ -/* include/config_sym.h. Generated by configure. */ -/* include/config_sym.h.in. */ - -#ifndef __CONFIG_SYM_H__ -#define __CONFIG_SYM_H__ - -/* Version number of project */ -#define SYMPHONY_VERSION "5.6.10" - -/* Major Version number of project */ -#define SYMPHONY_VERSION_MAJOR 5 - -/* Minor Version number of project */ -#define SYMPHONY_VERSION_MINOR 6 - -/* Release Version number of project */ -#define SYMPHONY_VERSION_RELEASE 10 - -#endif diff --git a/thirdparty/linux/include/coin1/SymWarmStart.hpp b/thirdparty/linux/include/coin1/SymWarmStart.hpp deleted file mode 100644 index 74089d17..00000000 --- a/thirdparty/linux/include/coin1/SymWarmStart.hpp +++ /dev/null @@ -1,72 +0,0 @@ -/*===========================================================================*/ -/* */ -/* This file is part of the SYMPHONY Branch, Cut, and Price Callable */ -/* Library. */ -/* */ -/* SYMPHONY was jointly developed by Ted Ralphs (tkralphs@lehigh.edu) and */ -/* Laci Ladanyi (ladanyi@us.ibm.com). */ -/* */ -/* (c) Copyright 2004-2006 Ted Ralphs and Lehigh University. */ -/* All Rights Reserved. */ -/* */ -/* The authors of this file are Menal Guzelsoy and Ted Ralphs */ -/* */ -/* This software is licensed under the Eclipse Public License. Please see */ -/* accompanying file for terms. */ -/* */ -/*===========================================================================*/ - -#ifndef SymWarmStart_H -#define SymWarmStart_H - -#include "CoinWarmStart.hpp" - -typedef struct WARM_START_DESC warm_start_desc; - -//############################################################################# - -class SymWarmStart : public CoinWarmStart -{ - -public: - - /* Default constructor. Will do nothing! */ - SymWarmStart(){} - - /* Initialize the warmStart_ using the given warm start. If dominate - WarmStart is set, then, SymWarmStart will take the control of the - given description, otherwise, will copy everything. - */ - SymWarmStart(warm_start_desc * ws); - - /*Get the warmStart info from a file*/ - SymWarmStart(char *f); - - /* Copy constructor */ - SymWarmStart(const SymWarmStart & symWS); - - /* Destructor */ - virtual ~SymWarmStart(); - - /* Clone the warmstart */ - virtual CoinWarmStart * clone() const; - - /* Get the pointer to the loaded warmStart_ */ - virtual warm_start_desc * getCopyOfWarmStartDesc(); - - /* Move the pointer to the rootnode of the warmStart to another - node which will change the underlying tree - */ - // virtual void setRoot(bc_node *root) {} //FIX_ME! Ask Prof. Ralphs. - - /* Write the current warm start info to a file */ - virtual int writeToFile(char * f); - -private: - - /* Private warm start desc. to keep everything */ - warm_start_desc *warmStart_; - -}; - -#endif diff --git a/thirdparty/linux/include/coin1/ThirdParty/defs.h b/thirdparty/linux/include/coin1/ThirdParty/defs.h deleted file mode 100644 index 22095405..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/defs.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * defs.h - * - * This file contains constant definitions - * - * Started 8/27/94 - * George - * - * $Id: defs.h,v 1.1 1998/11/27 17:59:13 karypis Exp $ - * - */ - -#define METISTITLE " METIS 4.0.3 Copyright 1998, Regents of the University of Minnesota\n\n" -#define MAXLINE 1280000 - -#define LTERM (void **) 0 /* List terminator for GKfree() */ - -#define MAXNCON 16 /* The maximum number of constrains */ -#define MAXNOBJ 16 /* The maximum number of objectives */ - -#define PLUS_GAINSPAN 500 /* Parameters for FM buckets */ -#define NEG_GAINSPAN 500 - -#define HTLENGTH ((1<<11)-1) - -/* Meaning of various options[] parameters */ -#define OPTION_PTYPE 0 -#define OPTION_CTYPE 1 -#define OPTION_ITYPE 2 -#define OPTION_RTYPE 3 -#define OPTION_DBGLVL 4 -#define OPTION_OFLAGS 5 -#define OPTION_PFACTOR 6 -#define OPTION_NSEPS 7 - -#define OFLAG_COMPRESS 1 /* Try to compress the graph */ -#define OFLAG_CCMP 2 /* Find and order connected components */ - - -/* Default options for PMETIS */ -#define PMETIS_CTYPE MATCH_SHEM -#define PMETIS_ITYPE IPART_GGPKL -#define PMETIS_RTYPE RTYPE_FM -#define PMETIS_DBGLVL 0 - -/* Default options for KMETIS */ -#define KMETIS_CTYPE MATCH_SHEM -#define KMETIS_ITYPE IPART_PMETIS -#define KMETIS_RTYPE RTYPE_KWAYRANDOM_MCONN -#define KMETIS_DBGLVL 0 - -/* Default options for OEMETIS */ -#define OEMETIS_CTYPE MATCH_SHEM -#define OEMETIS_ITYPE IPART_GGPKL -#define OEMETIS_RTYPE RTYPE_FM -#define OEMETIS_DBGLVL 0 - -/* Default options for ONMETIS */ -#define ONMETIS_CTYPE MATCH_SHEM -#define ONMETIS_ITYPE IPART_GGPKL -#define ONMETIS_RTYPE RTYPE_SEP1SIDED -#define ONMETIS_DBGLVL 0 -#define ONMETIS_OFLAGS OFLAG_COMPRESS -#define ONMETIS_PFACTOR -1 -#define ONMETIS_NSEPS 1 - -/* Default options for McPMETIS */ -#define McPMETIS_CTYPE MATCH_SHEBM_ONENORM -#define McPMETIS_ITYPE IPART_RANDOM -#define McPMETIS_RTYPE RTYPE_FM -#define McPMETIS_DBGLVL 0 - -/* Default options for McKMETIS */ -#define McKMETIS_CTYPE MATCH_SHEBM_ONENORM -#define McKMETIS_ITYPE IPART_McHPMETIS -#define McKMETIS_RTYPE RTYPE_KWAYRANDOM -#define McKMETIS_DBGLVL 0 - -/* Default options for KVMETIS */ -#define KVMETIS_CTYPE MATCH_SHEM -#define KVMETIS_ITYPE IPART_PMETIS -#define KVMETIS_RTYPE RTYPE_KWAYRANDOM -#define KVMETIS_DBGLVL 0 - - -/* Operations supported by stand-alone code */ -#define OP_PMETIS 1 -#define OP_KMETIS 2 -#define OP_OEMETIS 3 -#define OP_ONMETIS 4 -#define OP_ONWMETIS 5 -#define OP_KVMETIS 6 - - -/* Matching Schemes */ -#define MATCH_RM 1 -#define MATCH_HEM 2 -#define MATCH_SHEM 3 -#define MATCH_SHEMKWAY 4 -#define MATCH_SHEBM_ONENORM 5 -#define MATCH_SHEBM_INFNORM 6 -#define MATCH_SBHEM_ONENORM 7 -#define MATCH_SBHEM_INFNORM 8 - -/* Initial partitioning schemes for PMETIS and ONMETIS */ -#define IPART_GGPKL 1 -#define IPART_GGPKLNODE 2 -#define IPART_RANDOM 2 - -/* Refinement schemes for PMETIS */ -#define RTYPE_FM 1 - -/* Initial partitioning schemes for KMETIS */ -#define IPART_PMETIS 1 - -/* Refinement schemes for KMETIS */ -#define RTYPE_KWAYRANDOM 1 -#define RTYPE_KWAYGREEDY 2 -#define RTYPE_KWAYRANDOM_MCONN 3 - -/* Refinement schemes for ONMETIS */ -#define RTYPE_SEP2SIDED 1 -#define RTYPE_SEP1SIDED 2 - -/* Initial Partitioning Schemes for McKMETIS */ -#define IPART_McPMETIS 1 /* Simple McPMETIS */ -#define IPART_McHPMETIS 2 /* horizontally relaxed McPMETIS */ - -#define UNMATCHED -1 - -#define HTABLE_EMPTY -1 - -#define NGR_PASSES 4 /* Number of greedy refinement passes */ -#define NLGR_PASSES 5 /* Number of GR refinement during IPartition */ - -#define LARGENIPARTS 8 /* Number of random initial partitions */ -#define SMALLNIPARTS 3 /* Number of random initial partitions */ - -#define COARSEN_FRACTION 0.75 /* Node reduction between succesive coarsening levels */ -#define COARSEN_FRACTION2 0.90 /* Node reduction between succesive coarsening levels */ -#define UNBALANCE_FRACTION 1.05 - -#define COMPRESSION_FRACTION 0.85 - -#define ORDER_UNBALANCE_FRACTION 1.10 - -#define MMDSWITCH 200 - -#define HORIZONTAL_IMBALANCE 1.05 - -/* Debug Levels */ -#define DBG_TIME 1 /* Perform timing analysis */ -#define DBG_OUTPUT 2 -#define DBG_COARSEN 4 /* Show the coarsening progress */ -#define DBG_REFINE 8 /* Show info on communication during folding */ -#define DBG_IPART 16 /* Show info on initial partition */ -#define DBG_MOVEINFO 32 /* Show info on communication during folding */ -#define DBG_KWAYPINFO 64 /* Show info on communication during folding */ -#define DBG_SEPINFO 128 /* Show info on communication during folding */ diff --git a/thirdparty/linux/include/coin1/ThirdParty/dmumps_c.h b/thirdparty/linux/include/coin1/ThirdParty/dmumps_c.h deleted file mode 100644 index 1d5c2c91..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/dmumps_c.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * - * This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011 - * - * - * This version of MUMPS is provided to you free of charge. It is public - * domain, based on public domain software developed during the Esprit IV - * European project PARASOL (1996-1999). Since this first public domain - * version in 1999, research and developments have been supported by the - * following institutions: CERFACS, CNRS, ENS Lyon, INPT(ENSEEIHT)-IRIT, - * INRIA, and University of Bordeaux. - * - * The MUMPS team at the moment of releasing this version includes - * Patrick Amestoy, Maurice Bremond, Alfredo Buttari, Abdou Guermouche, - * Guillaume Joslin, Jean-Yves L'Excellent, Francois-Henry Rouet, Bora - * Ucar and Clement Weisbecker. - * - * We are also grateful to Emmanuel Agullo, Caroline Bousquet, Indranil - * Chowdhury, Philippe Combes, Christophe Daniel, Iain Duff, Vincent Espirat, - * Aurelia Fevre, Jacko Koster, Stephane Pralet, Chiara Puglisi, Gregoire - * Richard, Tzvetomila Slavova, Miroslav Tuma and Christophe Voemel who - * have been contributing to this project. - * - * Up-to-date copies of the MUMPS package can be obtained - * from the Web pages: - * http://mumps.enseeiht.fr/ or http://graal.ens-lyon.fr/MUMPS - * - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY - * EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * - * User documentation of any code that uses this software can - * include this complete notice. You can acknowledge (using - * references [1] and [2]) the contribution of this package - * in any scientific publication dependent upon the use of the - * package. You shall use reasonable endeavours to notify - * the authors of the package of this publication. - * - * [1] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, - * A fully asynchronous multifrontal solver using distributed dynamic - * scheduling, SIAM Journal of Matrix Analysis and Applications, - * Vol 23, No 1, pp 15-41 (2001). - * - * [2] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and - * S. Pralet, Hybrid scheduling for the parallel solution of linear - * systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). - * - */ - -/* Mostly written in march 2002 (JYL) */ - -#ifndef DMUMPS_C_H -#define DMUMPS_C_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "mumps_compat.h" -/* Next line defines MUMPS_INT, DMUMPS_COMPLEX and DMUMPS_REAL */ -#include "mumps_c_types.h" - -#ifndef MUMPS_VERSION -/* Protected in case headers of other arithmetics are included */ -#define MUMPS_VERSION "4.10.0" -#endif -#ifndef MUMPS_VERSION_MAX_LEN -#define MUMPS_VERSION_MAX_LEN 14 -#endif - -/* - * Definition of the (simplified) MUMPS C structure. - * NB: DMUMPS_COMPLEX are REAL types in s and d arithmetics. - */ -typedef struct { - - MUMPS_INT sym, par, job; - MUMPS_INT comm_fortran; /* Fortran communicator */ - MUMPS_INT icntl[40]; - DMUMPS_REAL cntl[15]; - MUMPS_INT n; - - MUMPS_INT nz_alloc; /* used in matlab interface to decide if we - free + malloc when we have large variation */ - - /* Assembled entry */ - MUMPS_INT nz; - MUMPS_INT *irn; - MUMPS_INT *jcn; - DMUMPS_COMPLEX *a; - - /* Distributed entry */ - MUMPS_INT nz_loc; - MUMPS_INT *irn_loc; - MUMPS_INT *jcn_loc; - DMUMPS_COMPLEX *a_loc; - - /* Element entry */ - MUMPS_INT nelt; - MUMPS_INT *eltptr; - MUMPS_INT *eltvar; - DMUMPS_COMPLEX *a_elt; - - /* Ordering, if given by user */ - MUMPS_INT *perm_in; - - /* Orderings returned to user */ - MUMPS_INT *sym_perm; /* symmetric permutation */ - MUMPS_INT *uns_perm; /* column permutation */ - - /* Scaling (input only in this version) */ - DMUMPS_REAL *colsca; - DMUMPS_REAL *rowsca; - - /* RHS, solution, ouptput data and statistics */ - DMUMPS_COMPLEX *rhs, *redrhs, *rhs_sparse, *sol_loc; - MUMPS_INT *irhs_sparse, *irhs_ptr, *isol_loc; - MUMPS_INT nrhs, lrhs, lredrhs, nz_rhs, lsol_loc; - MUMPS_INT schur_mloc, schur_nloc, schur_lld; - MUMPS_INT mblock, nblock, nprow, npcol; - MUMPS_INT info[40],infog[40]; - DMUMPS_REAL rinfo[40], rinfog[40]; - - /* Null space */ - MUMPS_INT deficiency; - MUMPS_INT *pivnul_list; - MUMPS_INT *mapping; - - /* Schur */ - MUMPS_INT size_schur; - MUMPS_INT *listvar_schur; - DMUMPS_COMPLEX *schur; - - /* Internal parameters */ - MUMPS_INT instance_number; - DMUMPS_COMPLEX *wk_user; - - /* Version number: length=14 in FORTRAN + 1 for final \0 + 1 for alignment */ - char version_number[MUMPS_VERSION_MAX_LEN + 1 + 1]; - /* For out-of-core */ - char ooc_tmpdir[256]; - char ooc_prefix[64]; - /* To save the matrix in matrix market format */ - char write_problem[256]; - MUMPS_INT lwk_user; - -} DMUMPS_STRUC_C; - - -void MUMPS_CALL -dmumps_c( DMUMPS_STRUC_C * dmumps_par ); - -#ifdef __cplusplus -} -#endif - -#endif /* DMUMPS_C_H */ - diff --git a/thirdparty/linux/include/coin1/ThirdParty/macros.h b/thirdparty/linux/include/coin1/ThirdParty/macros.h deleted file mode 100644 index fdf0ade1..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/macros.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * macros.h - * - * This file contains macros used in multilevel - * - * Started 9/25/94 - * George - * - * $Id: macros.h,v 1.1 1998/11/27 17:59:18 karypis Exp $ - * - */ - - -/************************************************************************* -* The following macro returns a random number in the specified range -**************************************************************************/ -#ifdef __VC__ -#define RandomInRange(u) ((rand()>>3)%(u)) -#define RandomInRangeFast(u) ((rand()>>3)%(u)) -#else -#define RandomInRange(u) ((int)(drand48()*((double)(u)))) -#define RandomInRangeFast(u) ((rand()>>3)%(u)) -#endif - - - -#define amax(a, b) ((a) >= (b) ? (a) : (b)) -#define amin(a, b) ((a) >= (b) ? (b) : (a)) - -#define AND(a, b) ((a) < 0 ? ((-(a))&(b)) : ((a)&(b))) -#define OR(a, b) ((a) < 0 ? -((-(a))|(b)) : ((a)|(b))) -#define XOR(a, b) ((a) < 0 ? -((-(a))^(b)) : ((a)^(b))) - -#define SWAP(a, b, tmp) \ - do {(tmp) = (a); (a) = (b); (b) = (tmp);} while(0) - -#define INC_DEC(a, b, val) \ - do {(a) += (val); (b) -= (val);} while(0) - - -#define scopy(n, a, b) (float *)memcpy((void *)(b), (void *)(a), sizeof(float)*(n)) -#define idxcopy(n, a, b) (idxtype *)memcpy((void *)(b), (void *)(a), sizeof(idxtype)*(n)) - -#define HASHFCT(key, size) ((key)%(size)) - - -/************************************************************************* -* Timer macros -**************************************************************************/ -#define cleartimer(tmr) (tmr = 0.0) -#define starttimer(tmr) (tmr -= seconds()) -#define stoptimer(tmr) (tmr += seconds()) -#define gettimer(tmr) (tmr) - - -/************************************************************************* -* This macro is used to handle dbglvl -**************************************************************************/ -#define IFSET(a, flag, cmd) if ((a)&(flag)) (cmd); - -/************************************************************************* -* These macros are used for debuging memory leaks -**************************************************************************/ -#ifdef DMALLOC -#define imalloc(n, msg) (malloc(sizeof(int)*(n))) -#define fmalloc(n, msg) (malloc(sizeof(float)*(n))) -#define idxmalloc(n, msg) (malloc(sizeof(idxtype)*(n))) -#define ismalloc(n, val, msg) (iset((n), (val), malloc(sizeof(int)*(n)))) -#define idxsmalloc(n, val, msg) (idxset((n), (val), malloc(sizeof(idxtype)*(n)))) -#define GKmalloc(a, b) (malloc((a))) -#endif - -#ifdef DMALLOC -# define MALLOC_CHECK(ptr) \ - if (malloc_verify((ptr)) == DMALLOC_VERIFY_ERROR) { \ - printf("***MALLOC_CHECK failed on line %d of file %s: " #ptr "\n", \ - __LINE__, __FILE__); \ - abort(); \ - } -#else -# define MALLOC_CHECK(ptr) ; -#endif - - - -/************************************************************************* -* This macro converts a length array in a CSR one -**************************************************************************/ -#define MAKECSR(i, n, a) \ - do { \ - for (i=1; i0; i--) a[i] = a[i-1]; \ - a[0] = 0; \ - } while(0) - - -/************************************************************************* -* These macros insert and remove nodes from the boundary list -**************************************************************************/ -#define BNDInsert(nbnd, bndind, bndptr, vtx) \ - do { \ - ASSERT(bndptr[vtx] == -1); \ - bndind[nbnd] = vtx; \ - bndptr[vtx] = nbnd++;\ - } while(0) - -#define BNDDelete(nbnd, bndind, bndptr, vtx) \ - do { \ - ASSERT(bndptr[vtx] != -1); \ - bndind[bndptr[vtx]] = bndind[--nbnd]; \ - bndptr[bndind[nbnd]] = bndptr[vtx]; \ - bndptr[vtx] = -1; \ - } while(0) - - - -/************************************************************************* -* These are debugging macros -**************************************************************************/ -#ifdef DEBUG -# define ASSERT(expr) \ - if (!(expr)) { \ - printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ - __LINE__, __FILE__); \ - abort(); \ - } -#else -# define ASSERT(expr) ; -#endif - -#ifdef DEBUG -# define ASSERTP(expr, msg) \ - if (!(expr)) { \ - printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ - __LINE__, __FILE__); \ - printf msg ; \ - abort(); \ - } -#else -# define ASSERTP(expr, msg) ; -#endif diff --git a/thirdparty/linux/include/coin1/ThirdParty/mpi.h b/thirdparty/linux/include/coin1/ThirdParty/mpi.h deleted file mode 100644 index 7ab0c373..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/mpi.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * - * This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011 - * - * - * This version of MUMPS is provided to you free of charge. It is public - * domain, based on public domain software developed during the Esprit IV - * European project PARASOL (1996-1999). Since this first public domain - * version in 1999, research and developments have been supported by the - * following institutions: CERFACS, CNRS, ENS Lyon, INPT(ENSEEIHT)-IRIT, - * INRIA, and University of Bordeaux. - * - * The MUMPS team at the moment of releasing this version includes - * Patrick Amestoy, Maurice Bremond, Alfredo Buttari, Abdou Guermouche, - * Guillaume Joslin, Jean-Yves L'Excellent, Francois-Henry Rouet, Bora - * Ucar and Clement Weisbecker. - * - * We are also grateful to Emmanuel Agullo, Caroline Bousquet, Indranil - * Chowdhury, Philippe Combes, Christophe Daniel, Iain Duff, Vincent Espirat, - * Aurelia Fevre, Jacko Koster, Stephane Pralet, Chiara Puglisi, Gregoire - * Richard, Tzvetomila Slavova, Miroslav Tuma and Christophe Voemel who - * have been contributing to this project. - * - * Up-to-date copies of the MUMPS package can be obtained - * from the Web pages: - * http://mumps.enseeiht.fr/ or http://graal.ens-lyon.fr/MUMPS - * - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY - * EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * - * User documentation of any code that uses this software can - * include this complete notice. You can acknowledge (using - * references [1] and [2]) the contribution of this package - * in any scientific publication dependent upon the use of the - * package. You shall use reasonable endeavours to notify - * the authors of the package of this publication. - * - * [1] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, - * A fully asynchronous multifrontal solver using distributed dynamic - * scheduling, SIAM Journal of Matrix Analysis and Applications, - * Vol 23, No 1, pp 15-41 (2001). - * - * [2] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and - * S. Pralet, Hybrid scheduling for the parallel solution of linear - * systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). - * - */ - -#ifndef MUMPS_MPI_H -#define MUMPS_MPI_H - -/* We define all symbols as extern "C" for users who call MUMPS with its - libseq from a C++ driver. */ -#ifdef __cplusplus -extern "C" { -#endif - -/* This is the minimum to have the C interface of MUMPS work. - * Most of the time, users who need this file have no call to MPI functions in - * their own code. Hence it is not worth declaring all MPI functions here. - * However if some users come to request some more stub functions of the MPI - * standards, we may add them. But it is not worth doing it until then. */ - -typedef int MPI_Comm; /* Simple type for MPI communicator */ -static MPI_Comm MPI_COMM_WORLD=(MPI_Comm)0; - -int MPI_Init(int *pargc, char ***pargv); -int MPI_Comm_rank(int comm, int *rank); -int MPI_Finalize(void); - -#ifdef __cplusplus -} -#endif - -#endif /* MUMPS_MPI_H */ diff --git a/thirdparty/linux/include/coin1/ThirdParty/mumps_c_types.h b/thirdparty/linux/include/coin1/ThirdParty/mumps_c_types.h deleted file mode 100644 index aef62128..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/mumps_c_types.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * - * This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011 - * - * - * This version of MUMPS is provided to you free of charge. It is public - * domain, based on public domain software developed during the Esprit IV - * European project PARASOL (1996-1999). Since this first public domain - * version in 1999, research and developments have been supported by the - * following institutions: CERFACS, CNRS, ENS Lyon, INPT(ENSEEIHT)-IRIT, - * INRIA, and University of Bordeaux. - * - * The MUMPS team at the moment of releasing this version includes - * Patrick Amestoy, Maurice Bremond, Alfredo Buttari, Abdou Guermouche, - * Guillaume Joslin, Jean-Yves L'Excellent, Francois-Henry Rouet, Bora - * Ucar and Clement Weisbecker. - * - * We are also grateful to Emmanuel Agullo, Caroline Bousquet, Indranil - * Chowdhury, Philippe Combes, Christophe Daniel, Iain Duff, Vincent Espirat, - * Aurelia Fevre, Jacko Koster, Stephane Pralet, Chiara Puglisi, Gregoire - * Richard, Tzvetomila Slavova, Miroslav Tuma and Christophe Voemel who - * have been contributing to this project. - * - * Up-to-date copies of the MUMPS package can be obtained - * from the Web pages: - * http://mumps.enseeiht.fr/ or http://graal.ens-lyon.fr/MUMPS - * - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY - * EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * - * User documentation of any code that uses this software can - * include this complete notice. You can acknowledge (using - * references [1] and [2]) the contribution of this package - * in any scientific publication dependent upon the use of the - * package. You shall use reasonable endeavours to notify - * the authors of the package of this publication. - * - * [1] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, - * A fully asynchronous multifrontal solver using distributed dynamic - * scheduling, SIAM Journal of Matrix Analysis and Applications, - * Vol 23, No 1, pp 15-41 (2001). - * - * [2] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and - * S. Pralet, Hybrid scheduling for the parallel solution of linear - * systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). - * - */ - - -#ifndef MUMPS_C_TYPES_H -#define MUMPS_C_TYPES_H - -#define MUMPS_INT int - -#define SMUMPS_COMPLEX float -#define SMUMPS_REAL float - -#define DMUMPS_COMPLEX double -#define DMUMPS_REAL double - -/* Complex datatypes */ -typedef struct {float r,i;} mumps_complex; -typedef struct {double r,i;} mumps_double_complex; - -#define CMUMPS_COMPLEX mumps_complex -#define CMUMPS_REAL float - -#define ZMUMPS_COMPLEX mumps_double_complex -#define ZMUMPS_REAL double - - -#ifndef mumps_ftnlen -/* When passing a string, what is the type of the extra argument - * passed by value ? */ -# define mumps_ftnlen int -#endif - - -#define MUMPS_ARITH_s 1 -#define MUMPS_ARITH_d 2 -#define MUMPS_ARITH_c 4 -#define MUMPS_ARITH_z 8 - -#define MUMPS_ARITH_REAL ( MUMPS_ARITH_s | MUMPS_ARITH_d ) -#define MUMPS_ARITH_CMPLX ( MUMPS_ARITH_c | MUMPS_ARITH_z ) -#define MUMPS_ARITH_SINGLE ( MUMPS_ARITH_s | MUMPS_ARITH_c ) -#define MUMPS_ARITH_DBL ( MUMPS_ARITH_d | MUMPS_ARITH_z ) - - -#endif /* MUMPS_C_TYPES_H */ diff --git a/thirdparty/linux/include/coin1/ThirdParty/mumps_compat.h b/thirdparty/linux/include/coin1/ThirdParty/mumps_compat.h deleted file mode 100644 index d63120eb..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/mumps_compat.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * - * This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011 - * - * - * This version of MUMPS is provided to you free of charge. It is public - * domain, based on public domain software developed during the Esprit IV - * European project PARASOL (1996-1999). Since this first public domain - * version in 1999, research and developments have been supported by the - * following institutions: CERFACS, CNRS, ENS Lyon, INPT(ENSEEIHT)-IRIT, - * INRIA, and University of Bordeaux. - * - * The MUMPS team at the moment of releasing this version includes - * Patrick Amestoy, Maurice Bremond, Alfredo Buttari, Abdou Guermouche, - * Guillaume Joslin, Jean-Yves L'Excellent, Francois-Henry Rouet, Bora - * Ucar and Clement Weisbecker. - * - * We are also grateful to Emmanuel Agullo, Caroline Bousquet, Indranil - * Chowdhury, Philippe Combes, Christophe Daniel, Iain Duff, Vincent Espirat, - * Aurelia Fevre, Jacko Koster, Stephane Pralet, Chiara Puglisi, Gregoire - * Richard, Tzvetomila Slavova, Miroslav Tuma and Christophe Voemel who - * have been contributing to this project. - * - * Up-to-date copies of the MUMPS package can be obtained - * from the Web pages: - * http://mumps.enseeiht.fr/ or http://graal.ens-lyon.fr/MUMPS - * - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY - * EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * - * User documentation of any code that uses this software can - * include this complete notice. You can acknowledge (using - * references [1] and [2]) the contribution of this package - * in any scientific publication dependent upon the use of the - * package. You shall use reasonable endeavours to notify - * the authors of the package of this publication. - * - * [1] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, - * A fully asynchronous multifrontal solver using distributed dynamic - * scheduling, SIAM Journal of Matrix Analysis and Applications, - * Vol 23, No 1, pp 15-41 (2001). - * - * [2] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and - * S. Pralet, Hybrid scheduling for the parallel solution of linear - * systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). - * - */ - -/* Compatibility issues between various Windows versions */ -#ifndef MUMPS_COMPAT_H -#define MUMPS_COMPAT_H - - -#if defined(_WIN32) && ! defined(__MINGW32__) -# define MUMPS_WIN32 1 -#endif - -#ifndef MUMPS_CALL -# ifdef MUMPS_WIN32 -/* Modify/choose between next 2 lines depending - * on your Windows calling conventions */ -/* # define MUMPS_CALL __stdcall */ -# define MUMPS_CALL -# else -# define MUMPS_CALL -# endif -#endif - -#if (__STDC_VERSION__ >= 199901L) -# define MUMPS_INLINE static inline -#else -# define MUMPS_INLINE -#endif - - -#endif /* MUMPS_COMPAT_H */ diff --git a/thirdparty/linux/include/coin1/ThirdParty/proto.h b/thirdparty/linux/include/coin1/ThirdParty/proto.h deleted file mode 100644 index 9b65adf6..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/proto.h +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * proto.h - * - * This file contains header files - * - * Started 10/19/95 - * George - * - * $Id: proto.h,v 1.1 1998/11/27 17:59:28 karypis Exp $ - * - */ - -/* balance.c */ -void Balance2Way(CtrlType *, GraphType *, int *, float); -void Bnd2WayBalance(CtrlType *, GraphType *, int *); -void General2WayBalance(CtrlType *, GraphType *, int *); - -/* bucketsort.c */ -void BucketSortKeysInc(int, int, idxtype *, idxtype *, idxtype *); - -/* ccgraph.c */ -void CreateCoarseGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *); -void CreateCoarseGraphNoMask(CtrlType *, GraphType *, int, idxtype *, idxtype *); -void CreateCoarseGraph_NVW(CtrlType *, GraphType *, int, idxtype *, idxtype *); -GraphType *SetUpCoarseGraph(GraphType *, int, int); -void ReAdjustMemory(GraphType *, GraphType *, int); - -/* coarsen.c */ -GraphType *Coarsen2Way(CtrlType *, GraphType *); - -/* compress.c */ -void CompressGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *, idxtype *, idxtype *); -void PruneGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *, idxtype *, float); - -/* debug.c */ -int ComputeCut(GraphType *, idxtype *); -int CheckBnd(GraphType *); -int CheckBnd2(GraphType *); -int CheckNodeBnd(GraphType *, int); -int CheckRInfo(RInfoType *); -int CheckNodePartitionParams(GraphType *); -int IsSeparable(GraphType *); - -/* estmem.c */ -void METIS_EstimateMemory(int *, idxtype *, idxtype *, int *, int *, int *); -void EstimateCFraction(int, idxtype *, idxtype *, float *, float *); -int ComputeCoarseGraphSize(int, idxtype *, idxtype *, int, idxtype *, idxtype *, idxtype *); - -/* fm.c */ -void FM_2WayEdgeRefine(CtrlType *, GraphType *, int *, int); - -/* fortran.c */ -void Change2CNumbering(int, idxtype *, idxtype *); -void Change2FNumbering(int, idxtype *, idxtype *, idxtype *); -void Change2FNumbering2(int, idxtype *, idxtype *); -void Change2FNumberingOrder(int, idxtype *, idxtype *, idxtype *, idxtype *); -void ChangeMesh2CNumbering(int, idxtype *); -void ChangeMesh2FNumbering(int, idxtype *, int, idxtype *, idxtype *); -void ChangeMesh2FNumbering2(int, idxtype *, int, int, idxtype *, idxtype *); - -/* frename.c */ -void METIS_PARTGRAPHRECURSIVE(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphrecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphrecursive_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphrecursive__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPARTGRAPHRECURSIVE(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphrecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphrecursive_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphrecursive__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void METIS_PARTGRAPHKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPARTGRAPHKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void METIS_EDGEND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_edgend(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_edgend_(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_edgend__(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_NODEND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodend(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodend_(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodend__(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_NODEWND(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodewnd(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodewnd_(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_nodewnd__(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_PARTMESHNODAL(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshnodal(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshnodal_(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshnodal__(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void METIS_PARTMESHDUAL(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshdual(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshdual_(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void metis_partmeshdual__(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void METIS_MESHTONODAL(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtonodal(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtonodal_(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtonodal__(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_MESHTODUAL(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtodual(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtodual_(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void metis_meshtodual__(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_ESTIMATEMEMORY(int *, idxtype *, idxtype *, int *, int *, int *); -void metis_estimatememory(int *, idxtype *, idxtype *, int *, int *, int *); -void metis_estimatememory_(int *, idxtype *, idxtype *, int *, int *, int *); -void metis_estimatememory__(int *, idxtype *, idxtype *, int *, int *, int *); -void METIS_MCPARTGRAPHRECURSIVE(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_mcpartgraphrecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_mcpartgraphrecursive_(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_mcpartgraphrecursive__(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_MCPARTGRAPHKWAY(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_mcpartgraphkway(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_mcpartgraphkway_(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_mcpartgraphkway__(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void METIS_PARTGRAPHVKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphvkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphvkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void metis_partgraphvkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPARTGRAPHVKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphvkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphvkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void metis_wpartgraphvkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); - -/* graph.c */ -void SetUpGraph(GraphType *, int, int, int, idxtype *, idxtype *, idxtype *, idxtype *, int); -void SetUpGraphKway(GraphType *, int, idxtype *, idxtype *); -void SetUpGraph2(GraphType *, int, int, idxtype *, idxtype *, float *, idxtype *); -void VolSetUpGraph(GraphType *, int, int, int, idxtype *, idxtype *, idxtype *, idxtype *, int); -void RandomizeGraph(GraphType *); -int IsConnectedSubdomain(CtrlType *, GraphType *, int, int); -int IsConnected(CtrlType *, GraphType *, int); -int IsConnected2(GraphType *, int); -int FindComponents(CtrlType *, GraphType *, idxtype *, idxtype *); - -/* initpart.c */ -void Init2WayPartition(CtrlType *, GraphType *, int *, float); -void InitSeparator(CtrlType *, GraphType *, float); -void GrowBisection(CtrlType *, GraphType *, int *, float); -void GrowBisectionNode(CtrlType *, GraphType *, float); -void RandomBisection(CtrlType *, GraphType *, int *, float); - -/* kmetis.c */ -void METIS_PartGraphKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPartGraphKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -int MlevelKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *, float); - -/* kvmetis.c */ -void METIS_PartGraphVKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPartGraphVKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -int MlevelVolKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *, float); - -/* kwayfm.c */ -void Random_KWayEdgeRefine(CtrlType *, GraphType *, int, float *, float, int, int); -void Greedy_KWayEdgeRefine(CtrlType *, GraphType *, int, float *, float, int); -void Greedy_KWayEdgeBalance(CtrlType *, GraphType *, int, float *, float, int); - -/* kwayrefine.c */ -void RefineKWay(CtrlType *, GraphType *, GraphType *, int, float *, float); -void AllocateKWayPartitionMemory(CtrlType *, GraphType *, int); -void ComputeKWayPartitionParams(CtrlType *, GraphType *, int); -void ProjectKWayPartition(CtrlType *, GraphType *, int); -int IsBalanced(idxtype *, int, float *, float); -void ComputeKWayBoundary(CtrlType *, GraphType *, int); -void ComputeKWayBalanceBoundary(CtrlType *, GraphType *, int); - -/* kwayvolfm.c */ -void Random_KWayVolRefine(CtrlType *, GraphType *, int, float *, float, int, int); -void Random_KWayVolRefineMConn(CtrlType *, GraphType *, int, float *, float, int, int); -void Greedy_KWayVolBalance(CtrlType *, GraphType *, int, float *, float, int); -void Greedy_KWayVolBalanceMConn(CtrlType *, GraphType *, int, float *, float, int); -void KWayVolUpdate(CtrlType *, GraphType *, int, int, int, idxtype *, idxtype *, idxtype *); -void ComputeKWayVolume(GraphType *, int, idxtype *, idxtype *, idxtype *); -int ComputeVolume(GraphType *, idxtype *); -void CheckVolKWayPartitionParams(CtrlType *, GraphType *, int); -void ComputeVolSubDomainGraph(GraphType *, int, idxtype *, idxtype *); -void EliminateVolSubDomainEdges(CtrlType *, GraphType *, int, float *); -void EliminateVolComponents(CtrlType *, GraphType *, int, float *, float); - -/* kwayvolrefine.c */ -void RefineVolKWay(CtrlType *, GraphType *, GraphType *, int, float *, float); -void AllocateVolKWayPartitionMemory(CtrlType *, GraphType *, int); -void ComputeVolKWayPartitionParams(CtrlType *, GraphType *, int); -void ComputeKWayVolGains(CtrlType *, GraphType *, int); -void ProjectVolKWayPartition(CtrlType *, GraphType *, int); -void ComputeVolKWayBoundary(CtrlType *, GraphType *, int); -void ComputeVolKWayBalanceBoundary(CtrlType *, GraphType *, int); - -/* match.c */ -void Match_RM(CtrlType *, GraphType *); -void Match_RM_NVW(CtrlType *, GraphType *); -void Match_HEM(CtrlType *, GraphType *); -void Match_SHEM(CtrlType *, GraphType *); - -/* mbalance.c */ -void MocBalance2Way(CtrlType *, GraphType *, float *, float); -void MocGeneral2WayBalance(CtrlType *, GraphType *, float *, float); - -/* mbalance2.c */ -void MocBalance2Way2(CtrlType *, GraphType *, float *, float *); -void MocGeneral2WayBalance2(CtrlType *, GraphType *, float *, float *); -void SelectQueue3(int, float *, float *, int *, int *, PQueueType [MAXNCON][2], float *); - -/* mcoarsen.c */ -GraphType *MCCoarsen2Way(CtrlType *, GraphType *); - -/* memory.c */ -void AllocateWorkSpace(CtrlType *, GraphType *, int); -void FreeWorkSpace(CtrlType *, GraphType *); -int WspaceAvail(CtrlType *); -idxtype *idxwspacemalloc(CtrlType *, int); -void idxwspacefree(CtrlType *, int); -float *fwspacemalloc(CtrlType *, int); -void fwspacefree(CtrlType *, int); -GraphType *CreateGraph(void); -void InitGraph(GraphType *); -void FreeGraph(GraphType *); - -/* mesh.c */ -void METIS_MeshToDual(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_MeshToNodal(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *); -void GENDUALMETIS(int, int, int, idxtype *, idxtype *, idxtype *adjncy); -void TRINODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy); -void TETNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy); -void HEXNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy); -void QUADNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy); - -/* meshpart.c */ -void METIS_PartMeshNodal(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); -void METIS_PartMeshDual(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *); - -/* mfm.c */ -void MocFM_2WayEdgeRefine(CtrlType *, GraphType *, float *, int); -void SelectQueue(int, float *, float *, int *, int *, PQueueType [MAXNCON][2]); -int BetterBalance(int, float *, float *, float *); -float Compute2WayHLoadImbalance(int, float *, float *); -void Compute2WayHLoadImbalanceVec(int, float *, float *, float *); - -/* mfm2.c */ -void MocFM_2WayEdgeRefine2(CtrlType *, GraphType *, float *, float *, int); -void SelectQueue2(int, float *, float *, int *, int *, PQueueType [MAXNCON][2], float *); -int IsBetter2wayBalance(int, float *, float *, float *); - -/* mincover.o */ -void MinCover(idxtype *, idxtype *, int, int, idxtype *, int *); -int MinCover_Augment(idxtype *, idxtype *, int, idxtype *, idxtype *, idxtype *, int); -void MinCover_Decompose(idxtype *, idxtype *, int, int, idxtype *, idxtype *, int *); -void MinCover_ColDFS(idxtype *, idxtype *, int, idxtype *, idxtype *, int); -void MinCover_RowDFS(idxtype *, idxtype *, int, idxtype *, idxtype *, int); - -/* minitpart.c */ -void MocInit2WayPartition(CtrlType *, GraphType *, float *, float); -void MocGrowBisection(CtrlType *, GraphType *, float *, float); -void MocRandomBisection(CtrlType *, GraphType *, float *, float); -void MocInit2WayBalance(CtrlType *, GraphType *, float *); -int SelectQueueoneWay(int, float *, float *, int, PQueueType [MAXNCON][2]); - -/* minitpart2.c */ -void MocInit2WayPartition2(CtrlType *, GraphType *, float *, float *); -void MocGrowBisection2(CtrlType *, GraphType *, float *, float *); -void MocGrowBisectionNew2(CtrlType *, GraphType *, float *, float *); -void MocInit2WayBalance2(CtrlType *, GraphType *, float *, float *); -int SelectQueueOneWay2(int, float *, PQueueType [MAXNCON][2], float *); - -/* mkmetis.c */ -void METIS_mCPartGraphKway(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -int MCMlevelKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *); - -/* mkwayfmh.c */ -void MCRandom_KWayEdgeRefineHorizontal(CtrlType *, GraphType *, int, float *, int); -void MCGreedy_KWayEdgeBalanceHorizontal(CtrlType *, GraphType *, int, float *, int); -int AreAllHVwgtsBelow(int, float, float *, float, float *, float *); -int AreAllHVwgtsAbove(int, float, float *, float, float *, float *); -void ComputeHKWayLoadImbalance(int, int, float *, float *); -int MocIsHBalanced(int, int, float *, float *); -int IsHBalanceBetterFT(int, int, float *, float *, float *, float *); -int IsHBalanceBetterTT(int, int, float *, float *, float *, float *); - -/* mkwayrefine.c */ -void MocRefineKWayHorizontal(CtrlType *, GraphType *, GraphType *, int, float *); -void MocAllocateKWayPartitionMemory(CtrlType *, GraphType *, int); -void MocComputeKWayPartitionParams(CtrlType *, GraphType *, int); -void MocProjectKWayPartition(CtrlType *, GraphType *, int); -void MocComputeKWayBalanceBoundary(CtrlType *, GraphType *, int); - -/* mmatch.c */ -void MCMatch_RM(CtrlType *, GraphType *); -void MCMatch_HEM(CtrlType *, GraphType *); -void MCMatch_SHEM(CtrlType *, GraphType *); -void MCMatch_SHEBM(CtrlType *, GraphType *, int); -void MCMatch_SBHEM(CtrlType *, GraphType *, int); -float BetterVBalance(int, int, float *, float *, float *); -int AreAllVwgtsBelowFast(int, float *, float *, float); - -/* mmd.c */ -void genmmd(int, idxtype *, idxtype *, idxtype *, idxtype *, int , idxtype *, idxtype *, idxtype *, idxtype *, int, int *); -void mmdelm(int, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int, int); -int mmdint(int, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *); -void mmdnum(int, idxtype *, idxtype *, idxtype *); -void mmdupd(int, int, idxtype *, idxtype *, int, int *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int, int *tag); - -/* mpmetis.c */ -void METIS_mCPartGraphRecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_mCHPartGraphRecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void METIS_mCPartGraphRecursiveInternal(int *, int *, idxtype *, idxtype *, float *, idxtype *, int *, int *, int *, idxtype *); -void METIS_mCHPartGraphRecursiveInternal(int *, int *, idxtype *, idxtype *, float *, idxtype *, int *, float *, int *, int *, idxtype *); -int MCMlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float, int); -int MCHMlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float *, int); -void MCMlevelEdgeBisection(CtrlType *, GraphType *, float *, float); -void MCHMlevelEdgeBisection(CtrlType *, GraphType *, float *, float *); - -/* mrefine.c */ -void MocRefine2Way(CtrlType *, GraphType *, GraphType *, float *, float); -void MocAllocate2WayPartitionMemory(CtrlType *, GraphType *); -void MocCompute2WayPartitionParams(CtrlType *, GraphType *); -void MocProject2WayPartition(CtrlType *, GraphType *); - -/* mrefine2.c */ -void MocRefine2Way2(CtrlType *, GraphType *, GraphType *, float *, float *); - -/* mutil.c */ -int AreAllVwgtsBelow(int, float, float *, float, float *, float); -int AreAnyVwgtsBelow(int, float, float *, float, float *, float); -int AreAllVwgtsAbove(int, float, float *, float, float *, float); -float ComputeLoadImbalance(int, int, float *, float *); -int AreAllBelow(int, float *, float *); - -/* myqsort.c */ -void iidxsort(int, idxtype *); -void iintsort(int, int *); -void ikeysort(int, KeyValueType *); -void ikeyvalsort(int, KeyValueType *); - -/* ometis.c */ -void METIS_EdgeND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_NodeND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void METIS_NodeWND(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); -void MlevelNestedDissection(CtrlType *, GraphType *, idxtype *, float, int); -void MlevelNestedDissectionCC(CtrlType *, GraphType *, idxtype *, float, int); -void MlevelNodeBisectionMultiple(CtrlType *, GraphType *, int *, float); -void MlevelNodeBisection(CtrlType *, GraphType *, int *, float); -void SplitGraphOrder(CtrlType *, GraphType *, GraphType *, GraphType *); -void MMDOrder(CtrlType *, GraphType *, idxtype *, int); -int SplitGraphOrderCC(CtrlType *, GraphType *, GraphType *, int, idxtype *, idxtype *); - -/* parmetis.c */ -void METIS_PartGraphKway2(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPartGraphKway2(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -void METIS_NodeNDP(int, idxtype *, idxtype *, int, int *, idxtype *, idxtype *, idxtype *); -void MlevelNestedDissectionP(CtrlType *, GraphType *, idxtype *, int, int, int, idxtype *); -void METIS_NodeComputeSeparator(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *); -void METIS_EdgeComputeSeparator(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *); - -/* pmetis.c */ -void METIS_PartGraphRecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); -void METIS_WPartGraphRecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); -int MlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float *, float, int); -void MlevelEdgeBisection(CtrlType *, GraphType *, int *, float); -void SplitGraphPart(CtrlType *, GraphType *, GraphType *, GraphType *); -void SetUpSplitGraph(GraphType *, GraphType *, int, int); - -/* pqueue.c */ -void PQueueInit(CtrlType *ctrl, PQueueType *, int, int); -void PQueueReset(PQueueType *); -void PQueueFree(CtrlType *ctrl, PQueueType *); -int PQueueGetSize(PQueueType *); -int PQueueInsert(PQueueType *, int, int); -int PQueueDelete(PQueueType *, int, int); -int PQueueUpdate(PQueueType *, int, int, int); -void PQueueUpdateUp(PQueueType *, int, int, int); -int PQueueGetMax(PQueueType *); -int PQueueSeeMax(PQueueType *); -int PQueueGetKey(PQueueType *); -int CheckHeap(PQueueType *); - -/* refine.c */ -void Refine2Way(CtrlType *, GraphType *, GraphType *, int *, float ubfactor); -void Allocate2WayPartitionMemory(CtrlType *, GraphType *); -void Compute2WayPartitionParams(CtrlType *, GraphType *); -void Project2WayPartition(CtrlType *, GraphType *); - -/* separator.c */ -void ConstructSeparator(CtrlType *, GraphType *, float); -void ConstructMinCoverSeparator0(CtrlType *, GraphType *, float); -void ConstructMinCoverSeparator(CtrlType *, GraphType *, float); - -/* sfm.c */ -void FM_2WayNodeRefine(CtrlType *, GraphType *, float, int); -void FM_2WayNodeRefineEqWgt(CtrlType *, GraphType *, int); -void FM_2WayNodeRefine_OneSided(CtrlType *, GraphType *, float, int); -void FM_2WayNodeBalance(CtrlType *, GraphType *, float); -int ComputeMaxNodeGain(int, idxtype *, idxtype *, idxtype *); - -/* srefine.c */ -void Refine2WayNode(CtrlType *, GraphType *, GraphType *, float); -void Allocate2WayNodePartitionMemory(CtrlType *, GraphType *); -void Compute2WayNodePartitionParams(CtrlType *, GraphType *); -void Project2WayNodePartition(CtrlType *, GraphType *); - -/* stat.c */ -void ComputePartitionInfo(GraphType *, int, idxtype *); -void ComputePartitionInfoBipartite(GraphType *, int, idxtype *); -void ComputePartitionBalance(GraphType *, int, idxtype *, float *); -float ComputeElementBalance(int, int, idxtype *); - -/* subdomains.c */ -void Random_KWayEdgeRefineMConn(CtrlType *, GraphType *, int, float *, float, int, int); -void Greedy_KWayEdgeBalanceMConn(CtrlType *, GraphType *, int, float *, float, int); -void PrintSubDomainGraph(GraphType *, int, idxtype *); -void ComputeSubDomainGraph(GraphType *, int, idxtype *, idxtype *); -void EliminateSubDomainEdges(CtrlType *, GraphType *, int, float *); -void MoveGroupMConn(CtrlType *, GraphType *, idxtype *, idxtype *, int, int, int, idxtype *); -void EliminateComponents(CtrlType *, GraphType *, int, float *, float); -void MoveGroup(CtrlType *, GraphType *, int, int, int, idxtype *, idxtype *); - -/* timing.c */ -void InitTimers(CtrlType *); -void PrintTimers(CtrlType *); -double seconds(void); - -/* util.c */ -void errexit(char *,...); -#ifndef DMALLOC -int *imalloc(int, char *); -idxtype *idxmalloc(int, char *); -float *fmalloc(int, char *); -int *ismalloc(int, int, char *); -idxtype *idxsmalloc(int, idxtype, char *); -void *GKmalloc(int, char *); -#endif -/*void GKfree(void **,...); */ -int *iset(int n, int val, int *x); -idxtype *idxset(int n, idxtype val, idxtype *x); -float *sset(int n, float val, float *x); -int iamax(int, int *); -int idxamax(int, idxtype *); -int idxamax_strd(int, idxtype *, int); -int samax(int, float *); -int samax2(int, float *); -int idxamin(int, idxtype *); -int samin(int, float *); -int idxsum(int, idxtype *); -int idxsum_strd(int, idxtype *, int); -void idxadd(int, idxtype *, idxtype *); -int charsum(int, char *); -int isum(int, int *); -float ssum(int, float *); -float ssum_strd(int n, float *x, int); -void sscale(int n, float, float *x); -float snorm2(int, float *); -float sdot(int n, float *, float *); -void saxpy(int, float, float *, int, float *, int); -void RandomPermute(int, idxtype *, int); -double drand48(); -void srand48(long); -int ispow2(int); -void InitRandom(int); -int ilog2(int); - - - - - - - - - - -/*************************************************************** -* Programs Directory -****************************************************************/ - -/* io.c */ -void ReadGraph(GraphType *, char *, int *); -void WritePartition(char *, idxtype *, int, int); -void WriteMeshPartition(char *, int, int, idxtype *, int, idxtype *); -void WritePermutation(char *, idxtype *, int); -int CheckGraph(GraphType *); -idxtype *ReadMesh(char *, int *, int *, int *); -void WriteGraph(char *, int, idxtype *, idxtype *); - -/* smbfactor.c */ -void ComputeFillIn(GraphType *, idxtype *); -idxtype ComputeFillIn2(GraphType *, idxtype *); -int smbfct(int, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int *, idxtype *, idxtype *, int *); - - -/*************************************************************** -* Test Directory -****************************************************************/ -void Test_PartGraph(int, idxtype *, idxtype *); -int VerifyPart(int, idxtype *, idxtype *, idxtype *, idxtype *, int, int, idxtype *); -int VerifyWPart(int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *); -void Test_PartGraphV(int, idxtype *, idxtype *); -int VerifyPartV(int, idxtype *, idxtype *, idxtype *, idxtype *, int, int, idxtype *); -int VerifyWPartV(int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *); -void Test_PartGraphmC(int, idxtype *, idxtype *); -int VerifyPartmC(int, int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *); -void Test_ND(int, idxtype *, idxtype *); -int VerifyND(int, idxtype *, idxtype *); - diff --git a/thirdparty/linux/include/coin1/ThirdParty/rename.h b/thirdparty/linux/include/coin1/ThirdParty/rename.h deleted file mode 100644 index d096b46e..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/rename.h +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * rename.h - * - * This file contains header files - * - * Started 10/2/97 - * George - * - * $Id: rename.h,v 1.1 1998/11/27 17:59:29 karypis Exp $ - * - */ - -/* balance.c */ -#define Balance2Way __Balance2Way -#define Bnd2WayBalance __Bnd2WayBalance -#define General2WayBalance __General2WayBalance - - -/* bucketsort.c */ -#define BucketSortKeysInc __BucketSortKeysInc - - -/* ccgraph.c */ -#define CreateCoarseGraph __CreateCoarseGraph -#define CreateCoarseGraphNoMask __CreateCoarseGraphNoMask -#define CreateCoarseGraph_NVW __CreateCoarseGraph_NVW -#define SetUpCoarseGraph __SetUpCoarseGraph -#define ReAdjustMemory __ReAdjustMemory - - -/* coarsen.c */ -#define Coarsen2Way __Coarsen2Way - - -/* compress.c */ -#define CompressGraph __CompressGraph -#define PruneGraph __PruneGraph - - -/* debug.c */ -#define ComputeCut __ComputeCut -#define CheckBnd __CheckBnd -#define CheckBnd2 __CheckBnd2 -#define CheckNodeBnd __CheckNodeBnd -#define CheckRInfo __CheckRInfo -#define CheckNodePartitionParams __CheckNodePartitionParams -#define IsSeparable __IsSeparable - - -/* estmem.c */ -#define EstimateCFraction __EstimateCFraction -#define ComputeCoarseGraphSize __ComputeCoarseGraphSize - - -/* fm.c */ -#define FM_2WayEdgeRefine __FM_2WayEdgeRefine - - -/* fortran.c */ -#define Change2CNumbering __Change2CNumbering -#define Change2FNumbering __Change2FNumbering -#define Change2FNumbering2 __Change2FNumbering2 -#define Change2FNumberingOrder __Change2FNumberingOrder -#define ChangeMesh2CNumbering __ChangeMesh2CNumbering -#define ChangeMesh2FNumbering __ChangeMesh2FNumbering -#define ChangeMesh2FNumbering2 __ChangeMesh2FNumbering2 - - -/* graph.c */ -#define SetUpGraph __SetUpGraph -#define SetUpGraphKway __SetUpGraphKway -#define SetUpGraph2 __SetUpGraph2 -#define VolSetUpGraph __VolSetUpGraph -#define RandomizeGraph __RandomizeGraph -#define IsConnectedSubdomain __IsConnectedSubdomain -#define IsConnected __IsConnected -#define IsConnected2 __IsConnected2 -#define FindComponents __FindComponents - - -/* initpart.c */ -#define Init2WayPartition __Init2WayPartition -#define InitSeparator __InitSeparator -#define GrowBisection __GrowBisection -#define GrowBisectionNode __GrowBisectionNode -#define RandomBisection __RandomBisection - - -/* kmetis.c */ -#define MlevelKWayPartitioning __MlevelKWayPartitioning - - -/* kvmetis.c */ -#define MlevelVolKWayPartitioning __MlevelVolKWayPartitioning - - -/* kwayfm.c */ -#define Random_KWayEdgeRefine __Random_KWayEdgeRefine -#define Greedy_KWayEdgeRefine __Greedy_KWayEdgeRefine -#define Greedy_KWayEdgeBalance __Greedy_KWayEdgeBalance - - -/* kwayrefine.c */ -#define RefineKWay __RefineKWay -#define AllocateKWayPartitionMemory __AllocateKWayPartitionMemory -#define ComputeKWayPartitionParams __ComputeKWayPartitionParams -#define ProjectKWayPartition __ProjectKWayPartition -#define IsBalanced __IsBalanced -#define ComputeKWayBoundary __ComputeKWayBoundary -#define ComputeKWayBalanceBoundary __ComputeKWayBalanceBoundary - - -/* kwayvolfm.c */ -#define Random_KWayVolRefine __Random_KWayVolRefine -#define Random_KWayVolRefineMConn __Random_KWayVolRefineMConn -#define Greedy_KWayVolBalance __Greedy_KWayVolBalance -#define Greedy_KWayVolBalanceMConn __Greedy_KWayVolBalanceMConn -#define KWayVolUpdate __KWayVolUpdate -#define ComputeKWayVolume __ComputeKWayVolume -#define ComputeVolume __ComputeVolume -#define CheckVolKWayPartitionParams __CheckVolKWayPartitionParams -#define ComputeVolSubDomainGraph __ComputeVolSubDomainGraph -#define EliminateVolSubDomainEdges __EliminateVolSubDomainEdges - - -/* kwayvolrefine.c */ -#define RefineVolKWay __RefineVolKWay -#define AllocateVolKWayPartitionMemory __AllocateVolKWayPartitionMemory -#define ComputeVolKWayPartitionParams __ComputeVolKWayPartitionParams -#define ComputeKWayVolGains __ComputeKWayVolGains -#define ProjectVolKWayPartition __ProjectVolKWayPartition -#define ComputeVolKWayBoundary __ComputeVolKWayBoundary -#define ComputeVolKWayBalanceBoundary __ComputeVolKWayBalanceBoundary - - -/* match.c */ -#define Match_RM __Match_RM -#define Match_RM_NVW __Match_RM_NVW -#define Match_HEM __Match_HEM -#define Match_SHEM __Match_SHEM - - -/* mbalance.c */ -#define MocBalance2Way __MocBalance2Way -#define MocGeneral2WayBalance __MocGeneral2WayBalance - - -/* mbalance2.c */ -#define MocBalance2Way2 __MocBalance2Way2 -#define MocGeneral2WayBalance2 __MocGeneral2WayBalance2 -#define SelectQueue3 __SelectQueue3 - - -/* mcoarsen.c */ -#define MCCoarsen2Way __MCCoarsen2Way - - -/* memory.c */ -#define AllocateWorkSpace __AllocateWorkSpace -#define FreeWorkSpace __FreeWorkSpace -#define WspaceAvail __WspaceAvail -#define idxwspacemalloc __idxwspacemalloc -#define idxwspacefree __idxwspacefree -#define fwspacemalloc __fwspacemalloc -#define CreateGraph __CreateGraph -#define InitGraph __InitGraph -#define FreeGraph __FreeGraph - - -/* mesh.c */ -#define TRIDUALMETIS __TRIDUALMETIS -#define TETDUALMETIS __TETDUALMETIS -#define HEXDUALMETIS __HEXDUALMETIS -#define TRINODALMETIS __TRINODALMETIS -#define TETNODALMETIS __TETNODALMETIS -#define HEXNODALMETIS __HEXNODALMETIS - - -/* mfm.c */ -#define MocFM_2WayEdgeRefine __MocFM_2WayEdgeRefine -#define SelectQueue __SelectQueue -#define BetterBalance __BetterBalance -#define Compute2WayHLoadImbalance __Compute2WayHLoadImbalance -#define Compute2WayHLoadImbalanceVec __Compute2WayHLoadImbalanceVec - - -/* mfm2.c */ -#define MocFM_2WayEdgeRefine2 __MocFM_2WayEdgeRefine2 -#define SelectQueue2 __SelectQueue2 -#define IsBetter2wayBalance __IsBetter2wayBalance - - -/* mincover.c */ -#define MinCover __MinCover -#define MinCover_Augment __MinCover_Augment -#define MinCover_Decompose __MinCover_Decompose -#define MinCover_ColDFS __MinCover_ColDFS -#define MinCover_RowDFS __MinCover_RowDFS - - -/* minitpart.c */ -#define MocInit2WayPartition __MocInit2WayPartition -#define MocGrowBisection __MocGrowBisection -#define MocRandomBisection __MocRandomBisection -#define MocInit2WayBalance __MocInit2WayBalance -#define SelectQueueoneWay __SelectQueueoneWay - - -/* minitpart2.c */ -#define MocInit2WayPartition2 __MocInit2WayPartition2 -#define MocGrowBisection2 __MocGrowBisection2 -#define MocGrowBisectionNew2 __MocGrowBisectionNew2 -#define MocInit2WayBalance2 __MocInit2WayBalance2 -#define SelectQueueOneWay2 __SelectQueueOneWay2 - - -/* mkmetis.c */ -#define MCMlevelKWayPartitioning __MCMlevelKWayPartitioning - - -/* mkwayfmh.c */ -#define MCRandom_KWayEdgeRefineHorizontal __MCRandom_KWayEdgeRefineHorizontal -#define MCGreedy_KWayEdgeBalanceHorizontal __MCGreedy_KWayEdgeBalanceHorizontal -#define AreAllHVwgtsBelow __AreAllHVwgtsBelow -#define AreAllHVwgtsAbove __AreAllHVwgtsAbove -#define ComputeHKWayLoadImbalance __ComputeHKWayLoadImbalance -#define MocIsHBalanced __MocIsHBalanced -#define IsHBalanceBetterFT __IsHBalanceBetterFT -#define IsHBalanceBetterTT __IsHBalanceBetterTT - - -/* mkwayrefine.c */ -#define MocRefineKWayHorizontal __MocRefineKWayHorizontal -#define MocAllocateKWayPartitionMemory __MocAllocateKWayPartitionMemory -#define MocComputeKWayPartitionParams __MocComputeKWayPartitionParams -#define MocProjectKWayPartition __MocProjectKWayPartition -#define MocComputeKWayBalanceBoundary __MocComputeKWayBalanceBoundary - - -/* mmatch.c */ -#define MCMatch_RM __MCMatch_RM -#define MCMatch_HEM __MCMatch_HEM -#define MCMatch_SHEM __MCMatch_SHEM -#define MCMatch_SHEBM __MCMatch_SHEBM -#define MCMatch_SBHEM __MCMatch_SBHEM -#define BetterVBalance __BetterVBalance -#define AreAllVwgtsBelowFast __AreAllVwgtsBelowFast - - -/* mmd.c */ -#define genmmd __genmmd -#define mmdelm __mmdelm -#define mmdint __mmdint -#define mmdnum __mmdnum -#define mmdupd __mmdupd - - -/* mpmetis.c */ -#define MCMlevelRecursiveBisection __MCMlevelRecursiveBisection -#define MCHMlevelRecursiveBisection __MCHMlevelRecursiveBisection -#define MCMlevelEdgeBisection __MCMlevelEdgeBisection -#define MCHMlevelEdgeBisection __MCHMlevelEdgeBisection - - -/* mrefine.c */ -#define MocRefine2Way __MocRefine2Way -#define MocAllocate2WayPartitionMemory __MocAllocate2WayPartitionMemory -#define MocCompute2WayPartitionParams __MocCompute2WayPartitionParams -#define MocProject2WayPartition __MocProject2WayPartition - - -/* mrefine2.c */ -#define MocRefine2Way2 __MocRefine2Way2 - - -/* mutil.c */ -#define AreAllVwgtsBelow __AreAllVwgtsBelow -#define AreAnyVwgtsBelow __AreAnyVwgtsBelow -#define AreAllVwgtsAbove __AreAllVwgtsAbove -#define ComputeLoadImbalance __ComputeLoadImbalance -#define AreAllBelow __AreAllBelow - - -/* myqsort.c */ -#define iidxsort __iidxsort -#define iintsort __iintsort -#define ikeysort __ikeysort -#define ikeyvalsort __ikeyvalsort - - -/* ometis.c */ -#define MlevelNestedDissection __MlevelNestedDissection -#define MlevelNestedDissectionCC __MlevelNestedDissectionCC -#define MlevelNodeBisectionMultiple __MlevelNodeBisectionMultiple -#define MlevelNodeBisection __MlevelNodeBisection -#define SplitGraphOrder __SplitGraphOrder -#define MMDOrder __MMDOrder -#define SplitGraphOrderCC __SplitGraphOrderCC - - -/* parmetis.c */ -#define MlevelNestedDissectionP __MlevelNestedDissectionP - - -/* pmetis.c */ -#define MlevelRecursiveBisection __MlevelRecursiveBisection -#define MlevelEdgeBisection __MlevelEdgeBisection -#define SplitGraphPart __SplitGraphPart -#define SetUpSplitGraph __SetUpSplitGraph - - -/* pqueue.c */ -#define PQueueInit __PQueueInit -#define PQueueReset __PQueueReset -#define PQueueFree __PQueueFree -#define PQueueInsert __PQueueInsert -#define PQueueDelete __PQueueDelete -#define PQueueUpdate __PQueueUpdate -#define PQueueUpdateUp __PQueueUpdateUp -#define PQueueGetMax __PQueueGetMax -#define PQueueSeeMax __PQueueSeeMax -#define CheckHeap __CheckHeap - - -/* refine.c */ -#define Refine2Way __Refine2Way -#define Allocate2WayPartitionMemory __Allocate2WayPartitionMemory -#define Compute2WayPartitionParams __Compute2WayPartitionParams -#define Project2WayPartition __Project2WayPartition - - -/* separator.c */ -#define ConstructSeparator __ConstructSeparator -#define ConstructMinCoverSeparator0 __ConstructMinCoverSeparator0 -#define ConstructMinCoverSeparator __ConstructMinCoverSeparator - - -/* sfm.c */ -#define FM_2WayNodeRefine __FM_2WayNodeRefine -#define FM_2WayNodeRefineEqWgt __FM_2WayNodeRefineEqWgt -#define FM_2WayNodeRefine_OneSided __FM_2WayNodeRefine_OneSided -#define FM_2WayNodeBalance __FM_2WayNodeBalance -#define ComputeMaxNodeGain __ComputeMaxNodeGain - - -/* srefine.c */ -#define Refine2WayNode __Refine2WayNode -#define Allocate2WayNodePartitionMemory __Allocate2WayNodePartitionMemory -#define Compute2WayNodePartitionParams __Compute2WayNodePartitionParams -#define Project2WayNodePartition __Project2WayNodePartition - - -/* stat.c */ -#define ComputePartitionInfo __ComputePartitionInfo -#define ComputePartitionBalance __ComputePartitionBalance -#define ComputeElementBalance __ComputeElementBalance - - -/* subdomains.c */ -#define Random_KWayEdgeRefineMConn __Random_KWayEdgeRefineMConn -#define Greedy_KWayEdgeBalanceMConn __Greedy_KWayEdgeBalanceMConn -#define PrintSubDomainGraph __PrintSubDomainGraph -#define ComputeSubDomainGraph __ComputeSubDomainGraph -#define EliminateSubDomainEdges __EliminateSubDomainEdges -#define MoveGroupMConn __MoveGroupMConn -#define EliminateComponents __EliminateComponents -#define MoveGroup __MoveGroup - - -/* timing.c */ -#define InitTimers __InitTimers -#define PrintTimers __PrintTimers -#define seconds __seconds - - -/* util.c */ -#define errexit __errexit -#define GKfree __GKfree -#ifndef DMALLOC -#define imalloc __imalloc -#define idxmalloc __idxmalloc -#define fmalloc __fmalloc -#define ismalloc __ismalloc -#define idxsmalloc __idxsmalloc -#define GKmalloc __GKmalloc -#endif -#define iset __iset -#define idxset __idxset -#define sset __sset -#define iamax __iamax -#define idxamax __idxamax -#define idxamax_strd __idxamax_strd -#define samax __samax -#define samax2 __samax2 -#define idxamin __idxamin -#define samin __samin -#define idxsum __idxsum -#define idxsum_strd __idxsum_strd -#define idxadd __idxadd -#define charsum __charsum -#define isum __isum -#define ssum __ssum -#define ssum_strd __ssum_strd -#define sscale __sscale -#define snorm2 __snorm2 -#define sdot __sdot -#define saxpy __saxpy -#define RandomPermute __RandomPermute -#define ispow2 __ispow2 -#define InitRandom __InitRandom -#define ilog2 __ilog2 - - - - - diff --git a/thirdparty/linux/include/coin1/ThirdParty/struct.h b/thirdparty/linux/include/coin1/ThirdParty/struct.h deleted file mode 100644 index 63c7c656..00000000 --- a/thirdparty/linux/include/coin1/ThirdParty/struct.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * struct.h - * - * This file contains data structures for ILU routines. - * - * Started 9/26/95 - * George - * - * $Id: struct.h,v 1.1 1998/11/27 17:59:31 karypis Exp $ - */ - -/* Undefine the following #define in order to use short int as the idxtype */ -#define IDXTYPE_INT - -/* Indexes are as long as integers for now */ -#ifdef IDXTYPE_INT -typedef int idxtype; -#else -typedef short idxtype; -#endif - -#define MAXIDX (1<<8*sizeof(idxtype)-2) - - -/************************************************************************* -* The following data structure stores key-value pair -**************************************************************************/ -struct KeyValueType { - idxtype key; - idxtype val; -}; - -typedef struct KeyValueType KeyValueType; - - -/************************************************************************* -* The following data structure will hold a node of a doubly-linked list. -**************************************************************************/ -struct ListNodeType { - int id; /* The id value of the node */ - struct ListNodeType *prev, *next; /* It's a doubly-linked list */ -}; - -typedef struct ListNodeType ListNodeType; - - - -/************************************************************************* -* The following data structure is used to store the buckets for the -* refinment algorithms -**************************************************************************/ -struct PQueueType { - int type; /* The type of the representation used */ - int nnodes; - int maxnodes; - int mustfree; - - /* Linear array version of the data structures */ - int pgainspan, ngainspan; /* plus and negative gain span */ - int maxgain; - ListNodeType *nodes; - ListNodeType **buckets; - - /* Heap version of the data structure */ - KeyValueType *heap; - idxtype *locator; -}; - -typedef struct PQueueType PQueueType; - - -/************************************************************************* -* The following data structure stores an edge -**************************************************************************/ -struct edegreedef { - idxtype pid; - idxtype ed; -}; -typedef struct edegreedef EDegreeType; - - -/************************************************************************* -* The following data structure stores an edge for vol -**************************************************************************/ -struct vedegreedef { - idxtype pid; - idxtype ed, ned; - idxtype gv; -}; -typedef struct vedegreedef VEDegreeType; - - -/************************************************************************* -* This data structure holds various working space data -**************************************************************************/ -struct workspacedef { - idxtype *core; /* Where pairs, indices, and degrees are coming from */ - int maxcore, ccore; - - EDegreeType *edegrees; - VEDegreeType *vedegrees; - int cdegree; - - idxtype *auxcore; /* This points to the memory of the edegrees */ - - idxtype *pmat; /* An array of k^2 used for eliminating domain - connectivity in k-way refinement */ -}; - -typedef struct workspacedef WorkSpaceType; - - -/************************************************************************* -* The following data structure holds information on degrees for k-way -* partition -**************************************************************************/ -struct rinfodef { - int id, ed; /* ID/ED of nodes */ - int ndegrees; /* The number of different ext-degrees */ - EDegreeType *edegrees; /* List of edges */ -}; - -typedef struct rinfodef RInfoType; - - -/************************************************************************* -* The following data structure holds information on degrees for k-way -* vol-based partition -**************************************************************************/ -struct vrinfodef { - int id, ed, nid; /* ID/ED of nodes */ - int gv; /* IV/EV of nodes */ - int ndegrees; /* The number of different ext-degrees */ - VEDegreeType *edegrees; /* List of edges */ -}; - -typedef struct vrinfodef VRInfoType; - - -/************************************************************************* -* The following data structure holds information on degrees for k-way -* partition -**************************************************************************/ -struct nrinfodef { - idxtype edegrees[2]; -}; - -typedef struct nrinfodef NRInfoType; - - -/************************************************************************* -* This data structure holds the input graph -**************************************************************************/ -struct graphdef { - idxtype *gdata, *rdata; /* Memory pools for graph and refinement data. - This is where memory is allocated and used - the rest of the fields in this structure */ - - int nvtxs, nedges; /* The # of vertices and edges in the graph */ - idxtype *xadj; /* Pointers to the locally stored vertices */ - idxtype *vwgt; /* Vertex weights */ - idxtype *vsize; /* Vertex sizes for min-volume formulation */ - idxtype *adjncy; /* Array that stores the adjacency lists of nvtxs */ - idxtype *adjwgt; /* Array that stores the weights of the adjacency lists */ - - idxtype *adjwgtsum; /* The sum of the adjacency weight of each vertex */ - - idxtype *label; - - idxtype *cmap; - - /* Partition parameters */ - int mincut, minvol; - idxtype *where, *pwgts; - int nbnd; - idxtype *bndptr, *bndind; - - /* Bisection refinement parameters */ - idxtype *id, *ed; - - /* K-way refinement parameters */ - RInfoType *rinfo; - - /* K-way volume refinement parameters */ - VRInfoType *vrinfo; - - /* Node refinement information */ - NRInfoType *nrinfo; - - - /* Additional info needed by the MOC routines */ - int ncon; /* The # of constrains */ - float *nvwgt; /* Normalized vertex weights */ - float *npwgts; /* The normalized partition weights */ - - struct graphdef *coarser, *finer; -}; - -typedef struct graphdef GraphType; - - - -/************************************************************************* -* The following data type implements a timer -**************************************************************************/ -typedef double timer; - - -/************************************************************************* -* The following structure stores information used by Metis -**************************************************************************/ -struct controldef { - int CoarsenTo; /* The # of vertices in the coarsest graph */ - int dbglvl; /* Controls the debuging output of the program */ - int CType; /* The type of coarsening */ - int IType; /* The type of initial partitioning */ - int RType; /* The type of refinement */ - int maxvwgt; /* The maximum allowed weight for a vertex */ - float nmaxvwgt; /* The maximum allowed weight for a vertex for each constrain */ - int optype; /* Type of operation */ - int pfactor; /* .1*prunning factor */ - int nseps; /* The number of separators to be found during multiple bisections */ - int oflags; - - WorkSpaceType wspace; /* Work Space Informations */ - - /* Various Timers */ - timer TotalTmr, InitPartTmr, MatchTmr, ContractTmr, CoarsenTmr, UncoarsenTmr, - SepTmr, RefTmr, ProjectTmr, SplitTmr, AuxTmr1, AuxTmr2, AuxTmr3, AuxTmr4, AuxTmr5, AuxTmr6; - -}; - -typedef struct controldef CtrlType; - - -/************************************************************************* -* The following data structure stores max-partition weight info for -* Vertical MOC k-way refinement -**************************************************************************/ -struct vpwgtdef { - float max[2][MAXNCON]; - int imax[2][MAXNCON]; -}; - -typedef struct vpwgtdef VPInfoType; - - - - diff --git a/thirdparty/linux/include/coin1/symphony.h b/thirdparty/linux/include/coin1/symphony.h deleted file mode 100644 index d9ddace6..00000000 --- a/thirdparty/linux/include/coin1/symphony.h +++ /dev/null @@ -1,327 +0,0 @@ -/*===========================================================================*/ -/* */ -/* This file is part of the SYMPHONY MILP Solver Framework. */ -/* */ -/* SYMPHONY was jointly developed by Ted Ralphs (ted@lehigh.edu) and */ -/* Laci Ladanyi (ladanyi@us.ibm.com). */ -/* */ -/* (c) Copyright 2005-2015 Ted Ralphs. All Rights Reserved. */ -/* */ -/* This software is licensed under the Eclipse Public License. Please see */ -/* accompanying file for terms. */ -/* */ -/*===========================================================================*/ - -#ifndef _SYM_API_H -#define _SYM_API_H - -#define COMPILING_FOR_MASTER - -#ifdef PROTO -#undef PROTO -#endif -#define PROTO(x) x - -/***************************************************************************** - ***************************************************************************** - ************* ********** - ************* Return Values ********** - ************* ********** - ***************************************************************************** - *****************************************************************************/ - -/*----------------------- Global return codes -------------------------------*/ -#define FUNCTION_TERMINATED_NORMALLY 0 -#define FUNCTION_TERMINATED_ABNORMALLY -1 -#define ERROR__USER -100 - -/*-------------- Return codes for sym_parse_comand_line() -------------------*/ -#define ERROR__OPENING_PARAM_FILE -110 -#define ERROR__PARSING_PARAM_FILE -111 - -/*----------------- Return codes for sym_load_problem() ---------------------*/ -#define ERROR__READING_GMPL_FILE -120 -#define ERROR__READING_WARM_START_FILE -121 -#define ERROR__READING_MPS_FILE -122 -#define ERROR__READING_LP_FILE -123 - -/*-------------------- Return codes for sym_solve() -------------------------*/ -#define TM_NO_PROBLEM 225 -#define TM_NO_SOLUTION 226 -#define TM_OPTIMAL_SOLUTION_FOUND 227 -#define TM_TIME_LIMIT_EXCEEDED 228 -#define TM_NODE_LIMIT_EXCEEDED 229 -#define TM_ITERATION_LIMIT_EXCEEDED 230 -#define TM_TARGET_GAP_ACHIEVED 231 -#define TM_FOUND_FIRST_FEASIBLE 232 -#define TM_FINISHED 233 -#define TM_UNFINISHED 234 -#define TM_FEASIBLE_SOLUTION_FOUND 235 -#define TM_SIGNAL_CAUGHT 236 -#define TM_UNBOUNDED 237 -#define PREP_OPTIMAL_SOLUTION_FOUND 238 -#define PREP_NO_SOLUTION 239 -#define TM_ERROR__NO_BRANCHING_CANDIDATE -250 -#define TM_ERROR__ILLEGAL_RETURN_CODE -251 -#define TM_ERROR__NUMERICAL_INSTABILITY -252 -#define TM_ERROR__COMM_ERROR -253 -#define TM_ERROR__USER -275 -#define PREP_ERROR -276 - -/***************************************************************************** - ***************************************************************************** - ************* ********** - ************* General Constants ********** - ************* ********** - ***************************************************************************** - *****************************************************************************/ - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef ANYONE -#define ANYONE -1 -#endif -#ifndef ANYTHING -#define ANYTHING -1 -#endif - -#define DSIZE sizeof(double) -#define ISIZE sizeof(int) -#define CSIZE sizeof(char) - -#ifndef BITSPERBYTE -#define BITSPERBYTE 8 -#endif -#ifndef BITS -#define BITS(type) (BITSPERBYTE * (int)sizeof (type)) -#endif - -#ifdef HIBITI -#undef HIBITI -#endif -#define HIBITI (1U << (BITS(int) - 1)) -#ifdef MAXINT -#undef MAXINT -#endif -#define MAXINT ((int)(~(HIBITI))) -#ifdef MAXDOUBLE -#undef MAXDOUBLE -#endif -#define MAXDOUBLE 1.79769313486231570e+308 - -#define SYM_INFINITY 1e20 - -#define BIG_DBL 1e40 - -#define SYM_MINIMIZE 0 -#define SYM_MAXIMIZE 1 - -#define MAX_NAME_SIZE 255 - -/*--------------------- return values for user-written functions ------------*/ -#define USER_ERROR -5 -#define USER_SUCCESS -4 -#define USER_NO_PP -3 -#define USER_AND_PP -2 -#define USER_DEFAULT -1 - -/*------------ search order options for multi-criteria problems -------------*/ -#define MC_FIFO 0 -#define MC_LIFO 1 - -/*------------ warm_starting options for multi-criteria problems -------------*/ -#define MC_WS_UTOPIA_FIRST 0 -#define MC_WS_UTOPIA_BOTH_FIXED 1 -#define MC_WS_UTOPIA_BOTH 2 -#define MC_WS_BEST_CLOSE 3 - -/*------------------------ compare_candidates -------------------------------*/ -#define BIGGEST_DIFFERENCE_OBJ 0 -#define LOWEST_LOW_OBJ 1 -#define HIGHEST_LOW_OBJ 2 -#define LOWEST_HIGH_OBJ 3 -#define HIGHEST_HIGH_OBJ 4 -#define HIGH_LOW_COMBINATION 9 - -/*--------------------------- select_child ----------------------------------*/ -#define PREFER_LOWER_OBJ_VALUE 0 -#define PREFER_HIGHER_OBJ_VALUE 1 - -/*-------------------- generate_cuts_in_lp defaults -------------------------*/ -#define GENERATE_CGL_CUTS 20 -#define DO_NOT_GENERATE_CGL_CUTS 21 - -/*-------------------- xxx_cuts_generation_levels ---------------------------*/ -#define DO_NOT_GENERATE -1 -#define GENERATE_DEFAULT 0 -#define GENERATE_IF_IN_ROOT 1 -#define GENERATE_ONLY_IN_ROOT 2 -#define GENERATE_ALWAYS 3 -#define GENERATE_PERIODICALLY 4 - -/*------------------------- node selection rules ----------------------------*/ -#define LOWEST_LP_FIRST 0 -#define HIGHEST_LP_FIRST 1 -#define BREADTH_FIRST_SEARCH 2 -#define DEPTH_FIRST_SEARCH 3 -#define BEST_FIRST_SEARCH 4 -#define DEPTH_FIRST_THEN_BEST_FIRST 5 - -/*-------------------------- diving_strategy --------------------------------*/ -#define BEST_ESTIMATE 0 -#define COMP_BEST_K 1 -#define COMP_BEST_K_GAP 2 - -/*--------------- parameter values for feasibility pump heuristic -----------*/ -#define SYM_FEAS_PUMP_DEFAULT 1 /* use fp using the default rules */ -#define SYM_FEAS_PUMP_REPEATED 2 /* use fp till the end of solve */ -#define SYM_FEAS_PUMP_TILL_SOL 3 /* use fp till a solution is found */ -#define SYM_FEAS_PUMP_DISABLE -1 /* dont use fp */ - -typedef struct MIPDESC MIPdesc; -typedef struct WARM_START_DESC warm_start_desc; -typedef struct SYM_ENVIRONMENT sym_environment; - -/*===========================================================================*/ -/*===================== Interface functions (master.c) ======================*/ -/*===========================================================================*/ - -void sym_version PROTO((void)); -sym_environment *sym_open_environment PROTO((void)); -int sym_set_defaults PROTO((sym_environment *env)); -int sym_parse_command_line PROTO((sym_environment *env, int argc, - char **argv)); -int sym_set_user_data PROTO((sym_environment *env, void *user)); -int sym_get_user_data PROTO((sym_environment *env, void **user)); -int sym_read_mps PROTO((sym_environment *env, char *infile)); -int sym_read_lp PROTO((sym_environment *env, char *infile)); -int sym_read_gmpl PROTO((sym_environment *env, char *modelfile, - char *datafile)); -int sym_write_mps PROTO((sym_environment *env, char *infile)); -int sym_write_lp PROTO((sym_environment *env, char *infile)); - -int sym_load_problem PROTO((sym_environment *env)); -int sym_find_initial_bounds PROTO((sym_environment *env)); - -int sym_solve PROTO((sym_environment *env)); -int sym_warm_solve PROTO((sym_environment *env)); -int sym_mc_solve PROTO((sym_environment *env)); - -int sym_create_permanent_cut_pools PROTO((sym_environment *env, int *cp_num)); -int sym_close_environment PROTO((sym_environment *env)); -int sym_explicit_load_problem PROTO((sym_environment *env, int numcols, - int numrows, int *start, int *index, - double *value, double *collb, - double *colub, char *is_int, double *obj, - double *obj2, char *rowsen, - double *rowrhs, double *rowrng, - char make_copy)); - -int sym_is_abandoned PROTO((sym_environment *env)); -int sym_is_proven_optimal PROTO((sym_environment *env)); -int sym_is_proven_primal_infeasible PROTO((sym_environment *env)); -int sym_is_iteration_limit_reached PROTO((sym_environment *env)); -int sym_is_time_limit_reached PROTO((sym_environment *env)); -int sym_is_target_gap_achieved PROTO((sym_environment *env)); - -int sym_get_status PROTO((sym_environment *env)); -int sym_get_num_cols PROTO((sym_environment *env, int *numcols)); -int sym_get_num_rows PROTO((sym_environment *env, int *numrows)); -int sym_get_num_elements PROTO((sym_environment *env, int *numelems)); -int sym_get_col_lower PROTO((sym_environment *env, double *collb)); -int sym_get_col_upper PROTO((sym_environment *env, double *colub)); -int sym_get_row_sense PROTO((sym_environment *env, char *rowsen)); -int sym_get_rhs PROTO((sym_environment *env, double *rowrhs)); -int sym_get_matrix PROTO((sym_environment *env, int *nz, int *matbeg, - int *matind, double *matval)); -int sym_get_row_range PROTO((sym_environment *env, double *rowrng)); -int sym_get_row_lower PROTO((sym_environment *env, double *rowlb)); -int sym_get_row_upper PROTO((sym_environment *env, double *rowub)); -int sym_get_obj_coeff PROTO((sym_environment *env, double *obj)); -int sym_get_obj2_coeff PROTO((sym_environment *env, double *obj2)); -int sym_get_obj_sense PROTO((sym_environment *env, int *sense)); - -int sym_is_continuous PROTO((sym_environment *env, int index, int *value)); -int sym_is_binary PROTO((sym_environment *env, int index, int *value)); -int sym_is_integer PROTO((sym_environment *env, int index, char *value)); - -double sym_get_infinity PROTO(()); - -int sym_get_col_solution PROTO((sym_environment *env, double *colsol)); -int sym_get_sp_size PROTO((sym_environment *env, int *size)); -int sym_get_sp_solution PROTO((sym_environment *env, int index, - double *colsol, double *objval)); -int sym_get_row_activity PROTO((sym_environment *env, double *rowact)); -int sym_get_obj_val PROTO((sym_environment *env, double *objval)); -int sym_get_primal_bound PROTO((sym_environment *env, double *ub)); -int sym_get_iteration_count PROTO((sym_environment *env, int *numnodes)); - -int sym_set_obj_coeff PROTO((sym_environment *env, int index, double value)); -int sym_set_obj2_coeff PROTO((sym_environment *env, int index, double value)); -int sym_set_col_lower PROTO((sym_environment *env, int index, double value)); -int sym_set_col_upper PROTO((sym_environment *env, int index, double value)); -int sym_set_row_lower PROTO((sym_environment *env, int index, double value)); -int sym_set_row_upper PROTO((sym_environment *env, int index, double value)); -int sym_set_row_type PROTO((sym_environment *env, int index, char rowsense, - double rowrhs, double rowrng)); -int sym_set_obj_sense PROTO((sym_environment *env, int sense)); -int sym_set_col_solution PROTO((sym_environment *env, double * colsol)); -int sym_set_primal_bound PROTO((sym_environment *env, double bound)); -int sym_set_continuous PROTO((sym_environment *env, int index)); -int sym_set_integer PROTO((sym_environment *env, int index)); -int sym_set_col_names PROTO((sym_environment *env, char **colname)); -int sym_add_col PROTO((sym_environment *env, int numelems, int *indices, - double *elements, double collb, double colub, - double obj, char is_int, char *name)); -int sym_add_row PROTO((sym_environment *env, int numelems, int *indices, - double *elements, char rowsen, double rowrhs, - double rowrng)); -int sym_delete_cols PROTO((sym_environment *env, int num, int * indices)); -int sym_delete_rows PROTO((sym_environment *env, int num, int * indices)); - -int sym_write_warm_start_desc PROTO((warm_start_desc *ws, char *file)); -warm_start_desc *sym_read_warm_start PROTO((char *file)); - -void sym_delete_warm_start PROTO((warm_start_desc *ws)); -warm_start_desc *sym_get_warm_start PROTO((sym_environment *env, - int copy_warm_start)); - -int sym_set_warm_start PROTO((sym_environment *env, warm_start_desc *ws)); - -int sym_set_int_param PROTO((sym_environment *env, const char *key, int value)); -int sym_set_dbl_param PROTO((sym_environment *env, const char *key, double value)); -int sym_set_str_param PROTO((sym_environment *env, const char *key, const char *value)); - -int sym_get_int_param PROTO((sym_environment *env, const char *key, int *value)); -int sym_get_dbl_param PROTO((sym_environment *env, const char *key, double *value)); -int sym_get_str_param PROTO((sym_environment *env, const char *key, char **value)); - -int sym_get_lb_for_new_rhs PROTO((sym_environment *env, int cnt, - int *new_rhs_ind, double *new_rhs_val, - double *lb_for_new_rhs)); -int sym_get_ub_for_new_rhs PROTO((sym_environment *env, int cnt, - int *new_rhs_ind, double *new_rhs_val, - double *ub_for_new_rhs)); -#if 0 -int sym_get_lb_for_new_obj PROTO((sym_environment *env, int cnt, - int *new_obj_ind, double *new_obj_val, - double *lb_for_new_obj)); -#endif -int sym_get_ub_for_new_obj PROTO((sym_environment *env, int cnt, - int *new_obj_ind, double *new_obj_val, - double *ub_for_new_obj)); - -warm_start_desc *sym_create_copy_warm_start PROTO((warm_start_desc * ws)); -MIPdesc *sym_create_copy_mip_desc PROTO((sym_environment *env)); -MIPdesc *sym_get_presolved_mip_desc PROTO((sym_environment *env)); -sym_environment * sym_create_copy_environment PROTO((sym_environment *env)); - -int sym_test PROTO((sym_environment *env, int argc, char **argv, - int *test_status)); - -#endif From e25f93ac59ef071a02d7babb96b15d4879f2d06c Mon Sep 17 00:00:00 2001 From: souvikdas95 Date: Fri, 15 Sep 2017 01:09:02 +0530 Subject: [PATCH 2/3] Refactor ECOS libraries and header files --- etc/FOSSEE_Optimization_Toolbox.start | 3 +- .../linux/include/ecos/SuiteSparse_config.h | 179 ++++++++ thirdparty/linux/include/ecos/amd.h | 411 ++++++++++++++++++ thirdparty/linux/include/ecos/amd_internal.h | 347 +++++++++++++++ .../linux/include/{coin => ecos}/cone.h | 0 thirdparty/linux/include/ecos/ctrlc.h | 66 +++ .../linux/include/{coin => ecos}/data.h | 0 thirdparty/linux/include/ecos/ecos.h | 323 ++++++++++++++ thirdparty/linux/include/ecos/ecos_bb.h | 208 +++++++++ thirdparty/linux/include/ecos/equil.h | 50 +++ thirdparty/linux/include/ecos/expcone.h | 87 ++++ thirdparty/linux/include/ecos/glblopts.h | 118 +++++ thirdparty/linux/include/{coin => ecos}/kkt.h | 0 thirdparty/linux/include/ecos/ldl.h | 98 +++++ .../linux/include/{coin => ecos}/spla.h | 0 thirdparty/linux/include/ecos/splamm.h | 126 ++++++ thirdparty/linux/include/ecos/timer.h | 75 ++++ thirdparty/linux/include/ecos/wright_omega.h | 26 ++ thirdparty/linux/lib/x64/libecos.so | Bin 87800 -> 109000 bytes thirdparty/linux/lib/x64/libecos_bb.so | Bin 0 -> 122488 bytes thirdparty/linux/lib/x86/libecos.so | Bin 0 -> 106388 bytes thirdparty/linux/lib/x86/libecos_bb.so | Bin 0 -> 119600 bytes .../windows/include/ecos/SuiteSparse_config.h | 179 ++++++++ thirdparty/windows/include/ecos/amd.h | 411 ++++++++++++++++++ .../windows/include/ecos/amd_internal.h | 347 +++++++++++++++ thirdparty/windows/include/ecos/cone.h | 171 ++++++++ thirdparty/windows/include/ecos/ctrlc.h | 66 +++ thirdparty/windows/include/ecos/data.h | 37 ++ thirdparty/windows/include/ecos/ecos.h | 323 ++++++++++++++ thirdparty/windows/include/ecos/ecos_bb.h | 208 +++++++++ thirdparty/windows/include/ecos/equil.h | 50 +++ thirdparty/windows/include/ecos/expcone.h | 87 ++++ thirdparty/windows/include/ecos/glblopts.h | 118 +++++ thirdparty/windows/include/ecos/kkt.h | 135 ++++++ thirdparty/windows/include/ecos/ldl.h | 98 +++++ thirdparty/windows/include/ecos/spla.h | 98 +++++ thirdparty/windows/include/ecos/splamm.h | 126 ++++++ thirdparty/windows/include/ecos/timer.h | 75 ++++ .../windows/include/ecos/wright_omega.h | 26 ++ thirdparty/windows/lib/x64/AMD.lib | Bin 0 -> 91490 bytes thirdparty/windows/lib/x64/ECOS.lib | Bin 0 -> 236788 bytes thirdparty/windows/lib/x64/ECOS_BB.lib | Bin 0 -> 294072 bytes thirdparty/windows/lib/x64/LDL.lib | Bin 0 -> 22026 bytes thirdparty/windows/lib/x86/AMD.lib | Bin 0 -> 83848 bytes thirdparty/windows/lib/x86/ECOS.lib | Bin 0 -> 205028 bytes thirdparty/windows/lib/x86/ECOS_BB.lib | Bin 0 -> 256496 bytes thirdparty/windows/lib/x86/LDL.lib | Bin 0 -> 19594 bytes 47 files changed, 4671 insertions(+), 1 deletion(-) create mode 100755 thirdparty/linux/include/ecos/SuiteSparse_config.h create mode 100755 thirdparty/linux/include/ecos/amd.h create mode 100755 thirdparty/linux/include/ecos/amd_internal.h rename thirdparty/linux/include/{coin => ecos}/cone.h (100%) mode change 100644 => 100755 create mode 100755 thirdparty/linux/include/ecos/ctrlc.h rename thirdparty/linux/include/{coin => ecos}/data.h (100%) mode change 100644 => 100755 create mode 100755 thirdparty/linux/include/ecos/ecos.h create mode 100644 thirdparty/linux/include/ecos/ecos_bb.h create mode 100755 thirdparty/linux/include/ecos/equil.h create mode 100755 thirdparty/linux/include/ecos/expcone.h create mode 100755 thirdparty/linux/include/ecos/glblopts.h rename thirdparty/linux/include/{coin => ecos}/kkt.h (100%) mode change 100644 => 100755 create mode 100755 thirdparty/linux/include/ecos/ldl.h rename thirdparty/linux/include/{coin => ecos}/spla.h (100%) mode change 100644 => 100755 create mode 100755 thirdparty/linux/include/ecos/splamm.h create mode 100755 thirdparty/linux/include/ecos/timer.h create mode 100755 thirdparty/linux/include/ecos/wright_omega.h create mode 100755 thirdparty/linux/lib/x64/libecos_bb.so create mode 100755 thirdparty/linux/lib/x86/libecos.so create mode 100755 thirdparty/linux/lib/x86/libecos_bb.so create mode 100755 thirdparty/windows/include/ecos/SuiteSparse_config.h create mode 100755 thirdparty/windows/include/ecos/amd.h create mode 100755 thirdparty/windows/include/ecos/amd_internal.h create mode 100755 thirdparty/windows/include/ecos/cone.h create mode 100755 thirdparty/windows/include/ecos/ctrlc.h create mode 100755 thirdparty/windows/include/ecos/data.h create mode 100755 thirdparty/windows/include/ecos/ecos.h create mode 100644 thirdparty/windows/include/ecos/ecos_bb.h create mode 100755 thirdparty/windows/include/ecos/equil.h create mode 100755 thirdparty/windows/include/ecos/expcone.h create mode 100755 thirdparty/windows/include/ecos/glblopts.h create mode 100755 thirdparty/windows/include/ecos/kkt.h create mode 100755 thirdparty/windows/include/ecos/ldl.h create mode 100755 thirdparty/windows/include/ecos/spla.h create mode 100755 thirdparty/windows/include/ecos/splamm.h create mode 100755 thirdparty/windows/include/ecos/timer.h create mode 100755 thirdparty/windows/include/ecos/wright_omega.h create mode 100755 thirdparty/windows/lib/x64/AMD.lib create mode 100755 thirdparty/windows/lib/x64/ECOS.lib create mode 100755 thirdparty/windows/lib/x64/ECOS_BB.lib create mode 100755 thirdparty/windows/lib/x64/LDL.lib create mode 100755 thirdparty/windows/lib/x86/AMD.lib create mode 100755 thirdparty/windows/lib/x86/ECOS.lib create mode 100755 thirdparty/windows/lib/x86/ECOS_BB.lib create mode 100755 thirdparty/windows/lib/x86/LDL.lib diff --git a/etc/FOSSEE_Optimization_Toolbox.start b/etc/FOSSEE_Optimization_Toolbox.start index db711521..bfa9d3ee 100644 --- a/etc/FOSSEE_Optimization_Toolbox.start +++ b/etc/FOSSEE_Optimization_Toolbox.start @@ -52,8 +52,9 @@ else link(lib_path + "/libcoinmumps.so"); link(lib_path + "/libipopt.so"); link(lib_path + "/libCbc.so"); - link(lib_path + '/libbonmin.so'); + link(lib_path + "/libbonmin.so"); link(lib_path + "/libecos.so"); + link(lib_path + "/libecos_bb.so"); end exec(pathconvert(root_tlbx + filesep() + "sci_gateway" + filesep() + "loader_gateway.sce",%f)); diff --git a/thirdparty/linux/include/ecos/SuiteSparse_config.h b/thirdparty/linux/include/ecos/SuiteSparse_config.h new file mode 100755 index 00000000..a5f6ee13 --- /dev/null +++ b/thirdparty/linux/include/ecos/SuiteSparse_config.h @@ -0,0 +1,179 @@ +/* ========================================================================== */ +/* === SuiteSparse_config =================================================== */ +/* ========================================================================== */ + +/* Configuration file for SuiteSparse: a Suite of Sparse matrix packages + * (AMD, COLAMD, CCOLAMD, CAMD, CHOLMOD, UMFPACK, CXSparse, and others). + * + * SuiteSparse_config.h provides the definition of the long integer. On most + * systems, a C program can be compiled in LP64 mode, in which long's and + * pointers are both 64-bits, and int's are 32-bits. Windows 64, however, uses + * the LLP64 model, in which int's and long's are 32-bits, and long long's and + * pointers are 64-bits. + * + * SuiteSparse packages that include long integer versions are + * intended for the LP64 mode. However, as a workaround for Windows 64 + * (and perhaps other systems), the long integer can be redefined. + * + * If _WIN64 is defined, then the __int64 type is used instead of long. + * + * The long integer can also be defined at compile time. For example, this + * could be added to SuiteSparse_config.mk: + * + * CFLAGS = -O -D'SuiteSparse_long=long long' \ + * -D'SuiteSparse_long_max=9223372036854775801' -D'SuiteSparse_long_idd="lld"' + * + * This file defines SuiteSparse_long as either long (on all but _WIN64) or + * __int64 on Windows 64. The intent is that a SuiteSparse_long is always a + * 64-bit integer in a 64-bit code. ptrdiff_t might be a better choice than + * long; it is always the same size as a pointer. + * + * This file also defines the SUITESPARSE_VERSION and related definitions. + * + * Copyright (c) 2012, Timothy A. Davis. No licensing restrictions apply + * to this file or to the SuiteSparse_config directory. + * Author: Timothy A. Davis. + */ + +#ifndef _SUITESPARSECONFIG_H +#define _SUITESPARSECONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* ========================================================================== */ +/* === SuiteSparse_long ===================================================== */ +/* ========================================================================== */ + +#ifndef SuiteSparse_long + +#if _WIN64 && !(defined PYTHON) && (defined _MSC_VER) + +#define SuiteSparse_long __int64 +#define SuiteSparse_long_max _I64_MAX +#define SuiteSparse_long_idd "I64d" + +#else + +#define SuiteSparse_long long +#define SuiteSparse_long_max LONG_MAX +#define SuiteSparse_long_idd "ld" + +#endif +#define SuiteSparse_long_id "%" SuiteSparse_long_idd +#endif + +/* For backward compatibility with prior versions of SuiteSparse. The UF_* + * macros are deprecated and will be removed in a future version. */ +#ifndef UF_long +#define UF_long SuiteSparse_long +#define UF_long_max SuiteSparse_long_max +#define UF_long_idd SuiteSparse_long_idd +#define UF_long_id SuiteSparse_long_id +#endif + +/* ========================================================================== */ +/* === SuiteSparse_config parameters and functions ========================== */ +/* ========================================================================== */ + +/* SuiteSparse-wide parameters will be placed in this struct. */ + +typedef struct SuiteSparse_config_struct +{ + void *(*malloc_memory) (size_t) ; /* pointer to malloc */ + void *(*realloc_memory) (void *, size_t) ; /* pointer to realloc */ + void (*free_memory) (void *) ; /* pointer to free */ + void *(*calloc_memory) (size_t, size_t) ; /* pointer to calloc */ + +} SuiteSparse_config ; + +void *SuiteSparse_malloc /* pointer to allocated block of memory */ +( + size_t nitems, /* number of items to malloc (>=1 is enforced) */ + size_t size_of_item, /* sizeof each item */ + int *ok, /* TRUE if successful, FALSE otherwise */ + SuiteSparse_config *config /* SuiteSparse-wide configuration */ +) ; + +void *SuiteSparse_free /* always returns NULL */ +( + void *p, /* block to free */ + SuiteSparse_config *config /* SuiteSparse-wide configuration */ +) ; + +void SuiteSparse_tic /* start the timer */ +( + double tic [2] /* output, contents undefined on input */ +) ; + +double SuiteSparse_toc /* return time in seconds since last tic */ +( + double tic [2] /* input: from last call to SuiteSparse_tic */ +) ; + +double SuiteSparse_time /* returns current wall clock time in seconds */ +( + void +) ; + +/* determine which timer to use, if any */ +#ifndef NTIMER +#ifdef _POSIX_C_SOURCE +#if _POSIX_C_SOURCE >= 199309L +#define SUITESPARSE_TIMER_ENABLED +#endif +#endif +#endif + +/* ========================================================================== */ +/* === SuiteSparse version ================================================== */ +/* ========================================================================== */ + +/* SuiteSparse is not a package itself, but a collection of packages, some of + * which must be used together (UMFPACK requires AMD, CHOLMOD requires AMD, + * COLAMD, CAMD, and CCOLAMD, etc). A version number is provided here for the + * collection itself. The versions of packages within each version of + * SuiteSparse are meant to work together. Combining one packge from one + * version of SuiteSparse, with another package from another version of + * SuiteSparse, may or may not work. + * + * SuiteSparse contains the following packages: + * + * SuiteSparse_config version 4.0.2 (version always the same as SuiteSparse) + * AMD version 2.3.1 + * BTF version 1.2.0 + * CAMD version 2.3.1 + * CCOLAMD version 2.8.0 + * CHOLMOD version 2.0.1 + * COLAMD version 2.8.0 + * CSparse version 3.1.1 + * CXSparse version 3.1.1 + * KLU version 1.2.1 + * LDL version 2.1.0 + * RBio version 2.1.1 + * SPQR version 1.3.1 (full name is SuiteSparseQR) + * UMFPACK version 5.6.1 + * MATLAB_Tools various packages & M-files + * + * Other package dependencies: + * BLAS required by CHOLMOD and UMFPACK + * LAPACK required by CHOLMOD + * METIS 4.0.1 required by CHOLMOD (optional) and KLU (optional) + */ + +#define SUITESPARSE_DATE "July 17, 2012" +#define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) +#define SUITESPARSE_MAIN_VERSION 4 +#define SUITESPARSE_SUB_VERSION 0 +#define SUITESPARSE_SUBSUB_VERSION 2 +#define SUITESPARSE_VERSION \ + SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/thirdparty/linux/include/ecos/amd.h b/thirdparty/linux/include/ecos/amd.h new file mode 100755 index 00000000..fff699dc --- /dev/null +++ b/thirdparty/linux/include/ecos/amd.h @@ -0,0 +1,411 @@ +/* ========================================================================= */ +/* === AMD: approximate minimum degree ordering =========================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 2.2, Copyright (c) 2007 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky + * factorization of P*A*P' has fewer nonzeros and takes less work than the + * Cholesky factorization of A. If A is not symmetric, then it performs its + * ordering on the matrix A+A'. Two sets of user-callable routines are + * provided, one for int integers and the other for SuiteSparse_long integers. + * + * The method is based on the approximate minimum degree algorithm, discussed + * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm", + * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp. + * 886-905, 1996. This package can perform both the AMD ordering (with + * aggressive absorption), and the AMDBAR ordering (without aggressive + * absorption) discussed in the above paper. This package differs from the + * Fortran codes discussed in the paper: + * + * (1) it can ignore "dense" rows and columns, leading to faster run times + * (2) it computes the ordering of A+A' if A is not symmetric + * (3) it is followed by a depth-first post-ordering of the assembly tree + * (or supernodal elimination tree) + * + * For historical reasons, the Fortran versions, amd.f and amdbar.f, have + * been left (nearly) unchanged. They compute the identical ordering as + * described in the above paper. + */ + +#ifndef AMD_H +#define AMD_H + +/* make it easy for C++ programs to include AMD */ +#ifdef __cplusplus +extern "C" { +#endif + +/* get the definition of size_t: */ +#include + +#include "SuiteSparse_config.h" + +int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, + * AMD_INVALID, or AMD_OUT_OF_MEMORY */ +( + int n, /* A is n-by-n. n must be >= 0. */ + const int Ap [ ], /* column pointers for A, of size n+1 */ + const int Ai [ ], /* row indices of A, of size nz = Ap [n] */ + int P [ ], /* output permutation, of size n */ + double Control [ ], /* input Control settings, of size AMD_CONTROL */ + double Info [ ] /* output Info statistics, of size AMD_INFO */ +) ; + +SuiteSparse_long amd_l_order /* see above for description of arguments */ +( + SuiteSparse_long n, + const SuiteSparse_long Ap [ ], + const SuiteSparse_long Ai [ ], + SuiteSparse_long P [ ], + double Control [ ], + double Info [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/SuiteSparse_long array of size n+1, containing column + * pointers of A. + * Ai: an int/SuiteSparse_long array of size nz, containing the row + * indices of A, where nz = Ap [n]. + * Control: a double array of size AMD_CONTROL, containing control + * parameters. Defaults are used if Control is NULL. + * + * Output arguments (not defined on input): + * + * P: an int/SuiteSparse_long array of size n, containing the output + * permutation. If row i is the kth pivot row, then P [k] = i. In + * MATLAB notation, the reordered matrix is A (P,P). + * Info: a double array of size AMD_INFO, containing statistical + * information. Ignored if Info is NULL. + * + * On input, the matrix A is stored in column-oriented form. The row indices + * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1]. + * + * If the row indices appear in ascending order in each column, and there + * are no duplicate entries, then amd_order is slightly more efficient in + * terms of time and memory usage. If this condition does not hold, a copy + * of the matrix is created (where these conditions do hold), and the copy is + * ordered. This feature is new to v2.0 (v1.2 and earlier required this + * condition to hold for the input matrix). + * + * Row indices must be in the range 0 to + * n-1. Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros + * in A. The array Ap is of size n+1, and the array Ai is of size nz = Ap [n]. + * The matrix does not need to be symmetric, and the diagonal does not need to + * be present (if diagonal entries are present, they are ignored except for + * the output statistic Info [AMD_NZDIAG]). The arrays Ai and Ap are not + * modified. This form of the Ap and Ai arrays to represent the nonzero + * pattern of the matrix A is the same as that used internally by MATLAB. + * If you wish to use a more flexible input structure, please see the + * umfpack_*_triplet_to_col routines in the UMFPACK package, at + * http://www.suitesparse.com. + * + * Restrictions: n >= 0. Ap [0] = 0. Ap [j] <= Ap [j+1] for all j in the + * range 0 to n-1. nz = Ap [n] >= 0. Ai [0..nz-1] must be in the range 0 + * to n-1. Finally, Ai, Ap, and P must not be NULL. If any of these + * restrictions are not met, AMD returns AMD_INVALID. + * + * AMD returns: + * + * AMD_OK if the matrix is valid and sufficient memory can be allocated to + * perform the ordering. + * + * AMD_OUT_OF_MEMORY if not enough memory can be allocated. + * + * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is + * NULL. + * + * AMD_OK_BUT_JUMBLED if the matrix had unsorted columns, and/or duplicate + * entries, but was otherwise valid. + * + * The AMD routine first forms the pattern of the matrix A+A', and then + * computes a fill-reducing ordering, P. If P [k] = i, then row/column i of + * the original is the kth pivotal row. In MATLAB notation, the permuted + * matrix is A (P,P), except that 0-based indexing is used instead of the + * 1-based indexing in MATLAB. + * + * The Control array is used to set various parameters for AMD. If a NULL + * pointer is passed, default values are used. The Control array is not + * modified. + * + * Control [AMD_DENSE]: controls the threshold for "dense" rows/columns. + * A dense row/column in A+A' can cause AMD to spend a lot of time in + * ordering the matrix. If Control [AMD_DENSE] >= 0, rows/columns + * with more than Control [AMD_DENSE] * sqrt (n) entries are ignored + * during the ordering, and placed last in the output order. The + * default value of Control [AMD_DENSE] is 10. If negative, no + * rows/columns are treated as "dense". Rows/columns with 16 or + * fewer off-diagonal entries are never considered "dense". + * + * Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive + * absorption, in which a prior element is absorbed into the current + * element if is a subset of the current element, even if it is not + * adjacent to the current pivot element (refer to Amestoy, Davis, + * & Duff, 1996, for more details). The default value is nonzero, + * which means to perform aggressive absorption. This nearly always + * leads to a better ordering (because the approximate degrees are + * more accurate) and a lower execution time. There are cases where + * it can lead to a slightly worse ordering, however. To turn it off, + * set Control [AMD_AGGRESSIVE] to 0. + * + * Control [2..4] are not used in the current version, but may be used in + * future versions. + * + * The Info array provides statistics about the ordering on output. If it is + * not present, the statistics are not returned. This is not an error + * condition. + * + * Info [AMD_STATUS]: the return value of AMD, either AMD_OK, + * AMD_OK_BUT_JUMBLED, AMD_OUT_OF_MEMORY, or AMD_INVALID. + * + * Info [AMD_N]: n, the size of the input matrix + * + * Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n] + * + * Info [AMD_SYMMETRY]: the symmetry of the matrix A. It is the number + * of "matched" off-diagonal entries divided by the total number of + * off-diagonal entries. An entry A(i,j) is matched if A(j,i) is also + * an entry, for any pair (i,j) for which i != j. In MATLAB notation, + * S = spones (A) ; + * B = tril (S, -1) + triu (S, 1) ; + * symmetry = nnz (B & B') / nnz (B) ; + * + * Info [AMD_NZDIAG]: the number of entries on the diagonal of A. + * + * Info [AMD_NZ_A_PLUS_AT]: the number of nonzeros in A+A', excluding the + * diagonal. If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1) + * with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n + * (the smallest possible value). If A is perfectly unsymmetric + * (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for + * example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz + * (the largest possible value). + * + * Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were + * removed from A prior to ordering. These are placed last in the + * output order P. + * + * Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes. In the + * current version, this is 1.2 * Info [AMD_NZ_A_PLUS_AT] + 9*n + * times the size of an integer. This is at most 2.4nz + 9n. This + * excludes the size of the input arguments Ai, Ap, and P, which have + * a total size of nz + 2*n + 1 integers. + * + * Info [AMD_NCMPA]: the number of garbage collections performed. + * + * Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal). + * This is a slight upper bound because mass elimination is combined + * with the approximate degree update. It is a rough upper bound if + * there are many "dense" rows/columns. The rest of the statistics, + * below, are also slight or rough upper bounds, for the same reasons. + * The post-ordering of the assembly tree might also not exactly + * correspond to a true elimination tree postordering. + * + * Info [AMD_NDIV]: the number of divide operations for a subsequent LDL' + * or LU factorization of the permuted matrix A (P,P). + * + * Info [AMD_NMULTSUBS_LDL]: the number of multiply-subtract pairs for a + * subsequent LDL' factorization of A (P,P). + * + * Info [AMD_NMULTSUBS_LU]: the number of multiply-subtract pairs for a + * subsequent LU factorization of A (P,P), assuming that no numerical + * pivoting is required. + * + * Info [AMD_DMAX]: the maximum number of nonzeros in any column of L, + * including the diagonal. + * + * Info [14..19] are not used in the current version, but may be used in + * future versions. + */ + +/* ------------------------------------------------------------------------- */ +/* direct interface to AMD */ +/* ------------------------------------------------------------------------- */ + +/* amd_2 is the primary AMD ordering routine. It is not meant to be + * user-callable because of its restrictive inputs and because it destroys + * the user's input matrix. It does not check its inputs for errors, either. + * However, if you can work with these restrictions it can be faster than + * amd_order and use less memory (assuming that you can create your own copy + * of the matrix for AMD to destroy). Refer to AMD/Source/amd_2.c for a + * description of each parameter. */ + +void amd_2 +( + int n, + int Pe [ ], + int Iw [ ], + int Len [ ], + int iwlen, + int pfree, + int Nv [ ], + int Next [ ], + int Last [ ], + int Head [ ], + int Elen [ ], + int Degree [ ], + int W [ ], + double Control [ ], + double Info [ ] +) ; + +void amd_l2 +( + SuiteSparse_long n, + SuiteSparse_long Pe [ ], + SuiteSparse_long Iw [ ], + SuiteSparse_long Len [ ], + SuiteSparse_long iwlen, + SuiteSparse_long pfree, + SuiteSparse_long Nv [ ], + SuiteSparse_long Next [ ], + SuiteSparse_long Last [ ], + SuiteSparse_long Head [ ], + SuiteSparse_long Elen [ ], + SuiteSparse_long Degree [ ], + SuiteSparse_long W [ ], + double Control [ ], + double Info [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* amd_valid */ +/* ------------------------------------------------------------------------- */ + +/* Returns AMD_OK or AMD_OK_BUT_JUMBLED if the matrix is valid as input to + * amd_order; the latter is returned if the matrix has unsorted and/or + * duplicate row indices in one or more columns. Returns AMD_INVALID if the + * matrix cannot be passed to amd_order. For amd_order, the matrix must also + * be square. The first two arguments are the number of rows and the number + * of columns of the matrix. For its use in AMD, these must both equal n. + * + * NOTE: this routine returned TRUE/FALSE in v1.2 and earlier. + */ + +int amd_valid +( + int n_row, /* # of rows */ + int n_col, /* # of columns */ + const int Ap [ ], /* column pointers, of size n_col+1 */ + const int Ai [ ] /* row indices, of size Ap [n_col] */ +) ; + +SuiteSparse_long amd_l_valid +( + SuiteSparse_long n_row, + SuiteSparse_long n_col, + const SuiteSparse_long Ap [ ], + const SuiteSparse_long Ai [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* AMD memory manager and printf routines */ +/* ------------------------------------------------------------------------- */ + +/* The user can redefine these to change the malloc, free, and printf routines + * that AMD uses. */ + +#ifndef EXTERN +#define EXTERN extern +#endif + +EXTERN void *(*amd_malloc) (size_t) ; /* pointer to malloc */ +EXTERN void (*amd_free) (void *) ; /* pointer to free */ +EXTERN void *(*amd_realloc) (void *, size_t) ; /* pointer to realloc */ +EXTERN void *(*amd_calloc) (size_t, size_t) ; /* pointer to calloc */ +EXTERN int (*amd_printf) (const char *, ...) ; /* pointer to printf */ + +/* ------------------------------------------------------------------------- */ +/* AMD Control and Info arrays */ +/* ------------------------------------------------------------------------- */ + +/* amd_defaults: sets the default control settings */ +void amd_defaults (double Control [ ]) ; +void amd_l_defaults (double Control [ ]) ; + +/* amd_control: prints the control settings */ +void amd_control (double Control [ ]) ; +void amd_l_control (double Control [ ]) ; + +/* amd_info: prints the statistics */ +void amd_info (double Info [ ]) ; +void amd_l_info (double Info [ ]) ; + +#define AMD_CONTROL 5 /* size of Control array */ +#define AMD_INFO 20 /* size of Info array */ + +/* contents of Control */ +#define AMD_DENSE 0 /* "dense" if degree > Control [0] * sqrt (n) */ +#define AMD_AGGRESSIVE 1 /* do aggressive absorption if Control [1] != 0 */ + +/* default Control settings */ +#define AMD_DEFAULT_DENSE 10.0 /* default "dense" degree 10*sqrt(n) */ +#define AMD_DEFAULT_AGGRESSIVE 1 /* do aggressive absorption by default */ + +/* contents of Info */ +#define AMD_STATUS 0 /* return value of amd_order and amd_l_order */ +#define AMD_N 1 /* A is n-by-n */ +#define AMD_NZ 2 /* number of nonzeros in A */ +#define AMD_SYMMETRY 3 /* symmetry of pattern (1 is sym., 0 is unsym.) */ +#define AMD_NZDIAG 4 /* # of entries on diagonal */ +#define AMD_NZ_A_PLUS_AT 5 /* nz in A+A' */ +#define AMD_NDENSE 6 /* number of "dense" rows/columns in A */ +#define AMD_MEMORY 7 /* amount of memory used by AMD */ +#define AMD_NCMPA 8 /* number of garbage collections in AMD */ +#define AMD_LNZ 9 /* approx. nz in L, excluding the diagonal */ +#define AMD_NDIV 10 /* number of fl. point divides for LU and LDL' */ +#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */ +#define AMD_NMULTSUBS_LU 12 /* number of fl. point (*,-) pairs for LU */ +#define AMD_DMAX 13 /* max nz. in any column of L, incl. diagonal */ + +/* ------------------------------------------------------------------------- */ +/* return values of AMD */ +/* ------------------------------------------------------------------------- */ + +#define AMD_OK 0 /* success */ +#define AMD_OUT_OF_MEMORY -1 /* malloc failed, or problem too large */ +#define AMD_INVALID -2 /* input arguments are not valid */ +#define AMD_OK_BUT_JUMBLED 1 /* input matrix is OK for amd_order, but + * columns were not sorted, and/or duplicate entries were present. AMD had + * to do extra work before ordering the matrix. This is a warning, not an + * error. */ + +/* ========================================================================== */ +/* === AMD version ========================================================== */ +/* ========================================================================== */ + +/* AMD Version 1.2 and later include the following definitions. + * As an example, to test if the version you are using is 1.2 or later: + * + * #ifdef AMD_VERSION + * if (AMD_VERSION >= AMD_VERSION_CODE (1,2)) ... + * #endif + * + * This also works during compile-time: + * + * #if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE (1,2)) + * printf ("This is version 1.2 or later\n") ; + * #else + * printf ("This is an early version\n") ; + * #endif + * + * Versions 1.1 and earlier of AMD do not include a #define'd version number. + */ + +#define AMD_DATE "Jun 20, 2012" +#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define AMD_MAIN_VERSION 2 +#define AMD_SUB_VERSION 3 +#define AMD_SUBSUB_VERSION 1 +#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/linux/include/ecos/amd_internal.h b/thirdparty/linux/include/ecos/amd_internal.h new file mode 100755 index 00000000..0aa5a303 --- /dev/null +++ b/thirdparty/linux/include/ecos/amd_internal.h @@ -0,0 +1,347 @@ +/* ========================================================================= */ +/* === amd_internal.h ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD, Copyright (c) Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* This file is for internal use in AMD itself, and does not normally need to + * be included in user code (it is included in UMFPACK, however). All others + * should use amd.h instead. + * + * The following compile-time definitions affect how AMD is compiled. + * + * -DNPRINT + * + * Disable all printing. stdio.h will not be included. Printing can + * be re-enabled at run-time by setting the global pointer amd_printf + * to printf (or mexPrintf for a MATLAB mexFunction). + * + * -DNMALLOC + * + * No memory manager is defined at compile-time. You MUST define the + * function pointers amd_malloc, amd_free, amd_realloc, and + * amd_calloc at run-time for AMD to work properly. + */ + +/* ========================================================================= */ +/* === NDEBUG ============================================================== */ +/* ========================================================================= */ + +/* + * Turning on debugging takes some work (see below). If you do not edit this + * file, then debugging is always turned off, regardless of whether or not + * -DNDEBUG is specified in your compiler options. + * + * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined, + * and mxAssert is used instead of assert. If debugging is not enabled, no + * MATLAB include files or functions are used. Thus, the AMD library libamd.a + * can be safely used in either a stand-alone C program or in another + * mexFunction, without any change. + */ + +/* + AMD will be exceedingly slow when running in debug mode. The next three + lines ensure that debugging is turned off. +*/ +// #ifndef NDEBUG +// #define NDEBUG +// #endif + +/* + To enable debugging, uncomment the following line: +*/ +// #undef NDEBUG + +/* ------------------------------------------------------------------------- */ +/* ANSI include files */ +/* ------------------------------------------------------------------------- */ + +/* from stdlib.h: size_t, malloc, free, realloc, and calloc */ +#include + +#if !defined(NPRINT) || !defined(NDEBUG) +/* from stdio.h: printf. Not included if NPRINT is defined at compile time. + * fopen and fscanf are used when debugging. */ +#include +#endif + +/* from limits.h: INT_MAX and LONG_MAX */ +#include + +/* from math.h: sqrt */ +#include + +/* ------------------------------------------------------------------------- */ +/* MATLAB include files (only if being used in or via MATLAB) */ +/* ------------------------------------------------------------------------- */ + +#ifdef MATLAB_MEX_FILE +#include "matrix.h" +#include "mex.h" +#endif + +/* ------------------------------------------------------------------------- */ +/* basic definitions */ +/* ------------------------------------------------------------------------- */ + +#ifdef FLIP +#undef FLIP +#endif + +#ifdef MAX +#undef MAX +#endif + +#ifdef MIN +#undef MIN +#endif + +#ifdef EMPTY +#undef EMPTY +#endif + +#ifdef GLOBAL +#undef GLOBAL +#endif + +#ifdef PRIVATE +#undef PRIVATE +#endif + +/* FLIP is a "negation about -1", and is used to mark an integer i that is + * normally non-negative. FLIP (EMPTY) is EMPTY. FLIP of a number > EMPTY + * is negative, and FLIP of a number < EMTPY is positive. FLIP (FLIP (i)) = i + * for all integers i. UNFLIP (i) is >= EMPTY. */ +#define EMPTY (-1) +#define FLIP(i) (-(i)-2) +#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i)) + +/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */ +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + +/* logical expression of p implies q: */ +#define IMPLIES(p,q) (!(p) || (q)) + +/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in . */ +/* The Compaq Alpha also predefines TRUE and FALSE. */ +#ifdef TRUE +#undef TRUE +#endif +#ifdef FALSE +#undef FALSE +#endif + +#define TRUE (1) +#define FALSE (0) +#define PRIVATE static +#define GLOBAL +#define EMPTY (-1) + +/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */ +/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0). We */ +/* need to use the ANSI standard value of 0. */ +#ifdef NULL +#undef NULL +#endif + +#define NULL 0 + +/* largest value of size_t */ +#ifndef SIZE_T_MAX +#ifdef SIZE_MAX +/* C99 only */ +#define SIZE_T_MAX SIZE_MAX +#else +#define SIZE_T_MAX ((size_t) (-1)) +#endif +#endif + +/* ------------------------------------------------------------------------- */ +/* integer type for AMD: int or SuiteSparse_long */ +/* ------------------------------------------------------------------------- */ + +#include "amd.h" + +#if defined (DLONG) || defined (ZLONG) + +#define Int SuiteSparse_long +#define ID SuiteSparse_long_id +#define Int_MAX SuiteSparse_long_max + +#define AMD_order amd_l_order +#define AMD_defaults amd_l_defaults +#define AMD_control amd_l_control +#define AMD_info amd_l_info +#define AMD_1 amd_l1 +#define AMD_2 amd_l2 +#define AMD_valid amd_l_valid +#define AMD_aat amd_l_aat +#define AMD_postorder amd_l_postorder +#define AMD_post_tree amd_l_post_tree +#define AMD_dump amd_l_dump +#define AMD_debug amd_l_debug +#define AMD_debug_init amd_l_debug_init +#define AMD_preprocess amd_l_preprocess + +#else + +#define Int int +#define ID "%d" +#define Int_MAX INT_MAX + +#define AMD_order amd_order +#define AMD_defaults amd_defaults +#define AMD_control amd_control +#define AMD_info amd_info +#define AMD_1 amd_1 +#define AMD_2 amd_2 +#define AMD_valid amd_valid +#define AMD_aat amd_aat +#define AMD_postorder amd_postorder +#define AMD_post_tree amd_post_tree +#define AMD_dump amd_dump +#define AMD_debug amd_debug +#define AMD_debug_init amd_debug_init +#define AMD_preprocess amd_preprocess + +#endif + +/* ========================================================================= */ +/* === PRINTF macro ======================================================== */ +/* ========================================================================= */ + +/* All output goes through the PRINTF macro. */ +#define PRINTF(params) { if (amd_printf != NULL) (void) amd_printf params ; } + +/* ------------------------------------------------------------------------- */ +/* AMD routine definitions (not user-callable) */ +/* ------------------------------------------------------------------------- */ + +GLOBAL size_t AMD_aat +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Len [ ], + Int Tp [ ], + double Info [ ] +) ; + +GLOBAL void AMD_1 +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int P [ ], + Int Pinv [ ], + Int Len [ ], + Int slen, + Int S [ ], + double Control [ ], + double Info [ ] +) ; + +GLOBAL void AMD_postorder +( + Int nn, + Int Parent [ ], + Int Npiv [ ], + Int Fsize [ ], + Int Order [ ], + Int Child [ ], + Int Sibling [ ], + Int Stack [ ] +) ; + +GLOBAL Int AMD_post_tree +( + Int root, + Int k, + Int Child [ ], + const Int Sibling [ ], + Int Order [ ], + Int Stack [ ] +#ifndef NDEBUG + , Int nn +#endif +) ; + +GLOBAL void AMD_preprocess +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Rp [ ], + Int Ri [ ], + Int W [ ], + Int Flag [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* debugging definitions */ +/* ------------------------------------------------------------------------- */ + +#ifndef NDEBUG + +/* from assert.h: assert macro */ +#include + +#ifndef EXTERN +#define EXTERN extern +#endif + +EXTERN Int AMD_debug ; + +GLOBAL void AMD_debug_init ( char *s ) ; + +GLOBAL void AMD_dump +( + Int n, + Int Pe [ ], + Int Iw [ ], + Int Len [ ], + Int iwlen, + Int pfree, + Int Nv [ ], + Int Next [ ], + Int Last [ ], + Int Head [ ], + Int Elen [ ], + Int Degree [ ], + Int W [ ], + Int nel +) ; + +#ifdef ASSERT +#undef ASSERT +#endif + +/* Use mxAssert if AMD is compiled into a mexFunction */ +#ifdef MATLAB_MEX_FILE +#define ASSERT(expression) (mxAssert ((expression), "")) +#else +#define ASSERT(expression) (assert (expression)) +#endif + +#define AMD_DEBUG0(params) { PRINTF (params) ; } +#define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; } +#define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; } +#define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; } +#define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; } + +#else + +/* no debugging */ +#define ASSERT(expression) +#define AMD_DEBUG0(params) +#define AMD_DEBUG1(params) +#define AMD_DEBUG2(params) +#define AMD_DEBUG3(params) +#define AMD_DEBUG4(params) + +#endif diff --git a/thirdparty/linux/include/coin/cone.h b/thirdparty/linux/include/ecos/cone.h old mode 100644 new mode 100755 similarity index 100% rename from thirdparty/linux/include/coin/cone.h rename to thirdparty/linux/include/ecos/cone.h diff --git a/thirdparty/linux/include/ecos/ctrlc.h b/thirdparty/linux/include/ecos/ctrlc.h new file mode 100755 index 00000000..d96d0316 --- /dev/null +++ b/thirdparty/linux/include/ecos/ctrlc.h @@ -0,0 +1,66 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Interface for ECOS signal handling. + * + * This module is (c) Michael Grant, [mcg@cvxr.com] contributed by Github PR #82 + */ + +#ifndef __CTRLC_H__ +#define __CTRLC_H__ + +#include "glblopts.h" + +#if CTRLC > 0 + +#if defined MATLAB_MEX_FILE + +/* No header file available here; define the prototypes ourselves */ +extern bool utIsInterruptPending(void); +extern bool utSetInterruptEnabled(bool); + +#elif (defined _WIN32 || defined _WIN64 || defined _WINDLL ) + +/* Use Windows SetConsoleCtrlHandler for signal handling */ +#include + +#else + +/* Use POSIX clocl_gettime() for timing on non-Windows machines */ +#include + +#endif + +/* METHODS are the same for both */ +void init_ctrlc(void); +void remove_ctrlc(void); +int check_ctrlc(void); + +#else /* CTRLC = 0 */ + +/* No signal handling. */ +#define init_ctrlc() +#define remove_ctrlc() +#define check_ctrlc() 0 + +#endif /* END IF CTRLC > 0 */ + +#endif /* END IFDEF __TIMER_H__ */ + diff --git a/thirdparty/linux/include/coin/data.h b/thirdparty/linux/include/ecos/data.h old mode 100644 new mode 100755 similarity index 100% rename from thirdparty/linux/include/coin/data.h rename to thirdparty/linux/include/ecos/data.h diff --git a/thirdparty/linux/include/ecos/ecos.h b/thirdparty/linux/include/ecos/ecos.h new file mode 100755 index 00000000..36b99629 --- /dev/null +++ b/thirdparty/linux/include/ecos/ecos.h @@ -0,0 +1,323 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#ifndef __ECOS_H__ +#define __ECOS_H__ + +#include "glblopts.h" +#include "spla.h" +#include "cone.h" +#include "kkt.h" + +#if PROFILING > 0 +#include "timer.h" +#endif + +#if CTRLC > 0 +#include "ctrlc.h" +#endif + +/* ECOS VERSION NUMBER - FORMAT: X.Y.Z --------------------------------- */ +#define ECOS_VERSION ("2.0.4") + +/* DEFAULT SOLVER PARAMETERS AND SETTINGS STRUCT ----------------------- */ +#define MAXIT (100) /* maximum number of iterations */ +#define FEASTOL (1E-8) /* primal/dual infeasibility tolerance */ +#define ABSTOL (1E-8) /* absolute tolerance on duality gap */ +#define RELTOL (1E-8) /* relative tolerance on duality gap */ +#define FTOL_INACC (1E-4) /* inaccurate solution feasibility tol. */ +#define ATOL_INACC (5E-5) /* inaccurate solution absolute tol. */ +#define RTOL_INACC (5E-5) /* inaccurate solution relative tol. */ +#define GAMMA (0.99) /* scaling the final step length */ +#define STATICREG (1) /* static regularization: 0:off, 1:on */ +#define DELTASTAT (7E-8) /* regularization parameter */ +#define DELTA (2E-7) /* dyn. regularization parameter */ +#define EPS (1E-13) /* dyn. regularization threshold (do not 0!) */ +#define VERBOSE (1) /* bool for verbosity; PRINTLEVEL < 3 */ +#define NITREF (9) /* number of iterative refinement steps */ +#define IRERRFACT (6) /* factor by which IR should reduce err */ +#define LINSYSACC (1E-14) /* rel. accuracy of search direction */ +#define SIGMAMIN (1E-4) /* always do some centering */ +#define SIGMAMAX (1.0) /* never fully center */ +#define STEPMIN (1E-6) /* smallest step that we do take */ +#define STEPMAX (0.999) /* largest step allowed, also in affine dir. */ +#define SAFEGUARD (500) /* Maximum increase in PRES before + ECOS_NUMERICS is thrown. */ +/*Ecos exponential cone default settings*/ +#ifdef EXPCONE +#define MAX_BK (90) /*Maximum backtracking steps*/ +#define BK_SCALE (0.8) /*Backtracking constant*/ +#define MIN_DISTANCE (0.1) /* dont let sqrt(r), sqrt(-u) or sqrt(v) + become smaller than + MIN_DISTANCE*mu*/ +#define CENTRALITY (1) /*Centrality requirement*/ +#endif + + + +/* EQUILIBRATION METHOD ------------------------------------------------ */ +#define EQUILIBRATE (1) /* use equlibration of data matrices? >0: yes */ +#define EQUIL_ITERS (3) /* number of equilibration iterations */ +#define RUIZ_EQUIL /* define algorithm to use - if both are ... */ +/*#define ALTERNATING_EQUIL*/ /* ... commented out no equlibration is used */ + + +/* EXITCODES ----------------------------------------------------------- */ +#define ECOS_OPTIMAL (0) /* Problem solved to optimality */ +#define ECOS_PINF (1) /* Found certificate of primal infeasibility */ +#define ECOS_DINF (2) /* Found certificate of dual infeasibility */ +#define ECOS_INACC_OFFSET (10) /* Offset exitflag at inaccurate results */ +#define ECOS_MAXIT (-1) /* Maximum number of iterations reached */ +#define ECOS_NUMERICS (-2) /* Search direction unreliable */ +#define ECOS_OUTCONE (-3) /* s or z got outside the cone, numerics? */ +#define ECOS_SIGINT (-4) /* solver interrupted by a signal/ctrl-c */ +#define ECOS_FATAL (-7) /* Unknown problem in solver */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* SETTINGS STRUCT ----------------------------------------------------- */ +typedef struct settings{ + pfloat gamma; /* scaling the final step length */ + pfloat delta; /* regularization parameter */ + pfloat eps; /* regularization threshold */ + pfloat feastol; /* primal/dual infeasibility tolerance */ + pfloat abstol; /* absolute tolerance on duality gap */ + pfloat reltol; /* relative tolerance on duality gap */ + pfloat feastol_inacc; /* primal/dual infeasibility relaxed tolerance */ + pfloat abstol_inacc; /* absolute relaxed tolerance on duality gap */ + pfloat reltol_inacc; /* relative relaxed tolerance on duality gap */ + idxint nitref; /* number of iterative refinement steps */ + idxint maxit; /* maximum number of iterations */ + idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ +#ifdef EXPCONE /*Exponential cone settings*/ + idxint max_bk_iter; /* Maximum backtracking iterations */ + pfloat bk_scale; /* Backtracking scaling */ + pfloat centrality; /* Centrality bound, ignored when centrality vars = 0*/ +#endif +} settings; + + +/* INFO STRUCT --------------------------------------------------------- */ +typedef struct stats{ + pfloat pcost; + pfloat dcost; + pfloat pres; + pfloat dres; + pfloat pinf; + pfloat dinf; + pfloat pinfres; + pfloat dinfres; + pfloat gap; + pfloat relgap; + pfloat sigma; + pfloat mu; + pfloat step; + pfloat step_aff; + pfloat kapovert; + idxint iter; + idxint nitref1; + idxint nitref2; + idxint nitref3; +#if PROFILING > 0 + pfloat tsetup; + pfloat tsolve; +#endif +#if PROFILING > 1 + pfloat tfactor; + pfloat tkktsolve; + pfloat torder; + pfloat tkktcreate; + pfloat ttranspose; + pfloat tperm; + pfloat tfactor_t1; + pfloat tfactor_t2; +#endif +#ifdef EXPCONE + /* Counters for backtracking, each of these counts + * one condition that can fail and cause a backtrack + */ + idxint pob; /* Potential decreases */ + idxint cb; /* Centrality violations */ + idxint cob; /* The s'z of one cone is too small w.r.t. mu */ + idxint pb; /* Primal infeasibility */ + idxint db; /* Dual infeasibility */ + idxint affBack; /* Total affine backtracking steps */ + idxint cmbBack; /* Total combined backtracking steps */ + + pfloat centrality; /*Centrality at the end of the backtracking*/ +#endif + +} stats; + + +/* ALL DATA NEEDED BY SOLVER ------------------------------------------- */ +typedef struct pwork{ + /* dimensions */ + idxint n; /* number of primal variables x */ + idxint m; /* number of conically constrained variables s */ + idxint p; /* number of equality constraints */ + idxint D; /* degree of the cone */ + + /* variables */ + pfloat* x; /* primal variables */ + pfloat* y; /* multipliers for equality constaints */ + pfloat* z; /* multipliers for conic inequalities */ + pfloat* s; /* slacks for conic inequalities */ + pfloat* lambda; /* scaled variable */ + pfloat kap; /* kappa (homogeneous embedding) */ + pfloat tau; /* tau (homogeneous embedding) */ + + /* best iterate seen so far */ + /* variables */ + pfloat* best_x; /* primal variables */ + pfloat* best_y; /* multipliers for equality constaints */ + pfloat* best_z; /* multipliers for conic inequalities */ + pfloat* best_s; /* slacks for conic inequalities */ + pfloat best_kap; /* kappa (homogeneous embedding) */ + pfloat best_tau; /* tau (homogeneous embedding) */ + pfloat best_cx; + pfloat best_by; + pfloat best_hz; + stats* best_info; /* info of best iterate */ + + /* temporary stuff holding search direction etc. */ + pfloat* dsaff; + pfloat* dzaff; + pfloat* W_times_dzaff; + pfloat* dsaff_by_W; + pfloat* saff; + pfloat* zaff; + + /* cone */ + cone* C; + + /* problem data */ + spmat* A; spmat* G; pfloat* c; pfloat* b; pfloat* h; + + /* indices that map entries of A and G to the KKT matrix */ + idxint *AtoK; idxint *GtoK; + +#if defined EQUILIBRATE && EQUILIBRATE > 0 + /* equilibration vector */ + pfloat *xequil; + pfloat *Aequil; + pfloat *Gequil; +#endif + + /* scalings of problem data */ + pfloat resx0; pfloat resy0; pfloat resz0; + + /* residuals */ + pfloat *rx; pfloat *ry; pfloat *rz; pfloat rt; + pfloat hresx; pfloat hresy; pfloat hresz; + + /* norm iterates */ + pfloat nx,ny,nz,ns; + + /* temporary storage */ + pfloat cx; pfloat by; pfloat hz; pfloat sz; + + /* KKT System */ + kkt* KKT; + + /* info struct */ + stats* info; + + /* settings struct */ + settings* stgs; + +} pwork; + + +/* SOME USEFUL MACROS -------------------------------------------------- */ +#define MAX(X,Y) ((X) < (Y) ? (Y) : (X)) /* maximum of 2 expressions */ +/* safe division x/y where y is assumed to be positive! */ +#define SAFEDIV_POS(X,Y) ( (Y) < EPS ? ((X)/EPS) : (X)/(Y) ) + + +/* METHODS */ + +/* set up work space */ +/* could be done by codegen */ +pwork* ECOS_setup(idxint n, idxint m, idxint p, idxint l, idxint ncones, idxint* q, idxint nex, + pfloat* Gpr, idxint* Gjc, idxint* Gir, + pfloat* Apr, idxint* Ajc, idxint* Air, + pfloat* c, pfloat* h, pfloat* b); + + +#ifdef EXPCONE +pfloat expConeLineSearch(pwork* w, pfloat dtau, pfloat dkappa, idxint affine); +#endif + +/* solve */ +idxint ECOS_solve(pwork* w); + +/** + * Cleanup: free memory (not used for embedded solvers, only standalone) + * + * Use the second argument to give the number of variables to NOT free. + * This is useful if you want to use the result of the optimization without + * copying over the arrays. One use case is the MEX interface, where we + * do not want to free x,y,s,z (depending on the number of LHS). + */ +void ECOS_cleanup(pwork* w, idxint keepvars); + + +/** + * Version: returns the current version number + * Use a character array of length 7 to obtain the version number + * in the format + * x.y.zzz + * where x is the major, y the minor and zzz the build number + */ +const char* ECOS_ver(void); + + +/* ------------------- EXPERT LEVEL INTERFACES ---------------------- */ + +/* + * Updates one element of the RHS vector h of inequalities + * After the call, w->h[idx] = value (but equilibrated) + */ +void ecos_updateDataEntry_h(pwork* w, idxint idx, pfloat value); + +/* + * Updates one element of the OBJ vector c of inequalities + * After the call, w->c[idx] = value (but equilibrated) + */ +void ecos_updateDataEntry_c(pwork* w, idxint idx, pfloat value); + +/* + * Updates numerical data for G, A, c, h, and b, + * and re-equilibrates. + * Then updates the corresponding KKT entries. + */ +void ECOS_updateData(pwork *w, pfloat *Gpr, pfloat *Apr, + pfloat* c, pfloat* h, pfloat* b); + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/thirdparty/linux/include/ecos/ecos_bb.h b/thirdparty/linux/include/ecos/ecos_bb.h new file mode 100644 index 00000000..dc95b03a --- /dev/null +++ b/thirdparty/linux/include/ecos/ecos_bb.h @@ -0,0 +1,208 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* + * The branch and bound module is (c) Han Wang, Stanford University, + * [hanwang2@stanford.edu] + */ + +#ifndef __ecos_bb_H__ +#define __ecos_bb_H__ + +#include "ecos.h" +#include "spla.h" +#include "glblopts.h" + +/* Print verbosity */ +#define MI_PRINTLEVEL (1) + +/* ecos_bb configuration settings */ +#define MI_ABS_EPS (1E-6) +#define MI_REL_EPS (1E-3) +#define MI_MAXITER (1000) +#define MI_INT_TOL (FTOL_INACC) + +/* Flags */ +#define MI_SOLVED_NON_BRANCHABLE (3) +#define MI_SOLVED_BRANCHABLE (2) +#define MI_NOT_SOLVED (1) +#define MI_FREE (0) + +#define MI_ONE (1) +#define MI_ZERO (0) +#define MI_STAR (-1) + +/*** Exit flags ***/ +/*ECOS_BB found optimal solution*/ +#define MI_OPTIMAL_SOLN (ECOS_OPTIMAL) +/*ECOS_BB proved problem is infeasible*/ +#define MI_INFEASIBLE (ECOS_PINF) +/*ECOS_BB proved problem is unbounded*/ +#define MI_UNBOUNDED (ECOS_DINF) +/*ECOS_BB hit maximum iterations but a feasible solution was found and the best seen feasible solution was returned*/ +#define MI_MAXITER_FEASIBLE_SOLN (ECOS_OPTIMAL + ECOS_INACC_OFFSET) +/*ECOS_BB hit maximum iterations without finding a feasible solution*/ +#define MI_MAXITER_NO_SOLN (ECOS_PINF + ECOS_INACC_OFFSET) +/*ECOS_BB hit maximum iterations without finding a feasible solution that was unbounded*/ +#define MI_MAXITER_UNBOUNDED (ECOS_DINF + ECOS_INACC_OFFSET) + +/* Max integer and all smaller integer representable by single precision */ +#define MAX_FLOAT_INT (8388608) + +/* define INFINITY and isinf for MSFT */ +#ifdef _MSC_VER +#include "float.h" +#ifndef INFINITY +#define INFINITY (DBL_MAX+DBL_MAX) +#endif +/* this will also return true if x is nan, but we don't check that anyway */ +#ifndef isinf +#define isinf(x) (!_finite(x)) +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct settings_bb{ + idxint maxit; /* maximum number of iterations */ + idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ + pfloat abs_tol_gap; /* termination criteria |U-L| */ + pfloat rel_tol_gap; /* termination criteria for |U-L|/|L| < 3 */ + pfloat integer_tol; /* integer rounding tolerance */ +} settings_bb; + +typedef struct node { + char status; + pfloat L; + pfloat U; + idxint split_idx; + pfloat split_val; +} node; + +/* Wrapper for mixed integer module */ +typedef struct ecos_bb_pwork{ + /* Mixed integer data */ + idxint num_bool_vars; + idxint num_int_vars; + + node* nodes; + char* bool_node_ids; + pfloat* int_node_ids; + + idxint* bool_vars_idx; + idxint* int_vars_idx; + + /* ECOS data */ + pwork* ecos_prob; + + /* Modified pointers to ecos internals */ + /* Use these to edit or reset the h variables */ + spmat* A; + spmat* G; + pfloat* c; + pfloat* b; + pfloat* h; + + /* best iterate seen so far */ + /* variables */ + pfloat* x; /* primal variables */ + pfloat* y; /* multipliers for equality constaints */ + pfloat* z; /* multipliers for conic inequalities */ + pfloat* s; /* slacks for conic inequalities */ + pfloat kap; /* kappa (homogeneous embedding) */ + pfloat tau; /* tau (homogeneous embedding) */ + stats* info; /* info of best iterate */ + pfloat global_U; + pfloat global_L; + + /* Tmp data */ + char* tmp_bool_node_id; + pfloat* tmp_int_node_id; + idxint iter; + + /* Stored pointers to prevent memory leaks */ + pfloat* Gpr_new; + idxint* Gjc_new; + idxint* Gir_new; + pfloat* h_new; + + /* settings struct */ + settings* ecos_stgs; + settings_bb* stgs; + idxint default_settings; + +} ecos_bb_pwork; + +ecos_bb_pwork* ECOS_BB_setup( + idxint n, idxint m, idxint p, + idxint l, idxint ncones, idxint* q, idxint nex, + pfloat* Gpr, idxint* Gjc, idxint* Gir, + pfloat* Apr, idxint* Ajc, idxint* Air, + pfloat* c, pfloat* h, pfloat* b, + idxint num_bool_vars, idxint* bool_vars_idx, + idxint num_int_vars, idxint* int_vars_idx, + settings_bb* stgs); + +idxint ECOS_BB_solve(ecos_bb_pwork* prob); + +void ECOS_BB_cleanup(ecos_bb_pwork* prob, idxint num_vars_keep); + +void updateDataEntry_h(ecos_bb_pwork* w, idxint idx, pfloat value); + +void updateDataEntry_c(ecos_bb_pwork* w, idxint idx, pfloat value); + +settings_bb* get_default_ECOS_BB_settings(); + +/* Calculate the offset into the node_id array */ +static inline char* get_bool_node_id(idxint idx, ecos_bb_pwork* prob){ + return &prob->bool_node_ids[prob->num_bool_vars * idx]; +} + +static inline pfloat* get_int_node_id(idxint idx, ecos_bb_pwork* prob){ + return &prob->int_node_ids[prob->num_int_vars * idx * 2]; +} + +static inline pfloat abs_2(pfloat number){ + return number < 0.0 ? -number : number; +} + +static inline pfloat pfloat_round(pfloat number){ + return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5); +} + +static inline pfloat pfloat_ceil(pfloat number, pfloat integer_tol){ + return (pfloat) (number < 0 ? (int) number : (int) (number+(1-integer_tol)) ); +} + +static inline pfloat pfloat_floor(pfloat number, pfloat integer_tol){ + return (pfloat) (number < 0 ? (int) (number-(1-integer_tol)) : (int) number); +} + +static inline idxint float_eqls(pfloat a, pfloat b, pfloat integer_tol){ + return abs_2(a - b) < integer_tol; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/linux/include/ecos/equil.h b/thirdparty/linux/include/ecos/equil.h new file mode 100755 index 00000000..51f3fa6d --- /dev/null +++ b/thirdparty/linux/include/ecos/equil.h @@ -0,0 +1,50 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* Equilibration module (c) Eric Chu, March 2014 */ + +/** + * used predominantly in preproc.c + */ + +#include "ecos.h" + +#if defined EQUILIBRATE && EQUILIBRATE > 0 + +#ifndef __EQUIL_H__ +#define __EQUIL_H__ + +#include "glblopts.h" +#include "ecos.h" + +/** + * set_equilibration: This routine takes the workspace and sets + * the equilibration vectors. + */ +void set_equilibration(pwork *w); + +/** + * unset_equilibration: This routine takes the workspace and + * undoes the equilibration. + */ +void unset_equilibration(pwork *w); + + +#endif +#endif diff --git a/thirdparty/linux/include/ecos/expcone.h b/thirdparty/linux/include/ecos/expcone.h new file mode 100755 index 00000000..3da725c8 --- /dev/null +++ b/thirdparty/linux/include/ecos/expcone.h @@ -0,0 +1,87 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * The exponental cone module is (c) Santiago Akle, Stanford University, + * [akle@stanford.edu] + * + */ + +#include "cone.h" +#include "glblopts.h" +#include "wright_omega.h" +#include +#ifndef __ECOS_EXP_H__ +#define __ECOS_EXP_H__ + +#if defined EXPCONE +/* + * Exponential cone structure: We save the index where each expcone Hessian + * column starts in the csr format. For each cone we also allocate space for + * the gradient of the barrier at each cone and the values of entries of the + * Hessian matrix + */ +typedef struct expcone +{ + idxint colstart[3]; /* All cones are fixed size, we store the index + * where the column of the hessian starts in the + * permuted Newton system. + */ + pfloat v[6]; /* Uper triangular section of the hessian */ + pfloat g[3]; /* Gradient of the barrier */ +} expcone; + +/* + * Evaluates the Hessian of the exponential dual cone barrier at the triplet + * w[0],w[1],w[2], and stores the upper triangular part of the matrix mu*H(w) + * at v[0],...,v[5]. The entries of the Hessian are arranged columnwise into v + */ +void evalExpHessian(pfloat* w, pfloat* v, pfloat mu); + +/* + * Evaluates the gradient of the dual exponential cone barrier g^\star(z) at the triplet + * w[0],w[1],w[2], and stores the result at g[0],..,g[2]. + */ +void evalExpGradient(pfloat* w, pfloat* g); + +/* + * Computes f_e(s_e) + f^\star_e(z_e) + */ +pfloat evalBarrierValue(pfloat* siter, pfloat *ziter, idxint fc, idxint nexc); + +/* + * Multiplies by y+=muH*x + */ +void scaleToAddExpcone(pfloat* y, pfloat* x, expcone* expcones, idxint nexc, idxint fc); + +/* + * Returns 1 if s is primal feasible w.r.t the primal exponential + * cone and 0 i.o.c + */ +idxint evalExpPrimalFeas(pfloat *s, idxint nexc); + +/* + * Returns 1 if s is dual feasible w.r.t the dual exponential + * cone and 0 i.o.c + */ +idxint evalExpDualFeas(pfloat *s, idxint nexc); + +#endif +#endif /* End ifndef __ECOS_EXP_H__ */ + diff --git a/thirdparty/linux/include/ecos/glblopts.h b/thirdparty/linux/include/ecos/glblopts.h new file mode 100755 index 00000000..0adb8400 --- /dev/null +++ b/thirdparty/linux/include/ecos/glblopts.h @@ -0,0 +1,118 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* data type definitions used with ECOS */ + +#ifndef __GLBLOPTS_H__ +#define __GLBLOPTS_H__ + +/* DATA TYPES ---------------------------------------------------------- */ +typedef double pfloat; /* for numerical values */ + +/* SET PRINT LEVEL ----------------------------------------------------- */ +#ifndef PRINTLEVEL +#define PRINTLEVEL (2) /* 0: no prints */ + /* 1: only final info */ + /* 2: progress print per iteration */ + /* 3: debug level, enables print & dump fcns. */ +#endif + +#define MATLAB_FLUSH_PRINTS + /* print each iteration directly to Matlab. */ + /* this options considerably slows down the */ + /* solver, but is useful if you solve big */ + /* problems. */ + +/* SET PROFILING LEVEL ------------------------------------------------- */ +#ifndef PROFILING +#define PROFILING (1) /* 0: no timing information */ + /* 1: runtime (divided in setup and solve) */ + /* 2: detailed profiling */ +#endif + +/* SET DEBUG LEVEL ----------------------------------------------------- */ +#ifndef DEBUG +#define DEBUG (0) /* 0: no debugging information */ + /* 1: debug info & dump intermediate results */ + /* (flag used only for development) */ +#endif + +/* SYSTEM INCLUDES FOR NAN & INFINITY ---------------------------------- */ +#include + +/* NAN ----------------------------------------------------------------- */ +#ifndef NAN +#define NAN ((double)0x7ff8000000000000) +#endif + +/* INF ---------------------------------------------------------------- */ +#ifndef INFINITY +#define INFINITY ((double)0x7ff0000000000000) +#endif + +/* Exponential cone */ +#define EXPCONE /*When defined the exponential cone solver code is enabled*/ + +/* SYSTEM INCLUDES FOR PRINTING ---------------------------------------- */ +#if DEBUG || PRINTLEVEL > 0 +#include +#endif + +/* PRINTTEXT ----------------------------------------------------------- */ +#if PRINTLEVEL > 0 +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#define PRINTTEXT mexPrintf +#elif defined PYTHON +#include +#define PRINTTEXT PySys_WriteStdout +#else +#define PRINTTEXT printf +#endif +#else +#define PRINTTEXT(...) +#endif + +#include "SuiteSparse_config.h" + +/* use this if pfloat is float: */ +/* #define NAN ((float)0x7fc00000) */ + +/* USE SAME NUMBER REPRESENTATION FOR INDEXING AS AMD AND LDL ---------- */ +typedef SuiteSparse_long idxint; + +/* SYSTEM INCLUDE IF COMPILING FOR MATLAB ------------------------------ */ +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#endif + +/* CHOOSE RIGHT MEMORY MANAGER ----------------------------------------- */ +#ifdef MATLAB_MEX_FILE +#define MALLOC mxMalloc +#define FREE mxFree +#else +#define MALLOC malloc +#define FREE free +#endif + +/* Other commonly used macros ----------------------------------------- */ +#define inline __inline + +#endif diff --git a/thirdparty/linux/include/coin/kkt.h b/thirdparty/linux/include/ecos/kkt.h old mode 100644 new mode 100755 similarity index 100% rename from thirdparty/linux/include/coin/kkt.h rename to thirdparty/linux/include/ecos/kkt.h diff --git a/thirdparty/linux/include/ecos/ldl.h b/thirdparty/linux/include/ecos/ldl.h new file mode 100755 index 00000000..53f861a2 --- /dev/null +++ b/thirdparty/linux/include/ecos/ldl.h @@ -0,0 +1,98 @@ +/* ========================================================================== */ +/* === ldl.h: include file for the LDL package ============================= */ +/* ========================================================================== */ + +/* Copyright (c) Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See README for the License. + * + * Stripped down by Alexander Domahidi, 2012. + */ + +#include "../../include/glblopts.h" +#include "../../include/ecos.h" + +#include "SuiteSparse_config.h" + +#ifdef LDL_LONG +#define LDL_int SuiteSparse_long +#define LDL_ID SuiteSparse_long_id + +#define LDL_symbolic2 ldl_l_symbolic2 +#define LDL_numeric2 ldl_l_numeric2 +#define LDL_lsolve ldl_l_lsolve +#define LDL_lsolve2 ldl_l_lsolve2 +#define LDL_dsolve ldl_l_dsolve +#define LDL_ltsolve ldl_l_ltsolve + +#else +#define LDL_int int +#define LDL_ID "%d" + +#define LDL_symbolic2 ldl_symbolic2 +#define LDL_numeric2 ldl_numeric2 +#define LDL_lsolve ldl_lsolve +#define LDL_lsolve2 ldl_lsolve2 +#define LDL_dsolve ldl_dsolve +#define LDL_ltsolve ldl_ltsolve + +#endif + +/* ========================================================================== */ +/* === int version ========================================================== */ +/* ========================================================================== */ + +void ldl_symbolic2 (int n, int Ap [ ], int Ai [ ], int Lp [ ], int Parent [ ], int Lnz [ ], int Flag [ ]) ; + +int ldl_numeric2 (int n, int Ap [ ], int Ai [ ], double Ax [ ], + int Lp [ ], int Parent [ ], int Sign[], double eps, double delta, int Lnz [ ], int Li [ ], double Lx [ ], + double D [ ], double Y [ ], int Pattern [ ], int Flag [ ] +#if PROFILING > 1 + ,double *t1, double *t2 +#endif + ) ; + +void ldl_lsolve (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ]) ; +void ldl_lsolve2 (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ], double X [ ]) ; + +void ldl_dsolve (int n, double X [ ], double D [ ]) ; + +void ldl_ltsolve (int n, double X [ ], int Lp [ ], int Li [ ], + double Lx [ ]) ; + +/* ========================================================================== */ +/* === long version ========================================================= */ +/* ========================================================================== */ + +void ldl_l_symbolic2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], + SuiteSparse_long Ai [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Parent [ ], SuiteSparse_long Lnz [ ], + SuiteSparse_long Flag [ ]); + +SuiteSparse_long ldl_l_numeric2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], + SuiteSparse_long Ai [ ], double Ax [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Parent [ ], SuiteSparse_long Sign [ ], double eps, double delta, SuiteSparse_long Lnz [ ], + SuiteSparse_long Li [ ], double Lx [ ], double D [ ], double Y [ ], + SuiteSparse_long Pattern [ ], SuiteSparse_long Flag [ ] +#if PROFILING > 1 + ,double *t1, double *t2 +#endif + ) ; + +void ldl_l_lsolve (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ]) ; +void ldl_l_lsolve2 (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ], double X [ ]) ; + +void ldl_l_dsolve (SuiteSparse_long n, double X [ ], double D [ ]) ; + +void ldl_l_ltsolve (SuiteSparse_long n, double X [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Li [ ], double Lx [ ]) ; + +/* ========================================================================== */ +/* === LDL version ========================================================== */ +/* ========================================================================== */ + +#define LDL_DATE "April 6, 2013, with dynamic regularization by A. Domahidi" +#define LDL_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define LDL_MAIN_VERSION 2 +#define LDL_SUB_VERSION 1 +#define LDL_SUBSUB_VERSION 0 +#define LDL_VERSION LDL_VERSION_CODE(LDL_MAIN_VERSION,LDL_SUB_VERSION) diff --git a/thirdparty/linux/include/coin/spla.h b/thirdparty/linux/include/ecos/spla.h old mode 100644 new mode 100755 similarity index 100% rename from thirdparty/linux/include/coin/spla.h rename to thirdparty/linux/include/ecos/spla.h diff --git a/thirdparty/linux/include/ecos/splamm.h b/thirdparty/linux/include/ecos/splamm.h new file mode 100755 index 00000000..813bc23d --- /dev/null +++ b/thirdparty/linux/include/ecos/splamm.h @@ -0,0 +1,126 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* + * Sparse linear algebra library for setup phase, i.e. this module + * accesses malloc and hence should not go on an embedded platform. + */ + +#ifndef __SPLAMM_H__ +#define __SPLAMM_H__ + +#include "glblopts.h" +#include "spla.h" + + +/** + * Create a sparse matrix from existing arrays. + */ +spmat* EcosCreateSparseMatrix(idxint m, idxint n, idxint nnz, idxint* jc, idxint* ir, pfloat* pr); + + +/** + * Create a new sparse matrix (uses MALLOC!) + */ +spmat* newSparseMatrix(idxint m, idxint n, idxint nnz); + +/** + * Create a new sparse matrix (uses FREE!) + */ +void freeSparseMatrix(spmat* M); + + +/** + * Transpose a matrix; returns A = M' (uses malloc!) + */ +spmat* transposeSparseMatrix(spmat* M, idxint* MtoMt); + + +/** + * Permutes a symmetric matrix with only the upper triangular part stored. + * Writes the upper triangular part of C = A(p,p) in column compressed + * storage format. + * + * The function additionally returns the mapping PK that maps the row indices + * of the sparse matrix A on the row indices of C, such that C[P[k]] = A[k]. + * + * NOTE: The matrix C and the vector PK are NOT created within this function + * - you need to allocate them beforehand!! + * + * If PK is NULL then the last output argument is ignored. + */ +void permuteSparseSymmetricMatrix(spmat* A, idxint* pinv, spmat* C, idxint* PK); + + +/** + * Returns the inverse of permutation p of length n. + */ +void pinv(idxint n, idxint* p, idxint* pinv); + + +/** + * Returns a copy of a sparse matrix A. + */ +spmat* copySparseMatrix(spmat* A); + +/* ============================= DEBUG FUNCTIONS ======================= */ +#if PRINTLEVEL > 0 + +/** + * Prints a dense matrix. + */ +void printDenseMatrix(pfloat *M, idxint dim1, idxint dim2, char *name); + + +/** + * Prints a dense integer matrix. + */ +void printDenseMatrix_i(idxint *M, idxint dim1, idxint dim2, char *name); + + +/** + * Prints a sparse matrix. + */ +void printSparseMatrix(spmat* M); + +#endif + +#if DEBUG + +/** + * Dumps a sparse matrix in Matlab format. + * Use SPCONVERT to read in the file. + */ +void dumpSparseMatrix(spmat* M, char* fn); + + +/** + * Dumps a dense matrix of doubles to a CSV file. + */ +void dumpDenseMatrix(pfloat *M, int dim1, int dim2, char *fn); + +/** + * Dumps a dense matrix of integers to a CSV file. + */ +void dumpDenseMatrix_i(idxint *M, int dim1, int dim2, char *fn); + +#endif + +#endif diff --git a/thirdparty/linux/include/ecos/timer.h b/thirdparty/linux/include/ecos/timer.h new file mode 100755 index 00000000..d450535c --- /dev/null +++ b/thirdparty/linux/include/ecos/timer.h @@ -0,0 +1,75 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Interface for the built-in timer of ECOS. + */ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "glblopts.h" + +#if PROFILING > 0 + +#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) + +/* Use Windows QueryPerformanceCounter for timing */ +#include + +typedef struct timer{ + LARGE_INTEGER tic; + LARGE_INTEGER toc; + LARGE_INTEGER freq; +} timer; + + +#elif (defined __APPLE__) + +#include + +/* Use MAC OSX mach_time for timing */ +typedef struct timer{ + uint64_t tic; + uint64_t toc; + mach_timebase_info_data_t tinfo; +} timer; + + + +#else + +/* Use POSIX clocl_gettime() for timing on non-Windows machines */ +#include +#include + +typedef struct timer{ + struct timespec tic; + struct timespec toc; +} timer; + +#endif + +/* METHODS are the same for both */ +void tic(timer* t); +pfloat toc(timer* t); + +#endif /* END IF PROFILING > 0 */ + +#endif +/* END IFDEF __TIMER_H__ */ diff --git a/thirdparty/linux/include/ecos/wright_omega.h b/thirdparty/linux/include/ecos/wright_omega.h new file mode 100755 index 00000000..6f4b531b --- /dev/null +++ b/thirdparty/linux/include/ecos/wright_omega.h @@ -0,0 +1,26 @@ +/** + * Santiago Akle + * ICME Stanford University 2014 + * + * Computes the value \omega(z) defined as the solution y to + * the equation y+log(y) = z for z real and z>=1. + * Follows the recommendations by + * PIERS W. LAWRENCE, ROBERT M. CORLESS, and DAVID J. JEFFREY. + * Published in: + * Algorithm 917: Complex Double-Precision Evaluation of the Wright \omega Function + * ACM Transactions on Mathematical Software (TOMS) TOMS Homepage table of contents archive + * Volume 38 Issue 3, April 2012 + * Article No. 20 + * Publication Date 2012-04-01 (yyyy-mm-dd) + * Publisher ACM New York, NY, USA + * ISSN: 0098-3500 EISSN: 1557-7295 doi>10.1145/2168773.2168779 + */ + +#include "glblopts.h" + +#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) +#define _USE_MATH_DEFINES +#endif +#include + +pfloat wrightOmega(pfloat z); diff --git a/thirdparty/linux/lib/x64/libecos.so b/thirdparty/linux/lib/x64/libecos.so index 7c939e9b946d04d0e7f3cedda0d58105dcfb867a..da821caa82659de58241ce9aab413a195918e994 100755 GIT binary patch literal 109000 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
      ?c(^s`GT*Eg+{ z5eb;F&n3Iz&pZhaNH{ z%Wc9!4@9WzqJ`9@8qADNb$(k79XAlomwU%JfUO^NX=vLRj9}GU74I82%OTLSE<&u< z1Y-mciVx8-TyR2I)yGrU!MCuzF7#D7y7&pfiuig-(-Y>GZ;XA*dh|Ma^yQ7qgC2c) zL%p#--C7=WXK6f#{WJE!U)aB+%QX1|#PiW4&je7ZGeeuTt3g{-`-Ywx9Ys(dl*eD_ zpEVoH(GBu9jyQV)T_cf6o=No7t|G|`tMfw?o+Z)^-yiB7Bc6c1<5~S)j00(iXdfmU zJzyjWM<* z$E$JZWH>Xn6C`pDsz3Oa{xz;<$01x1b7boY_S>MqU+q7e^=V~?*(5D%!`>H&ILW@( zdY>NjzS#T7p!a6)y-(!kZ}*N2dSB~3nfrd%CP?V*8LGM-G-`Kky?c??8x##Y~pqbY- zlRplh!S(qiCngnnWw}Y?y%F|mrxsac zS7>W5fXBYV#5@>ph;1Xz0Ddj6@?IEjq;Qp2Ayezii@bv$ObmNJ|6pPi71`{4-#)k+ z3G~8;vGKdwAi?m$%?7$)#RvHrZR^o{hb(cF+Cb>|NoWjax2v&&DPfxaR}P zbDn$Nr{^>LXA$+I?soJyO16EK@`W`* zYn?(V=*rDyI=)da46mEZBKG3%vg5tn|JbaLmHrEwdvn=%|7ERSs{CS`L{r|Q{=1}n z&^%EdZ;a(W?zB`^wtlhk!36&_y7rz!B4D5RKDjHNWNmgam^Z`Ao6GV5$;OdtHjK&B zr5$T{aPij0^Sx;P(P(liP2VRM3Q%LoJ^CE=CL64&jJk(2pLXk0jdz~=RIUSxfTM&`N7dog(KQA@l-nO9@%{h3$e`JZK8jlFNnyc*|! z&t93d*#WO!pS`|F?X}*GLC&d*y+r1@*=yn1E+`>aySG4Zl}6B>9l}QPc2C45NFi9` zG}Rl+hiX{@yJN}Ipm1pG*+mL-aaU1mY8WC1f3X$FZt~_{!rq%OBlp^t0S)si)LTSJ z4dg{ABo3qFjrYA(Vf(9eZFW+(MU(9j&5+&-_3kHEd`P3r;4U&GXRx5VtXwJO@d=GA zsQ1ofYHcm^dQ~4bLKMP?&Al!^p@sw#!KHpeEeR%vb4j>ot?)?pm@rNzf$@Lj^)XA6 zF5q?8m-M=~s-}^wyr1)!ew9SKWVDvKZsF zWHCz?gu#R-oduB4H+JIs<88$8sH^H4_xG&R_)7Z7r_VQVxWWle8PBh1rJkzzRol$3 z#Yh+a1{!cw2*CN9^fzf&wdwU{_j-&!p>OnW-Wl3F?Nk|`U$d>TS{>bdAqh-~&HNJu z7h^VIQXch|usj5)!vaBTEKp*+I>ylU!M$nV;$>9^>%|jbA&?H%Cmbx#(0STBjio|P zJu%S4tZ#l>A{5NIt$CCGYH~YC^9EUzz zfa#I71l~Z$B6vhsxw7u#^!w09@ui}fHQ&*?>Q&_% zUxFxVUObfp}u$a3gr$-PQ`Sjw}PW)J}O5q`~fBHtrr5l_{j=Lk2}oYwj?p3>wN zeP{OM?7p(6gr~Nsqd#BtzDQO4jV8HW=fdE*cL!O#vdrsty^aW8rmvdoXzJy-Q$!nR&fkuRqAV_Um;=@H#!}eVu3UqId%vwxeg9T= zn7`_i+bkJTC@Aw5Srx9h)e?tc#S_ug&@vXqSPDgv(v?qpyOp)K-*Sa|KO@Z=Od`fH z+&^u79!+hx-rPdWapp6(Z5!ftRZBE=vmu0+G5LG%VQ_J+bJzA&6C^V_p1RSsl$*^d z==-swsd0$d{5{MEwH&YuSHXeAOELMPeU^ks-a~9g(5!B}n9_s}166I{sEHp6jd&{A zZ+~vw!5?kMOQyYVi|`P+idz-5nVXpxffJ9A0cn`8D5V#@E+AXyV9R*R^+JIfY2>Py zl#;TgzHc3nO#405&ejVX%Y0gJPyjBgeO590<94If{lKdI5<`?t2f4q%2Cbebz2FiT zv&DI}ORUKx67JA@rAyRc0d<&g`;$6Hw`lVAo2kj0b-G9*RfpC(12e2DxRe^Aj`V(B1h6FQ5GBTGIwWfo>B5~6 z_%3k6!9ULSnTC3Gv?23q4X8QuYUjV&YpPX6(@)v)P@DBkcQfcS6c*V_Fv9PxD%E>v z^Rc(p6BEnuOmF0*i7lp)_gNzt<2jrt%7GEd8Ab8r^&FWwm5Oa^+xP6y40L-u`JUW} zI{=0yfj^=;HTvn;-Wdj7?gpMKRh1$;F;!lX)3rL;`t9ocmo=dD>?!i; z%<~R!a_0F~?;@Vbz_!6N%M#z!84BX@^p&9R=2LQcSBag*kL94xxXfei$)TIVUb*O= zw4++m!;Cgni1ftO+9K&aiL9kZX5h#pR4#<|U_?uoQiMu;dhWH6LpjpF<%4R7dfya~ zn{YpD*L$sZliqcfkiFM`RL>n%60u;VY-c6e^!|4t6Y0^S!N!WwGQ z#VAK7>||3;;(4usi7!~8IwOluicHA@_CU#Bzc=x!<;t!n=zx{pz(uI1+ z9Ep>@_B2~%8r(kTqtSgvt|q%aBDE%B)Azd}eYK<&TLFGfe9TqgY7Mj&fObH^)*1Wn-CEP6JSC__63^^N$s6m{|?S7FDON<^NS-_Ecg~ z>;8?Q^4y0D4&tr7-{K9~TA4gGmYjIMd|~u_GIK)^U^a5B;a(Ix6>a=J(^xOXe)cp? z@#Vy>Kg1*8X3wpB)M3Fkm2R+?b%bVVVm(i9OoP)`@bD+;{YW(V2KN@Ie|20?5He#! zKcw?E&|gMGbVW2D`}%nIQeR)?&~Ybp6iJ8&z(3j_yR54pPyNtc8!9;8gPrJRUrl5o zXz#|7_=KVF#gqG^q3WUU#d-=J!c&QZa{?tcay^>Hw!Mj;MIkz;r^J(QdFu#WbaZzY zEfXkGW=r`_o@b>d4$Qi2{QzNq)c0kp4@2XR!p_xO@Ui%W{*6(Fh+SMUEYmzxJ;0Op ztFm43HI};ATO03Nn_rzIfZ;>hWMYASQ z>Bb#eov-FJg3{2oFUvP--2Zl#In(!_f)>fr-}N8YqojyuPi>5NPm01l>q_(1a!e9_ zfD6a|DzIl!AhygBoiML-!|%z&aT`}KmNTAr7Ac$YAD1{NUusslvwIJ2Jffh9bL8D5 zW7xq{TOL(Ae251VujocS_;&`O75&`}aa)!d@iNO0P-bVKFJq}wVyP=6D;q8(c9w3P z0b9#ncIVQ#Z9%$enJf@qi(bX7$}8BVIKdY9oh&pxk+@6ex~m*}jY_ML#D($HN69*3 zJ@w_@Pl0G1#121bHCCuLat-Bh#UNfmvV^fwB(#y7yeQ9Zn^$&LDSGrRQOFgAbr28$lbq5B+iP`c?ylWGMYML`q=&c zI7wX0{j*c^@3%OdF&0Fcx`KEl^oVZAQv9$2k%+k=@KepPej#W_{lIe8gmmKPiWCas z2{d>R-1#zsb?0IAI}_{80|l~pTM@Kv9%=E^GQz0XN81wVW^lPhevIIpQmuoNMQwwJ zy!Ed#%j`ZEn^L|F)Z*b_e9s*}v<|O5;#;T(*QC52unYs{u?)Ws8gDHBTUenf=epc> z{C%{mE0;?y7pYl>sT{-;%c;;8pBYVkT9vUAN?!{9Zy+<9!8VMc`Y6 z0xuu+BWSp;g}|5O&TM~+ou$5X?(G|j-%#WRR9;AMqc{UnTmNcsd;?wAjOn5a^S%WV z5h)5*LGN%4El_Nu7K4ZFz1SN5P?THvIG9)bs5l=5iF5vq36vt+Ip;HkJF{nC6Io=B+7j4lT-@08CBL7jbkFR* zi3;5d6Z2L6914O>q!kaWIS}k3Sw~c}?HF;}EHp@uVvai<7kb1x&GwkJy98zC93#3Z3^v&QEoA7(W@lxgr`|soR@A)UkE3+O+ZyW|YWB1+S zKcBVczYl8(cRSo7b%!yRV>NHQzGceUa*9O3J7DY>WVNJUkc7yDwthWJg8i=P!_wm% z36f`?ykFk5_6yAap#6D&ar?9FsHKp#{kx(}rtQ|CiF}i2k3(3F+2@obT(j&=yo%9u zyw^gfbo_X{!|OfZ>1dH#@{GnQNr1&wo+N)1_2FR%lxMAgU0HI6dUvoAoBn5hiQ#P{ z_=%Yz__nBW-Dr!pro5PR#8WM(vKHyE(6)(M_S8cU4|Ye5vj?R2erZdhPRD$Kh2QkQ zli=h#S6}`SeYrN8`qp9Et#i;fziOdXTb!<(Qu@mxKEzWuFsGQWaFg~(Jh|8QSa^H> z@cwc4SqA=Y@5kA9CJ1}H|HHeR4kT$ir4_z9Dw^t3C!BD8(xm7aqPxE=%*eL>CE1x! zyVoh-p~tfF1-&Pgk{_jFUR;KseF^fvW%<=DsJx?t^Lw8xzU&Wd-d#4y{Gqm-`5R6mw{$K-7{=+&nFPc24c&u8? zWf9}G#2d7qiv98D^~4((ChT>2LiT+$~EcmFKjLB$`$J1Y#K&7VNTP9_kgZ~rNAQn*zXg2d^A!uZ5HClMzN zALqqVNmGB!+{Bdy+P+t(qb@Os*sZ5UineiPD@85Sgi(fo%I!%*+}Y$8p!^UHcSN;i|! zMuQ~rNZKAJ-e(jbZpeH6P1jD;u(rk-uSfnIaei^^B*e*7V#G9^7ID>iedN!DFX1Xm z{|Ccjw$KMKyX&n#i`fUY;By~}*^Aa@YrT)z9Vf+X51VCK@2*b1T%CNA^>Q}Z#FJRI zxMFs76G3Xd8cY3+OpiZhKg1^-OL+c>)@P=6>KigU{&fDM++T)|e(~$Hn`Pu${$f(F zsNzRKOkOy7QF@9}wGR9<+@9$d13zlYhI<>!ZJ5VD9OneJL8JX+|MmXyv2MKAV84%7 zfAF`#{x0569PC5eLb!_4OZf%2XUF68ZFEkKKLmFpTha)r%~~P*p-t4GmAN|Z9!UdJ z$q083N4(EjQ_!4SO&-5qCLYxt*Ag#X*Db1f`IhUI?g_e^TLjmg-zHW4S$rff*n9pY z)6G>T>>*wmDWt!?UM9+`pvhT3QWkY%J1#>cW2=CDqE_Z6aOEwJ|fqK@ivUlZ1~@ zIp&0?g+^)rDqDaDZBV}*0+3(R8BPn}LRpT*6Xq_8(m71i^|>vXnu=xx8wqj;Uyx+kQ^UI*F>;GhkH_0KWv|AtI9QOLfQXpbl(ukI?UdzbP$Yh)qbjD;@=*!`sHzxLQ2BB4Y# zQ{uO({}qjnD2;UWXxB{>;jTo~<|5zn1xbl>Tn;XXQ` zI8KG1SLhOr$kzTxpOi6MJvKncJMIcC}82g@D;c7Hv5=+tDQ+l zmgtw|qFhks)$r+-ixDlD1FG;D9EcMcZA3F}uHakl;+ zT4jpr4pK!H&0UM%-d0>kk0Xq+@63rgpag5wy|y15Vby zjQ2?ME4w~)Uueshw49Cu6)Xj`@O3JnGT`0{eMlLzqu4|kIS*g78>bI!{vc{NT==lz z5-xnqish%0uDQ{Y?ms+mTtsC|eD^NG`@Aa3B%ZC8<|M<_}+WR#U4QOzI z&vZBgzq?HI(Z(WjI%r}YeW{cG#7cHk z69W$eRj5wW66r67DAQqlm)15ZE4=G;wN+zL?Sp`?!xgS$)x=v2g*HUiA0SNy_+QW9 zY0dTD>kjii^0{+G-reN@QiVE)E%TqU(5m(+{-Q`3`Lv(g9Z0}E=5@$RIrg^>FsNsU z73_r=0<|8`I#F`Z;Pcm{vTNg*9NZ z3mJjSiXcUio;y31p5L&lanaa{rFpH9%OjO}Eo)Xb@iZyYzO19EDe{F#Yu*aIRz}V{ zFR~&sk@uF&dyBo#YmY2gacyMMq)1H@PhS{&ZJv@^$BeZ^14Lc=QC%w+t!`M^(ikak z9UbA{ew0-(=T>iIXDp-4l)VpGdQ>YL>xk zF?cN}hu328teIoM({Dj#q`j@BwX3NkvZR5AbVOQj0Qbt`yq4C+rnQl_M3-9E(a^fQ zX>^1#)?O%}zt&!tFVWiB*3s3}cz$D|edP!96;CyKU23J<$NGOSu)oCtDxzc#GR1jR zEhfw8 z$P(JIBC%@8$|kT*v|iWRwx-q4&nuo>JuR}jsiU){tu->TvBLh1j*RRa9qDN5Oswqc zywozPR(PVZWmQwFSL+S%6<9!RO1HMP-q6(1)){GO{SZjG zd2)cc_2**T-p~ctvb*r)(nZu!qf8X;bjB&gFDq0Rt6kY9M_{^XW-Jse4NHZ_hG)s|e})dUlK z=ud9>&#E#X$kMh|?F~!2==BeW5R@-gE%Te3BFoxVu54S=(z-m-(B9tBwzdU6Ychsx z>FjD*+8Jr+P^OMZL!>jYq_gSEiKf;rE4_^R+B#ZpXi%-z?(&+^HKWjElkMSi6;{Lb z2BC9h%kt)~NTR*Hsl!SyX-l*=!Ys=oUCm8Yp=w&&PDWAj6Y6Mmq@lGjvZRTYHW`GK zZEc;f9uQ8_4NYr7zoOU)MZhmP92$2$oM=?b1D473a<&TsdMPEBUnt+wx^(4VRUUq6 zS>4ju6lsG9Mzv0(Y#ZTS;X z$SuFBVJ$LWAy#c@yQKAm66G# zBb{IF=yJ(Tjgf}V$XLsW!ZZLPzme&rr3bZGSu;N$URpx4l40RbDZZT2SDhU1NcozU zu4XZAd&}y!E|@9HLmyT;Q}dq$;7Vus7Z&E{=soUlUcdW$^o#EAxmE6Oq^jCRiAYOl zc6?~Pp`oD*LZY?&sE$SLY21a=Izr+*4R{>w?@fh^V*wa*Vxw<8_LIA9%)Ap!I@?bz(uXA%UkGCjpdOUD;t*c z$cSr@Wvb=1u9ht)k^sz7DAaVmhVlsiN&G@YXwV90oiT!~Y#dw+`y?;YbTR~rr!_5? zZMYI$rg3{In8^r>jES^1af&KGLGz{iS2sm6BtTiCWL7tHv@~EPxG~@IPgg~kMjDo2 z;VePaXbUC){E@YRa`PoxKRhSR6>*?{(^?~2WMxCAduVK0u5XToPcUUgu@=iod*Ujw z0Bes#6(Y%RIEg}rAIDGX{tOehw{>ViJ-N^=wD9wu|EdqO8+QZ2pCaKnTeY)7}| zEz2Y<^GlgY-k#`ewjzvYR=zlIo`G4=YzB5qUOT!=?KQ@Bt-DU0OU1>O_0kiKc+OSM z;-5h|uef;9pZPH{Q30zf=s`zpb$_QJ(u&@(2g#s4WH~s3!d}+luq-Z~*~UoQ(Uw@= ztPwY|w7F$vBfKvC-PEvDI;;_!SYvE^qN`Y0mb5Hi-bB|}R@bkne#EIAxGka(hRUYr?V&4`tFa`fu_w8TB7hja2?rzfDM9 zpy@IMgh^_gY%f^0%zAT0UaM=F@y+bjkp+%)*BUPfUL>;2mwh4ZE1aN^b-Fd{9AC#+ z^~T6SifadN%9m#l`K3N|v{9uXqv@az7T&MSo7>iA^OT0p&L)if>m%awTxtgLkZGO4 zW)zYss@&LcHj0{MRBT_3=5)3u2$~`-Z|X2@=1BY}=MAWe9J_E88hce@mBdsi8EZ1= z+323J!qiO-SoT(d1{Z#4cBI^}vjLN-O%rU`&?+8{l#g7_Fk%)!dF!ark+Bz#ilCD^ zTAIxKbhZPQEw)n!?K;zg_=eD-1aTHAtbWmOse>S)4hUJ6(k?3!SDK38*Fo5wo6b<%k_Y%zwI z4EJ-Ad~+G;<_7b1_Z?C3Ys*tNPM$nJ!|061VBk-s1O8)tAW!5&r>m}hwcCtyI%8$y zX#S7NKGAG_XP$rz{<-ffXFZ z#_+jSTY`$uYij5~pLecyWRbQpY_s*aY6g9FS!Pb2J7x0B>5-{(;_>NI=f~#EF3xK= zCzZ2tFl2mdY^F5Sk`+x%K~@+br(_~nKB`bZ*hW@wWV$mk?8BtXU80(lr<{Dm1eHnR zAUGOgs?0n6B>8Z^ zIHawxK+ax`o6Uz3iBwOXH_xvR?A;jQ?6qQ;qYDyf4mrr)lCdTan-rE`G@wSt*paoU zPR}H$@61xkaFcPv7=B!91N@5fR%ZL8$$!q1OAs3>0PDX7{S{lo@Rt4Rzp6@eItEob zzoR)5P|&VgnFK2wnd9`8Jdi;p)_FmKVUY7t7?|tO+3(9V;g7U*o#TK-pryet1_Sif zZ1oZO=`4{n(%9CDr9Kz?LqkQTyK$rWNiIY6bl2UHX>(>zFU~8T&#(mXg|6RK0Yl~x zC}?elMy(j&j!Bt_%8+9IWPIfs*yM)jVn2_1w>U7Z_0j^5+ECa88#{i?NX6+b0@lEY zDOXWYsyOfT_-LZa`o2#Nb?!$!49kN_6+7L|vu#fS*q==>w#F0mwrz z%|OYOh@2!f+x_^;((hS+8ph~^Djv)LZl|ucbQ*+hpQ@MGr0knR- z({esC)-8VZxsqItB&&y%zubrGSK+sM)Tq4KO=|*HWr`vPexd^wLWwT#YR;0G873Gx z1>8Al4@Wwinm(`;A-u#S=At(><|HLU|MsyNg7E0$ zZ>_mNA6P~Z@h%9yJ8})?RZqoKP)4CpXzh1v4$5G^x^Yy3hctNt0X!7fzbg z-Z~1pm6xwhO7RAN=Ec>Y7?@(NUxbc z86z|AutyH5 zo|i|i>2v2^RWpD3G+a0+$*#8cc80wQG~rxadGHCkh*>x8S=_o6dBt;T=Etfh;~A8_ zk3cPJVwT^wa?;2PE5}Xn<^M*N|c^gHDC3<4&O1!&LkpDA4#aGRqGUuw<)22^5 zIVP^Q-1`2q0>w3Rt$DH8Gp0|T7n>5F{+Gi4>k1avbhP2XStX0vcerD0%$hYn(s_Mn zSJNsK=Mv`J>I#u9uXy^@IrCWV!9`R)m08p(Z007c!I`U;L`O%yl;~*TWgdOPTFpvE zcDD#MX6!{3k!zZk;00Q@&~Vi z{zR@j-*T=>=mm~xQl8G1<*OPjAvRZk*7JV~w;+wYKy%_RTvTykQ|@2bRPP`1ClbLv z5+wIWa17QMf#$;)>`H$A+wezT%!*SE3J$!$t+$GJQU%owteh}0&aO$dF#q+P{LIIf zHX~d76wher!cWrF(SgIik?x>3{pp9lk}|kQuWCh7%!h|;nO)!5(jk*mD_v$OY4M1Z zHWvK^Y>7NJuI?u0V9Xz7zvalQumF$QS5;4+8=H!R*36v)`&Q3me(v!6Yh_jNX17I_ zB|5Z}0~@s2Je$=|CfhLYUxS}u>BlWt{^hMIhUNb!_|L=;3t6w?0^WW!RST(io?(Y?xUjO`~ zZ{BzLkKW;VXnxP#ebsF*UcK&?qc`tq{rcER&c~O_g^Tj@opRRiAq>6xY8mVQ0qbAy z|Mv3_{r4O9-g?t;@w@wXRo<%dyJWp8*L$1}{w25ydsv?szU<>q{&^%<>J?&Q{T3N| z8CS1={(BUb^ZDzn=PaN9C!g1OT$j6VzQQd;GZgo~ykM8&c=G6i-3T0gb-^A7`ezpG zdEhuO8y~6^{$#<<2Q~mpfs?=h;p~Dv4a|OP!EVch-0=l_3^;po!7k1cqV2!H1NUMR z;UsVz`;oKpDN_SJZ0QG%;(NCV;3P^bum|NVFb|lAPp{j6e&7JG4gY<*7<+yCf#i;= zt=zU7fwNxQ?gy6QzuAufr>ksx7I=08;=`gF0=B&uIJ?=lX9(+&P7d^LvF$=&!#2nP z$3JD;lfYTawzHR_93i+q0s7%pvl}?Q6X|1L;vCQqJPT|DX794?abO$pIB@UXxNaie z5O`q!Ug*QF(n(-Gu<$p=fwNQdwnh!1T0CazzEdIc5&XMrAI>EkF5upihB90%?NP6Nk){%_g# zG;kC+N7sSkV&o5)2h2NQ+oiz0Pa__1`a6&Z&iw%TFTwQ}pdaW5b_2(Olfc3$=(!a2 z{I4iCa1_`L%sXt`Q^0ZHaXNnq?4Q|Yy*x0M_++{ ze36s)8uSATfo;Ij*Kr-V_ZZTl^EZ$VU4IkpkOw_KLwSJHzyaX+TPP2Z0S+ z_2;@SUwT3I2=>_(fW_82QTn2?ZDHp6%)FWpeY^pv1C{d> zexu;~Gzla=gZ5owEVwR-zXE(7c&DByWJXJ`hxwp7!yUAnLA{l%?I68X28AQy~NDxG;_C@*}j|#9OH7CnO&1ZZGI2p z4g74uKA2da@pkve>N8-DxZJB`!4_9kj=Rfcj=Gx7G1nGg8Oh#HOgWfxbKK=KCtQuh zx;0w~ww77sM3v(b%mrf@+Xsn&X$>2GGjE9Oc`(B$L*@h0jyL6OlI4I&qwEl^MZB|! zcNxay^Vmg&+3lXrp!Qi*3_nI@rSB2wn|^P>z7%uLdG!sr+#Ap*QYgHQ6o&CT1%0Ex zLOmnD4t*%sqW)EZ8gm!8P&)zC&Ng5fG5?!^BR`lBGrp85R^&)~xC8l~#n)M@VYd!@ zKrc3)LoIHQCQz9Zb(n*!$A3V)yqh`l8MlY{I1qqs^`|oj#FqX01oTbdGpQSi z;6Uy5C(0lAi_+O$Je?XUeH%3xxa1B>^-JSOE$n_AbNmWUgWw>3LGV-HFS`jRa$KvV zam^R2_xN~GV@|l;54y}r^qMJmjX4dR0nP%C1LuJAZljXKvW@eI-APijH?Y)afn~(B zyHi;SWfp-D2BClzx1^NIf0~ z+}?D}XGF|~JIuy%v(0CAd(D2YIe_6}ugi;}qTUP`Urc@3hs#^c0MbUFxv~~(yS-l9 z{xp|s&~SekT{4?`G?hDy>(iCCy&L_|QSK_U*d2x(kBQYehBtO{Th7kdaTS%DZ0i~5 z5!JT+2LS0AG`5*}m{a{`p%;B?BkB*S`f`k3GrIsHCm=rq`DT_Mg8g7zhW#0vb*k%d zZ7CW&ug11r-0$|&{JYPM`W()H%@1Y5P6xBxzi=%v3(Jz`-CD%2Mf|zj@Zll)Rm%2= z_ooW<+q~4{Ul|osjsuU7K77kjm`-23-_V%koD18r;Nu3?2X|n7P>%J159f{hXVnO^~Lc9UQOPY7%>BsG)2CFRh4>9{2Xknuhh*g5&&dy>cnksK3 zatG2`f%++p+V*#-|DL;?HE09lmuSvfG^f#lgGw;&%+xb9EQ<6GL;oo5wXWg*caHUM z73|%3)SPrxpgoO79MIavcspgglEG5@odVLmn{ytd@g!p@+8aFmKXAvmRADx{pFo%5 zaY^+{(o+KYnZHZ4d)fcN&wkFfx1T@%8)y}_-bhv3NC2S#zek|&>|M5fJJ}V+A`EoK z|13FdX5W^x&6HnlaQj29cmQ6~Xl(f%116d^h-Q=Wi!zXaAz@ z>|Pu+ke&S`t({RnuE(>0ZrtnBC;pE6K};D#G>;5sx;@BgzT<{at-FU2Z}fiK{vBmD zLiZ1Ho-(!_M)e*+{nD&8WEhQnPGT$YdkOIx@l4?&N^fU8UI%PNMl8!Qn)s0FYF1#+v+Y~t5}p9SwBo&)jq;Ki4*F3}{A_%Qf9 z@H8#xK<#-C_oW{(BZ_b2e9;2Vj>efyx%0eyGEdenS*1)jmo;(8P2O-H|qudkeDjA`YO3(}f} zSO*nh=sWum>MKL(b3P}Kc0ntllbCc1aZ3`jj%t~oD54ys_+Pi}E70E^`AOBS0_H%5 z``S!%Z-(C-$p`_J`$1Z zs1wkW{}k+<`bT_xOx=!wW>iR;n;b+ZyD7mlGjY(i*8r5gcGE4e47K=MkL&rk-h2M^ zHeelC?Mjs(>!b7@hrYl++x9-8RBlE=RooDY%o1W1e2KeFxE#$@I2@!JzoqX`3{kx`uqK|?r&N_wV;pwBlYoqv+gmnt#QeYHB!Yuu7sRZRU1W8(8yN`cE+ zUawc+!cm4vzE0~63i>)8Uw6^@JZD7DdBs>mP~dEcNxpzb5i*SP1-*{s*KL9x9mp`C z@hjO%<(bN*P3(CIDMD*xnrl7h|WIv?|VKFbk) zpLAWt`s@EY&Fz<*(*tZ5hZv7A9%DSoc!n`+nbL3><1)rIj6TM#jIE4)j6;kMFdkq$ z#CU}97~@ICGmKf+aQckP7}qfR7`HOEGWIbJF+RX}fbkIH5yoSTCmGK$W)*V!jLR6; zF!~s`GPW}IF%B_4z<7Z15aSWXV~i&m&oE|P%jq*NV_d`NW8BKv%Gk#^#P|T?0meg& zM;MPWo@6}3m~|be&$x_n4Wo~7D`P8TAL9_?1B?e44>2BLJjQsE@eE_ua!#Ld8RHs8 zALCZWR>nTYA;t$74=^5LEF4th&PU)~k%CI?{C}&wUVLc0r5Srkd-GQpl@t|Uzou87 z-Eh|pYl@0Xib}3kJbBGnQ@o~l?Rk~DF}mw<%PH)}KaA7kZ6fcEjkAe-hS1}2BA+Sr zxR%Ig2|XSr@)rm_t|s!?LXW?R{0Cz5P9ncVjPQ7p$mfVDZihsEshCO0e^BUoEK%MR z9-iM4`45S_MxF>97u+IOlsaF|@in)&Q0RHlA&xofBBAHQME+tim13NAW7bMF{<^Ul zW_*vbw?sYI%);|uBL88b?K6?j6OC-QiM*cO<1CdvL;QA;UDGXQ`44&i%s+D{W;!{|W zMt&X3duo(C9{tI%C5?QDhOecOKbVF;1fI$}xk>3+ z!g_w3M*a=(WDmvLm7q4e_gK$!4N8x0M*|DTRQ3FUG(7#2vQ+XPO2c24hNnFlWamNd zj~QI9df1V?BC2At?%nCBJz5d=vadWIrEM`Pa{+-)27lCdJEV zSGJy^T*}O9Xylcfu;d`eu8Fo5@q>$pE@68nZMV1xE|!QI9&TG z^Har2Q11==CiD4c6))fU;qWQuM;=rBI|{`2CC?`gm`%g~0{n&8%<18Nl+AH|mqvam zIvUkKSt*4(6^P52&tIkp`OF#DKg#^^-%D{J-$mkZIr9Oz=}`!ex-3>PKUSdhG%&xO zdCxBuq4zq}F+cBC@^viVz*4-;JL}2Gq;_8%u8}dMjXlWKQYPduEn1 zU(DlVJEvPBc|LJ~pXGC(R;1h;h{M~NA6ugme3Ij|Gv7U-2)S1fhr7Y&V%?Q@&y_5x zU=Pa+?vHxhxKHv4qVnVb%Li^$>7L^9K9@%R?GLDSpZT@YCHLas@F?UdKgr|sEbAX( zJE8j}3U8;;f0pGv+RiyYv=@==ZG!u6FZ0(jKhr4H3f(TH%+K=zr&(PVo0uQ?h9dNB zFwFy`UwdqmdjcU6mOMvxz#f(ld`ppX?~XRQ+aDPMh^`F!p#jm#g{@*YJTM1P<_dmO1;jhRZ%Mn#L?Ge5xt`4fh^kd5}e z5bZd?{bH2mKgjJqv0Ukq?~ZY;fcYu5w|bUeE%kg@G$i#e5BPkRal$8APi~W9Ii1{g=zaq>($^6WmBIKSo96k%4#)m*s{(k`e z;~dusd*nE?`1#MzSpNi%dn-B83FaHOD?;uC$KfxTpWz!mE}r-!^YhDD#ac)%i8tzSn5}l;Y{Wh(ejxbCqh}u%fY0>xo99y{)bA!ed!A-a4zc zdUL&H!R<#+Xgj=$g?g-Lht-0w^+ORz1iP&5;jZSUuoZ+OkcidP+b`&|_%ObG4Hn(F zx^#7FAqyYmw_8m;Jx#kTawWA(w31IM3m)V;b|H%6OnMz$R2$=Pwtv6D^OQi zUw^yh+pNGyVb zoM=&T>RKyVT`cgaGAZA&gZx!Ry2DKrJ=zm)0m3gCJVTQI7kn*EP6fzGC1;VPJ34Rx zFSPAcf>1v`Nbe*EfIEB0zpMq{u-i!?wVkpXoLH8xu53f4Rk^VOhNi4e9|t2{7Tk~p z!y#c++`h4FL$wzYRU5Zhm41%quc!l6zrm{&RMl=OFRQgS`Fxuz>#h1Sd_8RmcthwD zA(%sDe|Mkx)r70X**%S=IKtmyqr>eHP z+-t2YT3NJOz>`@^TT@RWsXSUqPl)twz7+{Yd%J~IUB3ZUr~43cOFgKboIlFSK>r~h zoYK~HHY<8LldyL<3lB%S!hNBY@Fy+vB)b_r=E1FD6#WvefKdzWk*=1tYpqsDbhgIx zbt7dp5S(EY&Er_(&vDhrR% ziCpKwy@Itxs>D#!OrLMF7_0?VBw8^%MUvVoq8fOsz?c3lJ1l9@LXJYB5*F{3iW98B zvZRkmtEFv+MPGKuE2o4E+l%(AMcT?kjiB$xRlAUn�sFsj|^LvM*UJy&b48)j`^u z;ea5dDsFoyx_Ofq?y8Uws*(I?g*Kyk@HKiwNIQc609h}{sBAQJP)o@Pc&N6T!Wf!6 zrS~n1TE>!nP$q$fmByP?I`UrF6HO`_Wj5TkJziFADq)KUCiHid4@MxJ2&lZNYRBjE zoe{KUC?O%$AL8Sfioss!ltop*?J_wzM-|Cl7~R?-lxZgBgB&q%%c(JePiV;Ex~PEp zRMLE6wTM3IwNyT(c|)B+-It_V7%>bL zhCu^uqIMd`$}xGu55m@_aBm15G({dPt2q);cjst#7Nc6eoM?g~?pd61`8;wIzTqTyN97AfRviSaH-1^s?pV*&FT`0 z<4d@2p}-K^=cHJCFMcz4eN7ts=@B#nrAsn=`++-16+8gat>f$W@*4HNC?&0* zX6rNTr^X?+CB*Wt-`{IoqHb4W`Pb=a+=BSD=SiRI_xu`1I4R0MrN#n<~9G&bo6kV)xkefyH)>-`TJ zaa)`alFR=Uj<4Ha?~~9tdu2j&Ji|&14=2Uf`zbV%FBxY@PXC{h;_H1E8ehX6Zf8iY zzwhFriJwkJ@6VX{Jhe*PUgSxN^B2J3vz}Ody^mw^FO2^R;!;XFeZ5~|>Mx8xgScd3 zI=vp&soHKpBe`I`*ir7Gr96{HgMtV%Wr}t z9Z%!CN%8f5l)^z3ztoX79qM?Ro?}iYqo0p9a{Ngx$e5pW{wthQO2tXMj$e|*t6Zr# zbcvqJ>$IJsUw%wUo^g^m*6}q>=eqA`j&PLoKXI{QX*=pB{B-&A6fLNKrb^%cph~F* L&z+nhIsN|wJn^DU delta 34003 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 O&86|);PqGJuKy3e3r6Sw diff --git a/thirdparty/linux/lib/x64/libecos_bb.so b/thirdparty/linux/lib/x64/libecos_bb.so new file mode 100755 index 0000000000000000000000000000000000000000..c09eabc02b89303a211e866237b853c9f0fbf6e8 GIT binary patch literal 122488 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

    10. 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 literal 0 HcmV?d00001 diff --git a/thirdparty/linux/lib/x86/libecos.so b/thirdparty/linux/lib/x86/libecos.so new file mode 100755 index 0000000000000000000000000000000000000000..4ae8128d2232abc17b3f8cc751317baa2d99e87d GIT binary patch literal 106388 zcmdqKe_Yg6_CNj_9F>%MQBh)1QahCtwNO+{QcZ|T8`V@)RFt4#@D7z=Flq_WnNeT8 zcmb)Um6f~Od)M77wliU6S!U+O=lQ(%&M=_v=ll5n^L;$N z_L%PL+6@c{Du;U*FL2NYJ?&PMNAoupZSlwYNJN@|6eP7tH{GtC zRlWbo^IdyS*naf|B$_QgxuGClYfILCXG@M5 zi;TM#yKSe~wcO-*p7kzig!A)$@dKrb;Iv&BgBq{BFeWX8hdv-G*QI-|gWC zqy_5vE~JI{-KXHmNQ>1olPUO3#jgy%|G|&{9>8xpelrNDe>0I*;#Z|$57HX^9#-&g zRT@s})x&J0bMW)xr;nSl$++#R+gGfA?2Y?>`}0>zHk_Gp&A90|rN49HxU`w?w*LB# zr>^+Gin(xF?_KYFT6yByzh3eArFWigOF94gyKcGpp=VBdJpXr}JpaZ0A9({%?o*&Oo`rDrt9enMnj?Fio`O1jDFBrM|`6ETo9w=x%Z^rX= zV|Lb``{f7UoV42d_M}-SJ+$Q8mYy4bNKQ}se8Yq>D~E4e(*0mT(tYK#8=d!UuikOr z*%=*eu7x*V{lCQrNB_KXTJ7J8PuP0y{;rQQ7QOk|!aB#*Ta!M1H+|%(`uKm`uKlfj z%8_dtgT_Pe|M|o1*TiOCcoVJ#NaFgR`E< zzkG`G{+1Gyjeq{mNAJG2dETfyI(K{DfA3#A3+(Y%ZuT|)ujBGZeqMU$&gn~@sk`d6 zt!?iI*DRe9xZvI&zo>iRo{7`$J!9+*C+>8|fA>OOtXVT>#=Y5-meqX(c-l1ARhj;! zb-iEg4c>Y26QLd6cT?Vb^rhx)6MP@v_OFb4o=TWO_cq|4#R0GWor3iAFn}}}zkf%; zEHAS4XAr)95L`J3zKsq@{Ud%}7(mMLxOWi#uLr@O#`ITU{itFs8Svdv87%)~5dMxq zDO#L%J?JH0 zX%lS`{sj3;AGZmAe6lu5`vK)`z~@+HxsUX&)wDe)NZ1Yi?Hy;+o>k?41%Bs`m|K8H z{I`+6{MYbdkPG39kpE&7{bx{~3`ba{>KB2(<>%S79#x<1(s_cUs6PqxUEp`5D!&hO zJG(J2U_v1M4#3M_(X^XXc{TWJ`wDZaYM;J?ieIJRWhn35qG<;d{nwFpf*<-R(z_h| zbpFbw{Z`Ry1zee8(~4C2Ey!OH)t?tpuA#hKl|P4eI=|7ht5yA{0k_y~!f%uQFtp!- zMyt^;!cC~x=D>WZ>Q6;}Jgn{sRsU4>=O^%>U>D$qESvT>gE8+O0383VrfmRS!pVTseulhM`_Cg? zj>#iI$^Q__lZV?h%9;3Iqy01}{ZrMylYrlb$*W4y`y1LXf;>3a5&s_GB@eZUIg4;S z@;|&r_U9DsL=9chN=73S|4zYd9s>Syv^PYx--Gt|f2L_Zq^$2pdD@q9J|+A<`Hj-o zLoEM~oFiHOzySFrY8R6K({0-5I7x3E>bGE!UM<>>(}n=viwSxs@L2yD(sSChS*rXa z;AGH??~;C<nlirx!=SK4ga6$<`4(zZJ_EmgrMfd1Z3q;Ds^EY`;)@<*hE z+rV!p?E7RzpZ(k)W7F@c+pAZz1+PMbc|Td+tn|_P#3r z8Tgf}H0?Ci-VX8u`B7dcLtkfrt_wjLPy|1(kskW{tb!k>JU5^|AaD-bOAzJpkaxI0TR_KkKITQ`pUKC{-)Y(*MgM8kPe%Q)f4hhD;NLG%Hb$WtyYzv47%}YHccNc>;D<~%g+N1Rjy5*eE;;BGbUGiimN=6Cu@_Z zmCq>GCSRX_gcE#UxN%QT_-Je=}?H zt%}0V_e1>NlI!iXt(P_oy6%y%Egt7c9ut*%xX#l;e9T2*POHf?5Q=?t`3UOjWF(>Zxs z_0-}S)3j+*D`r+hHj^bslc$zF5N@evdS#gK%xceM4~fV=RRWG?YU<1xo~oIu1JKj7 z;+hIiwO0LLm27`%KbKXd@_EAen{S&u3*DMJb9!ZQRq1V>Vh?m%J{8r9XO&(LEf;%A zudB{3t@dbD_}|Q`Qa-B!ZE9KR)CVTimV3s}oKaHlDW5r`T6^FDkCe=enN`y-)oLK5 z>+vh6`ayl>41pnaGzAK{|57ksDl(@PPeluYnHo>&t)oTl9HJot){XB{6_Uc$kSal^L{X2tyR`|rj`{~F|F20N-Ih| zrFq5Go^W|yIrz9W_qNH!(_pUh5rUb5=MpeAqkJkbOKPTiB#=`+tGt^1DXpzU|4Ui@ zw$kFNsbyLz>}^7AWe&KXSXx{ihTT==FqKG7c5zizd1=)h#T7NB0_C=cr%x~Sz~%>( zRLs0ztLUdarFiNCQUXGIQjk!YMsu7z)l*e5Rq91OE15uMkhN5g%+dsv{F&F4lz>;E z1P`pZs&x9yS*5CS>C~CklO=jiv8Q+fEbQUQ=-;ujr)q+ser)Kzy3{kd^ue0)it;J2 zBnpdGflhk+br&oF&M)TTC7?p+$By1leZR!J)(UPZpdZ~sMU@$k_kU#l$ zZ2~$qUck3Wdn<-2YGtRUR+JXcsHxOAhL0{qGbr;^70;-~pd5%Wqx7Kx6)MYT%+e}L ztER)kWkE#iH_8U9D=Ug8Ppz3=T{9hqR{8LN>eGvBCs)mUs9NL0)R`1h&GgCD56VpS zEb{xsUMdTtGX#bj&{|D(>Ez-HjP)5%(Tw{iQ$>TcMwF_W@<#?`KU7tIf0^gz>81A< z!$hY{zodHRC0FpN%EQNWK2DXHlR23{@^Ed^&rUAISS^Onn^IjZCmL;X>5LL>Qr`91 z<0oHw$)%B}%Pz@?Jf~lBS>!n?HcdfhM+7~Jf9%` zFLwuR+W#N_<9gbrUBfvaeNV>kl=AWuHN^FG$m2g7q;tJ0uLSHFU5>~mR-32ts>cu> zt}Rq>f~Y@CdrrY83wWruLcya1Y}Z~1^nq zsSEmNdKL7~bS(7GbT0JI^i=4d>CMnT(*)?BX*KlE6zjG!rVY?P(=_Ox=_AlT(_caV zOdo>&nO+V3Grb@BXL>sH&lKaLk?94{KT|9wZu9Po4NirD&Dp$Y7M63~&-?oN{B540 z!HLN9Zi&5TGlVJs^>NXy_5Fe4nE(3zfPpG@ueH!#RO|Z#1gVv=IMgX%bVMs-W~fcT zFf^@<{|l`YFb0-ZmP~lLfcaPk>1d%A0Yf2L8G5UQ8U)OuvP{C20)}F>G8f?@0TZ<> zm#|yF7;svdo3Km3tXft;I8DGXRIRLtaI%11gv$uW3pj^xC1Fj#BwbcZc>gcR_yY_? zD{COUSHNtlYysg;0p}BLA>1ZlHeI%q@Jay}5?)StxqyoZuOQqa;1a?s2{#Cstd+GA zt`u+u;WolW0w$|v+X%Y_>>=Dq*d<`HUe-l8O~4pvTG?L0$pUU593&hsU?1WAgf#&# zAbg1M{{OK5jf621p#K7HAskD%Q^1P}#}jT7@KVBwgjWi98R2BY%LTlgFjn2@zkpvL zoJP1oz$*x27Xkej@QZ|9go^~cl5j3zw}4j>b`y39xRr1L;WPoSC0s-}S-@?C%LvB{ zcnjf5!kU07+Ok^0`;V~yI|w%r-YZ~=x@-aAP62;NxP@?=fGPU2rG!@scsJqYgqI6= zFX0u0TLk<$;gy6N1WeVGwGyrr@IJzAgo^}BRh4Zc>=y9%ggXhl1WeVHbrDVz@Daj$ z2`39!!(&;HaJ+!Ap#%LB)&v|&_z>a!KePXFgc+lS_6j(ja4g|Y0rQl!ES_+ifD;KP z5?(3bB*MvrmkT(VFt_GHEdq8BP9xkP;IV`=30Df3yIEx}!bJj3Bb-avE#M5oZo)1B zXA&+ToF-sw2t)sblLhP|%&nJDynu5ER}$6)oJ+Wt@czSM{1a{u+zdRw04| zj@@BuMvlY2ac_(jH{3b8=Jei+tXW#0eV8%Yj0xv@Mp^koHSbk@HD4HK^!^hFO8#EE z18q3QXXIkv+_{v5l@xw+;W@0PfG z?wfq?W+F?Za85+Ovj3^*vn!C}D8#SCe9_SWdj3AWi6>g9T$|p9E+pZ}W##xa<3HwF zfr3m2GV9V0w%h48HNz9Mn?47pG$VBdiYnUeoKHw3$IM@WuB>ow(wj~v-9ksMmE<*& z9C*sJ?3+O?5qP5C#)1QA18R6ss-Z5uCtwc(GbxbZ2(SlrVQCaX8mQ_-PxPh_D275u zon@bI*d0cNBhipjv|cCQQT@wvRG68T{XfiR)3&aFw(;LFQiJU-JM%%;Z6;*e-ZOt~ z`^fp_qv;TX2bqM%P0;uf$hANd z9Shjgx_&}N5;78ZcXW5`9xHlMX=Jn@+Y?CYM7R5fqvHh-rkn+fS{1Mvg) zO@XA19DP54g;~_o!1if9UWuX-p(+yk2p8ipA)$5kdY5x1K|YhAMcK9 zM<4ct0=FEh*#`}w#QUY)8;Tv5?-*ON-K!kSv=+)|&OXM7!HFke%jo5DEN~V(+K}Pj z3FEE9V2_2l`a~8=7@om+7?oLem#r;jlPWV7I~tG)k7#T*e2zvu+YT9@(g8?OcAUTBpfIN%@uNgPr1<$gz<{L%IT;^y10vaf>ZE}8~H#U-%$5HF=G4@*t z&()tQ)zmH)H5h}=&YA;gr9v>|hFR2^EnOH$=n~zf*%Aa`HF*AxET3Z;X)ksxV2Sjn zrUtV<2Y|=}fY~eh2ZQM6bH)3nbO z!p+$j9OHv5cv-+H6{j~nPdt!t<~wq9i|3W9+qs~Y8$JHe5jb{7K0HINa;a9*2=g-C zw-X@>YEg`4POROzUvJ`t1ypc{E0_s$b>9YNN`o+S=0i?;(`(4GCfZ=K`Nj}d=tCcj zoYypCt7)Haxot+m8=#Rx<)GMO+h)dtu?jTD&N~xg_2!GPw1!RzTh~ztMP^RA9TPSD zmEL?JN_C5&9qQ1wOnZw{+Nj=i4mdZqZv1+T@vW~z_n!g~-E-^KXAlG&cVXyRQWe8c z8H!nVwcYui-t=dZ8V4=s!rA2*b&fpU*TFn#Pv}t*P_=O^Xj)Gy58HrUm~C8xvK+{} zz^Jn{bENg4&A80Su{7O>6U!(rqZoS_>_nKZ03f+^Qe7TLzLn)iP0jWTbz`2S`?+36 zD>%35&zvX`KUPJj7bw;7cOQZg~?}h!J!94}Es7E`m{c@{Wi)6|I29CNgay4PwnYDf`YOOj0n}NB-d7rl9{Sa?h+3Ay8*D;=>FWV+ zIlA8tZA9$!M|KseK}^wDg*gRO-05w!TGG=Ox7j*TtCA?l@PKfoku=w(goYxw?q7yg z7g}pWFVepPR=!o+2gT)}lE=(ip=@eg-3q&I@dP@;S!+c0`Cvmt!M+~d*9=0TY~)CJ zEt4a_bD7=wuHM8eH{)O#X2xH1pAP`Ws~91Lf3-Ug=uNjXi-FODwn@fi^e0AYlNt9H z>n@v-^cTb4q}Xwiou)sbseX3C9QfY?ml57t0l)xqtPEidR??*g=$j*Te=!y4ag>Cn z;vo{R!We}aEpF3am*Oi3-HEt59M2*^6boB$8Erg|f)&VffbpEARG)aDuWy3$MMoQO zbpHz==3OfQn`Z(AjxGopoZ@ubb^q@u0;vzn-Iw0hn%d$lz`X$Rm_h9#O+yyv4?L#gk#h7OVJR~SO1Rah$s3- zYUmbPKV%lFSM9A|P9)C&q%W~BCxP{)N0)IEgHi~M$LdwIGVQ2VqM6#Fm>L46jLqw? zjjve^$8sFs(+R`Gg98I0G#9(Gz3cdFmbk!bS#EbaKyDtk8b_dUaMbCN5jSUPn zXa5mn8zuP)Tq3~&gf>3j8A4GZpJ%Ilgp&EDeF0idP&Ifn5m*IgCRTfX7ohYue~0eF zB`nSKGa^avNk3?=6M;%0*1jG`5~`=-$CYOR>Lz)wwHe#Zj5)?eGiR<{#1sh#R5+j* zrHq1v;;biLUI|&ls$hP0gMrF8k0U{EJ`WA8K{I{2#W_{B3F>2eooasNXe6DPXfMfn zqLFkG9PnX+RA1*BP@onZ6OCO?(Dab0LhrRPX3|Q*MzUnXvi{Agg=jv`0sKV7O8CFg zB}7p(6Dt6BeYx|4*>9M-zhn0NiFBMADH^-LkfUZrpB(o|SkC3^{{L_cBHz0uD|*== zdmx$|X+4o6x#g}(Rx2v>NmTAj2Dd1tz)!g^tX?!~!I)z{DaXxq*qfC@bjxx_f)i zm-^f?pm%rld>PoK&s~e>JsW}KX7jo)4zRW8m$017;elbO*3lCRbnB1VP^kNV25*5b z@cJuj(MYl);@siA37i)KT?5x&-Ctu1BaPLol29etT2zTDXir+5IlNaF^D@?+!({!y z#Q1QFRp+3}dDfzpgQ_I-@5e;fON`VTje2KUi}nwy7dNdX8b5h3e%dPoSsR2ub})YB zf5%T7jKA`~<7Z0zs$WqNyqp~9Mjr;%86n3Z*Xe_LoB)ZLIe z3WTB%?fk`6)k3p8fSh0H)z<2e8svOcn8Ol*GNv}n7IZ~M&`lZ!;P3eIfW24M!|pSCz7(mer&pgl7vmRsx!jG>=lTH2{yc^!?9-S@ zZy=~!v>OdWPsrHR?M+5jH+G4-He5H!U1bN*Fn3N7)fEP8tY%w-muQZf@xx{*MgPeP<)M=ni)8l@8&N zt7xPXFFMpSb@L91eFrXY-Xf`S9+m!=m>E zbjI>-L5B^5H!1(bZU?+J-k8&{H}T|hlt%1P?zCZZuHAJ6C;l6pn`-v;$mkalHACZe zES2&9iSWhT(+S)ctNRY(5s@szWitA22`*D$mjoF>t2kq8e-82Aj{*-`31VTQ$eF3} zo-BlYS^lqjavWKK`{MNl-0_&RRz&2G+_ewI&f(;H?W~KVSlhorY}EHY=>Mv=EE+i| zkssQN21KNv@5sV@&b=ZP?Q?fXMf+lR$oVhKjll9A`UQwZH6{Lop3}ni9Mz=OCT3ml zmO3%3W2N#v_A%Iozt8iz*(k-+;ptZNWuWmk#3}@}Q}>6^jovlFK27iUn36FPG3Am! zcV9etU`9K_41oSVr5BXuU=(^+LBC=Q=IXu)@ZQ+tLk->M#IqM04L05XHhh=q710}) zNIiKy9H5lXZ}C|g6;KLxb6Wy^L62jRO>H2?%R=yz0D4?n zx%O;i1cE}LpFBq#3gR)abHQ71&Oby1<`R{Za;4DG2Z|W+W&)^*O2`u0mz#k~^IVMy z$`~b|eFi}wgoT*m{X6T^m6-7CIWN5p;ZFhDF0{N?LSUa(0Ky)Ao}&cJ*!y;Zg%TsU z25o8=Ns@Z*Cg(u!P)8|gWm`vZWbHARe<* zy{+BB&;h|WqV629$lU}b*(3-nQQ3M#ydKDp{f`psam9Jcr~fx`W(*dmII-`Sh3@+i zlTGL=bldW-pd&!Lt=zxD12ze=Wfryp3;BdWaubH!!1>3!F9~a^_@ECZb2hKK#TFiQ ziI#V5r2cwU|D`?RfOm@drtnEyE$?=?ZM0@LGPvrA4X*70oZ$$T>_+dfLa04g2m>bA zZs$z}#o9JSI(P&WvFi{I0ViNxl<3`(w3+j*G!c=@Qk1l7qoE2>E+SD&oF4^S_V@J- z{n?GC(WD}aldCm*U7Lvht)KiVi0Z^0Tr^6vvvPlv6?nP z_w5?Wt!e{+sgugpgQ#3g=d%Vnq#PV(>Qh|frhEz7vDTCKk*-)T=`!BJB9>e_(48W^ z>7S4&A+%V6+7%#OYo^YH!{wZ7CV9<_dDx@}#bj($(mQz%_aPg{9h`9BICzduuI>OA zY35U+Z$mJ(Oho%*Mc<5s)dTxB7K`)x^G#y0_i4rfZ119pSa=k>^_WMBLWp53n$vyv zLDp!i=_;f~P=yp110bQBggBmyG<=QK^yi2$$4V;xoi!H__gv9vlGXG|bQ@AI;qx$$ zBiYz*3kr2NE*CAEy53Yrd0=l2hkD{*yI;+zP;;gcG(IvmA)bRQ%#5e&&jYU9|Dcj7 zh&0)|ZP6_o`&DQB&@r|eppoC=$(qn->dr3R_bdQ$=3lb{boHidp=FXX=Z0-a_g#cM zYvG0KB6=R6;pVeZO#PfWu%2h6weSbBB5WfP$u0PkG>D?~gEVYjO+iP}(szRSv6!D4 zC#N?Izazs)vv@QUK^&{Q&sSPctkRgk<|Uz$3N)Y#0vjt52t?}2!n2!Vt8UF^Zfw8PP8DoaQ}mwgxNi^Hzi0Ok4r zPJL7I7_2IuOxcEmG(XSQyj$`_+$qi1-=q6E4GTMXL7@^pAu=)T|5Np)}=hkRNK zU6dc9OYFz>b#io_#{ebxBO()V9w@G8(BbG!+c52!r!ri44)X;Va)`he4x_}3dzE&b zvP}sPiusgg1u^b4^-vRPO8x{PT+(5PmuAipd@)uSOR_&mJCnP5m<+5rCFG7o$l3KM zj*R;(0AU%*ok1zXgSTwV{{Ag9M6C-c+q;1m9YXqn(-Zal591I5sA^N z_{7Fx>eKZX03$(YdfSh7D9uK;sKe-5wniV6J&Q;~=t*p*|9O;>nq-k|$ZfD2itVRKp9d|Yc0jakgmpGW4{8>QTX zf9ZzIBlm|CgEg@bWb;31PXj3#$Dp)CQ7QtZh($;W>wc0H)_YkG`?>v0S>AqL-c=ON zCNE;P^&hNn@29mEwvi9ppmrbNuuxvz=K_bJyO0y{CmxuKoH7xL>%Iktz<@lvv0L+E zWIM1mju4&kZ8Z==BO-Rk?yg_)UzvSzwXn6|gI%g`v;Hf3_*5ku=t9MJOBH9*Ty$R^ zAefAB`PO6o6Ai6&Z0Hi=4%EQoN&~%5vtZ3j1UYv{v>h$jp^DeHJ~@gG{oG)icwNdT z_@qK#H=Rg0ROzQ4iaFXSDvm+QQlxG;y5*8%pyw;}q@&RbkAZ%fLjUUHqxyB@G0+dZ zAyu|sp>M!j59*LCJVrv_qhHt`3I6>H1bAoQ-DMTu6^b*tG=zk_FI9y58pHJ_e)0fN zTKYlk_Iof(tmuLf4w&K`a-Cj>LY@rYtC{vzRBngNGsJu^J^GmlW9=ZG1|=q1%_pw` zr}XSlKQ9nv7>AUDeIGvDd021i;A{aJ>bM?{Wwt|R8pvjPf5G(09eHG?8sDONg^Snc zX3rK1@YsNKuf9k8@fkmp=H%Nm`RhSFtZmotJ$qQUAyckb!JiQ~P zwcy;xcL*)qYOQKt-AjW7N9@!GK_2`oiZ|;#YAud&z$Jxt@)3UN3kkP6cceGb}~}?JSC_k zDnK{Zh7MW_4o#5b>5Y|oA?w)F#Qp~3Spc5Xr~!zb3lz2c-+$nv`&Xbn=PtczIntZR z^IGWC-&6l9(awCq7|EP!HK#DTias^MEvQtzX$xwiHC(RJjn6qVV&5Y?D@Xj-1g#HO zG$B@==7(JwW0PMIoh(8nj6JwqfJ>Vx1t2?56jUp*a&365bZ$2?GWEu@*sf63Sn>)b zl|%{B{{{?SNDb>3y3?DXd;t?t_rJ!xal*xNodlm_d0&v05!ZT0WUw8ery)n)Ns^=B zEg#6SxdyM$C>Is3XL zqnll*==@dDS${v##S9fD7>zzxq1P$&HFytbP^UuY(*+Ea&pnEzXi`OrRJtOyI_JMK zdY(d$QRo}4Bf2=?4>KBiQTQ&dw1fMxupW9(c6fbS2%YdWxDr7p*Jv=TU&F>LakZ>b zMBan$*RRV@*=X!!m>(3vr^MW)Aitb>n9-&aAU_e^`tXIi#4l2 zi|6jS!uyRPYp9lGJtbBbs!N=_T&4zPdKi&FmUAh~N1zg{J#tLjBwTWK*`0MD-`or{ zgjbacf&-)SmkLF5@jeRL%VI0ml4MFl#l>u)l6v`H&Z%-Or*sV6QX5GgflO`8~vtBVG^4H8#6+-zPE($;IXaSiJ-I zDpuf^b1>)i^{wasAjUKS;UQB#;65RwR)>t#-g7uyaA)qzF}|JXO{(tahfpNV7(5x9 z!>ibY;m+^sPQu7b1s*pjGL4VJdq4IV4)|7Z$WSQ{fbQc5bF759rVX~4XP)A3LyCDY zhFXaXKyIJwK7JdDbs>&issRlo&>Mq8JC%=o4#7;TVHx$tt$nd(1iGB@^N?hs%{Li4 zD5-%#O4CSK2@-iKnt%wsM7#^kVWFOeRhBe7v4w>>*T`6Ej;4|GB^|cizXPHBxOWEu zxWGXwRfy*->&dQ&JySs_l1f73xnf7^M%3bMMZIY|`pMmVv1VQ;JDp`MT_!Dw;a6Sn z6fDQkt{mg{SQ$^i-O>l8nsJvwf?QS7WYlQqwS1P@(_m!Rs;=K`CZy3J7e(5-1#L+d zCb3mm&94_h3WkzK4EXS>TSl$ya&W(I-G$E zo*;+HatYgMEM%IcrLs-)hafpUP6&+6K`_KkjvMFKv0^le}aq&bHo5k6F2%KlAmuvhKIqE7>~`3$e>>cT?dY7k7#f` zz6GE{q_BlVH+ZpX@Gdk+^bI0>6M@RH(32GUg+PbvZtnUCEc^~Lh>Xt%c9544sE_FO zW-0=qZAZyNEbj)PhXcno3Vn@-G{wsKSnN$v)Xk%*;}vqjOz(1bbIprK(dnHp`u}?t z9Jl{<;r^=z*8hR%A^<%WKTQh#=XTlKH3dgC8!a5CLf--O=o1*RsO6Y&1#M_}&gS$? z8>1rM0gwx58!(i$fGZXQ_SGOvz58o%*Wl?kJ?D@)43qdZ>i!q;AiVfBa3=IkajW6t zq&OF)uEVicKKwWK3UO+tcEE<=pba;aJ`Fuo4LXyoMGJ_=z(oWC!~A_U*(ksTvsBDl z;mkJA7=CV!lyS4{BvcV4y(dKOQFyncVKi=5FerR&Es70O=v^DZL&=A@u0*-W2JvDL z>{@hFbnSJ~`EG9>Du+%(=fn3Uy!%oyBy)pLVE16Cb|qd|slcgk9nML)Amxo z5G2mC`2G$qW7@t`F9FW}8kpb|b@IfySb~>tO+*;nIQuKaz4>7KKXRPXpVWcB!UcBR z6}2*+cW$;4=0gUF^}nWk1%HJ@HRnj2SmP}N+kP|6s<#=L;LL5rtu#i0VXTi6Yd*Zr ziKb`&jRj~viBg6<ZX zh$i7gQ(?7=)uM1n{ph6%Jw>6fzZ4yyA@$dbre3Si4}+op5e-YSa5wP5M)uii=Kh+%8)JpSGZAva1|j3LF15>@EVJ)xKUwBcD(a; z03>+XApKzaS9qaP^wfi)T!9T?dpu6AKEaf(`d=u_Yh@RPrrO$*$MPlU9N$799qj5E zTLHVma89e;*oX`_DkIXg)nAN<60z#|m2wk#beLl8fg=H{>3hmpt=y7Kp5*h6E(R;ndBpLI#!@IL#K-pm+WQBik# zJQtw-czS1g1$fptPJ{R*TSnrBXkMhI8Qa-{CO4jPMHEv@zGU~uC5_b^zo&z%7;AU- z>dkypUAHzeM;Qa!;9Ji|CP`y~i8r>a8k9ri$r$4~y{FMnC}jIm7T<(BhbHrHl>*h_vFI*)NPE_eaTULiB)4O zUUj2X8#n&~?modG4?2q%me_(@_h}M;ITa117#XdTobqNF?in+Fq8>iMm3Mhf$y!l> zPRjjLbT0#@DK56~^he4Px6GY|ui5K!O#9R5R!$#0zx@rblc)W}VlU5$>Rkp*CXQx9 z^%$y$$>`y0_StJEI;E}8{yms06bHh-cVHd7Ed|aBL9s}k!>4TPYQyd`jzdwHyyqvq z=~*D+wtgGmF13B&l-H1Ee@l(X&B6z{jx*n27+{_bA5)y(A!c)&n_BZ5q%s}2UPQJy zk7L_rIz}O<`TEPnjQVS^Rb(w$1zf&yZQy-p9=gg|vrr8N&Z0O{M73l%7~u&zJlQ>x zpY)xO8}kssCqo2|0V6+95R2Xv1`6T>1&Men3KS%hp+Lb{-m}3?JEKcR>XGv;ywDfW z{r{4x%bh^mfO!`v`|$5Y0j(f3oaPV+tp$v7zED^cIv{It5^{&WAOJtN9v_-gUOPyc zh&kaSj%cwN8h!~R2RTH?L5jj^J&zT|oY0RRek0{Hpr`kQW`YYSvZy-<#KO>x1VLoO zy{sxC%P=*|+fU>(REAE1o$G+Eyp%K)teHp%Gz$Gao{K;_5AU*eP>AV05N`p-XHi!x zZwi_XbbG+g35C#AT&1G*6p8H^8dqL-FbZWWP&g^I_;*@yE%ix}`=VUkdxo`ZFgDGL zw_3N=e8q2NXyJHGz7NbpS`48QCXEhUuF-;H-@&}J=wbw0FFJ5h74PYfTZ}u3LSzN# z74I78&0n358f!%jet+QaX=01dHy-mqKojpKh+ww+Yu>ij8OHLu02{#DvTfuk81rdJ zpEnj2yoch~$0JM6+ltXZ9Q`JRyA>TSkT-pBaRA{C-mJb52PWd`j&SX~??QUkl3Ij) zDy)Uk#^Js*UTvp2!p`03T_p%Zin3Rz#qWW@$=5Pj>!@RbixWs>e6`rYw@xG5vSR7n zZl4R?^g&|$_y{2UU-nkK;kwvSD6;1vSL1aYjBwSXn!lqbxpZYpti1MsT|fl0X8#e! z$(RNiZ!h_Uw#sO^RkX*Dm-`Yv!5x=B%@{cUKWpA9ywLn{W_K{KOuUW{Bn^!r*^g{w?nR1@d2)Z!kJ+3w#doo)}jPe3z$bJF3AH3ru+%3x@$78UmStxN){sL~)C4 zzTvrg(=$Yu#c*JZ*tk0wvBv)|?eL3NV25kv+n(X`+U58XA7TaCqTaL!0C*Q;UE(2b z#2zU+P^y~#5*6yeq*ZL7G1rJy=e78Yl zVIA_A6kD*9Zd^8M#Vx?5KlWrBUmpv$w(3nUAw`B~1o*B5k4DmbJc*%cf8H1!x)Jsa z!z*|bWtt(KTXzH3#+aJfsqVJ!!#zR$u?N6>pu2mm;}T?cb?9&S#M87BwYX`pfmEWt zD3YFKjP=a0jN)Z&l81TM>d$S8?c~P>hQm<7j5w(f2d)L`0Ey=c zr$QvP){^ApjNtogtC@N zrP`lI#)r}X=|OCVKr;ys*y!~+4#@(JKv8gnFcvf@+JQ&CDH)BRzXU*s#Xoi#!;vFM zt`)9L)LbBHf;r&=<=&y*6p!l4UkoLsM$sY;!TtDRpaxs{#KyC24`Vrf!8W2Hj7IBh zu3ZKecnVLzy;B*-FOxQePhiNvP3(lb0kG0_P?g)(<=mz>`D4k3)!%X%=sQ2rn~ILh z!9>%Nz(>pGA;w|QHD6*8rpw(7IoFs8XPfp!q3^3nxm|C%94WWs8}DHTnz~J9 zU<|C1V*m>!j1m8pG&eb?nMsMxPxYn=z>Hk+%LIU8+J}*_6i-6D9ER@Dsj{ljt5gW| zK>NU#1)>pCXh5-`U`?_CgOi`ImjpcMO+(Q_E1qavE0G9qx)=`}kxIGwC|AorpCb_f zaFdaQC}=|}3EJ4gS~w(g9`NwPH{l_a2e&J4)lsCUT8}@#V@IwtB0F+EQCHp+1_99G zOp4)@@|}?|yxq>7KTb7d5JF&r2}5+CxrGOf%S4`YndraXcukVPBYWb0f*&VK;F%06 z<8A;3(4|>c6J33fBT1~}P5T(&vp$+*U;qUpqlFph8Q0njMJS8Na+?POh7?{gp7_pLH zp=8`LF_3lZ^nN;40q$n_!w!f>qc?RymWuv6a&0ZtCJji1ipGDGQdfgLs=>+_ZtH~Y z6aa=8TBTel4IG~~GC?q(i;@OB({Liz!gvJvD`dXg$w|n^9U{n^(xA&k%;C)%hQX3W zhCJd68^XcuN0A4kntL1-VYy!ek&vp8dpaVLLNp!+S3z=cQJV%4_fqL`H0EFQ(QazIuqprk{w4OXYLS&V+jYfGHeX+1UBOQHu zft(Ekzm+MSYcN2ub!ZIp#F!_8YvFN~yyD?QDMk_P8fVku0b$vE29SpVq*P(?tB`=K zn5KrLx4jANhu`bteyV?GZ4$gIT{vd`lVR?-6)}SQyheA*Mq`A_xpnp@R0x*eJaMgr zhQ(;EfFl#<z4AF;L`#@_mm|SPyE4Q*+KcQH&S-deA8}f!53Rh`|0QgJwN=mnQ*$^Sc7OJGPjoj5DtGU zbHnr9YMDFO>-&mHRLvv!G9FA46R8vuW}G5q6si3dz4001+UJk&YjiX~Hy8|CH-^Ue z__mR|=0uiJY#Z)|VZ(1DObbVD(E(d7y%Lr)WAK5A@IIb$XlFqt%h7@u zSn(K8!XkLWAT|seg+e!e5d(o&!hKiTzBSXi|9+{l)pFTj{m2XJChRoRyoYQY40_Wh zP_`(A&`S7-x=9JN{-n1(j@(Hhr-T?qS5AckH1uz*ZqEQ%L zsEVGJeU*k75?}F=wkN*3P#O9VGDpZGyy7=%Arm@q2-O%Asdc8j!;~vbb+P0q5{!v? z7B4N>I&nxL5z*Qf$Og4(?J2*A0(zB+#+CS#RQNo9_ZVSja^SxQ02Owyo_bqxtq2)y zo5aXX=|lv`wa_T@zlBumyoX~zjGt=2HE}F7aSf4U4$FBF74ve1+l>+*{(!4d{S#Ama|$ z;E#N_yy*)#c+jC^wH+`ofaBd{)zF(l8NVf{vttV8s-XDiOK)vx< z>W^1$PWB!ig1fM&%?lN{>xDL~B}Zt2VuEJm$k*a3Z9fx}_r^S+%tH>h@J*^lzwy*L zDkfkK<=(|8Tcocy9o@qj@lic220)g=_nTLVu+u!*_KSHon%0{~L)C(NtAbN` zk7qH|BAkkxug$nj+uNZ#P=;|wKa66Abitxt^oBb+%6gl#xyC)Ni8kFUi-kXsn;8fJ zwm{m>Lwa7j4U~*=5J@3a83+2_J`9MW^H982Y&~Ip0f3E(O}1l{fA_phOHD?S3^PJ-&lVj**a1}mZ&h_`0@w(3sZBYMBC&?+Gh-QZq z8bY9AE&5Z$>j+~NJM=BmP_9N@e@{)vw3g5fcto6oC{8#JnULYSLYRWelP2048HC{4 zr>6A3Vp3y!>rSM9!X8vV*U?jY_*-Uqe?)V*M+3R#s>z7!lx)CZcQ0RT6yq&=^z^&R zTH2vhc(khwdrZ7iAm6rDD~LaUvB<{LlXRQ17-m8(b9QEp28h_U9}hGHAxooNBGX~o zxIPuWky2j3FZhJLZwUS1u!6f4x&`ME|Jw>$$QMx@<~DrmsXiC=m~D=NlN|>@tlZ>K z6`m?-j4(0v#yGaj0SZTKHM|~i!gOhiWt1#g2O+X29O+8Y19J@ewG|VFE&M%D%>Na}#`j@(AJHvGsgA-2Sr6N8qM6()sVhrADB z=HsiCVd__ddU&`rr2#PQkHb0Na1mUOzM%9Zbf1AKOv}JjKi-z_aCR;F7EX)pGtFt0UTKLT>;pU1BP2yP0LXuvF66Yl2~F^Myrd}Sm( zBX4-W+k39`1NP^PjUvR>{Xaq(;qln?B{d@!UGRSq5gnL}QnJQ@jxmeN|WqbIcgSzS^?Cobn^q zTxS5a7K_0|xgE3|l@T4H3qSr4v4#m~hX!~xw*X~$Y~gduVsoyX^SIo|;p8*`?EiCPhl-+B!!28tQ5k)4FgYfw;d z`0pa?A`Zq7<_pt4hsL#TIBNA9*GmA=B28HwVGS6BP^$3@UJ_7aRQW87zt9}YYZZ_t+&i>SR4kj@o3gOMh4Z&T6LhOF@o-ivZqm2y0b@umCz z3eu+i9R|D`<+KoftTx`DD$KZ)pCN@M;em2eyHF4_V)R%@AI zj5=mKpUhZGQe+gwxd4)m1z};Savz_5Kg=?y)6=JL>s(rxIb3Zpq{xL9lC{8416lS+ zUQi01MowS?uh>Ett5x~>xfrqVGRK+1FO=F08qcAojF42kWDAMN#~Ah_O4N9Y8yi{7 z*1{!47PAk~KdI50x&SvTxWnwb2`%f5N!&|ZEXJc{pKHcTR^gVouT~-Uu7{o>c2zlx z=++_pF(*os5kvwW)Q+CGLGM48?nhPgRU8yNQ!SkDH>t_owhdR`)i~CDlOz(Iy3uLI zoeWkuR-uR@zUD5+vkEH4V0bF`n?T^DB${a@; zzEx-nro_m&5KfKW234_C#%^gH%G9x`Zp{Rs=-)yIEmRj%&qH#`Oia&X1SL$(G*0*? zz6*+#*IBsbXQ-7I15+vqnl$5vqt!BgXyjgUAvI>}6yLMv#q9+XnJrJ0&>mk6%|tLr z4WOb&Z?fQOBJY$o0Km111~6mYY10?O>5YT-G0&Zg#|8N5zQZcqwzc!fWH`O?XBP-(O@6@B@q+i@`>&%LWbPY zMLnR&6ZA-o`4`z(-_Fo_`UN^G%uzx~!lD6qs3a`7&*@RIRz#nzw@}4{CiL}6u~$5W3H@~t;CxiD`WDXp$F+t7 z>NwkmNTz4ty(^rZ1-SWnj0{o>@UG~SUJC^<;desv2yi2&J3(75In?UuptKa zF^93x!XC25WhGjK=G6NJ*rztW1#u2W423O7LXOXm5>2iWP3V6(-UeEDo+^u$L$We} z{3n6#lg!AoST)|zhuUy^t3H!7*E1YAzCh{}O^r0c!n(}=Y9-;%RKNcO`rVEZ8{Q1y zZHmy}_9!CW|4QU^rO!qX5q8f%ihg{%|4PM5_bT*t6Nr9XYspiA{Ur*$-$+_3j^Q@) z>1ScceT#9muB*F)4B?7hZXn4K>{*CB*hP0os5T&ZjiPqJF{nMPoY2dl25saT0oZAw z*v`HT=*SB1%!t>M$EZB3;c3YR?z#HpzT&FLwsy*X2$?2_VN|3ye~8`#i5Vu3{lY=Y za^y$Cmqq!d!; zU--%0J~8ZMA=KkGla@wK!v6y6jvVVh3jjpK!ZG7n(8VT{ITm6o6T0~F$6dUuo&umk z#YecRAXe(Un2?WUmhmU*LEV>U%+pjwrbz*@3)a_>H8>rIEyQCt^c z@9GFw{u!7axzNJ4o78>*?hd>0HQ)Mv>1v9Qbml+mza8~Z8~FpPTF(XdzlndUqoA`6`zLUm=v7bx3F zKNz}P#-WrM1|G$Pz!&`u9gzcph6-$9rrdm@naXfCbQh~CiXZjMOnf@bZ?L+wP_!~a z&AzK&;;c20vA=Q|3yINsaUk#{8i18iS35+tMasv>mX}t$RL) zmA&1)U0RkRBspw%*+GS5f=FO%1-W5c#j|_&Mp)f; zePCW?Y-9N$mVbb9o*v_~VRRQzTGSV4Pqe(BM4W}r{u@8yC2M)R#|(c*!QDH(MFdSz zp9frv2FPM{M|001zE#47^7~K5C`Emwf2W znFPt<>_*CA-EX;oi7SEo3)aMFypCt;V1BM!I9{( z@Y$<_RJ-`25C!m7*5fylFz-u5`jz@BVhOz|3&j%gQa*7$t$=wOlUafG>irLPfVNWy zLABkr46Wecp2Jmd60hN*7C!p{F3?07{z|0LirTmahhxy*JCH9%g6=B;6|_*u76ffG z^=z0%t~tbeC`Mf6mqUh^mL(hJ<}e$iZfbnNjP2H45Z-i5`Wwa_j-N*3yQHUp%7ceU+lh&VWp^he!BH!1LtG5CDbc77)4$A-Ot82(Bf5H zJ823!5RBeD9##U*JPQOHufIVyAgkUowf}(a6d|$jHzLXm@#Pz3l}Y>xS1#_02-!-^ zQ%Q-OSg&s)wG7BM66@|!T<|lJk_$^lxn}<5xEQGW7eR2;;XK$lX8ksL z=)eZ~p###N2Y;TAfsT86sb`0Fa8iVg!+QO^$`CpOdJXFf5)j5e40+P{j}RSZVJ#^S z>mn3Hp4jIEOK|8%34JaxBSL4tzrsAJme4(+z;OU#m2l;1pjB9j%D}>?<=uIn;8eQtokeP9p;!@P_jc<&P zLT|Dk5ZLOa6w|<1-~j$~jfuaM%uWMk{TiYicc)>5lIfr30bT9mqZUNZcay~0NWPoI z*$cURH;Dl>9vPa6$r&$U;E|IPHHJqj6_3%cDO~{iV!V+~{|g3eAo60pPmImkyTmlj zVcL5c{W+Ix=R_SFannq^zCn+$R^E|In$Nd+w#mGT*R@{b0F*nY|`I*{DIu)eEy9X(o=qcLqT}1o~ zefBx1ES5_1iNP2&xL*i29(sJ2Y+*w)TOYt|XsFttUf0O7<620@ zq0px(^e6>+SrH17d(9heJ&L7h`R!DiJ3HL$2{?>BK9?ieV~o#l=14B1nmv&f2iZl6 zLT@`7J?R+eFL0s-^~aA!KkXRk;}rENKp)pABMko^=$^zBWII+2cqi+qFii%YVibyx zKv^q`P}+OBoS&U<;hsUG*qt(x=5SK+I&Jl*ipxYNifII{mQ(P~@wk$3A4VI!Du%Z@ znDVS2wGZPYCff>WpT^SXJqA$)u5;lJpUrE=qxjy=JYLHSxbSzH z^mz+KdA!WGM85cYSo%D!H(C2gDGCL@Gr)d-@q>SaZrs2ERzMijyMFA%_A zKnk%%*5@-ZR2)GVuP;9m-hagN49-g;w?zECvil_5dq+4QIKSz~R}?a(K1IFMet)h? z&rsxGs_XnT1VYfL(#>Dh2paz$Iidt8=hC@YlY%QW=4F zN5+^{8JLCdj+dOs@9PBY_+!{xU3f432lF?4!(_Bsl}W4w#cy=E9pz55DvRZbN0(Q* zSdgU1ue|_L#NWn_&<|ug%?T0{iWuTza zytUSF*WPm3=?y$c4`8R)~`k%=1tYh>)i3RGzMk*d0(El8B zuISj^jzD%^;O^8wc7EV#A%*P1z|%qs*(HIeDFyS^ivRchN6*9dC%$);jIcKY!EIXb z#7FtftE<1lR#Bfh&xM9?IS^BEz?B$qB?nyiKviHKIqDXF?dzel1M|pM_uk!qBv;*= z__xKxh?=_z+BKgP{mG8+ej9&6Z63d<1TE1v^?59Zg1UEny6>UU&{6l>pZ4M}8qQn8 z{O;cVzmwN(y4+Z@O`sm}w@3Il5O?hi?DF#~0*Uy=;ss%_Xn8a6r8M|Wx-iILyuQoAtmM1XL@o8w*qk?3v8}a(3q7UGIB4mfJ8V%yV^5F>o zBO>i}Dc-F~F~?wj|Fse3<$bNduI>)}ZMc4Z0Aq-BZ~yd5eg5<4EHo>={V?xK0uvq5 z2kY}b1IRBw^djvY8M$8qX$WmxAX%@OX?f$e4;1@qY(FWH4Z+{9i|}g`{O-T@IKo!^ zy3zu!OnB+gLIid2pOo1{M(B0~H}s#DH*-*Pzv*vo@w66voNMK#$ENFq?f^!YbeqV(!5}x2- zGB(3u!9+{UCpbBo{!C<=weU|R+#xdEc?ioY@My=*2||psX#o=$uoU6Du>u>B{Z=RPx; zmV)c=hc@#(_ql)0J@=e*&pr3tbLVS3Xsgwn<&tQ*%9Zx+#xmTA-Km9`Q{S-0<4>on z?+)9Kf{%f%Oc9gy*`VS+>rWeZh*0q_C{CO!KOUL&?7#>|#3CLcI$PU{P&eWYD^sd- zSRU8f%9~$02tgeT2bjbTKUs!9%xrqJAnhgnv_SCBZT2s!OxOMl%r{2}wRIrfFeLby z0b=U|Z))EPDL?2`Z z(j_TQLrGtJHS4iw=+BK3#2`D`#ts(pVsz+nc8L%l+FAatZ1&3Q$R`D{KJ+ye@kY0> z7uBo+wyE^pdkPta7-jr{G8#QuPG$q;9Ox@63BJ3HJlxTQJTKjNB7aB0It|9qQkVE& zE;lauas{=BNwR0CrY}day?)T28&Ag{+&n^gBzSoLB5O$nMYA~cGyS<`>3HTaem!FT zpJ>*awPmDfl`2cEU&G(rkHo6R#dg3r z!cT?Y+Q3h_-&)I0+;3HxGQU+liupH+rg@6`H_ELm-_dpr2UjGdB``Q}+q9~`+@D?T zf4K}!3)ElH_*dZB-hKXso_|)1$oud1PeT=hT)4cmVr!CbFZgpSs9ZjDOBlRp$knfE zRL<_93G3e>U87rc$wCG3Q2l57mLwN_tK)~h>DC7NR>jYo_ARAByf9kmo1t6XtMk7c zKSKBBmJ8no{_Lb9L6c4NVdF}NCL0wn@aeECHyS53SNiOlryFiD!S3`=zkEtQj0jJo zgan-Hl!Cb^1x#0SO(__eTVrocix?KJ?_A=3I^0jE`=NloxdKfI_hyyN`r`o6w)WcE z$RE^PpiU5cNyHr_bqOP^q|wz_9LI1sb8KFA4aCt++h@R0Ts7Cq2*^&W71j z!Q#YsEc{e+?pAFMn)t{)&N6P+!QAUqpl+WlX+k1jP$zby#9nKP8>ZJ^ug^fZZn;c$IFVDv2G_DHv)@$ivKl3m^?b70>2lB2 zsp9{5IcZiTxOIf?LbMQt3wN zZ~nP)#wP0DWSt9T<_ybO9^5L$-BlH~<_S3J$_mb-gPUx%)l@lV3jdfX`rMCtYsNuI z?lR?mjB{$V9NaotNRKOhtEGFvttGA<@=I=K|2dytR!A>b`Zq`qZjF*Su&t66ikr6V zipurRP&K5z(T2+gGPhI;+7%_E&*eS^YZUa;Fn(_j@q1^3t+m5n+XEh&%KdvK)2+LJ zA$o9qea$E&mL#bnIFAe0D_XX>P8i$e5 zJ>&cNd|s3oYN*r=%vr%>PNQz+Srs&gUa(#x6s#BOgY|dvJ+l>GlSV=zT8-ncjoxQ9lpoS>?yp8WxKCZxx^PeF1`!l~ z0xxKV#!7C(wN$0m(&)e~zoMTDYuwT?2)l}20nArkLy>*?#owTctk*CD`_rRarEz2q z1nb2af%P@BO-L%;@E$d`HM3vWabIy&FcyrB?jGGWdY@ZI zgmF--E;@vkQ+<< zn{Ibci~O6`xu*sGO>5lKeE(csTi6yfNk3}|nilcX7&OW8upwyb=BGAj()zqQXwvis zV+M zT4MCM?5`oIwZjJ=rz>;1!%@C@3znzRU8VmysbS&x8pbMK=S}ix12u2bOd=velK6nC zFv8)AJCCDZ?0;28`Dx0&(7|zm*ZZFz*jDC@6YjfPZ&sia)cA_{LS zb5*LglH~wb#3=1M;(f&EOU3$6?bk6uCF{2b75jSk6HV{azE_#X_feItd5{9>+R5Vl zpOmgSZ0p0l(wB0*&qNxeSdm=}4~F955^+1vQ4E57gHk-dufo4WqRh3xat3}1ypgfW z9Yk?UYI*h$@!Qz>0G(b0$aM#;oB1V`{ENKQxa})ftVt6vmxUp7@nQNrjd`{{Je5{x zHJ0Z3RS{ancB&{bIQuFhPfWi>kVreG{b3!DB!q_mcuw}v2n0zXzoC-BpvJb;Bnw3C zXjQOGoaUwY0O^gY%2dxN6ggy%tA;!Qz%sF{bP(0yAa8NMgUi1A&$FiISE%z11`-X` zq-zbVw0F|^mc>oPjiV36@?MmEiG}M?ivZgHrcH(l%WUh!U`{JUn%Nc7 zPG1a=;ec`s1eqV-fb7O9QBCGL|I`GJG5?!3(l3z5W|fqoI-1>d2_h#$M;Ea-6D!bz z+-ERT^ihM*!{aJSWEU55yPV88x?Nk^Vr(A%ED8Q!V^7#Xg=KkuB71o{_L5N5lx}-RiT{z&Es>$InFFsz z#-;@y=>IEI^os03-qta1C|o}6PxsUu92jXM{&89FPcW=a!`GS)frlE1RZ6Swq^nW~ zd$f$E<(L5EH$*}rMbAIG#3*BtcKHfeDn`w@?Jk3_OT^3hS7UJp%1SrhfKH(%X|9f@ z%G{8pWA|bpNbOy^+3Y{{JJa!pgK3#v!3UscodRgTV)3epTArL};U_ z{=Tt1K$ck@dG_XBK6!+s#NL(tU(&bHErMlqPguFLKKRCBe6GVj#dii0dz&{5oyFIV zc_YU0kMuqZ#c%~GCYdsR8$yPEi~$nSrepB>wI~{U{BN3I`%0C6E`$1Ycw3jz)d56J z5xvt~xsi^1juv~;7Lf+aa!dj+-x=v1EVI=3-}T1Kq#9TKvY{=68~)D3KDNH^R}o<-BI zvu=Tx$RoU0raNCM*^F%f1Jjna%x?d)14EJ+QkpYz7T3sCdD@axzHXnb|!y zXK&DYXE1wjA^o)=d5_X3gVuY3*^~9Z4ZrmMvsq6){T&Ez&9#MRS#A@$$RYM77r$5< zE?bY9PS~u}4_=`L?F}x`h!XbcAbm`^POIRJjhb#BY1CcjcgQ zY#S`Kc6c3i2FYswH0d4lgCv(KCz<(pSwy*-K*3nG7IGU%Q`NNkr^RNIqwem%?Jc<$ z#lLRgp30}l7)f1sCqH*LJoVZB)OC09NDa5?XHEz1+UzhbdTduP%ITr&RIh%un9{Fu z>G%8L?+^6*8^5^?up4nB-}pQUc~fU6L~K+T_L8Wx&Du>mGqiGoUd4FF#7XI5ddIrM zSSJ}KZz~TqLB+`E&{%BiSmXARAiiTPHj+Gr?u-xh{uX)lF8;k^bMb#+dtj)Je>Hwm z8d!6Ftc>OTW)}-T8BcpVQi!j*3!z~uZSI*35w{*(qplT-2;um!HI6mU2j0f|=C;yJ z#~IZt$TLfoJ!`j#9&FY^-z^l>oKoD@h}v2J!$|%$tHGWR2BWS;A+=CYElyldh7MR4 z=m|=81K+`|02{+*tL0ryn4f&zaD#P?Z;Lp-AvM=e#FL-p>G;v(+rV}+ zkBN@8932fJV>9Rx|@eJJU}0P{G)SaHoG-wTGR9<863@i<09rPSDPs5@nnpj z3b5T5PVWnBdY6BwOd#UWXsV$yd)XpJSmd|PwZfUDfBK3|f2|a*VTknUHUJpgjVJmL z2-qy1JOuI}xkw5$83po{rHoAL!L?$=T(?$HE>^?%uH2d_0j1r@@K%pbGF;Ca`Zv6|q$T46uV9w(dQUQVAoptPwTakXD+Y!9) zq`d)V_i`Pxb$5Z}nb7lVr71Nao7I0PM0RX$$@nX_9~U6U5$@F^nfpu$ z-Ld*vjU@0$+nf)Ji;*PXq(8Qyaw0V6&4+*TwW|4G+IWtEn{RtF$+2Aw><7jouAKvi z%-7c5uCeMNfYF|T+C!p*?dj@5>E}glJ$|0?YTXzMVDYQA_8$d#qNdXIf8a@5(4w8I zr}Zc-S{{#w($TvL{xlOu8=eYerM=3e=X+7quZE&~t(apHFp+T~kM*ZUOE<|Bq9%eh zTO3(Sch=NlJ_o_*m5YNlcj*gCk~58oh?QqxTc=G(vd(DRJHQ`qbWb?su%^hBC$n8X4(j*JzXMQeX%1Z@k%A3w{oBWDGc-F0%FY=;3K)Skm16?s0AYzAi2chohc=OL8XC!J69RC z?42SR9&(SWpNFm=Nsn8IwvYR*W&SOiNYb^t9oYoaMeoDWvF7Trt0%PswV&$;ZMiYi zZ;ku6XnfMO`}6CsH_7j@JUQQQEl)St(#*d_@-|(4a%%iAeI+RP?`hg=tw`6N z?8YGvPj@ve7Q%xfb*zKi->lgXZ7LuCkgeFU7%oVV`p(|{MgoWMLy`XK;?lSOeViIX zrD4{V?3ipm+uyz$;cW&_zZ6ZvwoTeN&U3SC&i^|@8faB}wT1T5VaT9~6f0;q1!XV8 z)ge2VanC0PrHU$4|Ckx4X7cQ4eAN(LuAcqB%=&hEvF$ zW=IOxJjyFRS`$NYvBb+;nD2QPekz8Sx{PfF@nNznF`l&17;kZfqy+HjB$a6Eo` z&fjOle&wWPkUJp~RXZmj9GEZNtej1@(V5qOSUNZllbwIFI^%zlR{Gx`3_j?%5;rZI z$ge)SblrQ2-$myJ+tl^HQ*TfCQcLN&vUg}(s&w7=RLQ(f8Y8GZ?PZ6~c6Vl_^ubV- zn!xW3n9BTl39`iec@kbxf1cX`u<-)(+0O!4bLqMfHFUEie`>p`Km;Y1iu-i|y=u6dMW7;S_&utW+=QfJpM~iR0 zPki%cfhq8AzFtpef$_4R13or~h5NHXhl7B7Jq)}l2=W`%uCs62{#)$jzDfJPI0wNp zuX60lYPV}1Hk_38DC%zzH)yN~c4c#Sb9R*>)K>P%S|;#jmr;u;i7v}LFRDR0yC`SF zR8A>f%B9@?Jn014s-m1V%E`Ay!G;Vu$1WAE6hUIe1Wk57py$D@)08kS&4jE+fMrKf z-ehrJK{ExnLGx|pJ=1el5AH&rZT4GLXc1O^fG*wm0Sfu^*{aw4!e<0h-oUjJ`^~&Q zV<;do(hRBnBvrf6^XIM7RlIwTp^7W}SZYY$o|i~hjH6gNr82d*NS-@ifuZQ=9^~lQ zVv~@W-W+3=n!v_#vqr)VV8}wODMK z=Q~W}l~KP3g$)#!3TCR|)TckM+hN!Gr0ny|D7ZjWd!ENlylwuO-Ph=5oHd{)9e*gY zQ{6bCzeW#=4;*V%$&A$Mwxn$>3)&oYB~#A1C40A;IMb{D)iodW&+GOVRsd34VSe&( zVZc1 z@ZS1b^&$E};O)rl%5!T5f2@U3{7&BQpCu>huhnAjJp8*S+NtwYUy?khg^t4c{Xq{S zL~(uMe!9HK0c|86N`P5{7Qu4fDt{rfs6g#cAVdzC@1<{e!=VGv&fdN7X#w{}50Xbv zydk?LK_T8|GUPF4hYKb&v%=Y*7A&Tbps~*D4lXK&cZ$3FMUn;X z7R2!2y2>?R*EoFX8~wMoVt*~-Z$rhO=kebf?F(D}7p1%`k}jjOMgBrU`JWcHNig`c zW9is^5ssBNhWae)v+{whZJ^}h?+5dOG}AjV z@wU-jA(=ROJt1F3+&`^ORTTV%k6500hn7$G&nqAL{d89}UHbw5wB*Ee>OZWA)&u8N zAj~5VYko^E3IRH8QkG>F3=j7{O{$OxWp?+C&8tkG8wnOxj_(?qhu=aquKJF&>RVe% z)2DDIyl6fH?_l`2FM?sGKf7TOP0ni0(1$K+9l!Cjd!@Ml|#-7AXxO*I51BQ9N2BviVb8s^PStdP%aPA7cuk!N= z(9zh@G?wcC^3CC_Dt+U$0#%r*z3Ijm5uN4<)}8w)&n_#Pq8s?+B77F!rp4V^$=o0C z>OvxDs@JsdrrO+RCRNI<3vih)9ej=6nCn=soTaI&FmRU7HNr=@znvcZ@Gh%Qj2+ER z3Y$gMtb2e~(}Nbi0Ko4C@SKjGg=Qo-#hl%$)4QL+(Bg*VRJwc@nz$)v8l#WG1p|{m z3>O2O$W>R0TQT-5=>CcijU;{YA&8 zpH8!q*e&YHnHq^#s9#+vQ%_-{T#XHN5f$h*6E`S77LtkwB~1;*;Qxrq9N6~)<3aQF zFJ1SzrAmMu3g`c3T>b?v%zaxG=-fc*;Oo@lnBuQA5I>rt0$YKu)4gixLAf;=;TCsy zk*Yeg0HN=etb?L4lL8OYnV(tjB!D5gf2BZi?|!W#ZBr!I(-3mRA;|yVbn20LhY?$^ z_%U9Y{SzO;7Ti!@EG*9JWcNFyKROgm4@MbbbuD{61#+Jgg|LE~$o^ugyrFB|zpA@$ zEZ^Y<+sn47{B>k9E8SGzO4ntDS!O;2t4`yWnHr(>Z!A3+N6%uW(GB#`Vhq0y&(53{qP_Zv~t6>uoV)>kbGYNn;i4Yc+Cr zMY6^J3Z`t#H;)$0uWZ%JB+OR0AHP{A4xTH(XE6EA7`yNfcJ=y>N~HTxH6hpZc|;u(z=Llx#?8nD%$EAA)D{R`w*t!sB4R8Bm*{iKXjefesW z3EonEg2!W4R^n9-acB2Xi}HenxS^oZ$@A31>0PU|5V_#mB~@;%K(v3x`&Gs;;~x zIFdd>nLR>n)nSdFif7ClYCWvXHr4AQM=@($`}HWD`&&c8UGz>q5iO~q5DTLlWc6fO zb=vio0}ALEeJ)*b9U(n$Cv#*-kfdw>9rT;d?Kb83Dm`1iByN8Z(!bNi)<$encUBGc zFnH{v(jUdVc#0&3Hby5gv6HYz39^r4Amvw^z#0f1wS}iK;!(B`qXdv~%IE2rgA>O2 zOt4{((7z9U(cs@{6|xOw!;QUz^&>3ElCbl)NDdtJMtYyYa({z)PY{poL@OxpIJ?SU ziP9xu>jtcA{l5eVtv>)-DbZtjblTN*O(8neTe{}1EEdF>u*|pIP*?|QWj^z=|H+IM zb`Otpbl%d9n`M-+&QPlh#mj)1Jh;=)MyG_1!|nO%-vIqO3yh+iw)#YSO+9!Wp$PJP{SQ0wWe!#0*gAsJ|as) z?F2TaV>@SUnfREd2^g^^__~@w8K_dXc46dUAn8$M&&T}u26Zja=z2TGbE|$$7CN2F zXXy>Jt;fG4|C;$HueLf1ZqifPIO{ifU)Hwqr(qgFx%W&T@mQHLmMuqnsRc(P%#V)Y znz?0K*yCE9tlCNk-*-^@PyvT!NRW-bx`5kN+S8=hLT_53PwN;vrRmyx`It;M9AGv~ z@YtNLc$J^Vbi<=`F^OT$#!`~x5VXQ{EfnBPU*iLGajQmE9Rvp>I^##oCce8vegnh! zUzOMI?%i#`NlZg18rgJh9~)qw2KRliw$0_MkS7_W`(gZ2I8W*QT6TzG=HqpCVXk!R z2`yDZ%2{ACOES0-*OA{D8WdQF)Osh+OV@pu1ZvO><0^L^`0Gi= zk5hMI)hIo4tzuag*JO7qwh%&G+=hp`tUA9{?F*Pg@2tFy3J=Fu(fLpOdv*RZoUp^& zdALNyVZdYL-#FQs91#{*2|L-->kNGl(ol#uN?Cw6O@?1^$esG?yq9V%*4sytx+&cuE1Xw7%a!Dz-{4Sd=RyC^r#W8S`#y$!R*QEx}haQYz+!hqDmEj+gS z?}#hqdShy~5pK6g+T=)*W2ehp$8@5z*}5z($>`Mh-7$ZDl#yB;b+UD8y+cid_Y#!)FHd2>@@ht zaB?P`b#z^@W|Xa|Omlw~Icn4MJSwP4*Z$PbcdD}b9k_Em=`Z*$7<;TY8)Ss4?@4x4 zY%)EF>z*uJW7Q$^rGvv?u-+TH-UOCBD(iQuj;9!|T5wU7zLLoa@~TRvUXP5cM1+a_ zCs=R?anu>4!Tqipst}riwEtxKR7C}ynzJLBbk87O2@G@CUd4LyYG#;f?hiCo%LG}) zgi@o@2!~2)s0-E#5s{20U~3KlH2-WRQ)T@;++yZQ78rq)sn-?^9tuoXq|&i(74REN zS6r*QU48lSMt-&h$-CGa?7I{EwWI-mx8Hn6klZr5XXwdkeh*IcE${Hu$>dJqnD6P> zFMu6u(S!P|-G}`=aA<@*Eiy+f^PYP4B`kaIw`@Yxyw`rxQDT_h{zcK$>*?6$(7&F}?fs>ev^V8L1#}W+;VDpDYex~d21JC# zD=ly?fI!#Ag>^8KxKRA2$&bfI9yQK9F5q#Edz?>3abX+3;=)#b#f8nA8SrWdAu0ZA z5dXCd{ZF3%#Ao6^@tOEOtLx{$O;?GVoa0WOT0c=lt?J${MX|Oo9Cp-EEDMN(*>AU% zl;ophK~J(kDE`$nu$bA|Uy+^@O~-dn`6tO=FvDd%_zJ#&J;K?G8fc_7yXe!hmTdk< zP|6M&lri6tZRy4bKx#0MMJ%xSAA4l#L+$Oz@mNV z{hxw!C~kKapW_xPoAoSu&U}UmSRuwAmFS|yz9aixdCYzA4ypTPSSXICqJJ-hy)RWA(w#>SxZ%-yJ!XF)uz91qg5 zpbNrPQ~Bn!_kh6UUfSJ(cl7Mc(7>M}LB%os?~Od2+9`SLp&B9aAMAZ8-SUou1H*0H zg;(CY(_v{~TZ3~ME7>FtK2|9UsBvwoB7;Il(Y?iC&#m1oN^`yKVy|B&}= zj)lCQVBj=yS5bF0WWwpH(v3RtTVRiSJ}yKA@u47&nPD&SzO*W|lU2*Wcp^mIYEZW! z#UVB~Z2qUxp1JI$_6PAuQxKmH0{d&g-d^*^3s1(4G!DU|+He}SpT=Q(6<&jM&!_EB zRYN85Ce>!EL~lEfUOIku=n)usB=TxHzAsp_7oz51)0#>B;t)P|ZOO0Ym6rDEC%mPb zK`IfV*uxE4_m1vj#TB$p;=z7SmJjFb)zc(xj+z_1c|i|si`ftoME&g``pf6dIw+fD z3(fa|tB&j|49wc$PkayDNL92Mnx`sX`^u|$svG>x=yUzc;lV`+ktGwKl^k?KjCW=B zu}`vw(S}vypGxK_VHXLi-Ph5C^7=ZeNsK?)e?s8B&KdIDO4d(*qP*5bEAE2MoZm41 zrSnDys_1Kd-FR*_O;WB#JiPK8o~m4dm8VZNytvRXqfWbL<=ah0)i8z|Yk2ji_@&Cs zKZw5u!t*>rkge$e)HOSvbHwn_tY?eu!@5ESd7$1)Cg_ahSzhG9bo@^mXg@lS!$`8q z9-Y}4*@}z{rXl4LPU?dv_$#w>{Am^;5)(s6xo6X>O5vO*o?f|<;lf?qdL%x{Zu$gc z?%Rb4bily>-RO|z{cOlpmhaL-@(I^-$Dge4Kz5(b5a(k2$?NYrA?^AHYyOt=Y5BL^ z6aS!YO5SGg`2sxk@!N31e=)7!II`%BtHL*q`zY2~H=43~=WVQusqEJf^uOt#+2gm4N%@Bg0JT+`y z?~V-7%=pmQjNtv8vb@?w(@_15Ba?DK*})f?<1#v*H}N*kCOdw|H6jw=ofRt`JPS1H z09f3KK=(b!WL}-PiBs~N$CAIao39qoYy_$N4^}{R7w*VlWzK`+j8Ty~;kyj#5Na?^L2A02* zj``_|wBfq89L>F)jmLPUR+ic6a96m*6wzj1fCj0g%J>u-#xH*0ahfIWn*E0J!gc)! zLWpk2b?qPZrjTvN1fwQD4QOp+B)!NGrvzcy{$BrlkCV&R(~0*uxvz5!oQXwp@96m; zCxV_I-C9WKecq&qX+g}XXR)#j3%_%-%8jsAaOHB88!99mTCRZED!KT7f11F?gYm5D zd`}eSmnr=igBw%PAA|ENOE=y_DkEAxngtt)$Zmg*=bs%-$M!n79X;cU$a#pJqUTIn z{GG3}(y%ktv|RIb8yDhfupH`UxDueKJTk&T4LpndGts2RB08V(tQuZeYm#R4xdOk- z+A+joinifNNt_+DN!UST%y||16T{0xx3%QSD51_SSI@`;3k{79aizszLYy^~huDTE zDbM3*Q@b;-arSFhW+(OB&k>6uE@;_Vl$TQxFH1dBeXoo^!<8-fXNJRGBmQM&<7$^} zr2j6Dg@0GwQ>{@$Z&(AdId)|xoXX^rHu3h5Zxje4U;K6z9~~WbB&M@51j_(Wqb)cE zjkg9w!W^Dxoe0r0g0IB!J!F5aej!4v0n8AV^D8Z-n{*7q@`{;OmuYM9V1FkmeY5^J z>o@6!k;Cn8k4!d3Yz(_ftcC-x)HQ3i@ z^p%o=bxwV2+3Fwjw8}g>w3N}}NK2W%6bqR|mFBMnv$i;a6w-S!jr#3>lFZV?#(Y98 zNbc<2ApitSkRWIC>wF32MCqnRCp0Z~|h2D*gIR=v_{gpwjoc zr-^s!cOsfk2O^_E14{8m!eP&O6t?&y83s|oOLE)PNM4SP4rlg>+%mgMH!NbzAgo_h z1IqZYa_9P$_llCtFT^gn7v%xKDJ{EhhL%|&+J1kPWRa%M|2mEgtoivT6%c`BEgn!0 zojzJc0dNA7X8(!I;#Or2iOBE7M5mm2{#F}BMS6;h?8?n`x$h$ru5kiK*_n&@No40a zV44pD=)TeW?Hbw;pd`*dDq846+2MV#fG@d^Ss!dXv(FwI5|b@l6S=JhM}Dkp7}oOa zu6!QZQM5iT&)tDFmD6;OImQlgQvpuH^;QM5Y;ATQ=H0d16BtdI{Obl46``#ETyc$d zrL-rl%@E_$bj9Sv2aH}uN4KC6jGfGxFewD*W3%r`xW(6%zr)M*WT!9Wzx6)l$TL(K zKF`1xREDtX#XZ-y+_uI>kk>p z+h9%xWnoadUqQq~CG>vBG>6vk3J5BbSeQCMUl+MAm_C+^3Wu%MfBOb7ct_AN=2MO5pO|jgK8a$$?$Jj>`7hDy9nBH9#_7?_zFyHAdZBf-EC{Oo z52xeX8KjcPLqR0+TQH0cEdkB)ufk-!;#&;4^~}&%i`-_0O}{XZrHMaNx_&G%}+ zJTQ5)#~5;z)B43f`$z9{KxgjfJcw7R$ihtw?fAYN2XR8X1QKCO=EdAmg@nWWqx>jw z8&WeE;8^eh{+0#FxIM&!WP?563fgE76+yCvhgK={iBwq_C@!ooTXv%C9|ZFfWvzWC z+>fcnV7CPvzm@%WYEQ;)BCZM7CDr{WLY+xud^J8tfYyLbt>X2(Jc&4rj?G{o#*&lT zl;u1Ppw;+&QC+n0ZAc9BZKoNV|36xOS>wSB&64+6d;z5juGbWxZI{2u>?^x*Ty|rv zdN75h(3`40gb-j^OKJ!8Cev|u2ou|PxMo9agFF_8rf?C@<-HNko~NtpBado}W?(WB z%#A{?I=es=9i5R5w|Cc>bz5I|q0o?{bmJqc$uwme>r8hu8x-s3?4FM`4n;E$j5RV} zF5sUxJk~N4#U=$WJ;B0nZVAe{+W3~gpJ5grzggU~a9_i*S6vrogqmijCK zkZ${h%q-RE+Pzcqcgi2&K9SyD_P6nUBVMyc*aat0yn<-yM)`u1+Nf$&h0`;SP#({? z$fH)?jDJ@NJx)L}bJSXhW`$(d&OmH4`8+d(G?1;4wuQ6Wbo^Jm)~3C?BG2PmAw?+9 z@A>_B?>-qvfH#7?vKU(yg4u#+#d?2W$TBL$d!xTL-9q12Q8|s^!J&xCucsS!EZxl1 zTe~*!UeFR&?iLnLc_>!@Xzw2eLdyivPZiDEHgBW3k1;fULnWqk{jV@SJ!o&tjUle9 zoDK3gJTT%9A0mI>aQ;l^Q#3=#53;A*9<^DJj14L_YP7!{@XuE=o4=Yvw9`{;?=jD# zjh^pqlqW&`06Vt;AR(vo$TZB)#T^6)YEAI4-shbHbz*BVn^E=9hoD7EWsP*8N!re z%3t?KUg<*}o-FGI^xPja9UIyuqF#yr`B{%+P+!GF^!!x&6o~opTl|(=y!zdx7Q@N! z@&fOPbmNUB>CSY?(C?;8;lZF})2QDS4I2NCVysmQr)*Y@=YR&kAuotOQMzuGT8h?> z_C7K?H1Q;20L(7(-9Ah!g0cef{#UDD{esAZ! z%%C&GdG=w;kK9%O?Kox1Df1CnVe0%l@wmpST{yKN&WG9J_=3Xy5SYRhW~(y$!Utpq z{}^sm80U`#?FsgH;t$$-BHZA4!L1dqemkK^wv}Hn%(jz)N3i-lx18X_6A}Z|rEuNS zS3RrXaQZ7jQQo5a9WaU6))diH72AYG!Gpa|Qs<%bz4ebieL{qQP7YS^PMe~SH`td1 z)&(K=!~fZNAEaMfzjU3^o_9A`=j=ym<524B+mO%0PJ_Ue!uc|0pJA=AcDRD zw&oa^oJZMqE=jWhN!{Qg5DlmfCjWSf$zvaGY5u?-8j$qFNnWe~EtUBLdzA=PWxore z4x3>9k6&=3RP}DU8P1+lXWORdWWQn%UB{g?YoAeu!{DOzGF2V6S7^)2&U#~8(Y4!D z#RbFJ7eA|>99NRvf>GtDPg1+T#t<^Kb!qZb^pSm(n$`{5Jz{SkdOTFCRu zz%$k8kusUeQKKgNw^sE2Yp2d4HAMl}%dQl*nqoMCr-o)e1Yec+5rsPHzt^tMt$3Ve zS>``#(1lIxP$el91KX;{hlY*L&WIjWvisYoeDa-^zx*_6sF>Kb`ODeoG4~wx6&f`C z@Orw7%iZ_+q1kS5e;bd3zw!I9ZN*C0UH>+|hXZhdRN$J(tC0-9oump^{spY7wA0>4 zS*vCN0yr7Ze|BDJ{s;Z8xc~M@mXh+>sy3hGPE5Lw<2=945l;L&>G(ILmQ`#n@TcPO zwWZt6jzk_puiO`ArO(~OXvAx*@$!hqr{n)|%{w{2DGthiN8R9iC;D_I@>u=D*ZdXIODR1n8SW1bs6f(xS7d+v*42A~ zts0SgS%^NweKj*$kN+hvHJtX?yd6l_t}W6hW^Ea$=eCKP`$IeUi0A5?Qy*FV!oX0Q zEm_mvjR4K8Gp&B#h)mRTCDwkS5s-QiAGN8`nM1%bn)Wsx-XFO9SnEbl;!rd!ApTZ^ATZ{j|e_Z|aQK_D-p4^)MU>8Hy$QSiRfC-6e)~?7T zq$#Da6FUS+VBt1e#9~UYH3>ysaNVBBttSaQo8BuszZwbxF}V9$2Gk? z)TNo)W=@i|I<A zYs&kV^xOzaKy|9~>#wD@+x--B&XtE+LuAs}O7AtPtU7(KJav(3L)Pbpf0;LzD47KN z8j@cnfe%jt>A>6Qmvemq9*m_M&u6(07H*??{C)8?kv-TU!XW_<7D~uNs#(aOTeX|j zT^eony`TE4e(JFDdi~x!R*ap66%Azd=4)1`8$Yd)tveD{)N&pxdOidzcab2h95%lG zpTSR$trYQWvj#QI)v%R^UyXbgP>EC38yG&iQX^!fYX7Ba#LLkXu{?6#TogC*)K8Xf zii<|I9&@t6BI=ZG>}JXkro2>+9&5W<&Jb-B(w^iJrafw1V$nH6DV0fy$>NCKH_45j0KAGAN zJ))7Pc9d>1jZK(G15Cw!aLpBI?_D$Z3iad^Iqse!M>XtU=EzacGj~U}7sxS>_)uSK z#No{Q6`s2(B9+c|1la;X4w=7|`~h`RDha}~G*pCe!tmvTakky(Q92b{pPX$}3RP=a z2UQ;LsInmyV5poQ$={|*KT@%p(v3rGHG!A~soiu_Dqce>GxM>edW6gYRn_UX-yWjh zrWyxc8)@7+Nw08y+G;wkyea;N%p!oAbX!Dx(2)L0B<0<#MageV==}wI5v{;>bfGRrDam|blB=e@fhgl#@ zNj-1WRR|n;8xR;p0eT08J0n|D4-W15unCL>di;<*axWj74H}0T4k8mQ=$(U(=J0eT3%gX6h`ET1MAjLU|qisy3PW*vwb`Zg1u* z7+HsYH!bprjxemNG$Pw7e(~-NyjO#Y1F1%q#q%6}t@`?FsgWZ3YJ;h%7aDsIAdJRn zv>6L!!$40nATQvxjYVl}fS38av}%Pq%uB;z@`JE=HZuUKInWV#8~*@yB3QCZ#!Z^E zV685W{3>3&RM%_KBa>}&wB;6p+vjlA!zb*X6_+7=XR`q@S!bg?aYiCfw z4HgnHHEr!S$z0pqq7FqefuN)j$(vXE{__z!wS(4QKq5h`#ZN!xdYmZF}==dT}+zz&Q9rGj#T&y0q55KFY{{NC3F=f z)G6V@qJ#z|v=k-4n4AwQN?4$TPZT8>`hWPgDL57>N3NFZ5D=j{=DyOwX* z$k@pvG`2eh`itTZZrK0%kR%&{n~RcE`3Ak;WYy`8%+if(sCky{7yD;>>DVvR)tlxG z{b8El_KDh5yfS;)&_bS7H6f z!XAP$N0u|v4fRhI(pAGFdTZ)af&1)nl^(a)V~-wxVvpT={AWE{EFZo7t-Yy#dfRAk z3JjpPHCCuokG=M2<8ztixj!tiz}|F1M%m7=xBm*?lJ=&P+WK~)y_uUdZf?`H1CQT#k4YYX;2xLoc)NRSfQo(gWK zvNd{`D@9}y@W!hkm4SHNe>j zx7SWy%k_GZUI!&8QX{05>4B*}+obdzsbfMcp;#PUx^Y$%{JD)6)%;QAY4Y^=K6@07 zh0}0_Kg|+_T8)p61IDQUXlq82ECEnQle}w$X|hV`AXQ_OYUUs?Qfn}){Bnx8!Rk%T zj*+X1MbPXx$#s#P^=_a`2QMPrT)vCfO;?{J1ITT2NuQEI_j$5O=oBgvK}`cU%Yc~4#q@bMo%{{?_={?~iHJ(7&=fAqS~k0i^!e#L1W zBgy#IV;epcx3<5o6*ZrrkNYw5Z#Xa&rAOBU~wcxGVYDOu@b42?0D z980`wNs;!e0XOyne_ljbmpr8E2C7aTTJPA()=dG%yTAD<&qjKY7D*q>pIH^Gs zz15Z3t7yvqiHTk!W<0Kno8lqSr3Ho^KNNti+2i#t()x)?PvvVrBws`JD3`C!w=M|C ze^I^3e7&D`->ZFtVk-SZq>Dspqnv+9u%`t}JnhufGJd6|#=?sYWsQe&Nr|Rn=w}CC zFY3umwTNNM-2M2z9eN}}K#j0u`f3kQ##6MDfZJcJE6N522Da#_MF*TC?n8t)%#B_r>R;LE* z#JW2q4x;*mX%uF4!$NMZvHQ?nv&=+LkO-t@FS zb$G7>8Wry|sY&&jcqjC=4?=5;i~!Djr?0TIXQRpUFMF+iBvt)y><^Q{=QE8~@+}2? zBY&dVGZt_HPVrU#8x z=~Gw!jZ-x|W3lZ?=zW&pLdfa)M)$2+&nfp@r{{OLJO*9FJvS)5-Q`K@`F!`>;oB{x zO4)D#q-BF!uLYFQe~f+Y>no*@wVz}sh)V|_=Vk3SX^O@E_RQucLUS)2FtrjXuIYcI z$xZo9OzC=y=|^JrnU^75mxl(FH7%?9+EAYVLImhEJc(KMu+NI7W_zU@FDB%jBP)j&Hj}4&1C&h?@JU~y4mf|Rb)MwcI|NO&gXHMI=B=EOP( zK)d}7+3O%)V5}K@Hbr!JOl7I=SgJ3cs!Fvg@>OH1HQK`-z)xgsk{@k?(v_5~8rW7n zOnVqS%`DWG-3-I59p1vEM`KCJC>m=_$K6g9=PcTo?1_q%eV_Pcdy&*RS_vaXGUug9 z1BxB{|MMD^#JjPNG?Td^nNmZ8Ahm(A7j7R$H4h*t+N0YenI4Wm#aVii;c7R00 za{qe^)?vsUioUS3n6Hp}mT zoPnV4>|U1FM_oWIh4Ey(=YxfCOk;UtLhmdV2Lu=4?`R z5C<0U<$J3ipN*SHqW4Y#N)rh~SdlX0&$U4g@z=^h3fZ83d*~o1^7|<^`zQR0yTV~E zO@CK875PZ@v$NBKuy*$nruK8=A`nj5D;Up8Vi?uGvie*Nt@zlF|4scPsfS8W|5g1X zX>{Y#Gag~r;BD#iBdH5T8}ntmkNZ5e`sau^D+2EWmVOR_0Ct0c1q8A>hLi;<4Cr(< ziSfDupPakB)tkaj8@-fn`kdRZsUmZ=jsFW8TE|mHFX4ThBAD556!-tKxOBHyb3Js- z*rKUSMb8#b$W5v5eLk@={0}=h9{Xl0b~Czt?3x$NFNxjWK9A2AdBxxTGvf6Rt==zr zsz@Eb5i{7l!kK8ueNO#Dy)O;8n>r75m~d1VqgR!5JmJrkgHfw=V)HBV{P+7`^Xgx~ zOY0ikGye`i{kiDFKh?H{SIK^GO)!1*NiNg~j&^5-B>snSm=8YO`+MdAD8=jj*+6)x z)twh-Y|EV|)7k!qX*Hg17}%VjpQf|5Ucd926XX~*ElsFD^Vpj5?=BgAQis>%4nBYn z&JZ3<_;+&ysJxe6?fs=wMhf|l*uO8mv45X>)Bd>*1*cBdPiA(~(XpfHT9&Ti@#gjZ zGT*fjeziB%zm_-cU)7uTk6ziyQ}t|Lp=VF@ZnvHtu|Lgk>`(Qd@6Q;6cEKc`02BGn zY%O%=5d2N`=d?HN&$0BUFj`KdvH9HmoyJa-FDU+Bg<;y6A12oyNz@wSU2T)e$qmMc z_Am91MzuiCDB^dmX}p{LRX58w@$_ z38%M*#+uC|`c?KnDK_U6bok!eO%^Y_(EM~9JThRkW;Y|Jng21T_&>cKnWO-ni_l~J zGs^sbb@l|UMk@W&v1|io6)%bYzw&SX0hv*lTPmwIhd~?I5;X;wP%W#Tk<5ZqtNabO zlQA8)iv&V{)V%zTjwD~>V+n38&q&5kVAJ`nAA4bs~UWT%V+F+rI z-rLQ?A0H*{4>US3vD3Qi>eBICWP3W6%gYB2YHT4Kz4_L@oFPnM5D#CdaI1ou1y&sw z<$|Qj!7Z!bH*o=UfGc!X=kbHlrus*M3rl*MLhM)XmH+mZ(I!3QEt|Nfh#namYl;zCT`{r9+9{&f;`W5A^qaM(V>z5AE^hCR z=a10d2BX9+rR%n{fPmtZYCIgjZvyL!f~ga}Ac)I9(aw?Jeo%Q( z9&n;Q!M|B%PndF(cmm;2nV%oI|A>P^95~Lb+E01{54bA-W|>QsTX<7yp}+XEPUX)} z^^kI8yNH=(u}(f_a-U!cmB(}G;O%U2=kC@%x3PZdrpwVA@`b}8+jP1z-JndyqhYu# zHYbY3OX;TXa)eO)kBjoA=XlPYLW>3cO)}~eN;s7NpJr9}9_?8>`PM?4i?aWQ!D;RG zJqzjK9Y$4@?J;v|jQFc)C1A-cOcl!RTZDG4EbOEzYWiJKkRuYx9tWm>W^Zi>7CXz8 z$i7SHUsYLtw|!u;bRVj+lNx90#_?*T|0JthQgpNEh1KAl$MIVd%0mSK`a(YP4FP^6 zKqn|%!7zQ?fu#XW$1`p`50#&LzhLqcW#2~CdSP5hcGt|CLIt3uG(UGdBpr$tW1)# zPFHnkBAJpuN6If6xKq+u;7^DWQgHV)PD(+3I9!)*y2*WIOr10dC4r`}3FW=QNfN$a z3mR-gOmhQTo92eaI&)zs)HFA&2LWXT`t#qbC^!#b$x3@qaKl3EiPY9n1riI#)6ECF zdtVOm@8*M@HXqoruCm^Hisyq9nF-SICkSI5dt&rC;;C#YlK)4L{+z+oV9fd>$n6#a z^fvLa0(@_jS3$*Iri7kT18=WQ1A~W51HTT%@}q7Vn6NcJ9nQW7mZE-H7^+(mZJ@dZ}FK>#APdPmET@!WgVaa~lEmY%7IEfT!Yjh}nV^tx? zZVRg_lr)D`a+y`h%Lucw)am zNEQyB!a0sUZ(OCEZY%S!oWiVf{!BR!LbErzq4CqIqgek4`C)|h{vZ1*{2N1EC9N8Y z_+{^^{R5$^$P~Q~9$fu@C$dxT;f7{+8C5-WIPiIpJ`P9|H{1CN*}pXNDR4t`whJ_^ z9ln*Ahmcnzhq*bwtBVNj)|hhX(nM6;$JulEROfCk;tV_m6~ti=|AuvKP3Cus{={iq z9mw3x@#QB+cVvE@`4#^g;w0s-#_#8Z`~i-2CV~%Bwv1p~3Iu0x;YM&FKKZs%+FCsRNR!6ZPGZm#_gc)wUsxSri@Qw11f*ZUS0Ok^Pj# z%{)%K4(uo&*j^sYo#b;}(3It;IcVC;PaaaQ^?%m>W>HEI%*ALdOA|#rF(uj=fx^v@C zX8yr$LPwpW6}+w=MevfV3Mgv^wkk zukl=#uDBpwF*>kC@h^hp8@ZZy)<2=Y)ggJwy~DzSZn(aDFyOlFHvZ z!*AQdZ+nCD_gYTAk!I!Y55G++RL5xV-(7I%d9!?cIBn#&Wyg`QYlq+2W;EM6`0VPB zPIQIq9C00XGwvL2vGwg2=Rp(of9g4d_*@Ks&=d`t%0`DYNMpJO(uU>7fum}1+1L_@ zgn&R?y8Z7um0xroe;ap28q(OW+179u6dCRbD&CfhU+3WayusIXP658kiT)z^?85IW z7r4-ISI!S1TmXayo!~qY??po>O{&0iy1~!*k1NEVc>0R(8?-aRc7Plhj|?y8?+|Yy zQts`}{tZ%Z?eNgq#K_{F@=NGdFiFR=uA%{yetYF2fZc6clD9=K7+$&Jl20wZe96LDCtOm} zmH2$3rexWbo$Wk*F44VoMSFYVlZmd9%k)~4IPSQ_Wr+sfmlfWZ+50)&i3={fF!8z1 zC0g5g`sAz&OO(`g{47hfiWqdY)4A}9#huHRB&xcq6a0U6H~*H+RMDD}Q{-!! zNl#+M@+&`e$@0$L%exX^{aoVM&LxTEOB1s{Is4-?sK)B1xrRj5WhzKBi7$lEo?L)n zrpxzL%lFkI=ld#(dX zzM`jn$)}d|c6Yup-;7fYUng7X?pfjQiS|1q4~j5Z1k8*QnhA4!v9~L6Vof#wW}R4) z;J=kUi+g%ko}4H-^Gh>ILLe`1zkKtXS4JgDlmFi|NN@y_a9y*$&jb zU0>~5er4B;k{Pp4Z%ka#zGCIFA4@C&dF|q!l_C4A%vX@lFF1?;D=zOwH_^MYeMz;jcJWm`?GV6Q{#RW7 zV`?m{UM)^$neUsN7i zS$4&;CGCmjAiyxT(y-dn*z$47sFp9kao~&F|5)O3n0Hxs=T*lu3_UBr{gJ9Vq>{h1 z{NW%Jm%n^*AN+oT$aHbnRT77qETF#-8Ao6hc-6@Y8?8$^khDuXmv>XPx2wlGzoLC{ zXJU4BV&&IX^tj~qC5go=6SFKMg3>Aw`VCD-EPY6im9_BSTbCBYbTS>hnb0dL{pBOW zov6BUSx<+EwtLwX%X=WEDH?jK(uJ1av;tS!XctkprKF^6Hovn^H|d{PwsK1DcU`@B zaSw<>B+0jXW}>a+J?B1Dmt)iJyIrv1K z3DQnXd?Hb`a@p1G3wvggftfq6Q&<~%<-aw_6(vjBFYdkc1m@wAV-Y`0K?^Nq;j*q} zJ=KXuQz@n(T+(}aHvl?)hjvT@ax<4cRXg1xoF`|TrWy8RF<|!!*lt;ODB4Tf)j{-; zs^e$PED2>m*YYLpGfJ*h@~o2XcIhnkb(u}m$A3Q2jhun{Y^sM+x~`~N#;9qYPBe8c zzLZC1Q>$4jSV`9v($Rz#Dzg*{wSP*}bb@~*elj62=!Mg|n4vnC99j(Bqa@LOBmibK zwqGipuM=6NdHE6`lY*5vKGD_QS(5L%wwND4biBGlq^QVnx~V7r&E>{-|Y9-xVic2qW0-Y)lqd_gU`h9i^9ae;S$;!_tImfEGpu-g8WhLFnA@$P;+4btH8blhNVOdW;TnX>W z!(ITlWX6oo{h9xa6;#05(MUPuYIs)~0A0uqdk~-5!xV)k5V}iOC=tDG#=Paslq;6^ zUfQ78c80^Ux^YB&TV_$55zd@; z=5}an@rs^h2xF_QuR)t5*t4S8C?hJqwt$OhTE z^jD$mu;z_u^C_+myeVIa)yN->ox_P51sE;g!fK)Onv%1ZFSoVD;*~4gQOvJOh^k!) zNB4zZS)I%rQXQ2Goy%rE(`07YSHm-dD}`RmnM>POm~?sz9Ut~D(%~*g`d;39x!6!( z7zr{-*=$_Um^3tt(Za2ACJVZms4}Q*a%1_?4!JGv5-ldGj=hvA!Dj2Ku9?+|S)ZAi zK*p?C)^2K|o9EF$(Q{VNpO0EA9}S7JbMYmlnVf(MS>QmXNYxdW_pegrG`K#Jj{@FZT%atWDyFf=P+R* zyu7EwFiKK`@JJpVB=8(@W%e>iV&zU`MZsOE4TUzFx+IHHR zXUr(+He->~Nl-jO?P;DQ&&8Luvn;sGDsrrxKvPkJ`VU>k+D*)Ls)2p@+~-}Qx>TZ^ zd_--OD&cBySiaKzl&GF5^`Yd;-AmxzE(Y5vSgOFa;V_iwSjTO5JhbhDXZG~0k8CPKL3TsIuPM>|wIbnN1?_|HzuVz3TJ)l7Ax58sTE&Z#kJ51&h9nnMrDR~x?O$Lq8!nYO0B zhOcVUjDPtio&C=i_XuLwtfu(O9GY7gD_H{bjo9Gj6AXg?*WUR@$5mbT{>+RZwxkM? zIF1|qnh60agPDwtF;HwQc_dlFvaCq5Lx|JSj~Us*BaI@Bgq$itjftT_p@tBa6AV#P z;?UN8RTJt*K?zC$2O2M;WV!rk+}2$MN?%CoG%QGY#P@x^=iV!gMpq8>y}!CR%iH_z zbN2bQ&)(VRA;HR-9(r7B%%gnl& z`GkgqndW9o%ky#>w$!-I9j)HlSi?}&%Fu)GRa~#Be1*&tkYC#w8TB$@c9oRHp(aMG zd8}T!6->KBZ?VUt)-Cp@!y>xTQ9InFQDavhXRKmzw-Re-RMgguAFJ3b-iZa}vQgi( z7tb*xDjXbZ@eRzCZ5E4(;eFcHiQeE(iHc2y-4InZ?bd6B<_}atlZF*$_e}FK1w{c0 z`UUBv$8YBw^pV7~YXn;dm){qm+m$fAv`kDJn;2o$08u;EMn6tj$=EG2{c*9~Fs!i4 zHAeLIOy90{`f9!ygkvt7nx#iF_bkMxeO(S%52(PN@*9lOPC$GQRVdF(Rc5c(?IgVx z^_EMFMs&e*8{S>fDGf$*R}n#g8h zts>qEFHJ9bueK{zn8x&tzIw8}&<6ToKWanAxih!R6K(GhC2>0xPpkcM%_zBRhU8D% z3Q4#Dvu{$mX@MitC*2@->MlQ@adJ?)?&2+*uIy*R{J5Q zU_e0L(TdqQm^&}4_+Y-56%R_YbN%|btI;X~a$UdPP5iR;>-&0FAghXsOqPuiI}ogx zDb`$HX+S{wc6`P_>_~12Pyh6-I9=Ur^Qw1H*P|tsR0YeB!XVP$!Pz+nWz$kPnzn7@ zb|{w9UAkDFrgpY+)X&Kj|_6u!SR-N!`VK-V-kZ)<9;sW#13jnS>!TBBQQqxJY!X^?MW8-x4XYwef(lgYG znDo9lkzof_o!az zk&2u8vuvF7XtwKZVl!dbyty?xuxB8b?xFMRU>z*co8p?p))tOW*pjJ8u-fTizMEz? zx2dP2Ze{fP!TxTD7Ua*_M~0EvJxClibhkj-#gp;6o@W@Smg^vcYoM&_6&+ZJJRAA=-%1WZawOog+_ploU32BT5Huy zE{|Q7&c~>v=rf>bl=+QPa*@)pXyin{3QRy9WDpBtr9N?K+qfL>9v+?As}qWaA$Cz4e+DqvrqBa<{O&-#zeQ z?~tOK14zch_902o?pD!5zn$V+9ZO_;I#|+i=tJ5%^4P89y4t%r@{C@{6x9Fc8i8G5 z&cw+O({Exo%G=JLy>0d5H}Mc$r7>?LBvZX(^5rl8HU5<^9*lo&;}?GVSL3fAow(+b zTb4fm^y~k=L2sbwIh4V%pMSRK;KVieT=GZz?z#Ew^?Kb?Pn_y$7T#rfwEpt%|MJEk zoqF`Lsdb-yOn&wG+s=FXpEu}v7QM}K?CP7k?i+u}%jeFGCZznnxsfta9#dJd zySI_=N5__)|EIs&UtYP*y1@-DzI?;vBXXB`^xt{-MbaBxPo2Q~H-^rOTzw_KuH|E&pWIl2*1ZX?126xmaY{=lN7`{x z!d;GY5S$ryoRi>#;8($u;6w14>^KjCOK+vz3je(0tosdPUI90O zOTWMmOTZ1cJI*wC$9~5tFC*PM2nX*tKs~?>U*XC-c=8^{sW=CGujA|jm)=Kxzz4@2 zX9~RPYmQ^eDK~ftc;t`a1HW>=<4l5=f1P@RcYt379|kWwm->TOg4Z1)U+@laO8($m zMSsI_Ccq=$$H9leFMwA*K)v5hyl*03@Z=H483UjA8|njI{uudy8^FunLpZn+yyJ1o z1wQcvP7X{FtP6dr*@Q+Gh0ZH2D$?^AQGAyJQ%6oaarD`gEvhXmz4n}vT+y)E@cyeW zUVXv&O?X!VrQbR2ybd;1Ws5!+t|}|NB~n#ZzOSgNY{}lU5@pfw^TlOLsvavVuR2;* zTJ^oMMO9Cf6;+jNneR#YN#-u#A<}%1TMY}OSsA%G9GK`Dq8taV#QvMXf$_uF78J%9 z#Ve)WZN%$eFy0OG;vqs)O}qz)7x&`r4fj4)MqhFzbQ@ulg!L|zrsUHxUlNt@A0+N6 z;%>vP1M5*+HWi9o{jLB(Y{G?m1E50^7;#GgOy{G;T*IZ(ITB8MsLJmub0qWF4xb($YF zJ}lwe@@_7)jkZWfkRI3D_y>vK#4ooU{;1hX+PhHBiL%P@ z4+_Lwhmch6C6u>v zmM{|q>b2R|<-?>g#VZgiY^rWqr|>(0-$N>RkWSQ=O@||YvTlAGx%Oeu!5vpP4qd-> zD*qDvcH#GF$qg3;D)2jgrQ@8I2l?!i&hCwb-*^laJz7>Io(6a(u3}s);Ca>K*@1r_ zJY&D(I90UG{5FY4&PA+qbicMF{9u7seM$KKd0r$}2~3mz$a==~g={1t8(DgGfSj$3 ztR#&k#C~fubPtn0-wz#>OaRxyP@838a*BM;d^FFhTaqR1aaH0b(~?o z=gT@8?wwmItNZ1en-S-|3+sM7@~dFomkKr!f2_fA2GGkueN2?KMRo-B8C4~fMA=XL zW6bI9S|~pH9Ey|&bsF@N*dB14G%B`H2XtY9GK_{IMZtv#HwW}*RklA_$^7%w#~kMu zBpaA+_$LLX>*{2Rcn@9gI7Q5x0^`{_y;c&CakX#zn)}|Iah&s&H%@jsiQhPWOnm5qNu@kf~( z&&@xPH?M39zY#1MmH#>7SAW)V)_eWNym{%CvWm!ig7U8`kqs?F@v8Sa&ZG1p3+Pc_ zBoj1TZ7K%&{|`@=KpU}`}fRK0E`jpM8pzjUT@ z-569Zcb@qq@mJhQA46JlO~48KqWG;nLz>}70(B^S!~8D7rWw~7_lu6R^9*T5s)EW{ zUD6zo<}%88Gig@b<;+_@C~Tatb%d#JlOFC3581Uv6mpWVHo_Wa!Z50#Vg_eeux{D* zNqENK@!L!BUd8W8{H~aZ_sL=#gPE7)r+CX)o4){0R6MvSuoAyh_}wdy+OmmI{oY9D zzHm5QteJCF$pv_8ji31vYhCf!@_q!yaALMpZu-OU-4CBX?^+J~7=9D@sV{cpQlAdD zI#Ik16Fx<_HjbFP$Lsb+$bGxbU2~C2yrG4N4>GIXd)D@SMRm7C>OL0^S3P0Z zJmOnKqvzne$K`9P+k4j5eMQ&b5`nGDWpni(zE|M;J?VdNzupwC3aD9CN#p~e`39i2 zzL_+avES0Dyl3l5<7?vS&oE)Hb_Ed(q z7R(7{cNd_fbq_jkdkwEOSQ~Lih}-4mH*XvY|L(jwlkz-3ya$Qby-++A_7n5vsXUJp z_hsU?EfhC=U0|N2%+JdI>I`L7p4SKGSx4Mz;_A1tfjS@F7MSNK@iN34TPR+ltRg%* zKTnO(lf<1O?msPTr%jQIgY2}bWH?YoT^(D(zFpnJj&lz4=)k&Y4nLwL6uMcksil6b zmH5lP>-C+s4@7X+yZxB@mz)<~A{}0!e+fSvkUT44*~^2(f0^`u$oCw3sSH1rZ!h9K z3GYGnE{Epx_U7}dT%}8}4|u<@aJl*-pAH(^s!B9gH4wj&eb6s@dF>5{@6d?S1ig!} z#|g7z$84PwdGooZ@MoxV;p#t8l9)f4a>w^c(ky4c_0PThJlmR^=Iw7iP06dAz19qA z-sZ_*ZwR1m2Or ze;Wx*McKOmSW~q311F$0M-t83 z%~}0f0Buw144EX%n*?a-b`(NuA&sZn9y2^uukD3$2#vQ)aSg|rrj^Y+=2fBbEU>|Tda0oa890i^MUIJbN&i)_72QC8E0=2+)pbHoR_5pVT zhkzr%QQ#TiCEzvS?B60ja1pQ;s0FqIUBD2q54amR1RMd50?z<10j~jPe}MSFMZj91 z7T6AS0Ykt(;BMd$a0IyP4s?+xx%_s?$D0xfE{|^O;CG3G(aU3NV)0AY4q9r}XI8C^ z#n;5vtZ@DH!ok}3+W1xZ(PzGwc+DQMR>9ft3@xp7^;$UMYO~dMmzE_MBfXT1SZlzR z&|8<5Rk-@?(pr?bdhgQGbl2`&nhjyxe)LQ(Vy%gF5^`{9Srzlv8Cq8B+N*HHS}*Gh z?AN8)P{HMrKFx*#ZbE+$0vE9s>e{(W%NkufcWGHA>k!W_BGx+DTbiNWiXZ<&KRvJF z*t=ZBxV!smLzkA-Q=b`HGx1p$q1SOaUB4ppb4NAw^AC}~M03)sf0$kilQ7XJ|KUVy zKgI9sL{~#AKcyQo%S;Pc{g_;cUguNbsi-J7{ywn!J-HCQ)7R~n`=845X9e`Ppx0G~ zj9NBi%FMBX@aGEXe<`5<9r}SyA>02d{vtPP%ccC@1O0M+$o8iSx97oL8Vc9n?z;cl zkZnnYZ!3tOhCbOa8~&Ms@Ua3~=}k7O=5BrNEeJncKp%mAd27gOs`CFqLHM)K(GK=^ zNl)$ZZ_tllH!H8OYhp9?U0gtaq<}uBfL>Za{}%M)w6`o%?R`l>_+sVQ}^P2V>4L7eP;W_Nnw%Yw-2# zIfOmeL4Q5u)<^Mw7kdBsA!~Q2YU3kL*`D8{ycP? zgC4Ef#jn>^M}K9E&Lc#RL;Fs>(O-z(V2pm(q40+le<@=G9fjy8^7x~${xfvtHSD|a zt?>VV9!1Hu?;tvipraQW)9=yc61?Y>-}%tf{6OlISH6p(<6kvKzb{bybp`w%g&z0x z?_A{90bPzJ>TE>(8HHaQGGnAII#&??X6UK^q!07>?|_b;6*38r|I6ZE5i;6aRQ#_) zkG?`3J^qKFr;9?S!3+NmbRU)1nYj3$f&w+IN!AV*IC(UoYPZe;@QX?X5k0(I0}|f5aG_sf&&)9R9e+zaDx5ebPCP!fTd5^c4E0J#mF+p?#HR`<|lpJJhBNLq_}OqOXGX-T8cMgP!^*=K!93I-$qEX$)Po<^Lq~ z^b_GE%=oKLoC2fWOG2s*EhK$ZjL{C7+{}1x= z;(tf+!y&WNqo0EIo#d_GY4}d`&!DH#SKt2svmksi1LXwaQFxW#Qs{C9NzD{QUkcrZ z{`&f{8hZM9_GCSMS_fTu5pwbDKLPE#C?7vX&gKyNrsS*inh8Ic*B+mMZeoJ>L)a9a zfsX%gGt++!K<}@ZZT}Hy->H6IfF3_=jDBCE`1dLPRmhJp(f_l6|GUtmf5CdkYyTfX zXYNFpxN^p)XAAiM6}k`oYa?9g{Q`P|^tG=m`u)gZnn{Ds#zhy=p0oD4%#=g-A>S*! z_)DREr}D?4D`|i2Un_n!^f>ybGa1qC(EC45`tXYGgFeM1XV{}}f%cu!yAOI|ob?*t z;-3)xDE$q3FZvPDUt^2atN#z6#~GjW`$dKS7&=b-zv0FI3AFE`d^pgRj3-~@Tm0wJ z?s4?tK961wJw;{pyF!ImK=)zaJG}7Aq0Ra9|6YF8&?nIc^}pvL|9a^1c*y9yK=Iqe z?>W_P4|FB{^(XjN_~)Sy=jqdz3i$stkB$=Oap-B}so%~i{?pJWpS4A@^o!6_7Z}s* zrT-t$aqRaVj}Ft`ZRn?d%c1zc0sTN;{;wcct=r|^Z5ErQgzv|GuC#Qi(M_4A4t~S4 z&W-=u(B^~2yzYfx0X^|Y{HD~SuZ14p!a5zS{H_O&{wpTs<=+YIJIQCHfW94i>Zh!M zJpKouqu7%_KA6t_+(2%ytBV`=$>g<(=43;COKUR872p2!PF@5__a}2b$xd$Ur3c_h zWs^HI*^c&1GR39efn@vOu+bH{4EJPGu`5=`$u3?mig6h}7gMVQNNsg|jp16865qXB?@DX%^#&rDtZlB^Qj@G{tVYpXt@FQ!uUs43na(BqI+M9wykHpX7=~lMZ(opaO1!Co zY?8-GQkirROFJypA8V}IQlB8$J_MBP+_gKY>p;m&wzEBh_ol{e$(lN^ly%k3c(rax z_~qTyuytcqLvm|vZA(pSvbBoKU8=>rGNyP^h({Vt8l9{e?rZAj8NEy`*D*~li-@y* zds=9lfwcRCmnX5U5||mF9O>2Vsg%iNcUD$zYN+3sNOD2X$`RAkQ%Slsm>fvw1`$Pl z>lWI{H(1Ilb8Xd2P<{+O#$^r5FHZHKR~U?o7eO-v+00OSHH}M~cjafvo0lq$wQ?Ta z;U%OT-2$%wQs?f0Z0A*1CA;A0&5PtIb~~>KcJd4*_o36d&Rzbi09bxHou30L)7{Da z%M`b!4VUzJc%#b<4E7`kKAF_BGbGWSt9Rf3@GkIKw$-M&t|i&tMb|Q?o?e}2Ow}aQ zJW0{+d8=12U36#zd4*VIJTc^~9OxDG{0`SYliO@2ba5TJcIL66V@L~YvF*3raPzQp zchXvou|1us!KxBAkvWZAsB*Jnzz~P~5;R)_`Lx(;h(>qZT;U^cYn#c=!5$>z8eDe= zmmkxvh_IQKtqGpGK#via-rz{L&~Dt08*o*HyNgx=6w0;>2A_2K46jWl+cR|az4qmf zq}m{9ZQ5qRJxJST1vTj$ZdYCHb?e!BtctmvX(s7)Y_3Yty!PUvr?ysnT;J;*pq0{d z5}x;Rj#YH;r5dylU8&~TL_JXIH$ZNC56We$HCvFl!Q4>5d>`Ec^_q#7h6eJ3+%Cfl zRG;Vxry9+v(SVigG()mT$<1wkThdjS!Oos+ulkby9Q~PmT`TfUtxgXYwNu(GYBfNy zhLH`e)Wy4xy|ZOlWld}_mu^n;C<*2{;3u%DzdhB>sA(v4=dSkt**I~(sq?Hd-J3Fc zk13zavnHFZ`lF4E#9YYS-kup$H`y^T;FjN{Q>knYAGZeT8fTNajGOCNGrjX%-Ebdl z@>;RQeZaN5)9cpU=JZD~rWKkg=sgu*Bc$(!+nVW~zT6%XpUp3B2HJO55gjFMxZA*+Crj>f!dUryg!!!8K&A19z@ASsvrFHq<}Z{iy=k(9h5_V4WI0 zXREe)js@Fhk)T|Sl{ECeUp7xU7{JxZpP`G_`$>U%yUXv}T&?X*-#EwKI&`IZwXM5~ zpw8J0=~-9X>)YmA?WMrWO&!^cs*E1%%@;L^*FK)K)akkslby)kP$tP5+t3(0D}uNo zg97`MYR)Lo937R>*s;LGC`GQl1Dxx3@h<E`iadu%62^US@w*>=nVgB)n#A~w@g|Ik<#-9l#5AXcCu>KSSbCQ?i`|tX z37>MKy3<)VhW~v-Cv4=>-b3fEWR*NV($yFiY4kRL9;xu>_iqKC2NO#t!*t*197Vu# zX2!9tV4e2m`OC;z@#%a;@HlH1{#hqJfz~ZLG82`H}kbp9yN zxufsID^~~T3{iYKrx9q6-Otzh6SfV|nWJc(-v}o7R=(mDmP-LF(QLjtw-g+J_R|xe zmasj5_%;GM=M?DtQ+(R%@cFcFpt7pyTE_`K#JBJKd_ReY&!_VtfxX-5F-j)l9m(U< zxsgC&zEj!cJ_q>eX}{U-Ie$PtuJhyE2I=!@A5MS>XPjTYJ3KzgPv=j9vFHq&m5Hb? z14>VP+IJSL^M!|>pWZj}_;g++xDHwS&gc6}Jjwtip>vz(KI88F7xH}@k8?aeo&TIz zfbS`IR6eDrefpCN@I6hq+Dv@fUw;9lt$;G2MtZL1j<^}c=rR(f%d7T+50 zTS#Goa{;C0yZ3%2WM1_Nuz2Kz)waHSf%HbPO^%+ejj0~eE!jqXdMRY{mw9^$etQ2G DF*g*N literal 0 HcmV?d00001 diff --git a/thirdparty/linux/lib/x86/libecos_bb.so b/thirdparty/linux/lib/x86/libecos_bb.so new file mode 100755 index 0000000000000000000000000000000000000000..d90fb3150ee014e0162f56160a544f128d299607 GIT binary patch literal 119600 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 +#include + +/* ========================================================================== */ +/* === SuiteSparse_long ===================================================== */ +/* ========================================================================== */ + +#ifndef SuiteSparse_long + +#if _WIN64 && !(defined PYTHON) && (defined _MSC_VER) + +#define SuiteSparse_long __int64 +#define SuiteSparse_long_max _I64_MAX +#define SuiteSparse_long_idd "I64d" + +#else + +#define SuiteSparse_long long +#define SuiteSparse_long_max LONG_MAX +#define SuiteSparse_long_idd "ld" + +#endif +#define SuiteSparse_long_id "%" SuiteSparse_long_idd +#endif + +/* For backward compatibility with prior versions of SuiteSparse. The UF_* + * macros are deprecated and will be removed in a future version. */ +#ifndef UF_long +#define UF_long SuiteSparse_long +#define UF_long_max SuiteSparse_long_max +#define UF_long_idd SuiteSparse_long_idd +#define UF_long_id SuiteSparse_long_id +#endif + +/* ========================================================================== */ +/* === SuiteSparse_config parameters and functions ========================== */ +/* ========================================================================== */ + +/* SuiteSparse-wide parameters will be placed in this struct. */ + +typedef struct SuiteSparse_config_struct +{ + void *(*malloc_memory) (size_t) ; /* pointer to malloc */ + void *(*realloc_memory) (void *, size_t) ; /* pointer to realloc */ + void (*free_memory) (void *) ; /* pointer to free */ + void *(*calloc_memory) (size_t, size_t) ; /* pointer to calloc */ + +} SuiteSparse_config ; + +void *SuiteSparse_malloc /* pointer to allocated block of memory */ +( + size_t nitems, /* number of items to malloc (>=1 is enforced) */ + size_t size_of_item, /* sizeof each item */ + int *ok, /* TRUE if successful, FALSE otherwise */ + SuiteSparse_config *config /* SuiteSparse-wide configuration */ +) ; + +void *SuiteSparse_free /* always returns NULL */ +( + void *p, /* block to free */ + SuiteSparse_config *config /* SuiteSparse-wide configuration */ +) ; + +void SuiteSparse_tic /* start the timer */ +( + double tic [2] /* output, contents undefined on input */ +) ; + +double SuiteSparse_toc /* return time in seconds since last tic */ +( + double tic [2] /* input: from last call to SuiteSparse_tic */ +) ; + +double SuiteSparse_time /* returns current wall clock time in seconds */ +( + void +) ; + +/* determine which timer to use, if any */ +#ifndef NTIMER +#ifdef _POSIX_C_SOURCE +#if _POSIX_C_SOURCE >= 199309L +#define SUITESPARSE_TIMER_ENABLED +#endif +#endif +#endif + +/* ========================================================================== */ +/* === SuiteSparse version ================================================== */ +/* ========================================================================== */ + +/* SuiteSparse is not a package itself, but a collection of packages, some of + * which must be used together (UMFPACK requires AMD, CHOLMOD requires AMD, + * COLAMD, CAMD, and CCOLAMD, etc). A version number is provided here for the + * collection itself. The versions of packages within each version of + * SuiteSparse are meant to work together. Combining one packge from one + * version of SuiteSparse, with another package from another version of + * SuiteSparse, may or may not work. + * + * SuiteSparse contains the following packages: + * + * SuiteSparse_config version 4.0.2 (version always the same as SuiteSparse) + * AMD version 2.3.1 + * BTF version 1.2.0 + * CAMD version 2.3.1 + * CCOLAMD version 2.8.0 + * CHOLMOD version 2.0.1 + * COLAMD version 2.8.0 + * CSparse version 3.1.1 + * CXSparse version 3.1.1 + * KLU version 1.2.1 + * LDL version 2.1.0 + * RBio version 2.1.1 + * SPQR version 1.3.1 (full name is SuiteSparseQR) + * UMFPACK version 5.6.1 + * MATLAB_Tools various packages & M-files + * + * Other package dependencies: + * BLAS required by CHOLMOD and UMFPACK + * LAPACK required by CHOLMOD + * METIS 4.0.1 required by CHOLMOD (optional) and KLU (optional) + */ + +#define SUITESPARSE_DATE "July 17, 2012" +#define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) +#define SUITESPARSE_MAIN_VERSION 4 +#define SUITESPARSE_SUB_VERSION 0 +#define SUITESPARSE_SUBSUB_VERSION 2 +#define SUITESPARSE_VERSION \ + SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/thirdparty/windows/include/ecos/amd.h b/thirdparty/windows/include/ecos/amd.h new file mode 100755 index 00000000..fff699dc --- /dev/null +++ b/thirdparty/windows/include/ecos/amd.h @@ -0,0 +1,411 @@ +/* ========================================================================= */ +/* === AMD: approximate minimum degree ordering =========================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 2.2, Copyright (c) 2007 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky + * factorization of P*A*P' has fewer nonzeros and takes less work than the + * Cholesky factorization of A. If A is not symmetric, then it performs its + * ordering on the matrix A+A'. Two sets of user-callable routines are + * provided, one for int integers and the other for SuiteSparse_long integers. + * + * The method is based on the approximate minimum degree algorithm, discussed + * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm", + * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp. + * 886-905, 1996. This package can perform both the AMD ordering (with + * aggressive absorption), and the AMDBAR ordering (without aggressive + * absorption) discussed in the above paper. This package differs from the + * Fortran codes discussed in the paper: + * + * (1) it can ignore "dense" rows and columns, leading to faster run times + * (2) it computes the ordering of A+A' if A is not symmetric + * (3) it is followed by a depth-first post-ordering of the assembly tree + * (or supernodal elimination tree) + * + * For historical reasons, the Fortran versions, amd.f and amdbar.f, have + * been left (nearly) unchanged. They compute the identical ordering as + * described in the above paper. + */ + +#ifndef AMD_H +#define AMD_H + +/* make it easy for C++ programs to include AMD */ +#ifdef __cplusplus +extern "C" { +#endif + +/* get the definition of size_t: */ +#include + +#include "SuiteSparse_config.h" + +int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, + * AMD_INVALID, or AMD_OUT_OF_MEMORY */ +( + int n, /* A is n-by-n. n must be >= 0. */ + const int Ap [ ], /* column pointers for A, of size n+1 */ + const int Ai [ ], /* row indices of A, of size nz = Ap [n] */ + int P [ ], /* output permutation, of size n */ + double Control [ ], /* input Control settings, of size AMD_CONTROL */ + double Info [ ] /* output Info statistics, of size AMD_INFO */ +) ; + +SuiteSparse_long amd_l_order /* see above for description of arguments */ +( + SuiteSparse_long n, + const SuiteSparse_long Ap [ ], + const SuiteSparse_long Ai [ ], + SuiteSparse_long P [ ], + double Control [ ], + double Info [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/SuiteSparse_long array of size n+1, containing column + * pointers of A. + * Ai: an int/SuiteSparse_long array of size nz, containing the row + * indices of A, where nz = Ap [n]. + * Control: a double array of size AMD_CONTROL, containing control + * parameters. Defaults are used if Control is NULL. + * + * Output arguments (not defined on input): + * + * P: an int/SuiteSparse_long array of size n, containing the output + * permutation. If row i is the kth pivot row, then P [k] = i. In + * MATLAB notation, the reordered matrix is A (P,P). + * Info: a double array of size AMD_INFO, containing statistical + * information. Ignored if Info is NULL. + * + * On input, the matrix A is stored in column-oriented form. The row indices + * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1]. + * + * If the row indices appear in ascending order in each column, and there + * are no duplicate entries, then amd_order is slightly more efficient in + * terms of time and memory usage. If this condition does not hold, a copy + * of the matrix is created (where these conditions do hold), and the copy is + * ordered. This feature is new to v2.0 (v1.2 and earlier required this + * condition to hold for the input matrix). + * + * Row indices must be in the range 0 to + * n-1. Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros + * in A. The array Ap is of size n+1, and the array Ai is of size nz = Ap [n]. + * The matrix does not need to be symmetric, and the diagonal does not need to + * be present (if diagonal entries are present, they are ignored except for + * the output statistic Info [AMD_NZDIAG]). The arrays Ai and Ap are not + * modified. This form of the Ap and Ai arrays to represent the nonzero + * pattern of the matrix A is the same as that used internally by MATLAB. + * If you wish to use a more flexible input structure, please see the + * umfpack_*_triplet_to_col routines in the UMFPACK package, at + * http://www.suitesparse.com. + * + * Restrictions: n >= 0. Ap [0] = 0. Ap [j] <= Ap [j+1] for all j in the + * range 0 to n-1. nz = Ap [n] >= 0. Ai [0..nz-1] must be in the range 0 + * to n-1. Finally, Ai, Ap, and P must not be NULL. If any of these + * restrictions are not met, AMD returns AMD_INVALID. + * + * AMD returns: + * + * AMD_OK if the matrix is valid and sufficient memory can be allocated to + * perform the ordering. + * + * AMD_OUT_OF_MEMORY if not enough memory can be allocated. + * + * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is + * NULL. + * + * AMD_OK_BUT_JUMBLED if the matrix had unsorted columns, and/or duplicate + * entries, but was otherwise valid. + * + * The AMD routine first forms the pattern of the matrix A+A', and then + * computes a fill-reducing ordering, P. If P [k] = i, then row/column i of + * the original is the kth pivotal row. In MATLAB notation, the permuted + * matrix is A (P,P), except that 0-based indexing is used instead of the + * 1-based indexing in MATLAB. + * + * The Control array is used to set various parameters for AMD. If a NULL + * pointer is passed, default values are used. The Control array is not + * modified. + * + * Control [AMD_DENSE]: controls the threshold for "dense" rows/columns. + * A dense row/column in A+A' can cause AMD to spend a lot of time in + * ordering the matrix. If Control [AMD_DENSE] >= 0, rows/columns + * with more than Control [AMD_DENSE] * sqrt (n) entries are ignored + * during the ordering, and placed last in the output order. The + * default value of Control [AMD_DENSE] is 10. If negative, no + * rows/columns are treated as "dense". Rows/columns with 16 or + * fewer off-diagonal entries are never considered "dense". + * + * Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive + * absorption, in which a prior element is absorbed into the current + * element if is a subset of the current element, even if it is not + * adjacent to the current pivot element (refer to Amestoy, Davis, + * & Duff, 1996, for more details). The default value is nonzero, + * which means to perform aggressive absorption. This nearly always + * leads to a better ordering (because the approximate degrees are + * more accurate) and a lower execution time. There are cases where + * it can lead to a slightly worse ordering, however. To turn it off, + * set Control [AMD_AGGRESSIVE] to 0. + * + * Control [2..4] are not used in the current version, but may be used in + * future versions. + * + * The Info array provides statistics about the ordering on output. If it is + * not present, the statistics are not returned. This is not an error + * condition. + * + * Info [AMD_STATUS]: the return value of AMD, either AMD_OK, + * AMD_OK_BUT_JUMBLED, AMD_OUT_OF_MEMORY, or AMD_INVALID. + * + * Info [AMD_N]: n, the size of the input matrix + * + * Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n] + * + * Info [AMD_SYMMETRY]: the symmetry of the matrix A. It is the number + * of "matched" off-diagonal entries divided by the total number of + * off-diagonal entries. An entry A(i,j) is matched if A(j,i) is also + * an entry, for any pair (i,j) for which i != j. In MATLAB notation, + * S = spones (A) ; + * B = tril (S, -1) + triu (S, 1) ; + * symmetry = nnz (B & B') / nnz (B) ; + * + * Info [AMD_NZDIAG]: the number of entries on the diagonal of A. + * + * Info [AMD_NZ_A_PLUS_AT]: the number of nonzeros in A+A', excluding the + * diagonal. If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1) + * with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n + * (the smallest possible value). If A is perfectly unsymmetric + * (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for + * example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz + * (the largest possible value). + * + * Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were + * removed from A prior to ordering. These are placed last in the + * output order P. + * + * Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes. In the + * current version, this is 1.2 * Info [AMD_NZ_A_PLUS_AT] + 9*n + * times the size of an integer. This is at most 2.4nz + 9n. This + * excludes the size of the input arguments Ai, Ap, and P, which have + * a total size of nz + 2*n + 1 integers. + * + * Info [AMD_NCMPA]: the number of garbage collections performed. + * + * Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal). + * This is a slight upper bound because mass elimination is combined + * with the approximate degree update. It is a rough upper bound if + * there are many "dense" rows/columns. The rest of the statistics, + * below, are also slight or rough upper bounds, for the same reasons. + * The post-ordering of the assembly tree might also not exactly + * correspond to a true elimination tree postordering. + * + * Info [AMD_NDIV]: the number of divide operations for a subsequent LDL' + * or LU factorization of the permuted matrix A (P,P). + * + * Info [AMD_NMULTSUBS_LDL]: the number of multiply-subtract pairs for a + * subsequent LDL' factorization of A (P,P). + * + * Info [AMD_NMULTSUBS_LU]: the number of multiply-subtract pairs for a + * subsequent LU factorization of A (P,P), assuming that no numerical + * pivoting is required. + * + * Info [AMD_DMAX]: the maximum number of nonzeros in any column of L, + * including the diagonal. + * + * Info [14..19] are not used in the current version, but may be used in + * future versions. + */ + +/* ------------------------------------------------------------------------- */ +/* direct interface to AMD */ +/* ------------------------------------------------------------------------- */ + +/* amd_2 is the primary AMD ordering routine. It is not meant to be + * user-callable because of its restrictive inputs and because it destroys + * the user's input matrix. It does not check its inputs for errors, either. + * However, if you can work with these restrictions it can be faster than + * amd_order and use less memory (assuming that you can create your own copy + * of the matrix for AMD to destroy). Refer to AMD/Source/amd_2.c for a + * description of each parameter. */ + +void amd_2 +( + int n, + int Pe [ ], + int Iw [ ], + int Len [ ], + int iwlen, + int pfree, + int Nv [ ], + int Next [ ], + int Last [ ], + int Head [ ], + int Elen [ ], + int Degree [ ], + int W [ ], + double Control [ ], + double Info [ ] +) ; + +void amd_l2 +( + SuiteSparse_long n, + SuiteSparse_long Pe [ ], + SuiteSparse_long Iw [ ], + SuiteSparse_long Len [ ], + SuiteSparse_long iwlen, + SuiteSparse_long pfree, + SuiteSparse_long Nv [ ], + SuiteSparse_long Next [ ], + SuiteSparse_long Last [ ], + SuiteSparse_long Head [ ], + SuiteSparse_long Elen [ ], + SuiteSparse_long Degree [ ], + SuiteSparse_long W [ ], + double Control [ ], + double Info [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* amd_valid */ +/* ------------------------------------------------------------------------- */ + +/* Returns AMD_OK or AMD_OK_BUT_JUMBLED if the matrix is valid as input to + * amd_order; the latter is returned if the matrix has unsorted and/or + * duplicate row indices in one or more columns. Returns AMD_INVALID if the + * matrix cannot be passed to amd_order. For amd_order, the matrix must also + * be square. The first two arguments are the number of rows and the number + * of columns of the matrix. For its use in AMD, these must both equal n. + * + * NOTE: this routine returned TRUE/FALSE in v1.2 and earlier. + */ + +int amd_valid +( + int n_row, /* # of rows */ + int n_col, /* # of columns */ + const int Ap [ ], /* column pointers, of size n_col+1 */ + const int Ai [ ] /* row indices, of size Ap [n_col] */ +) ; + +SuiteSparse_long amd_l_valid +( + SuiteSparse_long n_row, + SuiteSparse_long n_col, + const SuiteSparse_long Ap [ ], + const SuiteSparse_long Ai [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* AMD memory manager and printf routines */ +/* ------------------------------------------------------------------------- */ + +/* The user can redefine these to change the malloc, free, and printf routines + * that AMD uses. */ + +#ifndef EXTERN +#define EXTERN extern +#endif + +EXTERN void *(*amd_malloc) (size_t) ; /* pointer to malloc */ +EXTERN void (*amd_free) (void *) ; /* pointer to free */ +EXTERN void *(*amd_realloc) (void *, size_t) ; /* pointer to realloc */ +EXTERN void *(*amd_calloc) (size_t, size_t) ; /* pointer to calloc */ +EXTERN int (*amd_printf) (const char *, ...) ; /* pointer to printf */ + +/* ------------------------------------------------------------------------- */ +/* AMD Control and Info arrays */ +/* ------------------------------------------------------------------------- */ + +/* amd_defaults: sets the default control settings */ +void amd_defaults (double Control [ ]) ; +void amd_l_defaults (double Control [ ]) ; + +/* amd_control: prints the control settings */ +void amd_control (double Control [ ]) ; +void amd_l_control (double Control [ ]) ; + +/* amd_info: prints the statistics */ +void amd_info (double Info [ ]) ; +void amd_l_info (double Info [ ]) ; + +#define AMD_CONTROL 5 /* size of Control array */ +#define AMD_INFO 20 /* size of Info array */ + +/* contents of Control */ +#define AMD_DENSE 0 /* "dense" if degree > Control [0] * sqrt (n) */ +#define AMD_AGGRESSIVE 1 /* do aggressive absorption if Control [1] != 0 */ + +/* default Control settings */ +#define AMD_DEFAULT_DENSE 10.0 /* default "dense" degree 10*sqrt(n) */ +#define AMD_DEFAULT_AGGRESSIVE 1 /* do aggressive absorption by default */ + +/* contents of Info */ +#define AMD_STATUS 0 /* return value of amd_order and amd_l_order */ +#define AMD_N 1 /* A is n-by-n */ +#define AMD_NZ 2 /* number of nonzeros in A */ +#define AMD_SYMMETRY 3 /* symmetry of pattern (1 is sym., 0 is unsym.) */ +#define AMD_NZDIAG 4 /* # of entries on diagonal */ +#define AMD_NZ_A_PLUS_AT 5 /* nz in A+A' */ +#define AMD_NDENSE 6 /* number of "dense" rows/columns in A */ +#define AMD_MEMORY 7 /* amount of memory used by AMD */ +#define AMD_NCMPA 8 /* number of garbage collections in AMD */ +#define AMD_LNZ 9 /* approx. nz in L, excluding the diagonal */ +#define AMD_NDIV 10 /* number of fl. point divides for LU and LDL' */ +#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */ +#define AMD_NMULTSUBS_LU 12 /* number of fl. point (*,-) pairs for LU */ +#define AMD_DMAX 13 /* max nz. in any column of L, incl. diagonal */ + +/* ------------------------------------------------------------------------- */ +/* return values of AMD */ +/* ------------------------------------------------------------------------- */ + +#define AMD_OK 0 /* success */ +#define AMD_OUT_OF_MEMORY -1 /* malloc failed, or problem too large */ +#define AMD_INVALID -2 /* input arguments are not valid */ +#define AMD_OK_BUT_JUMBLED 1 /* input matrix is OK for amd_order, but + * columns were not sorted, and/or duplicate entries were present. AMD had + * to do extra work before ordering the matrix. This is a warning, not an + * error. */ + +/* ========================================================================== */ +/* === AMD version ========================================================== */ +/* ========================================================================== */ + +/* AMD Version 1.2 and later include the following definitions. + * As an example, to test if the version you are using is 1.2 or later: + * + * #ifdef AMD_VERSION + * if (AMD_VERSION >= AMD_VERSION_CODE (1,2)) ... + * #endif + * + * This also works during compile-time: + * + * #if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE (1,2)) + * printf ("This is version 1.2 or later\n") ; + * #else + * printf ("This is an early version\n") ; + * #endif + * + * Versions 1.1 and earlier of AMD do not include a #define'd version number. + */ + +#define AMD_DATE "Jun 20, 2012" +#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define AMD_MAIN_VERSION 2 +#define AMD_SUB_VERSION 3 +#define AMD_SUBSUB_VERSION 1 +#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/windows/include/ecos/amd_internal.h b/thirdparty/windows/include/ecos/amd_internal.h new file mode 100755 index 00000000..0aa5a303 --- /dev/null +++ b/thirdparty/windows/include/ecos/amd_internal.h @@ -0,0 +1,347 @@ +/* ========================================================================= */ +/* === amd_internal.h ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD, Copyright (c) Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* This file is for internal use in AMD itself, and does not normally need to + * be included in user code (it is included in UMFPACK, however). All others + * should use amd.h instead. + * + * The following compile-time definitions affect how AMD is compiled. + * + * -DNPRINT + * + * Disable all printing. stdio.h will not be included. Printing can + * be re-enabled at run-time by setting the global pointer amd_printf + * to printf (or mexPrintf for a MATLAB mexFunction). + * + * -DNMALLOC + * + * No memory manager is defined at compile-time. You MUST define the + * function pointers amd_malloc, amd_free, amd_realloc, and + * amd_calloc at run-time for AMD to work properly. + */ + +/* ========================================================================= */ +/* === NDEBUG ============================================================== */ +/* ========================================================================= */ + +/* + * Turning on debugging takes some work (see below). If you do not edit this + * file, then debugging is always turned off, regardless of whether or not + * -DNDEBUG is specified in your compiler options. + * + * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined, + * and mxAssert is used instead of assert. If debugging is not enabled, no + * MATLAB include files or functions are used. Thus, the AMD library libamd.a + * can be safely used in either a stand-alone C program or in another + * mexFunction, without any change. + */ + +/* + AMD will be exceedingly slow when running in debug mode. The next three + lines ensure that debugging is turned off. +*/ +// #ifndef NDEBUG +// #define NDEBUG +// #endif + +/* + To enable debugging, uncomment the following line: +*/ +// #undef NDEBUG + +/* ------------------------------------------------------------------------- */ +/* ANSI include files */ +/* ------------------------------------------------------------------------- */ + +/* from stdlib.h: size_t, malloc, free, realloc, and calloc */ +#include + +#if !defined(NPRINT) || !defined(NDEBUG) +/* from stdio.h: printf. Not included if NPRINT is defined at compile time. + * fopen and fscanf are used when debugging. */ +#include +#endif + +/* from limits.h: INT_MAX and LONG_MAX */ +#include + +/* from math.h: sqrt */ +#include + +/* ------------------------------------------------------------------------- */ +/* MATLAB include files (only if being used in or via MATLAB) */ +/* ------------------------------------------------------------------------- */ + +#ifdef MATLAB_MEX_FILE +#include "matrix.h" +#include "mex.h" +#endif + +/* ------------------------------------------------------------------------- */ +/* basic definitions */ +/* ------------------------------------------------------------------------- */ + +#ifdef FLIP +#undef FLIP +#endif + +#ifdef MAX +#undef MAX +#endif + +#ifdef MIN +#undef MIN +#endif + +#ifdef EMPTY +#undef EMPTY +#endif + +#ifdef GLOBAL +#undef GLOBAL +#endif + +#ifdef PRIVATE +#undef PRIVATE +#endif + +/* FLIP is a "negation about -1", and is used to mark an integer i that is + * normally non-negative. FLIP (EMPTY) is EMPTY. FLIP of a number > EMPTY + * is negative, and FLIP of a number < EMTPY is positive. FLIP (FLIP (i)) = i + * for all integers i. UNFLIP (i) is >= EMPTY. */ +#define EMPTY (-1) +#define FLIP(i) (-(i)-2) +#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i)) + +/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */ +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + +/* logical expression of p implies q: */ +#define IMPLIES(p,q) (!(p) || (q)) + +/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in . */ +/* The Compaq Alpha also predefines TRUE and FALSE. */ +#ifdef TRUE +#undef TRUE +#endif +#ifdef FALSE +#undef FALSE +#endif + +#define TRUE (1) +#define FALSE (0) +#define PRIVATE static +#define GLOBAL +#define EMPTY (-1) + +/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */ +/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0). We */ +/* need to use the ANSI standard value of 0. */ +#ifdef NULL +#undef NULL +#endif + +#define NULL 0 + +/* largest value of size_t */ +#ifndef SIZE_T_MAX +#ifdef SIZE_MAX +/* C99 only */ +#define SIZE_T_MAX SIZE_MAX +#else +#define SIZE_T_MAX ((size_t) (-1)) +#endif +#endif + +/* ------------------------------------------------------------------------- */ +/* integer type for AMD: int or SuiteSparse_long */ +/* ------------------------------------------------------------------------- */ + +#include "amd.h" + +#if defined (DLONG) || defined (ZLONG) + +#define Int SuiteSparse_long +#define ID SuiteSparse_long_id +#define Int_MAX SuiteSparse_long_max + +#define AMD_order amd_l_order +#define AMD_defaults amd_l_defaults +#define AMD_control amd_l_control +#define AMD_info amd_l_info +#define AMD_1 amd_l1 +#define AMD_2 amd_l2 +#define AMD_valid amd_l_valid +#define AMD_aat amd_l_aat +#define AMD_postorder amd_l_postorder +#define AMD_post_tree amd_l_post_tree +#define AMD_dump amd_l_dump +#define AMD_debug amd_l_debug +#define AMD_debug_init amd_l_debug_init +#define AMD_preprocess amd_l_preprocess + +#else + +#define Int int +#define ID "%d" +#define Int_MAX INT_MAX + +#define AMD_order amd_order +#define AMD_defaults amd_defaults +#define AMD_control amd_control +#define AMD_info amd_info +#define AMD_1 amd_1 +#define AMD_2 amd_2 +#define AMD_valid amd_valid +#define AMD_aat amd_aat +#define AMD_postorder amd_postorder +#define AMD_post_tree amd_post_tree +#define AMD_dump amd_dump +#define AMD_debug amd_debug +#define AMD_debug_init amd_debug_init +#define AMD_preprocess amd_preprocess + +#endif + +/* ========================================================================= */ +/* === PRINTF macro ======================================================== */ +/* ========================================================================= */ + +/* All output goes through the PRINTF macro. */ +#define PRINTF(params) { if (amd_printf != NULL) (void) amd_printf params ; } + +/* ------------------------------------------------------------------------- */ +/* AMD routine definitions (not user-callable) */ +/* ------------------------------------------------------------------------- */ + +GLOBAL size_t AMD_aat +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Len [ ], + Int Tp [ ], + double Info [ ] +) ; + +GLOBAL void AMD_1 +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int P [ ], + Int Pinv [ ], + Int Len [ ], + Int slen, + Int S [ ], + double Control [ ], + double Info [ ] +) ; + +GLOBAL void AMD_postorder +( + Int nn, + Int Parent [ ], + Int Npiv [ ], + Int Fsize [ ], + Int Order [ ], + Int Child [ ], + Int Sibling [ ], + Int Stack [ ] +) ; + +GLOBAL Int AMD_post_tree +( + Int root, + Int k, + Int Child [ ], + const Int Sibling [ ], + Int Order [ ], + Int Stack [ ] +#ifndef NDEBUG + , Int nn +#endif +) ; + +GLOBAL void AMD_preprocess +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Rp [ ], + Int Ri [ ], + Int W [ ], + Int Flag [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* debugging definitions */ +/* ------------------------------------------------------------------------- */ + +#ifndef NDEBUG + +/* from assert.h: assert macro */ +#include + +#ifndef EXTERN +#define EXTERN extern +#endif + +EXTERN Int AMD_debug ; + +GLOBAL void AMD_debug_init ( char *s ) ; + +GLOBAL void AMD_dump +( + Int n, + Int Pe [ ], + Int Iw [ ], + Int Len [ ], + Int iwlen, + Int pfree, + Int Nv [ ], + Int Next [ ], + Int Last [ ], + Int Head [ ], + Int Elen [ ], + Int Degree [ ], + Int W [ ], + Int nel +) ; + +#ifdef ASSERT +#undef ASSERT +#endif + +/* Use mxAssert if AMD is compiled into a mexFunction */ +#ifdef MATLAB_MEX_FILE +#define ASSERT(expression) (mxAssert ((expression), "")) +#else +#define ASSERT(expression) (assert (expression)) +#endif + +#define AMD_DEBUG0(params) { PRINTF (params) ; } +#define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; } +#define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; } +#define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; } +#define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; } + +#else + +/* no debugging */ +#define ASSERT(expression) +#define AMD_DEBUG0(params) +#define AMD_DEBUG1(params) +#define AMD_DEBUG2(params) +#define AMD_DEBUG3(params) +#define AMD_DEBUG4(params) + +#endif diff --git a/thirdparty/windows/include/ecos/cone.h b/thirdparty/windows/include/ecos/cone.h new file mode 100755 index 00000000..9fb28e66 --- /dev/null +++ b/thirdparty/windows/include/ecos/cone.h @@ -0,0 +1,171 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* cone module */ + +#ifndef __CONE_H__ +#define __CONE_H__ + +#include "glblopts.h" +#include "expcone.h" + +#define CONEMODE (0) /* 0: expand to sparse cones (ECOS standard) */ + /* 1: dense cones (slow for big cones) */ + /* 2: dense of fixed size */ + + +/* LP CONE ------------------------------------------------------------- */ +typedef struct lpcone{ + idxint p; /* dimension of cone */ + pfloat* w; /* scalings */ + pfloat* v; /* = w^2 - saves p multiplications */ + idxint* kkt_idx; /* indices of KKT matrix to which scalings w^2 map */ +} lpcone; + + +/* SECOND-ORDER CONE --------------------------------------------------- */ +/* (all KKT indices are in compressed column format pointing into Kpr) */ +typedef struct socone{ + idxint p; /* dimension of cone */ + pfloat* skbar; /* temporary variables to work with */ + pfloat* zkbar; /* temporary variables to work with */ + pfloat a; /* = wbar(1) */ + pfloat d1; /* first element of D */ + pfloat w; /* = q'*q */ + pfloat eta; /* eta = (sres / zres)^(1/4) */ + pfloat eta_square; /* eta^2 = (sres / zres)^(1/2) */ + pfloat* q; /* = wbar(2:end) */ +#if CONEMODE == 0 + idxint* Didx; /* indices for D */ + pfloat u0; /* eta */ + pfloat u1; /* u = [u0; u1*q] */ + pfloat v1; /* v = [0; v1*q] */ +#endif +#if CONEMODE > 0 + idxint* colstart; /* colstart[n] gives index in KKT matrix where + the nth column of this scaling matrix in (3,3) + block starts */ + pfloat c; /* = 1 + a + w/(1+a) */ + pfloat d; /* = 1 + 2/(1+a) + w/(1+a)^2 */ +#endif + +} socone; + + +/* GENERAL STRUCTURE FOR A CONE ---------------------------------------- */ +typedef struct cone{ + lpcone* lpc; /* LP cone */ + socone* soc; /* Second-Order cone */ + idxint nsoc; /* number of second-order cones */ +#ifdef EXPCONE + expcone* expc; /* array of exponential cones*/ + idxint nexc; /* number of exponential cones*/ + idxint fexv; /* Index of first slack variable + * corresponding to an exponential cone */ +#endif +} cone; + + +/* ERROR CODES --------------------------------------------------------- */ +#define INSIDE_CONE (0) +#define OUTSIDE_CONE (1) + + +/* METHODS ------------------------------------------------------------- */ +/** + * Scales a conic variable such that it lies strictly in the cone. + * If it is already in the cone, r is simply copied to s. + * Otherwise s = r + (1+alpha)*e where alpha is the biggest residual. + */ +void bring2cone(cone* C, pfloat* r, pfloat* s); + +#ifdef EXPCONE +/* When there are exponential variables in the definition of the problem + * the initialization strategy changes to using the central ray for all + * cones. + */ +void unitInitialization(cone* C, pfloat* s, pfloat* z, pfloat scaling); +#endif + +/** + * Update scalings. + * Returns OUTSIDE_CONE as soon as any multiplier or slack leaves the cone, + * as this indicates severe problems. + * When compiled with EXPCONE it calculates the value of muH(z_e) with + * z_e the dual slacks for the exponential cone + * and stores the Hessian in the cone structure. + */ +#ifdef EXPCONE +idxint updateScalings(cone* C, pfloat* s, pfloat* z, pfloat* lambda, pfloat mu); +#else +idxint updateScalings(cone* C, pfloat* s, pfloat* z, pfloat* lambda); +#endif + +#ifdef EXPCONE +pfloat evalSymmetricBarrierValue(pfloat* siter, pfloat *ziter, pfloat tauIter, pfloat kapIter, cone* C, pfloat D); +#endif + +/** + * Fast multiplication by scaling matrix. + * Returns lambda = W*z + */ +void scale(pfloat* z, cone* C, pfloat* lambda); + + +/** + * Fast multiplication with V := W^2. + * Computes y += W^2*x; + */ +void scale2add(pfloat *x, pfloat* y, cone* C); + +/** + * Fast left-division by scaling matrix. + * Returns z = W\lambda + */ +void unscale(pfloat* lambda, cone* C, pfloat* z); + + +/** + * Conic product, implements the "o" operator, w = u o v + * and returns e'*w (where e is the conic 1-vector) + */ +pfloat conicProduct(pfloat* u, pfloat* v, cone* C, pfloat* w); + + +/** + * Conic division, implements the "\" operator, w = u \ v + */ +void conicDivision(pfloat* u, pfloat* v, cone* C, pfloat* w); + + +/* + * Returns details on second order cone + * Purpose: cleaner code + */ +void getSOCDetails(socone *soc, idxint *conesize, pfloat* eta_square, pfloat* d1, pfloat* u0, pfloat* u1, pfloat* v1, pfloat **q); + + +/* + * Returns dx, dy and dz from the expanded and permuted version of + * a search direction vector. + */ +void unstretch(idxint n, idxint p, cone *C, idxint *Pinv, pfloat *Px, pfloat *dx, pfloat *dy, pfloat *dz); + +#endif diff --git a/thirdparty/windows/include/ecos/ctrlc.h b/thirdparty/windows/include/ecos/ctrlc.h new file mode 100755 index 00000000..d96d0316 --- /dev/null +++ b/thirdparty/windows/include/ecos/ctrlc.h @@ -0,0 +1,66 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Interface for ECOS signal handling. + * + * This module is (c) Michael Grant, [mcg@cvxr.com] contributed by Github PR #82 + */ + +#ifndef __CTRLC_H__ +#define __CTRLC_H__ + +#include "glblopts.h" + +#if CTRLC > 0 + +#if defined MATLAB_MEX_FILE + +/* No header file available here; define the prototypes ourselves */ +extern bool utIsInterruptPending(void); +extern bool utSetInterruptEnabled(bool); + +#elif (defined _WIN32 || defined _WIN64 || defined _WINDLL ) + +/* Use Windows SetConsoleCtrlHandler for signal handling */ +#include + +#else + +/* Use POSIX clocl_gettime() for timing on non-Windows machines */ +#include + +#endif + +/* METHODS are the same for both */ +void init_ctrlc(void); +void remove_ctrlc(void); +int check_ctrlc(void); + +#else /* CTRLC = 0 */ + +/* No signal handling. */ +#define init_ctrlc() +#define remove_ctrlc() +#define check_ctrlc() 0 + +#endif /* END IF CTRLC > 0 */ + +#endif /* END IFDEF __TIMER_H__ */ + diff --git a/thirdparty/windows/include/ecos/data.h b/thirdparty/windows/include/ecos/data.h new file mode 100755 index 00000000..e6480083 --- /dev/null +++ b/thirdparty/windows/include/ecos/data.h @@ -0,0 +1,37 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +idxint n = 223; +idxint m = 220; +idxint p = 114; +idxint l = 201; +idxint ncones = 6; +pfloat c[223] = {0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; +pfloat h[220] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; +idxint q[6] = {3, 3, 3, 3, 3, 4}; +idxint Gjc[224] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220}; +idxint Gir[220] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219}; +pfloat Gpr[220] = {-1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000}; +idxint Ajc[224] = {0, 111, 222, 322, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 539, 540, 541, 564, 565, 566, 589, 590, 591, 618, 619, 620, 632, 633, 634, 635, 636, 637, 638}; +idxint Air[638] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 112, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 110, 113, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 3, 9, 15, 27, 53, 54, 57, 66, 67, 71, 74, 87, 92, 96, 98, 100, 101, 2, 8, 12, 19, 29, 30, 34, 37, 39, 42, 43, 44, 47, 50, 51, 56, 59, 70, 73, 79, 82, 85, 94, 102, 103, 0, 4, 7, 13, 14, 16, 17, 21, 23, 28, 31, 33, 36, 38, 60, 64, 78, 81, 88, 90, 91, 95, 99, 104, 105, 1, 6, 10, 20, 22, 26, 32, 35, 41, 46, 48, 49, 52, 55, 58, 65, 68, 69, 75, 76, 77, 80, 83, 84, 86, 93, 97, 106, 107, 5, 11, 18, 24, 25, 40, 45, 61, 62, 63, 72, 89, 108, 109, 110, 111, 112, 113}; +pfloat Apr[638] = {-6.748099080141577400e-001, 9.587587238674218900e-001, -3.380262965696901900e-001, -6.289006455522118100e-001, 1.458932368908371500e+000, 8.103505672584934100e-001, -8.308676110497204000e-002, 2.638152658681099300e+000, 1.000625209233638700e+000, 1.443285740856571400e-001, 1.198960671699122800e+000, 8.042866751960948700e-001, -2.146877760548437900e-002, 1.252109754253975600e+000, 1.681372772953815700e+000, 1.160558110039982400e+000, 8.971595941547876300e-001, 9.934462168535226300e-001, 4.030425643552826300e-003, 4.520907269135507900e-001, 1.957531681292445900e+000, 8.367513704018149100e-001, -8.919073879004054700e-001, 1.364968014685880000e-001, -5.391443069926015200e-001, 1.218605709809697200e+000, 1.379628849398701500e+000, 7.705722581573115600e-002, -9.721580354507602900e-001, 1.341091680254979900e+000, 1.416856131617781900e+000, 1.367782802004573000e+000, 9.310015370881947700e-001, 1.025960903569425500e+000, 4.418055920652105800e-001, 1.797608571927105100e-001, -1.566236421056189400e+000, -1.293790728779894400e-001, -2.548793507296202000e-001, -1.327158583802827700e+000, 8.378869252146687900e-001, 9.208088134425553900e-001, 8.954835779157467300e-001, 1.872488747783192400e+000, 1.607749082930002300e-001, 1.703097419135647200e+000, 1.485966470102646500e+000, 1.950727391193988900e+000, 1.261282074772785800e+000, 2.116080672704367100e+000, 4.418819171779880300e-001, -6.070414095655145600e-001, 2.236741804227308500e-001, -1.390565074056968600e+000, -3.689063294445240100e-001, 6.275925564016111600e-001, 9.419119351808997700e-001, 2.051844704916749900e-002, -2.055013180419911200e+000, -8.138411920140069500e-001, -1.670986440999406000e+000, -4.312826132928389000e-001, -1.317178055102502500e-001, 4.129877571668971700e-002, -1.178000809237306800e-001, -5.094809536848188300e-002, 4.887140456297478000e-001, -6.048920026011540600e-001, -1.622657687025348600e+000, 9.468924561461561400e-002, -1.076752006167445400e+000, -4.544402225817885700e-001, -1.138681599263542200e+000, 6.297099350763062400e-001, 7.161553122227841700e-001, -2.326213079050594200e-001, -2.421425730439526200e-001, -3.527400894253913700e-001, -5.991000491511071500e-001, -4.501982881436522000e-001, -1.073527618321097300e+000, -1.837831580649836900e+000, -1.093506922417250900e+000, 3.123080272148109900e-002, 4.764624397863112500e-001, -9.744593174286131400e-001, -5.475935551016516400e-001, -1.185577848308040100e+000, -1.512429413719079500e+000, -8.503358079552569800e-001, -1.048119449917124500e+000, -2.950353712891531400e-001, 4.436355670528358600e-001, -1.976143927829304500e+000, -1.154872945269262400e-001, -8.267783537066453200e-001, -2.524533500828647400e-001, -2.934013148063512300e-001, -9.559308197633347200e-001, -5.099545278978906400e-001, 7.104569782287112300e-001, 2.586151051423653000e-001, 9.670875274511733200e-001, -1.580472136196336100e-001, 4.036019169202506600e-001, -4.419329075671284400e-001, 1.335760493316310000e-001, -2.443367984060260100e-001, 5.346171843774407700e-001, 9.240837092450902800e-002, 1.000000000000000000e+000, -7.627629774659758300e+000, -8.317906940770274800e+000, -7.063111046330970300e+000, -8.991213209598194900e+000, -7.132056801314573300e+000, -6.933147988332642300e+000, -8.002850393982971200e+000, -7.763929473153173600e+000, -7.316196508551362500e+000, -6.857489440772187800e+000, -6.933435917031895100e+000, -8.453055934420948600e+000, -7.746956878849250200e+000, -6.987480243537588000e+000, -6.898256465718047200e+000, -7.035033952525910900e+000, -7.332300809407010800e+000, -8.868148466875196000e+000, -7.895445920224761800e+000, -8.477688226774738200e+000, -6.724790281248850500e+000, -8.026080227654171400e+000, -8.247796522362861500e+000, -7.893131787368933100e+000, -7.953077643849715300e+000, -7.085517647070380700e+000, -7.757918623860442500e+000, -9.404980440162075800e+000, -9.111021916635516900e+000, -6.753547752596220200e+000, -6.208328120779675900e+000, -7.460712402671073400e+000, -8.051154905293161700e+000, -6.979795864345947000e+000, -7.285373299414776400e+000, -7.935549231771511300e+000, -7.333663096710840700e+000, -7.549354579130950400e+000, -7.125439770244579300e+000, -8.444455837718113100e+000, -7.607705936847165300e+000, -6.947711222611268100e+000, -7.559561213742542300e+000, -6.633232534378238100e+000, -7.285067573640397100e+000, -7.198034090285221800e+000, -8.301173708858458500e+000, -7.740676955875905200e+000, -8.389317110487786200e+000, -7.030503781850090800e+000, 7.483837125022816400e-001, 9.972172897309477000e-001, 8.635272324715717000e-001, 3.437357445286000600e-001, 1.356057545748600200e+000, 7.747994541454063000e-001, -5.029337660688439900e-001, 7.320209587792132500e-001, 9.007328043370961300e-001, 1.839182838430090300e+000, -1.352604803382542600e+000, 1.440339792882617200e+000, 5.409160633286138600e-001, -9.096356667070149000e-002, 2.145906552675194100e-001, 1.749366326171780000e+000, 1.710862586429138200e+000, 5.617170924142114200e-001, 8.075937970441778900e-001, 5.294053117812258500e-001, 8.007328881544743000e-001, 6.824506852180559600e-001, -4.466422007073587200e-001, 4.125165857556476500e-001, 1.264599468598445900e+000, 1.195482116831558800e+000, 5.815701470999368200e-001, 1.480145121963046200e+000, 1.228974130124139900e+000, -9.887375252743877400e-001, 4.957232610676656800e-001, 2.201242074660017000e-001, -8.949779589135298300e-002, 4.463714750361750200e-001, 1.104458211701637000e+000, 1.146057798756675600e+000, 1.607064328082671100e+000, -3.342540671866551800e-001, -3.733869343080511400e-001, 1.376984209826379600e+000, 1.134842638638303900e+000, 1.578816025652644900e+000, 8.631161307174450800e-003, 6.628552272325566300e-001, -4.235551988694613600e-001, -5.931434773175525700e-002, 1.107744286910284700e+000, 1.308043758809049000e+000, 1.474220016986390400e+000, 6.094036504382410700e-001, 2.586151051423653000e-001, 7.690092056142631100e-001, -1.580472136196336100e-001, 2.410499789745967300e-001, -4.419329075671284400e-001, 6.725262868347948700e-001, -2.443367984060260100e-001, 9.310955439202097700e-001, 9.240837092450902800e-002, 9.816510048711224500e-001, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -5.000000000000000000e-001, -5.000000000000000000e-001, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 1.000000000000000000e+000}; +idxint K0jc[558] = {0, 112, 224, 325, 329, 332, 335, 338, 341, 344, 347, 350, 353, 356, 359, 362, 365, 368, 371, 374, 377, 380, 383, 386, 389, 392, 395, 398, 401, 404, 407, 410, 413, 416, 419, 422, 425, 428, 431, 434, 437, 440, 443, 446, 449, 452, 455, 458, 461, 464, 467, 470, 473, 476, 479, 482, 485, 488, 491, 494, 497, 500, 503, 506, 509, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 590, 593, 596, 599, 602, 605, 608, 611, 614, 617, 620, 623, 626, 629, 632, 635, 638, 641, 644, 647, 650, 653, 656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, 731, 734, 737, 740, 743, 746, 749, 752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, 875, 878, 881, 884, 887, 890, 893, 896, 899, 902, 905, 908, 911, 914, 917, 920, 923, 926, 929, 946, 949, 952, 977, 980, 983, 1008, 1011, 1014, 1043, 1046, 1049, 1063, 1066, 1069, 1072, 1075, 1078, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1414}; +idxint K0ir[1415] = {0, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 334, 1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 335, 2, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 3, 333, 336, 337, 4, 223, 338, 5, 224, 339, 6, 225, 340, 7, 226, 341, 8, 227, 342, 9, 228, 343, 10, 229, 344, 11, 230, 345, 12, 231, 346, 13, 232, 347, 14, 233, 348, 15, 234, 349, 16, 235, 350, 17, 236, 351, 18, 237, 352, 19, 238, 353, 20, 239, 354, 21, 240, 355, 22, 241, 356, 23, 242, 357, 24, 243, 358, 25, 244, 359, 26, 245, 360, 27, 246, 361, 28, 247, 362, 29, 248, 363, 30, 249, 364, 31, 250, 365, 32, 251, 366, 33, 252, 367, 34, 253, 368, 35, 254, 369, 36, 255, 370, 37, 256, 371, 38, 257, 372, 39, 258, 373, 40, 259, 374, 41, 260, 375, 42, 261, 376, 43, 262, 377, 44, 263, 378, 45, 264, 379, 46, 265, 380, 47, 266, 381, 48, 267, 382, 49, 268, 383, 50, 269, 384, 51, 270, 385, 52, 271, 386, 53, 272, 387, 54, 273, 388, 55, 274, 389, 56, 275, 390, 57, 276, 391, 58, 277, 392, 59, 278, 393, 60, 279, 394, 61, 280, 395, 62, 281, 396, 63, 282, 397, 64, 283, 398, 65, 284, 399, 66, 285, 400, 67, 286, 401, 68, 287, 402, 69, 288, 403, 70, 289, 404, 71, 290, 405, 72, 291, 406, 73, 292, 407, 74, 293, 408, 75, 294, 409, 76, 295, 410, 77, 296, 411, 78, 297, 412, 79, 298, 413, 80, 299, 414, 81, 300, 415, 82, 301, 416, 83, 302, 417, 84, 303, 418, 85, 304, 419, 86, 305, 420, 87, 306, 421, 88, 307, 422, 89, 308, 423, 90, 309, 424, 91, 310, 425, 92, 311, 426, 93, 312, 427, 94, 313, 428, 95, 314, 429, 96, 315, 430, 97, 316, 431, 98, 317, 432, 99, 318, 433, 100, 319, 434, 101, 320, 435, 102, 321, 436, 103, 322, 437, 104, 223, 438, 105, 224, 439, 106, 225, 440, 107, 226, 441, 108, 227, 442, 109, 228, 443, 110, 229, 444, 111, 230, 445, 112, 231, 446, 113, 232, 447, 114, 233, 448, 115, 234, 449, 116, 235, 450, 117, 236, 451, 118, 237, 452, 119, 238, 453, 120, 239, 454, 121, 240, 455, 122, 241, 456, 123, 242, 457, 124, 243, 458, 125, 244, 459, 126, 245, 460, 127, 246, 461, 128, 247, 462, 129, 248, 463, 130, 249, 464, 131, 250, 465, 132, 251, 466, 133, 252, 467, 134, 253, 468, 135, 254, 469, 136, 255, 470, 137, 256, 471, 138, 257, 472, 139, 258, 473, 140, 259, 474, 141, 260, 475, 142, 261, 476, 143, 262, 477, 144, 263, 478, 145, 264, 479, 146, 265, 480, 147, 266, 481, 148, 267, 482, 149, 268, 483, 150, 269, 484, 151, 270, 485, 152, 271, 486, 153, 272, 487, 154, 273, 488, 155, 274, 489, 156, 275, 490, 157, 276, 491, 158, 277, 492, 159, 278, 493, 160, 279, 494, 161, 280, 495, 162, 281, 496, 163, 282, 497, 164, 283, 498, 165, 284, 499, 166, 285, 500, 167, 286, 501, 168, 287, 502, 169, 288, 503, 170, 289, 504, 171, 290, 505, 172, 291, 506, 173, 292, 507, 174, 293, 508, 175, 294, 509, 176, 295, 510, 177, 296, 511, 178, 297, 512, 179, 298, 513, 180, 299, 514, 181, 300, 515, 182, 301, 516, 183, 302, 517, 184, 303, 518, 185, 304, 519, 186, 305, 520, 187, 306, 521, 188, 307, 522, 189, 308, 523, 190, 309, 524, 191, 310, 525, 192, 311, 526, 193, 312, 527, 194, 313, 528, 195, 314, 529, 196, 315, 530, 197, 316, 531, 198, 317, 532, 199, 318, 533, 200, 319, 534, 201, 320, 535, 202, 321, 536, 203, 322, 537, 204, 226, 232, 238, 250, 276, 277, 280, 289, 290, 294, 297, 310, 315, 319, 321, 538, 205, 323, 539, 206, 324, 540, 207, 225, 231, 235, 242, 252, 253, 257, 260, 262, 265, 266, 267, 270, 273, 274, 279, 282, 293, 296, 302, 305, 308, 317, 541, 208, 325, 542, 209, 326, 543, 210, 223, 227, 230, 236, 237, 239, 240, 244, 246, 251, 254, 256, 259, 261, 283, 287, 301, 304, 311, 313, 314, 318, 322, 544, 211, 327, 545, 212, 328, 546, 213, 224, 229, 233, 243, 245, 249, 255, 258, 264, 269, 271, 272, 275, 278, 281, 288, 291, 292, 298, 299, 300, 303, 306, 307, 309, 316, 320, 547, 214, 329, 548, 215, 330, 549, 216, 228, 234, 241, 247, 248, 263, 268, 284, 285, 286, 295, 312, 550, 217, 331, 551, 218, 332, 552, 219, 333, 553, 220, 334, 554, 221, 335, 555, 222, 336, 556, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556}; +pfloat K0pr[1415] = {9.999999999999999500e-008, -6.748099080141577400e-001, 9.587587238674218900e-001, -3.380262965696901900e-001, -6.289006455522118100e-001, 1.458932368908371500e+000, 8.103505672584934100e-001, -8.308676110497204000e-002, 2.638152658681099300e+000, 1.000625209233638700e+000, 1.443285740856571400e-001, 1.198960671699122800e+000, 8.042866751960948700e-001, -2.146877760548437900e-002, 1.252109754253975600e+000, 1.681372772953815700e+000, 1.160558110039982400e+000, 8.971595941547876300e-001, 9.934462168535226300e-001, 4.030425643552826300e-003, 4.520907269135507900e-001, 1.957531681292445900e+000, 8.367513704018149100e-001, -8.919073879004054700e-001, 1.364968014685880000e-001, -5.391443069926015200e-001, 1.218605709809697200e+000, 1.379628849398701500e+000, 7.705722581573115600e-002, -9.721580354507602900e-001, 1.341091680254979900e+000, 1.416856131617781900e+000, 1.367782802004573000e+000, 9.310015370881947700e-001, 1.025960903569425500e+000, 4.418055920652105800e-001, 1.797608571927105100e-001, -1.566236421056189400e+000, -1.293790728779894400e-001, -2.548793507296202000e-001, -1.327158583802827700e+000, 8.378869252146687900e-001, 9.208088134425553900e-001, 8.954835779157467300e-001, 1.872488747783192400e+000, 1.607749082930002300e-001, 1.703097419135647200e+000, 1.485966470102646500e+000, 1.950727391193988900e+000, 1.261282074772785800e+000, 2.116080672704367100e+000, 4.418819171779880300e-001, -6.070414095655145600e-001, 2.236741804227308500e-001, -1.390565074056968600e+000, -3.689063294445240100e-001, 6.275925564016111600e-001, 9.419119351808997700e-001, 2.051844704916749900e-002, -2.055013180419911200e+000, -8.138411920140069500e-001, -1.670986440999406000e+000, -4.312826132928389000e-001, -1.317178055102502500e-001, 4.129877571668971700e-002, -1.178000809237306800e-001, -5.094809536848188300e-002, 4.887140456297478000e-001, -6.048920026011540600e-001, -1.622657687025348600e+000, 9.468924561461561400e-002, -1.076752006167445400e+000, -4.544402225817885700e-001, -1.138681599263542200e+000, 6.297099350763062400e-001, 7.161553122227841700e-001, -2.326213079050594200e-001, -2.421425730439526200e-001, -3.527400894253913700e-001, -5.991000491511071500e-001, -4.501982881436522000e-001, -1.073527618321097300e+000, -1.837831580649836900e+000, -1.093506922417250900e+000, 3.123080272148109900e-002, 4.764624397863112500e-001, -9.744593174286131400e-001, -5.475935551016516400e-001, -1.185577848308040100e+000, -1.512429413719079500e+000, -8.503358079552569800e-001, -1.048119449917124500e+000, -2.950353712891531400e-001, 4.436355670528358600e-001, -1.976143927829304500e+000, -1.154872945269262400e-001, -8.267783537066453200e-001, -2.524533500828647400e-001, -2.934013148063512300e-001, -9.559308197633347200e-001, -5.099545278978906400e-001, 7.104569782287112300e-001, 2.586151051423653000e-001, 9.670875274511733200e-001, -1.580472136196336100e-001, 4.036019169202506600e-001, -4.419329075671284400e-001, 1.335760493316310000e-001, -2.443367984060260100e-001, 5.346171843774407700e-001, 9.240837092450902800e-002, 1.000000000000000000e+000, 9.999999999999999500e-008, -7.627629774659758300e+000, -8.317906940770274800e+000, -7.063111046330970300e+000, -8.991213209598194900e+000, -7.132056801314573300e+000, -6.933147988332642300e+000, -8.002850393982971200e+000, -7.763929473153173600e+000, -7.316196508551362500e+000, -6.857489440772187800e+000, -6.933435917031895100e+000, -8.453055934420948600e+000, -7.746956878849250200e+000, -6.987480243537588000e+000, -6.898256465718047200e+000, -7.035033952525910900e+000, -7.332300809407010800e+000, -8.868148466875196000e+000, -7.895445920224761800e+000, -8.477688226774738200e+000, -6.724790281248850500e+000, -8.026080227654171400e+000, -8.247796522362861500e+000, -7.893131787368933100e+000, -7.953077643849715300e+000, -7.085517647070380700e+000, -7.757918623860442500e+000, -9.404980440162075800e+000, -9.111021916635516900e+000, -6.753547752596220200e+000, -6.208328120779675900e+000, -7.460712402671073400e+000, -8.051154905293161700e+000, -6.979795864345947000e+000, -7.285373299414776400e+000, -7.935549231771511300e+000, -7.333663096710840700e+000, -7.549354579130950400e+000, -7.125439770244579300e+000, -8.444455837718113100e+000, -7.607705936847165300e+000, -6.947711222611268100e+000, -7.559561213742542300e+000, -6.633232534378238100e+000, -7.285067573640397100e+000, -7.198034090285221800e+000, -8.301173708858458500e+000, -7.740676955875905200e+000, -8.389317110487786200e+000, -7.030503781850090800e+000, 7.483837125022816400e-001, 9.972172897309477000e-001, 8.635272324715717000e-001, 3.437357445286000600e-001, 1.356057545748600200e+000, 7.747994541454063000e-001, -5.029337660688439900e-001, 7.320209587792132500e-001, 9.007328043370961300e-001, 1.839182838430090300e+000, -1.352604803382542600e+000, 1.440339792882617200e+000, 5.409160633286138600e-001, -9.096356667070149000e-002, 2.145906552675194100e-001, 1.749366326171780000e+000, 1.710862586429138200e+000, 5.617170924142114200e-001, 8.075937970441778900e-001, 5.294053117812258500e-001, 8.007328881544743000e-001, 6.824506852180559600e-001, -4.466422007073587200e-001, 4.125165857556476500e-001, 1.264599468598445900e+000, 1.195482116831558800e+000, 5.815701470999368200e-001, 1.480145121963046200e+000, 1.228974130124139900e+000, -9.887375252743877400e-001, 4.957232610676656800e-001, 2.201242074660017000e-001, -8.949779589135298300e-002, 4.463714750361750200e-001, 1.104458211701637000e+000, 1.146057798756675600e+000, 1.607064328082671100e+000, -3.342540671866551800e-001, -3.733869343080511400e-001, 1.376984209826379600e+000, 1.134842638638303900e+000, 1.578816025652644900e+000, 8.631161307174450800e-003, 6.628552272325566300e-001, -4.235551988694613600e-001, -5.931434773175525700e-002, 1.107744286910284700e+000, 1.308043758809049000e+000, 1.474220016986390400e+000, 6.094036504382410700e-001, 2.586151051423653000e-001, 7.690092056142631100e-001, -1.580472136196336100e-001, 2.410499789745967300e-001, -4.419329075671284400e-001, 6.725262868347948700e-001, -2.443367984060260100e-001, 9.310955439202097700e-001, 9.240837092450902800e-002, 9.816510048711224500e-001, 1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -5.000000000000000000e-001, -5.000000000000000000e-001, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, 9.999999999999999500e-008, 1.000000000000000000e+000, -1.000000000000000000e+000, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -9.999999999999999500e-008, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000, -1.000000000000000000e+000}; +pfloat b[114] = {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, -0.5}; diff --git a/thirdparty/windows/include/ecos/ecos.h b/thirdparty/windows/include/ecos/ecos.h new file mode 100755 index 00000000..36b99629 --- /dev/null +++ b/thirdparty/windows/include/ecos/ecos.h @@ -0,0 +1,323 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#ifndef __ECOS_H__ +#define __ECOS_H__ + +#include "glblopts.h" +#include "spla.h" +#include "cone.h" +#include "kkt.h" + +#if PROFILING > 0 +#include "timer.h" +#endif + +#if CTRLC > 0 +#include "ctrlc.h" +#endif + +/* ECOS VERSION NUMBER - FORMAT: X.Y.Z --------------------------------- */ +#define ECOS_VERSION ("2.0.4") + +/* DEFAULT SOLVER PARAMETERS AND SETTINGS STRUCT ----------------------- */ +#define MAXIT (100) /* maximum number of iterations */ +#define FEASTOL (1E-8) /* primal/dual infeasibility tolerance */ +#define ABSTOL (1E-8) /* absolute tolerance on duality gap */ +#define RELTOL (1E-8) /* relative tolerance on duality gap */ +#define FTOL_INACC (1E-4) /* inaccurate solution feasibility tol. */ +#define ATOL_INACC (5E-5) /* inaccurate solution absolute tol. */ +#define RTOL_INACC (5E-5) /* inaccurate solution relative tol. */ +#define GAMMA (0.99) /* scaling the final step length */ +#define STATICREG (1) /* static regularization: 0:off, 1:on */ +#define DELTASTAT (7E-8) /* regularization parameter */ +#define DELTA (2E-7) /* dyn. regularization parameter */ +#define EPS (1E-13) /* dyn. regularization threshold (do not 0!) */ +#define VERBOSE (1) /* bool for verbosity; PRINTLEVEL < 3 */ +#define NITREF (9) /* number of iterative refinement steps */ +#define IRERRFACT (6) /* factor by which IR should reduce err */ +#define LINSYSACC (1E-14) /* rel. accuracy of search direction */ +#define SIGMAMIN (1E-4) /* always do some centering */ +#define SIGMAMAX (1.0) /* never fully center */ +#define STEPMIN (1E-6) /* smallest step that we do take */ +#define STEPMAX (0.999) /* largest step allowed, also in affine dir. */ +#define SAFEGUARD (500) /* Maximum increase in PRES before + ECOS_NUMERICS is thrown. */ +/*Ecos exponential cone default settings*/ +#ifdef EXPCONE +#define MAX_BK (90) /*Maximum backtracking steps*/ +#define BK_SCALE (0.8) /*Backtracking constant*/ +#define MIN_DISTANCE (0.1) /* dont let sqrt(r), sqrt(-u) or sqrt(v) + become smaller than + MIN_DISTANCE*mu*/ +#define CENTRALITY (1) /*Centrality requirement*/ +#endif + + + +/* EQUILIBRATION METHOD ------------------------------------------------ */ +#define EQUILIBRATE (1) /* use equlibration of data matrices? >0: yes */ +#define EQUIL_ITERS (3) /* number of equilibration iterations */ +#define RUIZ_EQUIL /* define algorithm to use - if both are ... */ +/*#define ALTERNATING_EQUIL*/ /* ... commented out no equlibration is used */ + + +/* EXITCODES ----------------------------------------------------------- */ +#define ECOS_OPTIMAL (0) /* Problem solved to optimality */ +#define ECOS_PINF (1) /* Found certificate of primal infeasibility */ +#define ECOS_DINF (2) /* Found certificate of dual infeasibility */ +#define ECOS_INACC_OFFSET (10) /* Offset exitflag at inaccurate results */ +#define ECOS_MAXIT (-1) /* Maximum number of iterations reached */ +#define ECOS_NUMERICS (-2) /* Search direction unreliable */ +#define ECOS_OUTCONE (-3) /* s or z got outside the cone, numerics? */ +#define ECOS_SIGINT (-4) /* solver interrupted by a signal/ctrl-c */ +#define ECOS_FATAL (-7) /* Unknown problem in solver */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* SETTINGS STRUCT ----------------------------------------------------- */ +typedef struct settings{ + pfloat gamma; /* scaling the final step length */ + pfloat delta; /* regularization parameter */ + pfloat eps; /* regularization threshold */ + pfloat feastol; /* primal/dual infeasibility tolerance */ + pfloat abstol; /* absolute tolerance on duality gap */ + pfloat reltol; /* relative tolerance on duality gap */ + pfloat feastol_inacc; /* primal/dual infeasibility relaxed tolerance */ + pfloat abstol_inacc; /* absolute relaxed tolerance on duality gap */ + pfloat reltol_inacc; /* relative relaxed tolerance on duality gap */ + idxint nitref; /* number of iterative refinement steps */ + idxint maxit; /* maximum number of iterations */ + idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ +#ifdef EXPCONE /*Exponential cone settings*/ + idxint max_bk_iter; /* Maximum backtracking iterations */ + pfloat bk_scale; /* Backtracking scaling */ + pfloat centrality; /* Centrality bound, ignored when centrality vars = 0*/ +#endif +} settings; + + +/* INFO STRUCT --------------------------------------------------------- */ +typedef struct stats{ + pfloat pcost; + pfloat dcost; + pfloat pres; + pfloat dres; + pfloat pinf; + pfloat dinf; + pfloat pinfres; + pfloat dinfres; + pfloat gap; + pfloat relgap; + pfloat sigma; + pfloat mu; + pfloat step; + pfloat step_aff; + pfloat kapovert; + idxint iter; + idxint nitref1; + idxint nitref2; + idxint nitref3; +#if PROFILING > 0 + pfloat tsetup; + pfloat tsolve; +#endif +#if PROFILING > 1 + pfloat tfactor; + pfloat tkktsolve; + pfloat torder; + pfloat tkktcreate; + pfloat ttranspose; + pfloat tperm; + pfloat tfactor_t1; + pfloat tfactor_t2; +#endif +#ifdef EXPCONE + /* Counters for backtracking, each of these counts + * one condition that can fail and cause a backtrack + */ + idxint pob; /* Potential decreases */ + idxint cb; /* Centrality violations */ + idxint cob; /* The s'z of one cone is too small w.r.t. mu */ + idxint pb; /* Primal infeasibility */ + idxint db; /* Dual infeasibility */ + idxint affBack; /* Total affine backtracking steps */ + idxint cmbBack; /* Total combined backtracking steps */ + + pfloat centrality; /*Centrality at the end of the backtracking*/ +#endif + +} stats; + + +/* ALL DATA NEEDED BY SOLVER ------------------------------------------- */ +typedef struct pwork{ + /* dimensions */ + idxint n; /* number of primal variables x */ + idxint m; /* number of conically constrained variables s */ + idxint p; /* number of equality constraints */ + idxint D; /* degree of the cone */ + + /* variables */ + pfloat* x; /* primal variables */ + pfloat* y; /* multipliers for equality constaints */ + pfloat* z; /* multipliers for conic inequalities */ + pfloat* s; /* slacks for conic inequalities */ + pfloat* lambda; /* scaled variable */ + pfloat kap; /* kappa (homogeneous embedding) */ + pfloat tau; /* tau (homogeneous embedding) */ + + /* best iterate seen so far */ + /* variables */ + pfloat* best_x; /* primal variables */ + pfloat* best_y; /* multipliers for equality constaints */ + pfloat* best_z; /* multipliers for conic inequalities */ + pfloat* best_s; /* slacks for conic inequalities */ + pfloat best_kap; /* kappa (homogeneous embedding) */ + pfloat best_tau; /* tau (homogeneous embedding) */ + pfloat best_cx; + pfloat best_by; + pfloat best_hz; + stats* best_info; /* info of best iterate */ + + /* temporary stuff holding search direction etc. */ + pfloat* dsaff; + pfloat* dzaff; + pfloat* W_times_dzaff; + pfloat* dsaff_by_W; + pfloat* saff; + pfloat* zaff; + + /* cone */ + cone* C; + + /* problem data */ + spmat* A; spmat* G; pfloat* c; pfloat* b; pfloat* h; + + /* indices that map entries of A and G to the KKT matrix */ + idxint *AtoK; idxint *GtoK; + +#if defined EQUILIBRATE && EQUILIBRATE > 0 + /* equilibration vector */ + pfloat *xequil; + pfloat *Aequil; + pfloat *Gequil; +#endif + + /* scalings of problem data */ + pfloat resx0; pfloat resy0; pfloat resz0; + + /* residuals */ + pfloat *rx; pfloat *ry; pfloat *rz; pfloat rt; + pfloat hresx; pfloat hresy; pfloat hresz; + + /* norm iterates */ + pfloat nx,ny,nz,ns; + + /* temporary storage */ + pfloat cx; pfloat by; pfloat hz; pfloat sz; + + /* KKT System */ + kkt* KKT; + + /* info struct */ + stats* info; + + /* settings struct */ + settings* stgs; + +} pwork; + + +/* SOME USEFUL MACROS -------------------------------------------------- */ +#define MAX(X,Y) ((X) < (Y) ? (Y) : (X)) /* maximum of 2 expressions */ +/* safe division x/y where y is assumed to be positive! */ +#define SAFEDIV_POS(X,Y) ( (Y) < EPS ? ((X)/EPS) : (X)/(Y) ) + + +/* METHODS */ + +/* set up work space */ +/* could be done by codegen */ +pwork* ECOS_setup(idxint n, idxint m, idxint p, idxint l, idxint ncones, idxint* q, idxint nex, + pfloat* Gpr, idxint* Gjc, idxint* Gir, + pfloat* Apr, idxint* Ajc, idxint* Air, + pfloat* c, pfloat* h, pfloat* b); + + +#ifdef EXPCONE +pfloat expConeLineSearch(pwork* w, pfloat dtau, pfloat dkappa, idxint affine); +#endif + +/* solve */ +idxint ECOS_solve(pwork* w); + +/** + * Cleanup: free memory (not used for embedded solvers, only standalone) + * + * Use the second argument to give the number of variables to NOT free. + * This is useful if you want to use the result of the optimization without + * copying over the arrays. One use case is the MEX interface, where we + * do not want to free x,y,s,z (depending on the number of LHS). + */ +void ECOS_cleanup(pwork* w, idxint keepvars); + + +/** + * Version: returns the current version number + * Use a character array of length 7 to obtain the version number + * in the format + * x.y.zzz + * where x is the major, y the minor and zzz the build number + */ +const char* ECOS_ver(void); + + +/* ------------------- EXPERT LEVEL INTERFACES ---------------------- */ + +/* + * Updates one element of the RHS vector h of inequalities + * After the call, w->h[idx] = value (but equilibrated) + */ +void ecos_updateDataEntry_h(pwork* w, idxint idx, pfloat value); + +/* + * Updates one element of the OBJ vector c of inequalities + * After the call, w->c[idx] = value (but equilibrated) + */ +void ecos_updateDataEntry_c(pwork* w, idxint idx, pfloat value); + +/* + * Updates numerical data for G, A, c, h, and b, + * and re-equilibrates. + * Then updates the corresponding KKT entries. + */ +void ECOS_updateData(pwork *w, pfloat *Gpr, pfloat *Apr, + pfloat* c, pfloat* h, pfloat* b); + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/thirdparty/windows/include/ecos/ecos_bb.h b/thirdparty/windows/include/ecos/ecos_bb.h new file mode 100644 index 00000000..dc95b03a --- /dev/null +++ b/thirdparty/windows/include/ecos/ecos_bb.h @@ -0,0 +1,208 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* + * The branch and bound module is (c) Han Wang, Stanford University, + * [hanwang2@stanford.edu] + */ + +#ifndef __ecos_bb_H__ +#define __ecos_bb_H__ + +#include "ecos.h" +#include "spla.h" +#include "glblopts.h" + +/* Print verbosity */ +#define MI_PRINTLEVEL (1) + +/* ecos_bb configuration settings */ +#define MI_ABS_EPS (1E-6) +#define MI_REL_EPS (1E-3) +#define MI_MAXITER (1000) +#define MI_INT_TOL (FTOL_INACC) + +/* Flags */ +#define MI_SOLVED_NON_BRANCHABLE (3) +#define MI_SOLVED_BRANCHABLE (2) +#define MI_NOT_SOLVED (1) +#define MI_FREE (0) + +#define MI_ONE (1) +#define MI_ZERO (0) +#define MI_STAR (-1) + +/*** Exit flags ***/ +/*ECOS_BB found optimal solution*/ +#define MI_OPTIMAL_SOLN (ECOS_OPTIMAL) +/*ECOS_BB proved problem is infeasible*/ +#define MI_INFEASIBLE (ECOS_PINF) +/*ECOS_BB proved problem is unbounded*/ +#define MI_UNBOUNDED (ECOS_DINF) +/*ECOS_BB hit maximum iterations but a feasible solution was found and the best seen feasible solution was returned*/ +#define MI_MAXITER_FEASIBLE_SOLN (ECOS_OPTIMAL + ECOS_INACC_OFFSET) +/*ECOS_BB hit maximum iterations without finding a feasible solution*/ +#define MI_MAXITER_NO_SOLN (ECOS_PINF + ECOS_INACC_OFFSET) +/*ECOS_BB hit maximum iterations without finding a feasible solution that was unbounded*/ +#define MI_MAXITER_UNBOUNDED (ECOS_DINF + ECOS_INACC_OFFSET) + +/* Max integer and all smaller integer representable by single precision */ +#define MAX_FLOAT_INT (8388608) + +/* define INFINITY and isinf for MSFT */ +#ifdef _MSC_VER +#include "float.h" +#ifndef INFINITY +#define INFINITY (DBL_MAX+DBL_MAX) +#endif +/* this will also return true if x is nan, but we don't check that anyway */ +#ifndef isinf +#define isinf(x) (!_finite(x)) +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct settings_bb{ + idxint maxit; /* maximum number of iterations */ + idxint verbose; /* verbosity bool for PRINTLEVEL < 3 */ + pfloat abs_tol_gap; /* termination criteria |U-L| */ + pfloat rel_tol_gap; /* termination criteria for |U-L|/|L| < 3 */ + pfloat integer_tol; /* integer rounding tolerance */ +} settings_bb; + +typedef struct node { + char status; + pfloat L; + pfloat U; + idxint split_idx; + pfloat split_val; +} node; + +/* Wrapper for mixed integer module */ +typedef struct ecos_bb_pwork{ + /* Mixed integer data */ + idxint num_bool_vars; + idxint num_int_vars; + + node* nodes; + char* bool_node_ids; + pfloat* int_node_ids; + + idxint* bool_vars_idx; + idxint* int_vars_idx; + + /* ECOS data */ + pwork* ecos_prob; + + /* Modified pointers to ecos internals */ + /* Use these to edit or reset the h variables */ + spmat* A; + spmat* G; + pfloat* c; + pfloat* b; + pfloat* h; + + /* best iterate seen so far */ + /* variables */ + pfloat* x; /* primal variables */ + pfloat* y; /* multipliers for equality constaints */ + pfloat* z; /* multipliers for conic inequalities */ + pfloat* s; /* slacks for conic inequalities */ + pfloat kap; /* kappa (homogeneous embedding) */ + pfloat tau; /* tau (homogeneous embedding) */ + stats* info; /* info of best iterate */ + pfloat global_U; + pfloat global_L; + + /* Tmp data */ + char* tmp_bool_node_id; + pfloat* tmp_int_node_id; + idxint iter; + + /* Stored pointers to prevent memory leaks */ + pfloat* Gpr_new; + idxint* Gjc_new; + idxint* Gir_new; + pfloat* h_new; + + /* settings struct */ + settings* ecos_stgs; + settings_bb* stgs; + idxint default_settings; + +} ecos_bb_pwork; + +ecos_bb_pwork* ECOS_BB_setup( + idxint n, idxint m, idxint p, + idxint l, idxint ncones, idxint* q, idxint nex, + pfloat* Gpr, idxint* Gjc, idxint* Gir, + pfloat* Apr, idxint* Ajc, idxint* Air, + pfloat* c, pfloat* h, pfloat* b, + idxint num_bool_vars, idxint* bool_vars_idx, + idxint num_int_vars, idxint* int_vars_idx, + settings_bb* stgs); + +idxint ECOS_BB_solve(ecos_bb_pwork* prob); + +void ECOS_BB_cleanup(ecos_bb_pwork* prob, idxint num_vars_keep); + +void updateDataEntry_h(ecos_bb_pwork* w, idxint idx, pfloat value); + +void updateDataEntry_c(ecos_bb_pwork* w, idxint idx, pfloat value); + +settings_bb* get_default_ECOS_BB_settings(); + +/* Calculate the offset into the node_id array */ +static inline char* get_bool_node_id(idxint idx, ecos_bb_pwork* prob){ + return &prob->bool_node_ids[prob->num_bool_vars * idx]; +} + +static inline pfloat* get_int_node_id(idxint idx, ecos_bb_pwork* prob){ + return &prob->int_node_ids[prob->num_int_vars * idx * 2]; +} + +static inline pfloat abs_2(pfloat number){ + return number < 0.0 ? -number : number; +} + +static inline pfloat pfloat_round(pfloat number){ + return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5); +} + +static inline pfloat pfloat_ceil(pfloat number, pfloat integer_tol){ + return (pfloat) (number < 0 ? (int) number : (int) (number+(1-integer_tol)) ); +} + +static inline pfloat pfloat_floor(pfloat number, pfloat integer_tol){ + return (pfloat) (number < 0 ? (int) (number-(1-integer_tol)) : (int) number); +} + +static inline idxint float_eqls(pfloat a, pfloat b, pfloat integer_tol){ + return abs_2(a - b) < integer_tol; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/windows/include/ecos/equil.h b/thirdparty/windows/include/ecos/equil.h new file mode 100755 index 00000000..51f3fa6d --- /dev/null +++ b/thirdparty/windows/include/ecos/equil.h @@ -0,0 +1,50 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* Equilibration module (c) Eric Chu, March 2014 */ + +/** + * used predominantly in preproc.c + */ + +#include "ecos.h" + +#if defined EQUILIBRATE && EQUILIBRATE > 0 + +#ifndef __EQUIL_H__ +#define __EQUIL_H__ + +#include "glblopts.h" +#include "ecos.h" + +/** + * set_equilibration: This routine takes the workspace and sets + * the equilibration vectors. + */ +void set_equilibration(pwork *w); + +/** + * unset_equilibration: This routine takes the workspace and + * undoes the equilibration. + */ +void unset_equilibration(pwork *w); + + +#endif +#endif diff --git a/thirdparty/windows/include/ecos/expcone.h b/thirdparty/windows/include/ecos/expcone.h new file mode 100755 index 00000000..3da725c8 --- /dev/null +++ b/thirdparty/windows/include/ecos/expcone.h @@ -0,0 +1,87 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * The exponental cone module is (c) Santiago Akle, Stanford University, + * [akle@stanford.edu] + * + */ + +#include "cone.h" +#include "glblopts.h" +#include "wright_omega.h" +#include +#ifndef __ECOS_EXP_H__ +#define __ECOS_EXP_H__ + +#if defined EXPCONE +/* + * Exponential cone structure: We save the index where each expcone Hessian + * column starts in the csr format. For each cone we also allocate space for + * the gradient of the barrier at each cone and the values of entries of the + * Hessian matrix + */ +typedef struct expcone +{ + idxint colstart[3]; /* All cones are fixed size, we store the index + * where the column of the hessian starts in the + * permuted Newton system. + */ + pfloat v[6]; /* Uper triangular section of the hessian */ + pfloat g[3]; /* Gradient of the barrier */ +} expcone; + +/* + * Evaluates the Hessian of the exponential dual cone barrier at the triplet + * w[0],w[1],w[2], and stores the upper triangular part of the matrix mu*H(w) + * at v[0],...,v[5]. The entries of the Hessian are arranged columnwise into v + */ +void evalExpHessian(pfloat* w, pfloat* v, pfloat mu); + +/* + * Evaluates the gradient of the dual exponential cone barrier g^\star(z) at the triplet + * w[0],w[1],w[2], and stores the result at g[0],..,g[2]. + */ +void evalExpGradient(pfloat* w, pfloat* g); + +/* + * Computes f_e(s_e) + f^\star_e(z_e) + */ +pfloat evalBarrierValue(pfloat* siter, pfloat *ziter, idxint fc, idxint nexc); + +/* + * Multiplies by y+=muH*x + */ +void scaleToAddExpcone(pfloat* y, pfloat* x, expcone* expcones, idxint nexc, idxint fc); + +/* + * Returns 1 if s is primal feasible w.r.t the primal exponential + * cone and 0 i.o.c + */ +idxint evalExpPrimalFeas(pfloat *s, idxint nexc); + +/* + * Returns 1 if s is dual feasible w.r.t the dual exponential + * cone and 0 i.o.c + */ +idxint evalExpDualFeas(pfloat *s, idxint nexc); + +#endif +#endif /* End ifndef __ECOS_EXP_H__ */ + diff --git a/thirdparty/windows/include/ecos/glblopts.h b/thirdparty/windows/include/ecos/glblopts.h new file mode 100755 index 00000000..0adb8400 --- /dev/null +++ b/thirdparty/windows/include/ecos/glblopts.h @@ -0,0 +1,118 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* data type definitions used with ECOS */ + +#ifndef __GLBLOPTS_H__ +#define __GLBLOPTS_H__ + +/* DATA TYPES ---------------------------------------------------------- */ +typedef double pfloat; /* for numerical values */ + +/* SET PRINT LEVEL ----------------------------------------------------- */ +#ifndef PRINTLEVEL +#define PRINTLEVEL (2) /* 0: no prints */ + /* 1: only final info */ + /* 2: progress print per iteration */ + /* 3: debug level, enables print & dump fcns. */ +#endif + +#define MATLAB_FLUSH_PRINTS + /* print each iteration directly to Matlab. */ + /* this options considerably slows down the */ + /* solver, but is useful if you solve big */ + /* problems. */ + +/* SET PROFILING LEVEL ------------------------------------------------- */ +#ifndef PROFILING +#define PROFILING (1) /* 0: no timing information */ + /* 1: runtime (divided in setup and solve) */ + /* 2: detailed profiling */ +#endif + +/* SET DEBUG LEVEL ----------------------------------------------------- */ +#ifndef DEBUG +#define DEBUG (0) /* 0: no debugging information */ + /* 1: debug info & dump intermediate results */ + /* (flag used only for development) */ +#endif + +/* SYSTEM INCLUDES FOR NAN & INFINITY ---------------------------------- */ +#include + +/* NAN ----------------------------------------------------------------- */ +#ifndef NAN +#define NAN ((double)0x7ff8000000000000) +#endif + +/* INF ---------------------------------------------------------------- */ +#ifndef INFINITY +#define INFINITY ((double)0x7ff0000000000000) +#endif + +/* Exponential cone */ +#define EXPCONE /*When defined the exponential cone solver code is enabled*/ + +/* SYSTEM INCLUDES FOR PRINTING ---------------------------------------- */ +#if DEBUG || PRINTLEVEL > 0 +#include +#endif + +/* PRINTTEXT ----------------------------------------------------------- */ +#if PRINTLEVEL > 0 +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#define PRINTTEXT mexPrintf +#elif defined PYTHON +#include +#define PRINTTEXT PySys_WriteStdout +#else +#define PRINTTEXT printf +#endif +#else +#define PRINTTEXT(...) +#endif + +#include "SuiteSparse_config.h" + +/* use this if pfloat is float: */ +/* #define NAN ((float)0x7fc00000) */ + +/* USE SAME NUMBER REPRESENTATION FOR INDEXING AS AMD AND LDL ---------- */ +typedef SuiteSparse_long idxint; + +/* SYSTEM INCLUDE IF COMPILING FOR MATLAB ------------------------------ */ +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#endif + +/* CHOOSE RIGHT MEMORY MANAGER ----------------------------------------- */ +#ifdef MATLAB_MEX_FILE +#define MALLOC mxMalloc +#define FREE mxFree +#else +#define MALLOC malloc +#define FREE free +#endif + +/* Other commonly used macros ----------------------------------------- */ +#define inline __inline + +#endif diff --git a/thirdparty/windows/include/ecos/kkt.h b/thirdparty/windows/include/ecos/kkt.h new file mode 100755 index 00000000..a2f58f69 --- /dev/null +++ b/thirdparty/windows/include/ecos/kkt.h @@ -0,0 +1,135 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* The KKT module. + * Handles all computation related to KKT matrix: + * - updating the matrix + * - its factorization + * - solving for search directions + * - etc. + */ + + +#ifndef __KKT_H__ +#define __KKT_H__ + +#include "glblopts.h" +#include "spla.h" +#include "cone.h" + +typedef struct kkt{ + spmat* PKPt; /* Permuted KKT matrix, upper part only */ + spmat* L; /* LDL factor L */ + + pfloat* D; /* diagonal matrix D */ + pfloat* work1; /* workspace needed for factorization */ + pfloat* work2; /* workspace needed for factorization */ + pfloat* work3; /* workspace needed for factorization */ + pfloat* work4; /* workspace needed for factorization */ + pfloat* work5; /* workspace needed for factorization */ + pfloat* work6; /* workspace needed for factorization */ + pfloat* RHS1; /* Right hand side 1 */ + pfloat* RHS2; /* Right hand side 2 */ + pfloat* dx1; /* search direction of size n */ + pfloat* dx2; /* search direction of size n */ + pfloat* dy1; /* search direction of size p */ + pfloat* dy2; /* search direction of size p */ + pfloat* dz1; /* search direction of size m */ + pfloat* dz2; /* search direction of size m */ + + idxint* P; /* permutation */ + idxint* Pinv; /* reverse permutation */ + idxint* PK; /* permutation of row indices of KKT matrix */ + idxint* Parent; /* Elimination tree of factorization */ + idxint* Sign; /* Permuted sign vector for regularization */ + idxint* Pattern; /* idxint workspace needed for factorization */ + idxint* Flag; /* idxint workspace needed for factorization */ + idxint* Lnz; /* idxint workspace needed for factorization */ + + pfloat delta; /* size of regularization */ +} kkt; + +/* Return codes */ +#define KKT_PROBLEM (0) +#define KKT_OK (1) + +/* METHODS */ + +/** + * Factorization of KKT matrix. Just a convenient wrapper for the LDL call. + * The second argument delta determindes the threshold of dynamic regularization, + * while the last argument is the regularization parameter if it becomes active. + * + * If detailed profiling is turned on, the function returns the accumulated times + * for sparsity pattern computation in t1 and for numerical solve in t2. + */ +#if PROFILING > 1 +idxint kkt_factor(kkt* KKT, pfloat eps, pfloat delta, pfloat *t1, pfloat *t2); +#else +idxint kkt_factor(kkt* KKT, pfloat eps, pfloat delta); +#endif + + +/** + * Solves the permuted KKT system and returns the unpermuted search directions. + * + * On entry, the factorization of the permuted KKT matrix, PKPt, + * is assumed to be up to date (call kkt_factor beforehand to achieve this). + * The right hand side, Pb, is assumed to be already permuted. + * + * On exit, the resulting search directions are written into dx, dy and dz, + * where these variables are permuted back to the original ordering. + * + * KKT->nitref iterative refinement steps are applied to solve the linear system. + * + * Returns the number of iterative refinement steps really taken. + */ +idxint kkt_solve(kkt* KKT, + spmat* A, spmat* G, + pfloat* Pb, + pfloat* dx, pfloat* dy, pfloat* dz, + idxint n, idxint p, idxint m, + cone* C, + idxint isinit, + idxint nitref); + + +/** + * Updates the permuted KKT matrix by copying in the new scalings. + */ +void kkt_update(spmat* PKP, idxint* P, cone *C); + + +/** + * Initializes the (3,3) block of the KKT matrix to produce the matrix + * + * [0 A' G'] + * K = [A 0 0 ] + * [G 0 -I ] + * + * It is assumed that the A,G have been already copied in appropriately, + * and that enough memory has been allocated (this is done in preproc.c module). + * + * Note that the function works on the permuted KKT matrix. + */ +void kkt_init(spmat* PKP, idxint* P, cone *C); + + +#endif diff --git a/thirdparty/windows/include/ecos/ldl.h b/thirdparty/windows/include/ecos/ldl.h new file mode 100755 index 00000000..53f861a2 --- /dev/null +++ b/thirdparty/windows/include/ecos/ldl.h @@ -0,0 +1,98 @@ +/* ========================================================================== */ +/* === ldl.h: include file for the LDL package ============================= */ +/* ========================================================================== */ + +/* Copyright (c) Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See README for the License. + * + * Stripped down by Alexander Domahidi, 2012. + */ + +#include "../../include/glblopts.h" +#include "../../include/ecos.h" + +#include "SuiteSparse_config.h" + +#ifdef LDL_LONG +#define LDL_int SuiteSparse_long +#define LDL_ID SuiteSparse_long_id + +#define LDL_symbolic2 ldl_l_symbolic2 +#define LDL_numeric2 ldl_l_numeric2 +#define LDL_lsolve ldl_l_lsolve +#define LDL_lsolve2 ldl_l_lsolve2 +#define LDL_dsolve ldl_l_dsolve +#define LDL_ltsolve ldl_l_ltsolve + +#else +#define LDL_int int +#define LDL_ID "%d" + +#define LDL_symbolic2 ldl_symbolic2 +#define LDL_numeric2 ldl_numeric2 +#define LDL_lsolve ldl_lsolve +#define LDL_lsolve2 ldl_lsolve2 +#define LDL_dsolve ldl_dsolve +#define LDL_ltsolve ldl_ltsolve + +#endif + +/* ========================================================================== */ +/* === int version ========================================================== */ +/* ========================================================================== */ + +void ldl_symbolic2 (int n, int Ap [ ], int Ai [ ], int Lp [ ], int Parent [ ], int Lnz [ ], int Flag [ ]) ; + +int ldl_numeric2 (int n, int Ap [ ], int Ai [ ], double Ax [ ], + int Lp [ ], int Parent [ ], int Sign[], double eps, double delta, int Lnz [ ], int Li [ ], double Lx [ ], + double D [ ], double Y [ ], int Pattern [ ], int Flag [ ] +#if PROFILING > 1 + ,double *t1, double *t2 +#endif + ) ; + +void ldl_lsolve (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ]) ; +void ldl_lsolve2 (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ], double X [ ]) ; + +void ldl_dsolve (int n, double X [ ], double D [ ]) ; + +void ldl_ltsolve (int n, double X [ ], int Lp [ ], int Li [ ], + double Lx [ ]) ; + +/* ========================================================================== */ +/* === long version ========================================================= */ +/* ========================================================================== */ + +void ldl_l_symbolic2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], + SuiteSparse_long Ai [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Parent [ ], SuiteSparse_long Lnz [ ], + SuiteSparse_long Flag [ ]); + +SuiteSparse_long ldl_l_numeric2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], + SuiteSparse_long Ai [ ], double Ax [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Parent [ ], SuiteSparse_long Sign [ ], double eps, double delta, SuiteSparse_long Lnz [ ], + SuiteSparse_long Li [ ], double Lx [ ], double D [ ], double Y [ ], + SuiteSparse_long Pattern [ ], SuiteSparse_long Flag [ ] +#if PROFILING > 1 + ,double *t1, double *t2 +#endif + ) ; + +void ldl_l_lsolve (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ]) ; +void ldl_l_lsolve2 (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ], double X [ ]) ; + +void ldl_l_dsolve (SuiteSparse_long n, double X [ ], double D [ ]) ; + +void ldl_l_ltsolve (SuiteSparse_long n, double X [ ], SuiteSparse_long Lp [ ], + SuiteSparse_long Li [ ], double Lx [ ]) ; + +/* ========================================================================== */ +/* === LDL version ========================================================== */ +/* ========================================================================== */ + +#define LDL_DATE "April 6, 2013, with dynamic regularization by A. Domahidi" +#define LDL_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define LDL_MAIN_VERSION 2 +#define LDL_SUB_VERSION 1 +#define LDL_SUBSUB_VERSION 0 +#define LDL_VERSION LDL_VERSION_CODE(LDL_MAIN_VERSION,LDL_SUB_VERSION) diff --git a/thirdparty/windows/include/ecos/spla.h b/thirdparty/windows/include/ecos/spla.h new file mode 100755 index 00000000..5e8e1739 --- /dev/null +++ b/thirdparty/windows/include/ecos/spla.h @@ -0,0 +1,98 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Sparse linear algebra library for solver, i.e. no memory manager + * such as malloc is accessed by this module. + */ + +#ifndef __SPLA_H__ +#define __SPLA_H__ + +#include "glblopts.h" + +/* Data structure for sparse matrices */ +typedef struct spmat{ + idxint* jc; + idxint* ir; + pfloat* pr; + idxint n; + idxint m; + idxint nnz; +} spmat; + + +/* SPARSE MATRIX OPERATIONS PROVIDED BY THIS MODULE -------------------- */ + +/* + * Sparse matrix-vector multiply for operations + * + * y = A*x (if a > 0 && newVector == 1) + * y += A*x (if a > 0 && newVector == 0) + * y = -A*x (if a < 0 && newVector == 1) + * y -= A*x (if a < 0 && newVector == 0) + * + * where A is a sparse matrix and both x and y are assumed to be dense. + */ +void sparseMV(spmat* A, pfloat* x, pfloat* y, idxint a, idxint newVector); + + +/* + * Sparse matrix-transpose-vector multiply with subtraction. + * + * If newVector > 0, then this computes y = -A'*x, + * otherwise y -= A'*x, + * + * where A is a sparse matrix and both x and y are assumed to be dense. + * If skipDiagonal == 1, then the contributions of diagonal elements are + * not counted. + * + * NOTE: The product is calculating without explicitly forming the + * transpose. + */ +void sparseMtVm(spmat* A, pfloat* x, pfloat* y, idxint newVector, idxint skipDiagonal); + + +/* + * Vector addition y += x of size n. + */ +void vadd(idxint n, pfloat* x, pfloat* y); + +/* + * Vector subtraction with scaling: y -= a*x of size n. + */ +void vsubscale(idxint n, pfloat a, pfloat* x, pfloat* y); + +/* + * 2-norm of a vector. + */ +pfloat norm2(pfloat* v, idxint n); + +/* + * inf-norm of a vector. + */ +pfloat norminf(pfloat* v, idxint n); + +/* + * ECOS dot product z = x'*y of size n. + */ +pfloat eddot(idxint n, pfloat* x, pfloat* y); + + +#endif diff --git a/thirdparty/windows/include/ecos/splamm.h b/thirdparty/windows/include/ecos/splamm.h new file mode 100755 index 00000000..813bc23d --- /dev/null +++ b/thirdparty/windows/include/ecos/splamm.h @@ -0,0 +1,126 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +/* + * Sparse linear algebra library for setup phase, i.e. this module + * accesses malloc and hence should not go on an embedded platform. + */ + +#ifndef __SPLAMM_H__ +#define __SPLAMM_H__ + +#include "glblopts.h" +#include "spla.h" + + +/** + * Create a sparse matrix from existing arrays. + */ +spmat* EcosCreateSparseMatrix(idxint m, idxint n, idxint nnz, idxint* jc, idxint* ir, pfloat* pr); + + +/** + * Create a new sparse matrix (uses MALLOC!) + */ +spmat* newSparseMatrix(idxint m, idxint n, idxint nnz); + +/** + * Create a new sparse matrix (uses FREE!) + */ +void freeSparseMatrix(spmat* M); + + +/** + * Transpose a matrix; returns A = M' (uses malloc!) + */ +spmat* transposeSparseMatrix(spmat* M, idxint* MtoMt); + + +/** + * Permutes a symmetric matrix with only the upper triangular part stored. + * Writes the upper triangular part of C = A(p,p) in column compressed + * storage format. + * + * The function additionally returns the mapping PK that maps the row indices + * of the sparse matrix A on the row indices of C, such that C[P[k]] = A[k]. + * + * NOTE: The matrix C and the vector PK are NOT created within this function + * - you need to allocate them beforehand!! + * + * If PK is NULL then the last output argument is ignored. + */ +void permuteSparseSymmetricMatrix(spmat* A, idxint* pinv, spmat* C, idxint* PK); + + +/** + * Returns the inverse of permutation p of length n. + */ +void pinv(idxint n, idxint* p, idxint* pinv); + + +/** + * Returns a copy of a sparse matrix A. + */ +spmat* copySparseMatrix(spmat* A); + +/* ============================= DEBUG FUNCTIONS ======================= */ +#if PRINTLEVEL > 0 + +/** + * Prints a dense matrix. + */ +void printDenseMatrix(pfloat *M, idxint dim1, idxint dim2, char *name); + + +/** + * Prints a dense integer matrix. + */ +void printDenseMatrix_i(idxint *M, idxint dim1, idxint dim2, char *name); + + +/** + * Prints a sparse matrix. + */ +void printSparseMatrix(spmat* M); + +#endif + +#if DEBUG + +/** + * Dumps a sparse matrix in Matlab format. + * Use SPCONVERT to read in the file. + */ +void dumpSparseMatrix(spmat* M, char* fn); + + +/** + * Dumps a dense matrix of doubles to a CSV file. + */ +void dumpDenseMatrix(pfloat *M, int dim1, int dim2, char *fn); + +/** + * Dumps a dense matrix of integers to a CSV file. + */ +void dumpDenseMatrix_i(idxint *M, int dim1, int dim2, char *fn); + +#endif + +#endif diff --git a/thirdparty/windows/include/ecos/timer.h b/thirdparty/windows/include/ecos/timer.h new file mode 100755 index 00000000..d450535c --- /dev/null +++ b/thirdparty/windows/include/ecos/timer.h @@ -0,0 +1,75 @@ +/* + * ECOS - Embedded Conic Solver. + * Copyright (C) 2012-2015 A. Domahidi [domahidi@embotech.com], + * Automatic Control Lab, ETH Zurich & embotech GmbH, Zurich, Switzerland. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Interface for the built-in timer of ECOS. + */ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "glblopts.h" + +#if PROFILING > 0 + +#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) + +/* Use Windows QueryPerformanceCounter for timing */ +#include + +typedef struct timer{ + LARGE_INTEGER tic; + LARGE_INTEGER toc; + LARGE_INTEGER freq; +} timer; + + +#elif (defined __APPLE__) + +#include + +/* Use MAC OSX mach_time for timing */ +typedef struct timer{ + uint64_t tic; + uint64_t toc; + mach_timebase_info_data_t tinfo; +} timer; + + + +#else + +/* Use POSIX clocl_gettime() for timing on non-Windows machines */ +#include +#include + +typedef struct timer{ + struct timespec tic; + struct timespec toc; +} timer; + +#endif + +/* METHODS are the same for both */ +void tic(timer* t); +pfloat toc(timer* t); + +#endif /* END IF PROFILING > 0 */ + +#endif +/* END IFDEF __TIMER_H__ */ diff --git a/thirdparty/windows/include/ecos/wright_omega.h b/thirdparty/windows/include/ecos/wright_omega.h new file mode 100755 index 00000000..6f4b531b --- /dev/null +++ b/thirdparty/windows/include/ecos/wright_omega.h @@ -0,0 +1,26 @@ +/** + * Santiago Akle + * ICME Stanford University 2014 + * + * Computes the value \omega(z) defined as the solution y to + * the equation y+log(y) = z for z real and z>=1. + * Follows the recommendations by + * PIERS W. LAWRENCE, ROBERT M. CORLESS, and DAVID J. JEFFREY. + * Published in: + * Algorithm 917: Complex Double-Precision Evaluation of the Wright \omega Function + * ACM Transactions on Mathematical Software (TOMS) TOMS Homepage table of contents archive + * Volume 38 Issue 3, April 2012 + * Article No. 20 + * Publication Date 2012-04-01 (yyyy-mm-dd) + * Publisher ACM New York, NY, USA + * ISSN: 0098-3500 EISSN: 1557-7295 doi>10.1145/2168773.2168779 + */ + +#include "glblopts.h" + +#if (defined _WIN32 || defined _WIN64 || defined _WINDLL ) +#define _USE_MATH_DEFINES +#endif +#include + +pfloat wrightOmega(pfloat z); diff --git a/thirdparty/windows/lib/x64/AMD.lib b/thirdparty/windows/lib/x64/AMD.lib new file mode 100755 index 0000000000000000000000000000000000000000..153ff0ca01fcb6d08f9e06f652a4db1d33255cb9 GIT binary patch literal 91490 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 -tiqeV7a2cv^~ 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

      )Ti8J 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 literal 0 HcmV?d00001 diff --git a/thirdparty/windows/lib/x64/ECOS_BB.lib b/thirdparty/windows/lib/x64/ECOS_BB.lib new file mode 100755 index 0000000000000000000000000000000000000000..5d51692607e055bd1fa28c319b733409a0e7af09 GIT binary patch literal 294072 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 literal 0 HcmV?d00001 diff --git a/thirdparty/windows/lib/x64/LDL.lib b/thirdparty/windows/lib/x64/LDL.lib new file mode 100755 index 0000000000000000000000000000000000000000..0e2638ee1e32e79082279f5734a6c3286aebef37 GIT binary patch literal 22026 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

      K)zqJn5@OPio1K<+CG4P<8_K4inXW$}=b%kL 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 literal 0 HcmV?d00001 diff --git a/thirdparty/windows/lib/x86/ECOS.lib b/thirdparty/windows/lib/x86/ECOS.lib new file mode 100755 index 0000000000000000000000000000000000000000..a8013c6aa6b9109b72cf91249f393adf7a9236d8 GIT binary patch literal 205028 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

      343@T*R3q1%@``hU1Zy*#$^TnRs@BkZ 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 literal 0 HcmV?d00001 diff --git a/thirdparty/windows/lib/x86/ECOS_BB.lib b/thirdparty/windows/lib/x86/ECOS_BB.lib new file mode 100755 index 0000000000000000000000000000000000000000..981d647d1d0e13f73ee0b65c789d8c548ff5f10a GIT binary patch literal 256496 zcmeFa34B!5-3EL^0vVDZ2}Z@OL_x(3LJ|lRt4xv!8JWopv#?ln%rb#MNMaU5D>8~! z;)qMNt#;EEeQRr5txGqxZnWBJi>>Wjtl&~Xd*>ztaq0K_e&5dv zljof0{LjAs?{ZE!tEs1D#n}bZ%QCMSGs|aI&YCrI&a6znTv;n;RLzja3kxjEy1}xJ zF8yG?Gp1M;f6FdE`0uho%gXk<`F_iK55Ju0=UG{QSJhZK*?wRByOr}^eg|%`a{i0I zQTN?xeOSNTlk=>szqJ#r+z^A2k>SIZpPAvH z`Q|ovdM@s1U%sL*v^u%G$x8IKBjmm={PDGP_12;a`jXM^rk>tpu&J-7eXW&f>FT~D zlWFTox@0<&7iWreCwo@+>yV33S+=#x*2?Lro;4dWC_Y&=vwF_#WU`{Ne0EDEib?a;6)jCO zTgzuAo2r|dD{X#uQ)_iw#hj+*mZr9<*@kZ`Z>pS?tVlM`XsN2KK;l$5Z8Ng)$vKY8 zj<+q@)|8x4RjvN$aGI0u^t6ZyT(BUPh-;zB)^g^rdG@TP85PZQnl)clK4aJh+1BQ6 zsH;}>CEA)=`nr0o1kLT8?Whx)db>K-pqy#!?`}oYu>&u61)f~f)KSya)6<^pS=7|g z4@ok$`)ch+)O4)N+uDktTDm$- z3M!M$l}8knaWMy@-s4&1UL*|N&Fw!N>mtFyJe4@HhTLXOb=lhHnuVK2rnMPay!BzxOi(VSSd z7|m3hWC{5?`+6=(An;-N72wx)BaUPMMHNkQF=VM`-r-13r>z;O(R^D~MOAb2?25{kmh#F<%~w^-8Mer(Dw>Do ztA`BrGW_Oj!w2MBE2^v8X16p~&a9e)qVGYgtdQLZf7@H?+Sj!Aik2>{;hwJ6{ub3U z&9I)?t(PbJqM_QlWM5M|D?-(zfC@1{_jX~Ff=fS!5kG$IO&#r*qAuB=&}-z-4MSf~ zvXAv3+j$f`5(j^xt=H7J26hmcV|&}o@>vyCt*vP1O>^2zVOPzV<(fZ{Go+O*3rSD3 zVyNx!=rge(PAP|&FBa^A*xf#!p89F3Lhg*C-cG3o4fiuTUAVw$E<~3 zOSk16UCm7$iGZ|qCfD|1d}u{CrX$J%4WBlSzM{x5OmuN_?C5H0#Uz36=`6C?{xD2(0}UHu)cNMk38i^IDZ zG#%-(hbz+=-P8)}J?}s&=FBiVka5_8lpbwaQ_irg%a>W!;ANI||ILn>(2W|S$QYtS`*gha@%4R;omrGH2#eh|8m9O9BYi=B<~UC94iO1 z{5w|sEyQ2xo@3FRW98#F20yxwg=``I%HL=qQHYqvfEy=R##e}cMOLngJGXDJy-BvPOv*3gIr}VVn$; zQaN^0&sJ-sTlIE^{kY4 zu5{S;bbAAzMLyfEZurG`_T65#)z|R5z^d{rtFj@pp~_d*rN{8AxU5T(A*(wXe%7VR zkR6SbKiCq++2?inbJv@>w2|Qqot+KusxQYXR8Qa;tE2b5GCkPqsbKe`%-2V6!Y4hgp0N)iGcdMl@b)VqE0%&Ktdis{h@Dg2AK2GauUTG=5uYGm0$4Rh?Rdi94g_W^7xAh9{kb_k!vACWp#{$?Z%+gY9mY%NOuC~6i zsgYC5Lfsh6+AoFDsH_&M%JvSZWi9J(_~E{$x!4V-!p3gFYbAb1itV;c@0VboVa*rm zr8_VBITCmW&?+XwE5|uVA7@P{X0ZBV_SKb|zFxvz6KptN@Ni+AD#F0jq#V0cQfsfU|(Jfz?1S za5iu`@DspmfM)}50Gvdxai z4+@$R__w;-uz2i)QVV9JTMWm=Ig_8;_~`MsEPV2pi7RWzyw({MVOYgEKgh4FPEG$t z@3`vji)J?MJi@Zxg`bD;vsymBOepi3R+qJ*ZT6N;T|0Z$smm^I?`*{_kg`?neZ9+O zlrL-VZ0YE4O~N>>eAx@|u!KoCE84%fT)y!h80=kMd6z5KI_e_q|; z^St=iSKi*SZB5~h(Ga!XxDd4rR@&$?{?pfh2eloI8iwTN7$DW}Sk(IM$9zP(H;(uv~IDS7#gmwzTHr2gf9vP`!JMKLLfeY9#bl5!FYK=?p7 zj{j6OTQC2UvFZQ+-%833-@e3#EmP<25rvih#f^dRZ?beLp#wJ@C`F317HB(_fgTi&6vj0}u zUsd)$D*IlA`xIL9t~>I?Z~ptn;(5ZmRi-eaaPMRDc#m^hd+WnZc{v9TSkTSSYr~Tn z)5^sKbipD=gx#_&&^?|%(J{?Ok(;K zgpiTG)INpvn$1^Sg(75xxkE7o#%}LV^1{WJLo`og%+rECRd{HLT7pF?w*VP*~M{HmJt9(%= z(--@X?d!ESk3@serNQMDFUn;4Vn4He{p#h3yKG-$RHafT(--@r?Q6nI;iqh0A5*?4 zlj(~KDBD-+x!-@y_BBiSqD-c*;tXFK>vLDyzQk$)?v%;&#ddASb)$DX8iX#5HWe3T zGJQ?R@Ktusil5lNE?2%Nlj-a53||$=CFp}XuFol7l*#nPvCd9m{pAb)WBdA!@@i`k?AE&$T%30yyu)eDvI)yu*?GPSWsqjD|cnI325U=XEH3 z*o=zG8B+g8eb^YG4|^QbH8z3ba?W2Q&c`oLwI?CKKf~z5VwmWgAotMeQi?q>n?5Xl zhLq8Nht-F{@h-^4kTzZ%iL>d$?u5+UN{&g*rVqOxGT(E_q3kmB7XAJ0t<&&4noDz$ zg&v`nqZf&q`Chafw&L{zsW<+Hc&Ff}FD^ED>FNJp7@hbi0qxw$eG0!*UD^%$p*zcM zE^Ad>In=sStDy;^4i-j-R^#)K>BGuxPRTeW{8=!xmpSZIURdvd!0z2#jC(JB3|P0B zlMy)WSjMKHsSsKPrj1$!cYeFTvtjFm`LL4u7;LmNzpLiY9B+(z>wSq>DB-OMMPxCu zOgu7WK3^SzsR@N*(0t{WJS9pi-qW54M?zs=B(@aZqM<-M=1asQeruAFIn2tCiAPZc zRDv3T@tFb*A!L&EiJqHZ(uG)ZtXMcv>kR~IytNAun?DrsBeup+BqMLVF6Q8w)lFRC(pZU#RK-8jGGheCc) zEa9&(_FRkhDlEvPyNC9gXe@%Qon*$6K|>3BW3>%diDC=L`XZ4~1ZrFld872{>!af^CBSV@(dj$HTNS(-#NO;Oh2^RIT2#uQM@-tCnv8B@Y1D-_c)CkO zQR8o{i^jaMcr;NDBjh5!Xeb`3^mZirGdA zdz`}lMifQ>0Td8(2e>y&iF?GV)kTi_Ipb2zK@);9R+YD3|rqF}conU)og1lYS1 zfe;3TL=YmVF)=1F8->n5qKFW|M0^Y5zGzI0D3mF3%G3tD7&_~`i@g4TweN?2mH>pj*5h0-HWVz$l_Z5Mwvm5Jx1sU>vc-_C*->X)5f)oMDRs z&>hE)fRo0v2*$Fa$sRml@9pmHXm62EE1#^w8Se~7)Ms>QBZ^W@0;VvEopLCzOetMA zB~B?3T0CqTBWFUE>jbBebk|LhaT>V{UIZsbQf#br#grL*O6Xfe@FbV}A?gcZ^1 znmF3&%0fe$7^@tTB4X@f;*W94Va$kOV(0i2iuxIwHx@%%H(l^pr!<-f#;J%ejEP%k z2unnn?cjt{*qO0ylG8onU2GD> zbptb6<`h6xE?HXVi>dLiOv#+!l;OfF%sx2Z7d6qG=#;1pg%QAi zHkJs7u(VprY0&5Agr~doluTh6T09)a$R355ZWAXBCx)p2iypPI(4~HIR!Nx~Q$43- z6^!`KMX4CUsaXY4hQV+QcN}H;o|;uK;PXZs%usV$RyocP^CR9mxlCi7o$i!Xh1d}B z)tedbj0}OwaH7En{}EFgXFA=ZC{?+D6$Nc-W17mrG^a3ztSDEnSmvr~HuAcvr#s~{ z1CJ&!H-#3X4t3KicM6LUmYppU3ShG#3vfn;#E_n-2V`uXqCjj*opH)35L z6e~PkHcdm~Zol)R0hMr?)x z{_}idb4SNfmUOI-_%V|NmKtBV$|35j#SR5q2+YC8F;6*0u)#4qN$wXJt zI=D!#b}dk@$bxjFnAjfBZ=rH!1&bv;$s$FHm43v~<1~$>R?usLI84)iOb|M|;}uyK z3ZiYB5-(P?nHM=zFv=1gh%RyEQHM7{xvQ*mZ}eMu%dx`IxM@fX?E8YnDlW1VEBmlt zZDg^4l`B8GkFumYceja9eFEz`3>cVX=gU&3Os)&P`7wsasuokBPqZq!2Za0C9JSXt34`fP@C zUBp`-6a9>?=(HKG{zh&kIc1ANrU<%jh6uJ=F%vnuZ-!&Ux5$sQv6Im+x^adx0uR-T z!uSSUp^HMhU4WGjbP=d?F3QR0*nEAwv6e!j)af?LcEgrlIB9RWwi6p2_eY}2=`GK8 z^9RFN!1!aR%}~v`qPzY|BqkI3hhH zf~falPa8q!so}aqv^y@Jxt*au?Bs<%u_vy_p4fQJv9wpQGlNQQkz62i0Hs%K^@UfX z@L-ps1NQpDp*AFD7qOaPVn&$|IflvIJJZ6!fbO}O?om!rbmtJlaL1@{F*SIjVy{DA zdBzuJ9jtM%41`Vwsy3`eqQ-B&@*8jD8lMw4{f@T%LJL-lg=9D$4tg7*pb%O|)+6P{ z7`Ym(@E1W_Wyhay+)xnQY$k%#Xvw{diOFN6#1>cWaJk=Iz;&5uy^LwBk<&9;4U`;W zsY>SpfM^_keQ>p+W*2cgO2rX&`U zjaev67;%Y_LElV7z1RaV519OF7eL7@Q#Zi~&G$jihB+1!7j!)VpO}p?nR9EYmXr+j zaN{B7t*OCUsU{LyEEKYA=#(fm5@Lxa*5KriFuZOOYM$Wo7)m8<$i)(xvPTY)4fy7J zv76yw!BNlIUXL=u^&x1c5~zwu0_{VM(V|x~(1}J4%5)aAX+TFC7oD`2FMxT z(9nwGXhsgYb%=VkC^e*{p-)Hk#_Fgz7DF~kDAH>a_2GJ~34XuEPMA8h3&$?H zU~Cg@6WdCEt?2FdiWuZtMhusz%%Cq=gY8urJkc42D3&^Mn8gSj!>}YIIGa%dWok=A zeKGbWSygmJF=n{xrLG*uxn!XfO4XKvW)?e_fEbhMh|;wk{f&AoF-b%z+wRg>52YKr z5zFM;2*I*2D<-htliCT)FsvcED6&Syq)*RUiz+-rNu_t^#$S%~#~XBvlxqP7H%ih_ zXGQ!qxLqWctqf3WRqX(&pcWM*s+^v4rRNy$JupD}(;8EmOYG^igI0kG2fw<*z)J?J<7=z~EDLD~haU)j(W~)q(((+?~^OP(D6=r6kglmk46Z0dXco@COBknvW z(9Y`u34bj0hKQ9491|<=JBd8M0G6W@*W6I9px=2)zCteGjm(Ei z0Se^#m?4GA*?-_xQYm$tOk*Psv3L!&xgnPElBnEUFalTs5$$ z#6AG)0k!srCMzaNmZcGeMkW!%s>>tp+Tq2Pj;5AmZ*5mkLu*fCKPm;EaY^!nK)s@_ z=%(;@%wA90$8Ihmp}!(!y*wQ)=c7)&awWqq--LULYHsQ(oUq7PWW;^VQMC z*FIG-@eV0wB(bS-z4CAjLTgjeN4Y7ZHcH;37BMYxCruTii0Nl=L;=cssTe0bVmbqZ z$V~IiWdmIl!mz~}>qBOeJw2UWNE#dWMX)c%B+5y^BX;zx5}^SJiTj=y1wG>Kw{BUy z504hbo7A$xp}vjceI@jK89eUo2Sj_EjN~N}c&kE}2A?%eboV#oCKHx69&zspu{mx# ziO$Ie$e{#IST8rCB@3GUhU){+_5wiUn%X_ESb2$Dv&WqWid7nBVvYyF*66Gr5UfYw^HF)>kHU5 z%`$!plCCnIA^HJF95vuDXMFUL!HX!EGv2R8(m~XC1E{owuK_pukt9Bc;1Q!LoH^)X zB_{`K@>Hyek%}r%HCC}Cs3?HER!WEta;!+3qb9q%@Ex9HPp^1m$CJZx8#7wYnV&i9 z(LXHs!8=F&XY5`7*fxNNiDH5u`XuI42eBcYW zY}{;FuL=IrUk)zWlHS;R`6+P(-zDEfx-l1-_`q)>wcxXCEb)u+tth;1hnJE* zaFFWdrYzyCHZS`1wyx^c?@TRQQ$1})lX+tbiNU9;mUm`P&WM6(#xt^gy{#WG6uj2e z*_S@pP;pZVj%uYAL<3!~Xan2Yesw|=8ch1ND@DzL_5 zl%Q*&b+|GWSd$Dl*>HScQp%lWxV13x5zTySi!v2j&nQ!Yg)ejo*Fq~7BM9XRtcl80 zC|>%J93P7Okl*K9l=gWxJYJk03?DcGp<8nYcM;M-PkL}+26cgYv+De(_}ZVi#QT5~ z7m4=(2YkB*e0v6bdk1`j1HOF&zWpL(1T!?`xF_xPoIWb;FFN+zJPHT*zruI)_{v>6 z?s;WpFF_^-*GZSxO;V<9r7{iBD6*t3}Fc&D-Zo_@u zm|zeW!{xg$@-|rk&^bC1%=1UhpAZz z?l%kYK=X*+Ea*VfuS6Byt{P+j{^n)*(#Gex#&ldl&heHUoxYiGS$~GyO?+Vz*JS+4 zvV3XdExbGRE?=m_#a5E-&4PbJCI@-trR7i-8E+Ph@Ld5c0r9LtP6>k=(H9XM-(>k9 zFAMw)@l9c*>Pi9GIrIbX>yWP^FyuHV{TaWrT<;2`z;RZ&2){LE{K(1j*+4!{&(QSc zFsJN~B2WXd8le`JFl5>~F@zSDFnD3>ycDxhVM!_N2x4W6urk@Sw)Y4t>(C2pxBQ~Q zetb3IC4>+}P;*33aJOCubC`93vg18h*v)hM-IP#Q3djgJ(6{2ptH-iZOd;O&NU=$w z9#dxkF_ffc0`cBi>TKY}zkr~eqP$s7 zm@raj0ha?=FDroTlbEJcDd0-r9YDN0GNgVsg6E|RkHZ#ghj#XvyYZXlsvr8H`{npu zY}e0_FRihHAYv{Z2M9+6*^QdZ4_>?Bi={YAT8*7~9`7bGVp33+xDk{D}dJknJ@SqQdWF*oZ)%!dl= z(aJgKH}+WFj7ML(UBT|^A6{s-)og-9h*J+(+l+_xTbnVRgcpcP+-aHu2QX9J6~a-s z1zG#LzGchc*Lv)>AX*gSSta7o?PMiYl55fOi6a2)qmU4Df$|zXpCC_%iTr;8@hv zH-Lq}Zvu;fSk$Jd>Ov#lVD(=V`EI+3iD4N21=!9f30~thZeJrYIhD zm16p41DQtrhUEJ%;MvY~T3ca00yf&2@2l{0&o}gQ1b#2!cZr?vAs;qn894foi38po zWiWI=l%0S*gl;uvE(yb^1^F?}p6<}0AcQ;>J2c`EQY;Auei?bCrZz%zggfoB3+fYX4?-*h0` z#a#S&4`m0^*4qu`Du$zs?^)5xG`F{|g}Pk0_QR@_`6K+=)gLxjAOGyl1!uK?V$G&c zo_y&RsblU!AO6r3!b5d=YB%&DDD!4iXcgT1)#h36*CW2QCDnj4W_{2!n4rv8yFPHD zjB4@&hh%FxKX6c0I)Cr`YFsxbS<>jD^r1$HXPSQ zbS<#%G~C^W_D0DaJ}JThP%*kt%mD1T%X}mhP%pew;JwC zhT8?xc#(pt(b80C%~qxY>(7SUZMc6J?q7z>AEW&iDpP?~X1FPadmbhZ#rf88n09C? zw91sJz#4_-A-OTiRA5ao+>wSm(Qqdl?kvO2GhEeJKK{bkQp!|lU8PI~)}Z0`8Sab% zIZfnSYn7?cx=fi0teuA2Ww^7jJb)exacoqkLhCwZDzLblr)!~As!actZ|yBy^t5k3 z747N4l@p~de#4eLrJ)xJ_WjV)4>S~~<50F24b&8+gZtC*;(>*wX{g_Wr2`(}GI5|L zPq-X6u+RgS4YRGj!$_3CS2|ccP;@0&DBJTK%66gKFG30inS!T%`y|Np_=+|aU5zGY znVSTe35yp$@rP0A!N|}=?@RlNpLjLb+!b*88%zg_M1qS4@~%w>2N$N}`yxnL7-@vL z2xd=s7h=T+`X(Z|MULb?hxCej8Ef;bzN6C!%9CE0HzWbPCxP5glmaEgy07)vA$W#L z3^En&j19dxa>#ol>4s8d%9E}sM*fi4qKL{`5pJb0ooh?2epJ`4H~67VA(FLJ_n>}Q zF1yF3efu^%o`ZWT^bp@ScVY3m@!-1199dE#XYy7bls^U zMQAO9>C%m9-=1{QjT@fGQ6vQOZcNAbpuOyVihdecEqhQcyV9P8I`wF?I{5t}c-{y? zYn$6pG=9@&I5D(QY<{I15jT@OD3UDd3{4U(cW`dt%Di=bLlZL)@M;6UC@qWoBz=?47Wo9-Xnk@wDyms6L@q8FtGmabTnFN>rhTubgF7LCprv`B^orfL zyzxmEA*-nfO?xNWNO5|U?zlyEmWRp4TkkU)<2T(We6rII&C1WRW@Wp|%J#HxyUfZ! ze3vncY>`K{*qP#c*P+01Z*v>G1@{gFw=rvMjJwkDZ3FBv=oBbjkodbR-M?o?-rGBl zdw#>ZQmYTGY!3!y@CfdW3bwU>{ztSm-_9WeN&+p-`7KM1Zwu9QVD~VLyFXAcONSXtqtDt?qfQCZF>vu7tI?@5v9F< zZVkOLX)Jrued$eh-`&3khobU0rvlLD-73TxN8k}i{b7t+&2w(zcCHM#MN@CMO~3h^C>XNc<+aa zYo1c;YOHQ$3T}W&x_;T1ehZWI`-?t4y20FsnvgOHp@TzwC`#Mc^^gf?Fn55NhqT)= z-v%Quef$3rO<0L0-dk?BX$0>pCGliX6F!{;H|MF)e^@${mm-3GZZHKIz^sl$#Wde1lEHq2gZOEzzcv?z)t~Z z0`CH1Y!-KNs)4Vv83?U#Di86T1)K)NT?uiH!r8!f*zuk06wA&F{2Sz_ z;HNKs6qkACj~7S$V=enm#P7(t>Vtlc1%C-}{gC?L+2O1a9U?-J#q7Fn6 zAFThlZ<)P=K+wL;#dNTYbMc#^*ozPk!|VkzeSJW8p8epNM%}7Vj$$Q9j1$7-6RDVZ>bwL+%_hZSHdT6!OjVt^+d7 zmk(18{oq+v9{hOy5kKdXL^r~Ix~m-M=Q#Y(#;hyta*!wCu?!fXz8np~Q3lMJyeCRo zyD8ZDJVNy^FWeb&??wGMRosk;^K|$?riXbSjb9ahyskoCnMSnT)Cs_AfN|hPAk#en z{2Ooze)>wmz)H|%!8UOWe#`>f1pCFAuChphqs(RaZOAN(_Rh8;0~e(9b%@g7qY2`1 zDabSbqKVkW!>14U5CMy4^%{HpxljiWOyS3J8H-;GKVGQM6w~_|AeTnB05R@cp9L-k zeh!!feja!+@K)d@K=g+c^Y{gzyWB8Vi8iFG-Q9)|_K-G2Kdhf6_+4d}TT+~ZIkGln zw;D!l_Z)_1_Z&S&+qa`xWS7bkvqV3d2SQ&=m%A<9fjl#_cLLcy z&cN@z+)W*Xd^vtO_+>vU=&0_aXHELwnSbz|GkyKp`LUnKyQkaeDa&gxBY(dl>sdi! z+5P_Soqq5ep5~t22fiWrA>KO0C)Pi#_d3i?WpkU-PAA(E#~|LN{4`oK#w;=K$h(vr z(dC;SG!qixbLb=h1T7MD?-7Q2p>z7snA-cOa<09!)-SlvhiWRr-IXv z7A?+HUT#=7(YpLJTWx47L#2wcc-=Um_btYWRL4EB`xU4YH(ZK)Dx=@v31?Kvj=vsr zmNlF<5Fy~+NzuCHM#-6X6ZEXmqdS$8xQnrm+R)g>ymfPh?iV*4pwQHJ8>rvhmtI%2 zBk$+ii~a$f?Do7TGsTLTvU_%4{l--p35o9$%6h4b+=n|SNC=dnB0k$a&{LR>GjDgrF{6+^J%Hu}p&d z`tx}v*`D1KMV5K1ODL>SEzfK(`d_%n6z<4-VtaCr(E5tfxb2N@tOj;}%1&BvpHNJr z&Z&yVeV26?sQWDY#C;Yf&3R9at%x^hc%P+0tFWPQ$1Munn7M*~`;m$#w-^0Vv?Nr^ z&sAE`EFRo_y{ZiA{`I}!;o7@U{vXdw`HGQc5$N;V^L{BA*6gn{s&ypy63T?<(jC5{ z?M2Ts(D+1=I+W=|HrlP~z5<(w(6wi|SInXx%#!FL-VZ>csc?r@eMjE&D2eU9LHOAH zTXFu`pyNn3_Z?rmk&5_B)oW-O&GX=~&y%t5K#Y0Mi__|;?nmvS!y*l0^nm$^7jd}T z9!mN42&pkJFpc+uV=){m|G1CBg^B1N=3eI@@7N&!hz7BuB^2xY^LV!1zr}fGqS6jv z8llR()Eb9zl`FJTh9xd4pD>=Qi@a_7?2DO$h-TEaNT%z}) zo<0+@Rx5Kl;bkkMIW?v*en=)Ew#cARQnn12SaO6_iy2CIC z!twr`PEQqSacQPj6Be0~D!wDi7v^vzeWZ%-cIAsTjm+RmiNEqs=1E4F!!7&#BP}8E zS_xPPSV%J#;8wz@>$HiAqQn}r8UKGpO`VXZ_Y67RX!=a`3LMm{ybh(kuAEand$y3| zJ986+_WEAz(PAp!ZtXRP$}U8B*|gV{NPjhcydaiUd+mjcZ;0Gb?R7}WhyX=+^X55EeqyV9Czd!}(iuQmQ{ovV;S~~E|H<~yg4YkwFbYdFINhb)cIQdIPIqay z-Fg16(_Pwa_cvYc(r&vKsdbA^pS0WVr@P#x-F83MyR_Tx7jc8_2w&RASUoC#H@n=W-7cRWxZI`PuHPLlcWJlXM^W4C zh+o?6@K15MOS|nJaJfsn?S7HVUD|E;&$-;C-FAQ2QT@X}9w?8cQ)}{-oV@ zKh5PX?Y4W!yX`)K+I?KQ{Y$&;{&APP zwA=2@E_Z3S-LG-EOS@e@zjL`uyY0T;-`M#9C zxL+v4Bzz}`GZa5-rfPv#0-J#wfL8#o0&WIg4g3l4)4-j;>wx@@7`{@NIuUq1 z5NWh-0A2{Z5r{agn}J^d-Uj?35a!g+fL{b|1%3(mci@+S$72G;q@Ah*ehpX;+zea- zyc4(*co*<8;J1N~0>1;~J+OO$F97cYz76~?@ZUf@QJgv)6XOHGQ-Kcx&jCIJWi{1q?{_&RVj@Lga&Fc(@k5AX=!Sm0z}32-`a0&p(yaNvC4(ZHoZyt$a#2s{>e zE$}$t=Ye>SG4&1LB;Yn+8SwYO6M;FHSg{yNjRTegj|R>FdVv+d3xSouX5dU<2XGc} z4X_sY6(H(7^(YX^)YQ*_3xV$fqriUyW5AOz!N!3X051Tp1SWu=1zrez8Q27T71#oN z6W9uzh>0-?Yyx%wR|78rUJJYwcrWl%z~2DTwo?BDt^n`z)u3d3tS7lA9xM$ z`@lzlKLY*}_zU3C7+`+|TnpR*ybAal@DAV~fR6!R2mTfK7vMw;hKY zw*mhK{4?@xA z4*^F5e*hcPgT=Q&c~-Ezq^_o=BiYoc zv^5M@Uk-C>f>0^Iv&C)n#X@Jm@VNb5l}vW8X~L&!sgbZB0peQq6cv`9JL+Bbq|1Jl z%f8uVf6`@t&1DygTyQ$RDh%Pgv_0yw^A!)L`%NzUeJ=Y}m;J9U`w1B0o#D-M*%K~1 zrl|~hOb;3MM_l%oTz0;w%}eL+NHhhf{cM;0JeM8aF+=`aE<3tQhWl=peU54)I{ph? zb~Z&`+Wk8&`)e-ycuXNq`O{tYI+y)Im;Dl#{WC86cU*S8m(%I{lgs^p%g)C^oaw7_ z+49RlPvj5R#|BuUl6s9I;eB~~C$Yt+z**CfD-*VZXaoKme?0O8+ z<;NG$b$ZO&uUj=zI&d7~+HV2OeD;UeV>$A9*eyV+Sf2q_1Ahiw1pGOWy7Fg%w*a35 zJ^=g$@Yg^nc*OH<=$zt9KhFbCLL9#W)&YMFYysj6P^l|{zX5&~_*>xPKztD@^$PHJ z!2ba8>{@C9()J>72JrX5Fz_W{7jQce>p*J<5bHDRW#Dr_gpt|}d=*%Lj`A9i%9B3; zu|BX~2l877e*|)kw+o1Q*?I%`Mc`k6j{tWAF)vvdTvGo6?ggHRj`B9p4}1s6HQl?w z&jbGk{4wzVfKLJc1^hK|Kk#kf0ibyJ6l<(WXwX>Crse|20As*>U^mbM8~~05ehpXv z{4uZ)_1eO3V1ELI5w*n6bJ_sxYZU-I#{2TB{ z;9+P`M*&X(;w!zWdBCHA3E(ln%YnxNzYIJM_z3W0K(5Uu0SAF)Kz;%U>+=-nx5+^F zocRvcNE^{ssITYsag+-_?Jnlgw_#7C-rQf@p`YX7_6qP3d(Ld>NjCK*7c9VeQ{n~( zgVh&e*B7QtYO~2uNv@RJoHNC@h@>u@p~f+x){42a6tZ8lxE;Z-WSTio6u?D+JPQ_Z~-y>#gt&Q*Lx;W9>*Cp?72n|1cbPE5^P~%OTyeA+O z^{|?I0-5tWZTg0Q{Dzpmi69l<4=Vk+xF0~hy}spu6bJ?TBT8Ta^!R-9;Z+qq<3keh z@B*U{w-u0zZanu|SaP3|Nv`e2YhYTA%6O{yMdCXzmHPW1=-}1868)qtzi(Gq@;F?* zXaoyz(}2-Due`4oI`|w61HAMeTH5VB^6@TrX}9W#!x#z|sZK-b!0RIYn9QYRSx4^x?cY$vM z{{|ccj={K%F)=j}_;=tbz<&VCfvDTmOkfe_iF1JCfLvG=1351o4!jpj{qri#4ZNQ^}{I(6g)R-y*;(edgOyF_AC=i`Q?EOywcEf%ma6ND`@N>W^z}tbC zyHj@prvkb6KNa{Q@HF5c@O0n-;2A&<#{V;c1;A;*lYrBKRY0`S)F*)01c*KVOkgkU z_>yDldSEs1HsEaF*MM_?d}jCKz{i1efzJZZ0{#X#5BO)G7q|y_74RJ(+Pu&WYy|SV zJ89tA!0Uh^;3i-b@Ot2CAim6$x)OLJa0?Kdj?|05&j9}lMBhmjjYU5JmH=-BP62)a zcsB5hz$oxbK&>SAm}cehv6V;9bBwf&T;iHV|LTOx+K>ANV8S z13=Do4+7D4tij2g|Ktg)&{$-gu=>%#vGPD!9%u8>!Lh|uNPKi~EQ;ZygJbm>uOA&8 zi=mSzuzhrJto6~svGTOpj}DIg=-^l!rix=K;~yOyD^8;Q=-}A@{~jF6y~B4g0p?~L zD{BtBjtCL0(z9s%B&NtU0I9eMbp+MbG5gkLG427rL<4D{3 zfWI~dy`fAMj@5>Doc)UvmJx%$-d`&Y44<39&w@%Xzl2A`;vDi=!p~C-q&-*ItDs<& zb`R|}@}yzOj3vVpZoRSE20UFX*#fe@NCYQ)^W1X=T|^3}!uq{9L0gmKNb0=kNQ+7O zXP88k3j1snjSOiD?GZdhAE^@=5(!V?RtQA&9mms!zM*Y8QGDHP1q(AMEU8U}!<}5eW})CqLTo-r5B` zuAI$reEt5r{E^)LXDwV0_V=x;e_6L zoF^WzDk1%}2<#AN42vU_BLQzMie@rA@fhYDOP>AAQC_M z52km=?GV)ktIw(zqH!L1UhA!G@YU6Z!b?TL@mU_|exnCb3}k zf%YPhC^Cy+B0ijo9F>ROQ%0X#FJx*1UJRXe-bG%2z*`fLqXuKb(4b<%G1n0e6nXvvd3`@GfvNzX&motrlJ8wmo}m()g&N>R~Cjo%wEKY^2(Ibb)!$R7g8d$ zc-S;XPIC-uf-_3#uA3sql@~>d{jD8IeW1ITAnEgPr%xop5x7o4sZ#_aMl4ht3aH8x zGa17)l1OpQ?t9|5*JaX>sLP)0k^DOraR zRz$07;%KKU3k_*vta3<-h_Q>I9OIP3m=VLo&haS}^)ohaEQZ!#y5O-+X*3bc?h#)Y z6SvL~UZIkyJI*O7#&aBEEze1h`MoipY1YR(1^sGzv0I%U+dk$LlOq>LL^HNca=J&n zi%o)bA1!kVpemOvt@Fjy_*bS9eS%Yl3$HNy;C!5nt%uMPof5U7&;mafJD4Q(h&DM> zAQ;9`**H}kORJ@v27P``c)CkZ$rP5M#lvBY>`{p6HgVE$Vlfn=nT>U+pPW@v=EhXd zDOm+0zH?D3MsR9YL6l)I95Y@2)U1Ly$~@X&hMLo|%5jF6AMw`7Wf~jj=}uWyh&VpJ z-pqJsWC&D-6AeE2kC@sx)9D^Xsd6Q%s?F5KG*$c4oWdBgqFlXVnd_FG zfgT%Lj5^d!tK2CprWkg%2u_>V(a*?`7}68toi;Os8Zt8i+5!0((&n2B`(eG#5sc znw25N#a;xP2Dw(V!_?B%8PbjZ`g*MXhs=~*u)Tn=&76#F26jjF-grQ+4C!d5Q93p( z2n5A?^e4hwbZIoP*xxu~mf>Z`>L1sfL3!NxI9IYzL-F*`{vdl}?t8 za_~0RHek)piI8-@qQwm4OZcN09emMRFLpH?y(r?*L2|YbB1(XB3I)b00c;Q&67}fd zBDvZX2b72sKo+DU#l-f2ehZZ=D_AV)Nfs$mtn?#>9;a!nG=g3e#9^BDV}j7x9k0l` zP!Mg~lz6eC&AiB&f>D;}Ky-;Kk2<^w%3WohTFl?VTaFcu#!W+FVBZ%kR&kM~SlNgD zY9osUtX%ogeUv5Lxw}n->JwPkVZgv7J71PMWpb5_nq3oSiNK~zfjpOh*vfFjLdVg{ z5yKv)g$A+tAwS0OSk+=G^odqQmwX+Zw~?LFKc5NKae0&@_QX-_uVaftkp(8qvC0u` zN3Md!@Wn6-Y!|ii_CX^Ni!2puU`iC)64Gx1o1~yO9L9LS6)0tjoRJGD6ZJUTyXY!D zv0J34!yGQq6=2!r5nJ>`ER0kJ0yWsMK_B1`v3ns3Ps#ccyi(EE)YpqJJYogd*R)(O z|6-SPClRKnq#aUt@P^Ob2wyu8mpqnh0$iVf4Zauw>TMCm3Qx(eB**Gmz_kbCx{X}> z>LlNI_LT6!z8-a67fU%VOfB=2=CO&BfkP6s8O-nz@tN+ zl80qHa>qvnD@G+x$%!2Dj9dvAF6t4QTGgW{JtfOPg;_9|bQ|O0#QaDo9!CH72u)K0 zqi(Ood`)A9h?N62LbLaoBF`L6IS5dEFqka7 zC%dYl%2}Vydolw^wDk1p(&8sg65ajH9qla`e>`IA ziU=ILRxuK=J%3$h1@lBBI)ubUZi#xpF7yn(n+ z)D<3dkpl$>3v41hB?*;|j8TCLnOa}KZWGMW`N)xI5iIFDi0x%zd_-^bni*6~pOTYP4_I4Ae~ z>)*LNd~*I_Yr=my{NmC((C6_?UvbWlPI_=+)2%-{>y*(Q;||NUINiwC~?a_`{p z|MbtZ?>_p$x3->mJD$7xlaRmb^KFp_^WNO?=;o6TeBqXjoAEptp4BVPIrB4TJ^F_Q zKX~V;|BSusAKL~_74I&A|IJOWopJK`7prGB|Mi&3l`rABv~LLcyYIg33ptmKe{k!- ztm(5;^KX^kMcs!EpY6M-tJ_<8x_Z0X`pSA+SM@GapGjS|rh3|pre*D&Egk)>$z{z= z81j2tr>)2q%6tC0YL>6Gjwm&Vth4XKNJ~o}78%(C8fjuMdUo|>4`$?L)7#hD-t}Pw z)Y8?HWGB1$Ll02|$cLcY+Lvcf=}1eC?J9dH@1@{+upap^LeeF-I=Q-~`;tWOhZ!bn zLnU+Q$*lS-OD)-Y*ocZ05j1t+OE^gN2mVCxhxoDKs`4`ViD3J?zUD;I51!D1 z3BI!091Z(6hCU3l*oOs5`0ga1WydR-*nMqNrb27GG8Kr~f%9^qcyV-EJ8*a1V?ls&4hI`C#PZ@5j;a)J@D~5aBaBmszUBewPTrQpySLLTn zC_lsT?Ic+)lMOfBaFvGRQ|hYx3>Pw7)Nl#IwHU6;aJ`0GZ@3MHyTNcb8}4?)Z8qG! zhI_zpj~VVM!)-O(3x<2eaIYKgEyKNQxC4gE#ri^(pE9BR3^&PelMOfBaFvET$8dZn zUxpVl9G}&fT*7cIhU+q1ui@4kZiC@&Fx<_CyWMb`4R^2M9x&WvhI`6zTMhSu;a)M^ z>xO&FaPJ!KfZ_P909AgHr(xo+ibXd4flZI9y8oihTCem7Yz4`;a)e~TZVhra0d*R zive7wdAu^A{0ukAaFY!;-EftLJI8RfhU1$Os{9O>FkFk_x(wHAxb=qHV7MC$ceCMc zH{52!-D|i94ELDfo-*84!@Xd*R}A;M;odUbyM{YpxLmwnp~_F0P=1D+WVp$On{K#D z!<}QeTEm45$9F?y90|j<7_Q53y@p$FxDAH8!EiSl?smg%Hr&02d%$py8SW{=Z8h8r zhI_?uuN&?y!@X;`1BT1RH!D>6DHF=iaFYx-*>KYhS82F&3|DKokl~_+OBk-ja9xJ$ zHQai`Z7|#ohP&Btw;OJ=;qEou1BQFda8DU-tKnWS+$)BA-EeOi?p?zjFkEh-DL-XG z`5A7K;U*hyy5TAfcaGus%@A21A;U!tmoQw5;kpdhYq<4>+hDjG40p5PZa3U!!`*AR z2MqU^;hr+wR>QquxK|AKy5Zh3+`EQ5V7S~Oo!{}wgz_`oB*RTM+;qcL8txp!)f$eU z;bKV^T2aF#4A)|~F2nU2ZoT0)814qc-E6qq4Y%2F_Zsd2!#!rWrwq5%a4#6{6~n!5 zxP6A(Z@AgeU5-cI@~x|ssnFV}Oa<0%!@Xs=e;JN1_0n&FRS2yaO@-EYWh$_aHQXe_ zoo=}4hMQ}+a}2k@a3RBe(r^jGtukDf;XY-!^@d9u?gqns(QvmL?jFP4Yq*CE_n6_H zHQZLiy=1so47b~GZyD}ihC5)m!ctRy%7pSW+$6)DZn)`&n`^jp47b2=A;W#ra0$b$ zGF+G8K4rM|hD#gn2E%>PaJL)o9>d*hxQ7k*nBkr^+*ZTAWVlxhx7%=U8SY<(J7BoN zBTV@z6UxtUlMHvd;iemIuHnux+ycXe4EIUHB@DO9a9xJ`l;PGJE^W9Q4EIID-EO#h z40o^L9yZ)#hI`g>-?pecaHQY;vd&O{r zhTCVjj-%z7llj&Ul&R2qM41Y#&BsdDLhI|wRA4<|xbGY8DZ@Q&xEBofJHx$hxIY{2 zUBmsuaJl#j1uPhW^OdQ<%^woEuYtg>@_*LEFa-8;+4b&8G zSXU5F}QNYFqJoOWdoDIMn=Qa-axAe z4h@0!9Z;v@??h304&ppih4P|Amde&60-4tUErd11PuUPZ7`HPcS~7Kruh~OL9Ko{&Hsap1koC@kS z`aZE?U6s{Wy|0t0Lk!v8r_G6*Pe@UZ^Hg=5gT48xg>6oJqIk z=@gB;HmsW>!ka3>JA>f`ry#5|5W-Z1fT3w>I`3MVz!pVJcx*VgAb{Pcq~lW{dta5WE=NN?g_Bm$L1aUFwa z;A)-?vAgtXfpD>&79MC4fisy037kh-q&M-e44mSQz`c8WH8Yp8QJ~tM2qxi`8Sdl9>be9@yL#ao8r%*MAZPiF#TEP79vcS zPUdlr1g<%B0wFPQ<(){_a3eUzWKkPD~p>PY>i> zyZdpps^FHVub>+*k%WWhS0v$Xh-OKG@a#;2s3nyI`V&bIWu}sl7NwP5STqpdiE*ZT z$T-7>IFI8@eCI)C21;-d>DxJcV-#f|g~B5dY7jzMmYnIEWJp+-BDzBe6^}#+lfj`w znm7`n<3=Kc(e%*ev}`0oOGYAuA@b0}tBfPvrrf=Rz3OAO%n&SxYaKPN2V^lutA0p+^Hu%?)%bL3de?qf#7c()_@%Dg&U)= zAR%d41SRW;x=+=e_yl0E4XhjdB0#>~H%8Fr@QuVM-x@a;(l_Y7Za z1HSF)_@3cM#eu7Lu~mq_NWpeQ`zj*a1M^Op?TRs}8>q>{I)F2l$cZy)tRPXTy7I9G z_J}p`t%w9=WbK}WrN;0Lf8c5gvB-sC;L7JAzhPam@PCWLe{nYd6cYYv7`XB`!hezQ zf1|^HQ8xb+68>ozxRTGom|Uaj4%A>9nhriUWJKBUC?{>J&#Pu{wTgmzBQ2IHL$?xx z=}nwphlG^=Ea!dQGV?MEli|sQ%#g`%P%SOo4sLx5TNw8PJHD`yne%Olq<<0KB-Ae= z(M!(5Dapb8mA??SE4EOhGk1@$@HE&oAAJxPzXQrf&+As0r%I#6u6~Cyvy*9=yJ4QF z_&#|O7!E2Er*PG(``b-3{-8g)mB@tt!-_^7H=&oSXwEy3N5y16HC=v zXlRR;T5PHQzt7CxbM`q&Fjn8+`+h!uwjQ3@Yu3!3Su?ZdvUk?fV%HQwCq^t;jjBQx z`Ket68;%}w;ON`~M~^yi^tb~@pL^iw2?vgzb%5ynl)l2zyn9;bd5&k_ zlAC+h{36&mo7&sPiBMN5OLlt1{0M9pimfauwdcBrA9`+=hwjSLNmd}pWlK`M>oxEB zXMJ?g0~BD{(oAtXA$Q*fwn0_kE)S>ZJURcmu649MBub*L6*C!5UD8u-O+DqdqUYRJ zEbqB^H)yB(tKF5) z%6dW%56DMrd8jq={Bx1@x_K_L&cYLdwxVsx zMb9S}ZD}pq#NjEck+z~utFrT2%QyMCMKTaxYte(sO{!OiXKj%Olk>AVx@*fy?xXiy zk!{J5=aVBF3C9#)(f(x{l3I)QE8oce@%gDO#~Sse$E3{9NKIyyx@uAyXYw06e??~V zXJqzG=G2F^b7W)p+r`$%de*W%?GK)4E8ny#x;go7jjW??J*8dyT%=vK>pZlr zyxl15_O?j-_{g@F{_H2(%GW-ZVw{F{?x3=4Mc^xHH}xZOTXOmHXP39b${wW%)*EQ6 z_d7dmOl!HgBkkt(1M!l$WYQ-&_3R=g3i3CJeq)8{gxmgHWRG94$R3l$9>taKVGe1z zDkkm7eiONWe$k#wOiS`!XaD%@)D{j>LWOd*>-=T+bVo&T(AK^zI&b8?<@~9cwArRJ zw^Ae6#z!`hdARTpZ6!N*bb0+!w9iP39q7LC<=a|DXaicbj=R?E8%&tivtb6_djG6^ z;0E3mnAX_a`IKMR9yYqq_h0n~Q{oIZo@{ipSLlq5-plFmzP3rXrm!bxH#oj%XaAcu z9GyHi@m}_qRoMwnpxT&6Jf*>HXu&?`}Etxd?W#=^G3Ioo}n!5T8#dFP5_I54{%0kVb z5R0;OBG}>>ccsxox=5jXpAisM$uxBxpVfcWK2;F?VCtT7Yir~UP29YP-q%)mV@hk$ zPO3Y;97)`4813k_?P1IKMr-8uwxXS_MXTX7`6J8Q$46F67`Ft%(8Pc+ZjmsggHw2u zL=_~A>>rrAqM|5+s$+!lR>wf9v%jr82Tl%U2^$$e37UDCt;Yaa(77ws88mDQK5`p++CtU#g_v$I;uxA)Msw)bC! zeR_J#4pRt;HTzc6yLKe2kdo{q#2V{hw@a)>EhPJicr%#aR=zH%_8YB5E8EIHvyxuN#(+iKTK61T7W5yf_7yDEFC z8&l6kcAJ`@Qg<8q@8(Emd}MnI?{Dn1Lm75=TLxaJhR6QX-96<4MoUQk+s&KVK>m|% zN}*&Dt(5p~(*Y^P?(yX+S*$u7McL}aJxC>s4av@@6CYEU&)ayZ1Stavc0KRSqyqc~ z2rRUYtfpXdvIp|RT_q|9vi5EWi9)X`>&d< z{u+sO&y*XD4zO*WiiRv)5mp1*Zv{19WBN3j*=d5PG{LItP(C4L5FP(nQCfIqua${u zXx=6%EYU7A>lLr5=;KlhyRIhZ`4I+eQKtD+#%hOKVoe#>$@aCJ8FaEWrjx}t35^(Q zlFp4GR>njeYcLvO?7PefThWeX8^sliDITW z9f1}c}JWoch=w0j(F8jDk#_7Xyt@6(R< zSx0-&(SG1)^21`&>Tl$1+F=}JTH4u!ENz9O$yJ@DeaF$(I@u8f5t=iERIa;fu zeaX=tBZLJETKZ)d`?`yL&(Tu(!wUPfY(jiSONx9#15D^@LV6*Q?LA5;+k{g42PHj% zkWG6vp<_+#%`Wy17yDgDd(_c>N63zaEWqYGnviXe3kcbqn;q>lj`pad$u@}P`x_xT z8EyHlqaBU__!9|o&mm-E&md$|ob6~69c?-xo8od8s&{;{;bPOaI@*^U?Hhy;D^Gix z(21rjKOr>G(6$niN3v}1RYEqG-GojueESHUY(gnKevk=e5<10%1`;~ega#8j&4elm zeS%Q7cP$}Xw`GKE&bK?-y^i*{qit}s-#FS1NBf7P>F-Nye%UA?`;6lWS=vZPJI~Qd z9Br1PEh0oll=O2h_7)fWfTKO^Xd4~v1xI_`(f;CSedso}R2hV9sZMmXGaYS$qh07| zpCV*S)#zedTu80J zHq+7OIa-6G-Qs9pb+m^Z?J-B|aI`-;+IxcC@=4?FWvw&e4A1XfHY1 z8;S*H}E#J{*INGNi?J7rWam6;gqy65| zb~)O6j+V-lVat3hAzS7_jyA^8COBG&qs?-(d5+fLXe}=EC6+sOPPvPaecHp0_N1e| z=x8rHTBoD^!_iiv#K#*Ad^4F9o6wpQjAu#ao>bI+si8gPLPw*{EvmX^&;bwxGPVY zNNgkEk?i8Hp-nYQng%UgBx(x3>oWf9XPb56Uf!iCDeTk*d9dTHtdsfnr^=iWu+|cH#L{9A!}9v{7T>-^qH$ zw4f)-7$|$&{Q?3py)D)SUOez zQ5jqT{WivRuun2Po=H_^Q)vYDlt z(&{?)taCa)H8++j;-?Z%d@43Bp;Z6adcoQ-Tn-^qtDFukVJBc zCq9+5d#r@f=U=%umP#iyy2KNoilGrob>D+q{~b&9fS*b{@u}$cp;UKIpEEs{>M1{! zc=~uRaaU1MyRg2ZVs1lCO%Ps)#a7f}1@@auE9_@rHe9u!rgBkpJuy{vjT4Pe@6!6p zhQ^wrN^FBI@hTS8ToX@Fw(%5fd@X9MuWL*o*Vi;GY;N+2rPnT8SVN9gLB15CqUP%6 z+6A?98Y-J=>lS$x&5ODrRxYfrSWr>dP>rSB3VTysGqza z99ubOWQ;zpvU=>?5ocGR|Ls#s% zb7`2G;iJa-|HSg2+ikt()O26YIdc>EBTMS*8k%NdQ*~(FoU4ZA3?H34dgPcfqt70l z6L$^I%^fplOis>-;bX?ys4LP6lMZA0`O&3!6v>CYy}}C}QMAk%=no^y!M|ylUU;!1 zdJc2Ywea1cd5=pAh6!F~zRzbCJfdsa@bj}3id}{;wCGXHz37Ky&hfk-UugOAfE=&* z3fGw|*-Wny%3r`wmo)T*%-jjCcNwakhD+hOxC>uwauTbikxHM(PfC6h$geA3Z7=z* z?j_%~z2v*0mwc_gH8CA~GWeL2vO_Sq; z(vxzu9(jx3)%-?!NmA-wEj8e|epB3NDy>q;Cv*-?N z6^>-X^y5k$4_hp9CQ=8NoSrki9y{W-OR+bZGm%Ap?E*9<*FX3TQoz5qfNFRSD$MmR z9a-U^oVO9q^`@9|S`OpG-S9jM;bl!`=1O89R?MxeYN~7C#OsJm<=V{^JpxNE=~;?x zB-e{BDl_+*>+|^4)HgCere~=Py05NTzyj(pDEoPBrrB&!H4~bS>Abi3#a8FGT-%|k z>?|kDb*6{^ctXR#d%*~(a!&>mW$_%#uiJ?m#ZTAuY*Vm5>;(zD+1W2=|e&7I2%#1wa(&s4LN!|wE~<+>$5V_CPNX8!7c`Y1V0DCj0m-D^;2@#&yaOBw^2t;5Z15Z4XTkfy zyTAv)HQ;x^r@@E7pMu{9JHUs*e}j*JGtdc?Ia&%n1~!3@gLi^Yf)z;pDXcazCHQM_A-D~^0Yp~O zWguI_=-uFUa2@yt_($-MV0K^jN4&oPF?@>?Mm!54ey=^|) zOW{8|KR!b{CeAxb!X?o>Cce~)J1ukgpV4Cxy)`3r{|4Hb;}fNm7QEgJbGUp(C86tDjR6>^nf zUE{Mh=Ni^Pqg-w70#!Mmw}0tbMs<;E4NedmuWqhvuv+KtAP3p;_ca<^)x+%!Eu9lO zd@=1t-!${(Ud3@`(l^wm*t?ISPrMUA#Wg~wmcpr!@Qj{?sCM}t>^d>Imz9vlna4_*v@8@vqM z406g9&7_ZFA30hK&IZ2>UJkwlR)9y*-L3#X1y+JrfHh!Z-|qwef%^VaDu2Q{Lun)@ zVS9YvH?y*q83%iQ9uoS$(DUuubUmdBF14Hb{!#qa`ozWb4Ylcw;HBVaLFPDb1^8{S z75o9nH%QSP;3^Q^>wN)aTzEHwr+{As>HprBz{%ih@EY(o@LG^Bm!kS+=??Js;8#I? zk@PiCV}NghqeH;EK%Ixt|Dtoir$Ocd?~0Q(X8Rd0A*if4KOrF(#&RNp+pGBK$i*%x zPR-)t@Jm?8-c|0vloZ!yanX}X@+Oyga!00Ee4E9^7EHropnTSr8eddmIV6DvkF;g( z;dnWVOJ5S1SwPu>hvV%mE}G1zPiDaNGwwn7xX1Sng3D%HW65`^+=e8@=yI|mCf>r? zxIVEsoZ6VEAX#!OO3t6;M%K&mlcmJsBucqf;h|2G0Tt?yXM}A81`-RIM zc_EV@DV!P`qVF0xAmh^5kc*~ID#x#k9JlGy3AR7hp-}}Hb~rpX z>5TuQ$+!-7Nt0Ysxp1n86h>xRKcez8r=)m9Hc92&$aoEu5EX$-WD_xQx^cqCyBAxS zJ}yVOdb3WBRhA$=IX=Erp8OOqPixAzub(d-^zuqQc@$I?Q(P*X^Wh3o?xD*{@JNoE ztWuY@pP#mTn!IPpzoF6|5=)D-@QL`_DK0NA%A1BC=b{MCIn|Eh>+AUPafCV(mtnEz z_j7RwLOyvbisV+zx_os{N_AYu6R__HSZ;wYlKV>2d-bG49be%1FCSmf#-pdA(_C~= zOZ>c-;T!Z4-@BT7V7lYPfes#narznfbThvB0uf|5K9{3B69rzE&9Kyy4|9Atb;f^I zNJ{dQDwe|?OHln-{f7BG{TKy43l;!2;<5DueWctN&^lY?+IIwdni_Xv95h%?L-uLXW@1e?ta$;e6r#u}BA1p;k~cEb2qGRL;^gAV zI8Ze7fVr<>zEsaDG-^Q1{Y=Ki7sr<@)u)C^A&*)pPxUAK#g&y)VCj32QH&xN<0dYM zk`HY~q2Uz8)Dgr;cPR$lX8I=WR4~zuc6kQl;KjInH0qMZ#H&?4PVv+O6^#&M(UZ`? zW%7F^4$WrbKzK2Z(ny&(do)d@Si~3?8+Zh@dR(3z#f4O3TsW}D!E2$>$%;g}vB-jH zfi7`HM9Q&v8=Q=9a)yy)B42OD>s$qHah*RqwUA-u9o9?fhoOA=%^0q!@C6>>4Xr=TT?Rp&Fm`l1ei(HGU zWkl^~sZ5R&rPt}M8WJVtwy4s5;!5@FF}=u0SlvP7LoGQN!miqB@pS7HPs=|gN>7NK zT#`4%ZImZw_dnOJE$#U{nYn)V42_KAyPt}+R=cTmFQxL8+asRTu* z#7CD+GOeqaL*inJ3(RPEiU>4iL9rGG7gbCyN1j|taUS>3en3=9% zE}v$WK6J*s{OKjuS+!!Bwp21^XR^u16}0iG`x9a~RKn*a9SyZhf6vP=onFYOMC}!r zp)Q`o<9VdoOf4Nl|9FO}(gw!Eu=;ZyIj|M!#*;3yUr7-&h~%f|91)+5HWOwl{iQ3X z$+>*mMboqp)-X^Mp17%kiJHVZUc*4-J~47Z@yt<{`m9qR`Roo<{2#<&!3Aq@)A|t?5go43U_@3i8mt0r4;qgSrF{ z%@na@rHpN{Kf%{oe?G5=fh zpoutc4#rtg-i5jwVO+ZF(|rc&^r9(+`E-3v(HbOdBc_+xZD6EgGSfmKFG~9vhq>&j zX@SDLOEu&Qrc|(sn^uUgYJ5X8RITb{)D*H|on*EFazdOG_5;t(aT0v2pr@C!R5sJ6 zn1bbk*2@~u(==1CrkBc8e6UzB@g}x9 zpB-Y={z{n!OAf}*4nWD!I2y?OOXBt#dBhq$L=o}gHv$P9H`Kf!WjzO z*-SASY$f^9U6&&LiU15ZbX>hba&Q9tSbtpu`Vw%r`9?Ml^jQgS&Pf_ z3kyo8qLSV06LhpuVLpGA5ps;#qus42_B2>_+8wowq`Ax-J*-)2Fc+DlE7xV%DgNJFo8uYPL8*8jWFmP_Q|5M(TJ|cEH$f)SMQA!x1aE;%1g`3*vS!yrC^Bz< z4B4LbRuq(?9e9_MS8T_VSW<&5HCsf);xlMY5yPQAgE=;y%m8<%Ns3MLV_8O2m`Jgi z?SW#`{aAHHv!oX>!zY@Reu*O=7LZwK6y>=r4iCr$Ob|hJ`};(WwCUSU;+a0#&5N2T z^vJ9rlgLE&glrN0gh75s`0;+#b*}Le$!Olva@UcR+2e-FDz4;GR`$gO{zjGstX=sj zzK>_)wY#mDKDnZhquL64R%qr7@g(~^{_M)pi9c7X8;Bt#fx+xVwOLZ+A$}xkj|Kl! z)5S&a>*%a%nF=GO%PFQ`kX_z1_g=(BruvcWiA&jEm+@laBA4f(ek2{ku7ZvFQl4qC z7=Ps*;Y6aWsCY8M4>w%y(TBy7o1tQNY)W)^C?;>R zPA^l<7QLdo9Xk8GRI}!5s=P8-@Ri|so?KG1YWZ-cW=Xw1HK8b}SsmowSii8c2~Ch{ zPT@(VGj&>OrlDimu`GiHE)1_uz%?A?2Gc(F zDzQsyWVt%Pudq>qGOTW}PIp=J>LpXh{#Bzj8-hsadli6|3@0 ztkcSiE2fl8FE6IIrJ6&S3N-Ab!is{4b=5TmiyE8w>xc?IQ6Fxes>#4TRm*BqOKD6E zbe&(IFikB_q$Jl=&8uvvXfpQ`_0Wm7n&~_$s1Q>zB2Wh5=7{Je0o&l2BTc;Cxkx7F zO)Qd@ib^ z;EKJP`-@RrCFbF3-P-CUwTqg}fYLBj`x#v~-JEcshf~d|RnXsbq(wi|ag^;HEYwOh zC#z$gtPJ=ImZm^j`WU~WzIhIR+JbgSH5*GF5ZY6kQF|0oI_xD1Ek2DdZOCbmWyOGx zwN1Bv*s{c4*BBXS8YdxhyODv0;boB2{KeB*c=1)V>AB(N4Ru`U1ijuO3%%bmd8pCu zQyy{OS@7nlJYpJxZ%pj?)fi^|o|;wRKQV5wY7H?lQW$G+ji}jF$TYVk`xBBSNLHVx zrDjR{_{v8WI+9yG%REmN(s>jmhLE3ENK;irrgD%+`E<^hYL2Lh*2y@p+w7UA=$bf< z*3uHf*IN?6w{3R8mm_8jebSUI)R^^kbd;KgMo-_v@x3H-slJIj`|m$}^S(_dk8fU= zp8J>a*Ygq36hlAx`4vwcw|d62FI3z(vF{%i@y81{8~UJYAAM`s3C~U*Fn8(BS680F zhje@+Nb>@Jol;BE_&kaPrP^N1OMFKdOF`68TzdJ%(E5_Pr7$Y z-9P_&-^LC;Nd1AKKltDsUroBM|JoN@#|#@6opQVR_SEa(n<=mAoLTh^byqf2F3g$B zA2BrM3|=yB%;~chx<7Vkte)RE>zdj{)pghK#}i|R4zHY5yQpeGb9K$EIsAcEQ)Bhe zc|GOgC(D^%+tfH~c&=iM2QEL<>m~knNy#09#C7Kqx(@gXXadP2+&2a zH;wjY9I@x+{MQL{28|eHG93<{WwQP#d5yGrjUMCY70Z51Zje30`z?N`6V~K~S${-3 zt{{vyXC=PP52c&$CPhp0%FsFrrF*j4W@&uw$WlxxcKD%m?+rhc=0%yh6`Stq%X@{= z#LB)&Q0Rx)fcc>`PhYa1U{b8`LuuZZ2;~^sSNu?#cQ2t64egtLD9zJX?^+3^dyo2| zG;cj2O>XJlMn9D1y+~+~q5awqrFpLsI>pdl^FwLgUkJ%YLAobnQ?>ayMVT-+z?)tIOi7z5R_Fn@^U(o3*@ zh^^8L3?a%StR<#|Lvj@Z;}yl^(-Fz;7&yoTG6so6ImXWRHe=(OdTm>ky`dFD!4W@< zKf6^K&$h}g@}Oj#+C_4yUvl}7RoNF({p`SvMC!{sU)|6#do8v|XFsHW?$X^M;&zG~E)(B=if=A}~ zc21wO7JXw@uVeOY_m7VZ!m6}v+RBrVu`)csN~AqwGyZnlhgj3N8;$)|-x_u2Q^w5s zfUEdxENiE8AkTFjCp$)0Ii0J*Z0k>OV<4$i+F@DCVDI{CVnvIYHr_wJe6VludIx?F ztu^SNXd7tP_LMEAyz7lsQr}N$=Tkf!uYT)&;W&3mSQs4)ZGGTihlk(qTS0a5c|$V4 zD(R{uYj|`3{FwniO|su_lE7$qTT!m8L+>Borv>|}PJ~o*Ph0b*j+71UgRo2fMq5#i zEB32M6MMevj5M7QU1uxWnJNzi{UzTbI2|Fd^{nn)wAWZ;KAzziD^}2|^CNpHPOc0~ zGjKEd^k21!g3m99s*xe9&CC9rbawgvmO^8l*h&}q*ivt4AM^qiYw2S_skbm}?vjbx zkcn?+8aj|Wwyb+6fn9!HF$>v=wf041tm1|Rwd)v_!N||ICyW8&bp&T^#`rGhE~elVWa>hAv9mO}LED1F zovz1FG4n+#r0uAXXrMweJ|K_n;XFe6CK%XKH4%wPw&3w4V8yh#J>_SXLPzZU)vnF& z$}D#8CJ3Y`bIO{sL({mHA?9K}U$%S6#j9FYJgMcNKas~I7*mA!v{32#w2YQ5Ze~tA zVqnI9)5|;BwajFez;gp@3$<;^t#Y;@jjlya$H1+fkHxZ#)iqPvOE%|EVAsB?d`roy z$SuXIitfgn;2Of~3AYp8T{2&8dt~0)dB@5@NtnK}q9f8y5sKE^Quv%`#wWFuoBwmK zt*p8S?Gk7?%wf{-7UE`KU1aoaw=rJa7+h!QYm}tCdHYXYlURop)WH}sj}r&3Agr^5STzE>?3#%%zaLcN zZes?VYHazCIh$&{`6}&w3q`k}`w- z>57|?yutR3tzKIST`*1%U2@s*8o6YViz{?S@|Gvmw>IqX+A{j!S2-;II4+f9>yC~| zeR?j$hCg_1*(mXhw!&L*nIWA*+sBpF)MaaO$E3{eO0jiEFA9M-Tw98`j8%!Pf9T!g z53!F=7-WGcTp=digjVpo;;s^A=dKT>KiRrn(s|w?HeEIH{GhI(jv07+vk9EOyk=Yf-bVFQT zD_TY-=GBcx({e7P)7HhR(bl6n^Q9S6YOedHScTk;GShRmey}F=)Dn^@gltci_icU`BkoDi`g*@2Wb3hukgdnj zC=y$brG#ufZYE^q@+Kksj1o@6`kR~=5VEu+Ey3pOObTq*4IlX zbd1Sw03rLdL4=MsvAKkFhS=AW1@{~ino8(I6DlKgk_lZw=wuUGKxmK&Eg^J@3GE>? z#e`&!-Io4ZLYB79h0Z6+(ozw?sV2o?glzeaC1lGtn9yk^b`+t(CNzPN&ipukC3J=f z>4oW;CR9yGr+R(8dO~NJ&~=1{nh^h(>y!LTbNSc6xVx{NdC%v*w!H6ofyG+OwC4hg z119+Q&sf~|{{NgsTA67ZXCLGL8#d5JSH+fMaa_D^x>}@_dA2-ao}K&BIWcy+wSVRC zWs5GF$G=3WSX^0M9T4adP-GaWcF|l*3{t73;wkD2@sv>k!Q`VGU!0tV2KihBbql{3 zWhQrbGah1;Iik?VVw43?>=op5T|jU-w{@Z1(S`D07mDA&(1V;`=)%(xN5LlSh_l6S zN~mvvL{SS4j-w2Ra$6i_1eBZNC?lb)h@(h`pN*r?J-i#^C}W^}CXO-|%5`xR@eHCz zsQqmTmCukcWw^?GM;t}<`a+m8A{WZaIEw1k8b?vRJ{Lz(y_UsMRIjL`giQu&a_-5p z?QY_986GceKv3hlr&P&FCXpHY8b9b6pQ3QQt~ zx_7sV!(Qk5sl*eX3bh_e6>rB@Z;*6}Cq9+tvDmZXEw?W4Q;8=&71Kp1)z4pkZf~rF z%l%a1iBH9Z5=s?sxfN?1<`PeQDmq>$)wtzXz7>1cT0fO|`gqTCSJ7xKw$5~+rkM)~ z>yw)iQbrY5)-;t)pEwDlKD7%ln~I^;riPlPs(D^T$dsQ6TT^x>=v!JcVPkp5H@CXT zerJRkQfq#7fl1?TtNkqe$R>N+gE7|sQH!g+Hm{m1%c^t6jj0?yV$RufoY~SI%#)5x zG*9ZAV;z+{d|cShX^>ABbEZE3+_`h(`O}7t9hVcnKFH4L*wLd#T7KC%O*eKin5aOPvWl*g5^0Rx6>)@Fmze{TJiC6TUxc zCC8;@Tuu*mPG2JOWifE6s6E*^eI1@Zb>Zu3zw|Ai$7E>oo6xPD(|3ExmxO%7*MuJI zrXJc$zN~KeXwzX~yQICeG}=tL#(o$}qyBfEGOGJ=TN{-g9ZY$cpv+anzhSFyKj(f_ zg5@iv(W)PdTi%;NLNBRiapi)@lKQDNjg7UHi}^i`kG=oVDS&(~q+z7a_mRFUl{t zR2TIqY3U}Pcp@ySA8YTZR_6>;V{LH=IFj7E1fr4|>ya)N$bLmSNh_6~uEchb*MZRq?VvO&=TG?ksY^RdX{fBOt>L4` z|F$8n{5U25Hf5a0FSt~8$zAjJET1?Yxu`zpf|C1r;5d*ypOHIjY9sdvU<34g@K$gl zDEUtUC5s674{#8_;F52@<=g~f%Ag$vdNJ#U#oUickgw91y%V@INND?ceq}>LZB4_> z$_35V#-Z{Ku9P4^Iga3ov7X*o%cq5g67=?^h7$DnBS<;7ij8HuF}JH*thZK~hS=kG zWji2rl9xwx9ec|3tS9`t`i5F8$XCp)RCNGAZ>#Bv@H~Ls3oTNDCbXQ*}o9z+MU$h)DUWIx|?)y zV3u+Lm6j>zw~4Cf7hEd0l4#{z?Gu+$6xF2#)a*!mL{9;u{Lh&5ZUlb{E(2u+Z#nog z@bjQfz*d0U!B$Z6xCu;@@dnbPcU|@Mm05Ux`VDc3GFBS(u^;gJb4_k`X38n2DMe)>~trG9j!4*1Tsh87&#fQAB!H zF#75nYv~f!oNyk@OMGLUUFIs)OKl*T2XoaIk(uhc8q_)1mqG1`ZwDuVcYr0}SHUa5 zuYuQqcY?HwcNcg+$k>TK2;K{R54;cj0Z3ezHrWjQKy9*(_{6zNX;e?c29FJ-NM?#{Bc6~&w#r58;v7i^Z)k2GhejlLSP8-MR?aQ*U`n$ zM}O^%H`iX$@4KHGvF$gnmwmg|e))Z$67}%qckjO__P^Qg`k`*H!mau!AGq3&Wk-E{ z-^z~5v0vTBzLXu|Q$BhzhmQ=t!~N)ajS31H|Ml))7-#BJ8T|U0Z*~<*_u740n(UaG z*mO^Gp<>g#Y-T%Yn10?Bekk3m_CtK#nQUYEBM(26=E>sr;U>j;Kg5@{ekje`mtten zz5RYD&D(T{Jw5N|$qF_*PD(Yv52bl)9qkE68^YF9YNMYQ`0h>juJdVW-ndj7o9>^sNf!8h;ISE~aD?IgL!C#4;;cXUMd>BEg3?KS(_BRe~0 zZ|{g~Z!hBCef<0Cu8xR_EaGk-U#BTfLB+k>UX=NyDG0CdBYX*)*%8@EHa3IyqCGJV zy?}pvWNp>>Tai#d-jdLd zH_^q^kM|_@V|pE3cn{rN9d%cHv^ogg-xB#8HR%5B3-1?=Za;7kA1KGjceY2?AO>}- z=1p{+KNz-6hHZ6>ZM7k9G31qw99d}}6c9RQukVQXA4a*rt3PjVUQdk4fe&llkhH~& z*k>&d^041aw=Y~Cd*WScJ{SKz-P!L#+9OZUjx@ru4Fg*FuBJS7*|P&$%Tsqv;XQaq zX#9%H+x|HFCu&)D8GSc|`DNRa+LpO5 z54Ha0lV<}O?%PZ|Z{u$Q#usI@ES_J!E!oU1TbO+27jZ+qCv9dz*)u=F9n;XH4gS2- z-n=t$KrkM6+BwHgI4}Rzd{}z4hN%tmY3xoLT%0m;eP`OPYw6!lXck4i4e6%i`ZfCR z>hqZoQ=bFOqh{9J@#-!+lcGu^`?{&v_PC1G_fWBmsjH^^Y_FPXYZ0F9Jx9pW^sVL@ z(E57k5VEl+uwJsU=ey8M7h32-t6k{3F0_u2IzYDf3qmKFoVU5qpB?h%P(p(Y zUyh>rh=Ojz_IjpA@EyfKp5bF`h}{A+s1o{ptz?9HU$XC6{u=D4&L6ui)u71qAnW zP6hl+JiUD<{h*&lE0^S6zmtB(Po;iASLFJQ`Pcpv|2~z9gx;qH92R$2U_I}dGRIya zX>#i6J@Gz2m3ZQx#j-z?>Xy9r#p1A6CM}~&Jn^a2^JCAt{TGL@ArDdw_EU)`K9xpi zELHs5@qk z&R+gcyyNZhoo)DyZEkMx&URF8Zv4Ah|DA1@ce!c9&K}F_y4dwW?`%hmJUe%cVb?p` zH1p2()0fzHv$Rx~ceb;k-S0Q0;?32~JKJ&RaR5V)Ir{?3QUFZo;hpV~`Iaa6*YG90 zvt5qPt%C1Q<(BJQpr?1X7f}9*{B)_PJ-xFnf@ek-zSw|MdJU*g`8>MUHKB)htW~|_ zo8L>m#%}m%s!^z5B26&o^wC?d)vfQ@c~BM()#wg6~!vus(YOd*78d{ z6;~SZ=(Ob*I!ZBDQdd{Ldh-xOCtx)8;&uUZ+BGOF=l3x;#H(j*=cnfl^66-{sP5&z zNoA-56YEt>uhg@HdYwjK0Cz#XzD3;G32#)CM$gLwWnjo&N!>XqR?Qp-e8FP~cBxtT zrARHG_r~1)@m)a5?x6C_hE}K)y9LzPMI^7x27RP;$8mOqBI* z__adQK-Q%`q;DMqS>H)G(dU)Yi04&)e|3^fT3ETnR$KyBp50s_0q60EhM3KSQ7#Wa&)^rx zWitIJ{AQguOXL^-7F1~l^1GYgo|s%38A6R$$GVcT4K9h(`VuSr1B*8r-{^6WteqZ7Dc1$)gzx6dArc*tKMvCdD-;v+Pp`TR7 z#6C5R`m5aNeAA~&LG`IJP<^T#{1P}5ybZhqj~!B<1(tb}o{>&5wTIE|oR0e_csIRQ{_#^p>{(L^kH@7OiC$aeo(B2TD)ZgR1M* zV50n9JH+!C$6g9QT@3`V?q=@a;{IKJQxoK;G@pR}EASsN`87AzR8%hDQ>aCiO<0&R ze|J$48?3c;_Ul1CEx3YS&3#C;b`dJ)(E1YN2qLu#GhOyT%L%RK0$;76)m(ULz~negUik(cw|nhTbjU&ET!zli(M@tsuH5`fCu~5&aK%8+ayl`7(GGh%Smw25$#1 z0>1_>0;xl^5u|TL+d$^S=zSo4EcyU=H~18I54at?7kmZ04}2ZGAKVE(2+B_4O} zeg~Wjeizhc;vw)gkS`{pZ-8sSJ>Vl?2L1B~pq%*r5F83V3Z4T#2F?T@2WNp#fJ?w1 zgYy5p4%`bq1-=754fdfup8<~t*Msu^yaAj5{v5mv+zfsm`~}zw{t~FyApdg{#+TBlKMexk$@CL?Ng7`b&9zIr8B=;faDC92 z3J;MF98>yc(R|TFv8V6>RF~1>Z<)jw3|8~)qX_McD(wpLlu!gS>>w-=A#q&li^?rZ zK}DMCFbZp)6}X2F?ZXcD&d#Fin`=v!wqBR}_kGRQRPhfa#M}E={Q87=dmoG6+1E1Y zqbB9|Uc!AgO`}WkZXLCcz8zd@L+OcG{C4~FU(-L-t}lVo6TbnaCw>dw2*PjlHhY#R zeb+-LL`kE4S@bX9@4@%L9iUEn{s8JPfnEd81YZaBHRK!M6!4FrP9EO`*`Is6Kz$`i zUdEsMUqO7+dVd4&0{4KAgXsO}v*6p{M)2?8tKeQxUsck_qn+SB@Sh-aMD#G~_%Bd@ z@A_}>bda(}M}zN!(j$G6*aw5j;FTb{EqV=@3Vt0##~FQ+2L6)!bny2eU-d@+03HUW zqX!NLj|KaK13}Jpqoctr@EkB3oDHHYqjSKc!KL6Qz?I+t@C)EE;5R{J7=0A{B=|Up z?at_W@Hp^U@FcJuJQ*B9_Z)&PVj8-C*V2YPr>ov??L`jE83TidLEbx zo)4Y`a%K=M06CM6UIcP>5G@7^z^lLu!LNW9f$~dV1pW}@6Pf4^a60%JI0M`VmVk%T zznOEQ(oy`aSCl^EtvXrjs)PQEF~fb(f3fpZdeDFILI1^kdgvQem(yIVt{?PYtYg|h zCI|f&8%I3{{TCnfUyPTWgZ_)H6W+k{pmDfZe$aohafmG6j0gP}AM{`Bye3aN=)d@& z|6=E5P#(18sQ94&;)DK+5Be{DfRPZaB4QqD12@MZSHppK#e@EfW4?3)_pC85kO%!2 z{a^QZjJ-79+3?3Bw_!d^N>0YKEO7p4-Wt$Xh{7|~L)(=s0#Hv_o?uV!w zp`%QSoqj0Y+wF(Q?@$|??#=T<)Q!;5CPiwR4W)Y-e#m;3R&2U=x1;SRq%YBtRk{r! zD?gOx4dJh!6r1kl`k^#$7L7Z=qFnqG z?8RwqtNhNUw%xc|u~Rc!i}uR2*pF<&Q^}-lg~B-Ego(eZ@rq4mYX}AY(=wK|?Dej< zyvin#cWszA=DRKC{t_!=`&x#XC-C<{GI!W^s~*sX6S!vi!EDcXI~2QLPT8i&v+{oOGeLjuD^WQ#>|lEDI?EpU!1$c5{*4ER&=@K z96uwY|El}UV=~%OA>am*Hjwve-_4{P8TL_a%J+>gTanVzgzY@JLoMHDSodPt%eb30 zh8$C#4H=FzjxDkFxY>AOJ-jUfFSj`2-Ysvn8OBwpO(x@VJ1K=V0f}qfz0|)WvKt?) zyBheTm|YS6S++4dR9BhTvi+w^_c>r?Z~ZWpontDCTx>D7hKi|nG1c*Fhv;P567yqw zs9ldjA=(I&+U=3o*5$h{HdPBZW4tZ2jF~vt6A5>F7K|yp15~o*N)@|TtvSAj)})E$ zSh=lvU(oY3w%SuR`>lvu-tTsPHqm;UX^&LO+uMTTxwMxB9TK#J={9sem27K!#va=a z?J3q-IkxV$bpEJwwJn(`&wnAm%X?j{5k1InpE`dt{o&d6QTWvM`??1I+RiUHv3+QH zP49KVP7dU?&nOT|vbB8_-h%zXD(&%;&bwSmY?t%pg|)?AcDPKdLe$|hd+Km<{~J>u zbhylT^^s}RhjasaPKFfmo}TefI$wLnvvR2^U)K9nUOHTYy+BjmsWUMa_{5W1$rw%W z_wO8)nT={Xi22!0YLU9^NzHX$(?FA#!d+*(RO2UmpedT_U}rmJ70l7bP3x^Iq0nln%&4(4 z$BKb`42Px_w-d!i6 zfn)WIwGE{+^~Ak(erC(kggOQj3SHa_Q-D^LWD3*YorP^3Pr$j>j;qnyn35u%xpc zS6$n7T-DokT)%4v!_#XFc|hM9g~7PL+?vB1$flxc)H zmu_xjS%+>7FKA<<$8-_9GQL{^QBC~5;;)QH*_E-4wJYNaRr@H)ev|b5Ci12QH=*E7u~+L>+mAQe_FjdG+&$xc zZBeya9lzIfuhz&86IH&mq-#{WiHf{Y+%;-@k4+Fif$Tic1fn^?HB-@khWY^}kT()0 z5SW=j{7seC{d`b2F(v!V%k1(;5jfmQ2Ur!-@@{hw4J|*r4Hr_Q+JhR zzMbXRmyOTJY{?4d8>N<9UvPzXQ*AK4O^%yEVvR%9O(pI0R+CWtxaloB{J3^)a<+7K z#0ne7+ofoljhAgmW--xuL#&e|^raHpmyFKb9NK0j>df_>EFS15#&$YV3-245Kj>(f za%Se((s@_xS#dpWXA6x@4(;YyaXBQ+SWoaQ({&A}tf~i7i7{u+mbl&MbDFL!uG50aNU1dOXARo z#q}W5-7Tk^j;h(kRG7J9huNR8FEQ4K}m~332pFig#S>`!4oW*llbL zp=`tVc^7(^kWQSly{#^k3OhH@mGI@&)S zE$Og;?+8McZ=j>iq%!#io{%2-$WkcC^bJZLXu$JKA+FL!1|V>0|k96Qj8#4PCFBfAvp5c{`5MTbt}j)LWP4$llvz$F7aJ)Ef~27ZzsR6>qy7 zGp!Us^D&JLro36w5BP+WR_fTcO^P|w-pK*(^wT@ z+oi#cjfoky^Q};Zo>Akc?uA9XiXN0b2 zU2rFuZO7|nT|?8XnyR`+S<4>wLDtzvjT$|2M2;?5XFtkVXJ2_w%q?P~M{Oy@S+=JW z@~>{JvtKd;*L(0~m0KRAo6v)G_8(pnWMt9uRW?aN<}-s$Ite?-MT=-*b&F(q8Dq-3{XYdmo$xvIL730ZHIY5R0eA zN_{f8i2D@q8t_o?v*0JeuYi2zWUR&FJ1Y8p?oR@r1Wy66RO+1uz5osew}5AYScde@ z0^b6Mf>>De*po)Fgy`jhSSa*{gIEysMuB-C789db{`1CwSn~76g0sMJU=4^R#i%@q zo(tXz;=wBVeQ*N!JeUXm8O#U!Foq_ADPROV9>ijN^a8K|tOqXw?*YreHDEdT7KlHr zC^Gae29INsz6?AS{1ix;JuEp!8^FuK>%mHJ8CV5=5yWzA^cip-cogk)6*vl90A2(x z0!zU+a5LR#w*Rvc{kpL{R2daY|wx!&4})b`i#%8=C8zYN|PPh#B0k zT~ymtRaaf(od{6_PRtiwR8}!LZ(`Z>l8TZ@S$T>6D0EUJPDeG?UWtwh`-HGAIm{p@ z3n|Hp>Y7D$3yoe}PR@5^vKq9~kUEu;%JVsmh1o!R%#l8n_6yXD@;!pie z*XR^4so>(a3%N!@D}h(;H}_oAXbv2Uj=UizYX32{s_Da+z5UP{2NHW zkNz8c7|dYot^tn#9|4a69|NTW9tTebp9Cj@=+WpE;6`u`xEYjX=@-DyfLKS4eiqyU zeh1tRJ`Da2d<1+Id<^^(_)~Bf_-pXb;2v-{xF38QlqJ}IgXkgeJrMoky${MVZ1N#k zpal;BYeB5DM$r>qI(P>-0Q?nr61W{a6?_dm3v8wh&jD`$&j&xj*v5Km^vB>7u!ik- z5%?514SXG(0iMZrx(u8GUJO10UIlIg7lM1hI`BQP9@Hnd4d6LoGdL5x2D}bj0$vYB z!CS!_!27{v;1=+6;D11@R!7fZYrO)z7{q#YbUAnv_y~9#_)GAs;P1eDz}?`z;6Cs^ zP~Vi^59WXmfWyFVgX6*PfjW8oA^0x%82CL7Akg*0rNd;NCXy9Pqc`1aLceCHM;X4e)oMzE5ojcYwS+ ziS7bl1#|e46f3#W)4?6!Q1Epy4}1eG1K$LrAm9E*zX$FDUjhFN_Cxh_f}_B9z+w<< zyU|(Tq2NL=18f8j1DAqX;Ag-iz#G6L!OwxmfvmjG{5fCL6s9L)Lq(LXO=0%4dAD1B$dj5BAWWG*1)3^)=o;J*2w|WVs$tDHrDQ@ z(#j^dLg5}8JP)QR^$lkGU>cnJJnkhTy=+i?mAO-abvMu4X&0wEyA9E%M_p&W9VBlP zyoFzIsr-@^s>WOH6E8zHs#681tgFD&z-o~3<1x=f^TD~`H1JALCq-EFj?M)afvsR2 zxB;vOe*#_&z6myf$Mf7qP;zSm6UX4Y&~<5y>Pj4gpMjRRcUBtpL%l`&chG^oq^i1w z^_2}ZrTo!&ZDUhym35P)OuM;g4Q*!iSiRJ#T{O2Y&rl?gfRZ1R<%6L-^nA%u;=a?T zUx0p5nexD4AaXMn_#@!s+)o8JfCZprbP>22ECQbgr-NEwm4Ji5Qc!!UauBQT#&ZwW z+dU2zqr1T?z`ui);6K1BQ1YN%y2$uw^fLX#{D3a~{TgVAGFBRiA`9FflW}9^;+g{1 z=;*n;#(dn_e5f9;9v$@4+L&xNsZjo<=SsGEW2*Ndy5>_Sm1QBA4=w_)1?#{yU_JOJ z@M`eyU<3F*$h#!7cIEv{^f+YG3=RPogYt4my`xx`H(pd~LGp}V4=x3@X8knyAb1`4 z6xag(3cMct6G-2T?gyj%FFD-+CiZW+>^zX{mr%}e3A#pURA1%&pP20Zw@8w@-vl2~ z_|g&U`30ArE7>2#Z>>*cd>h%bw=l9_2}<^>K*|0Kpk#kDDB0fvO7^#c+BbX=l~9Ap`#V6%{;Qy5&-u2IJ>$*D{w`4R`8t>=^GfP5fHG)s z>yl2e9B_t4yVAYD-<&1j62K)ECZ37*9&`3DLp#V{NNL1v7$_UvR+^TwNMd2NzrX z?Rvvfa~2V}y6NF8Ld~yc)OlfX?V`mD>#zpYojQYhhdl)i&Ndbp&cNT`d~-4xoD?)% zYi@&chlVA7*D!tKcH|sfs<-+^F29vNy>F8B5R(d?3Oy6lxxkTNEhrBq*MI}T4IpDT zdJJiq$Ibr!1W@CW`8+CJeG-@to(yWAEsrJg;3Q8aUj|PH-v;HOWG^@zoRn-mk=zW* z^T-R}81QhUG!~o&o(EQfQ$Tq`-R!Rg?4K+X@N=dmAd1g{0<0rhF{T9Cb#w+dX^ z7rg;K4t^c%0O^Ou)5yKxKe)diJg%STeG|M8{1&(vq>jYIc31=pq2n<&?prKhs}d+Dip{1QFyDUEnI z>$D%k0Gt48?bF;;Q&Q7dTismgdk9tD-CSMzb#SJ{_;Z(@qrNkc-)^7!bLyaH{{obL zc^;eu{t{%4_Fe#)qrDfw)!$tuvug+@k40!DJ53l}aCh(kP-RnlX7N+o=-NlURo;JtgTePC5Ac0( z3CMcDc-!m)GS7O+AajV<7u*5%1N+bpsi5Zibdd4qab6dttvoz7MGr;phl5K%+A7Ms z0`C)`WOM?UDEBYHmqXrxOj_U{#GURnCYW=&oNFu1An0EJ`>2BEN-CLJTH(Lp(o3`) zpDqY;C)h>eVWqst$Xl8=PJ;(py4GmvU=FYvJa8u#ufeS|vf#xOB{M0_)Ib?Rd$uhq zo`0!cYBSAU8-3bM$V_!@14n`@LA?`N1x^BQ21~(P!OOref_H)B6@3j{4UVU6ZUfP& z9y&VO0DcA3Tzxypc=YZ78He82z`fv|AnoXV9Xt}e7aRlL2TlX=&KIR@9^)=bnY?d- zY7fp>yR>lxy{kDXXa&w<^IlRWKX6zl2seFSgr2o3K zvc}Q2aJy=t1?^MaI6Q9twe1|Vx^3tGkG=PgkMgSW$Df1%(_~tb8Y*p3(>85WOKE@r zY3XVv$pcB7NhXsS2o*YnB$PD#Nb`eIEbbJF5~u7^S68g9qHR}P>xxR1YO8=)Qp7g3 zRjJNYbkQXSHLdI#747%^KKI_|c_s-Jx82w0k1z8goco-6?z#7#d+xdC-si_LW4Frk z-UN^v4y${lbU)Y!&^2`zQYJC3TDoSYX-zv^Hyr^F?Z&;|*y^@5JzX(%>q2JpYslak zyZKQT)QfBJ*P`)Xft)FyuL52Lh_BPgx&PMyL%9ArU=!e8zz)D~0mApTz6}U}(Aoz$ z4!rgQ(l#Fe#F}h<2XHCiLBKBp;!HgL6~I0~*lX)qz&`>W0fg~Q=Vz!v~RfIk3a#IzRy_X55IxE~PDzQ(@;_+!9d0UiZB4`TZXApL_B;M)OT z0lW(E7l1*){Y;#wh3pbjQGfC*7CzyJ@yQ4B-3N)@5p;@EW@=D=eE{(S8rFP-{2=#^GnxS z-oYn^inOX}_41Y`asIeHBud{O&o!6oCNvl60RDK#n~F{&&uiYIk_DqsBX~!N1k(%w z5j248Vie7-5b{!7b>RwLu4wBHYBq4I+HpTW*4?%mH?&&1+J&}TYklX+wX(5sb}=j0 zLb0Vb-rkbtwIWC(JJ{#&TeG%vwcJ57lMRm|z^B>JDrYktnzwsf&pl1>n(aGePVUuQ z(Gp?HdvLooPB;jbPCf7YiGWoX?$MVm8`@!0a`IN{LTY02mf`ZdVJ> zZ~Gh1oz0KoSqePG%HyV^nv;5(fDPKGF{|3y8g3C-e3!uGw=aY1I0i;%wVYaV=(C?3b?qPln_(#B#fZ|UA24Jgx z3s?>KDquU{Yk;2x{5>H0Vx0oa!0`P6a0=ispbhv(K-@pI{sj00;Ay}kfPVoz4ft2U za@d;J0dfD%%EUd!ZoqMXxDRJ#0qy`C5BNF234mV$oCvrdFdGo}wJbm2%Yc&rUj@ts z#C;{}ZGf~-*h`PHc?rl5O>oxgk!R&NgR`z5u~xGT4b%q#C%86mc~f(H7apHgj~S4u z`FYZ#7HZCGca}TrA=fnXV|~;?Y{RTdjeH0Dg!E;AivTYNd<5_cz~2ED0@4q<5|Hh@ z4)9gre{luv^|=U>=ORpE|Ko(uI~QT{T!cyZT_&31xd@XN!9+d*uk&1l$%uG3})_+oZediJ>p zlW$do$tid)y;g>mL)*Qwt!rUxXBY0TR_T*!jB*wou z7kd&G<$19?2=*k$71gzoaG=(XSXUy8vO3=?KNov4R8xoDJ3@Tp@f{_W3%z1F7klzt z>`8Ij6d97w~MLIz+gg4w`p}Lytip6-%t-`KeXjeK@x-gx%?v`ph)({Pa!tky^W`gcs zITo2jlr)~j)w=ep&PaJK_T;(PlTaB-IXJcw9#)9s;#DBJ>`nK4u&A0KD!1*l}$YwJ=- zkH<@69WKcrPo`+`figU1p{4jFFbe}=yEYmWl?p)09V=F?ZBiPx3=e3m>fm!qIF<6{ z@jHne|Ay*ds0L@S`UFc#HiNWlt&p-E3~D2)Votg2+J)6&G?L2pEHa^5k;M%my8;g! z`SQM~FlfpxM)&amixpZ}S6wN?-HnFf>kn(zqTw9wJ8`|JqAC!U%BkddEf!yhz=5zY z@9W^knNT0K!;9-eG8gb3NFI;JjF$5Jthl&%rf_HZD)`0Gnuw_L6++nD*=?l74_w7M zdX}$hYsMLzFYkM*y@8GnVDL)e+BK28J6dr_?UO@l)LmH@ti?M$g3bnd1LV`*-Yqlr zOR6-Q5BFa>Oc{JvVG)&DP@KHC0!1l?>gsB6+XUSP!aKZLs34jz{=jpwO%)SVg$* zt6IAXiq@CTxn{|^sFf?Uyi9R`RQl|IdR~zWMNwP8h^D9Sd@n z3E=o<8dXxjcFdUlR`62sFaJ;DO3o-T@^b=9&Y1ny#Se8@Io#hu!OSQf-S!*ay0*_O z9>sp<42QkEPsMi&7*T)J>*TyiA4TJ9P@jr<04ML>1N!rV!;( zr?M@6lPn;(?K+iheG;iM!F^h%vaNqd>b-*d51oQHHPP^6%u904w&FQ>pA@Ny))Ae` zvHEoiCGfZ}a}k+Rr?Rawq~0wh?$@atYr9S%7UTIU7t!r?3h^?Lx>ibT)u|loex1tZ zjbX{nv9fe3+bTtBnv}Rtr*f>VI)zA=lT`VG^TQ_e4Wa+);qX+ z99$7br&vmK>r{@lUZ=9HmmJ(t2lpua-5FA1NT+hFQ#zGx@mu7~&9Ndnm2FMQ=UZ2l zZi`MK0;oWznq)>Ar_W9`$aZ0kOF*L)uWdZ1H?s(K~A zIY8;|)+t13)hX!iRVo*{t5exlVF`7fT#9t+t&biG_SVel#nVv%ewa$I1&9E2@5${* zA_&maeB4Dh zx$md;eW|5e6VV+ieo5+*%^Rm?^r%=vESUvUydI$|cBD&LLJ*2V@ z*+-bcU_eKtJ4c-U12eBGGHKf-<5awxy*gMDXrq0b444w+np`%}3Hd(tP79{ZF2=aPtjwRG>`zp_NopJbpH zB=VE?(N~^Td2D96fAhYKUOWC%JDz%&?tX zW%F>xq%9XhU?NE=P@k(pim3}k?>W8A-|s{OlLB~^9MZ&q3QbjhFS`s0r1c^VQ`zrJ z);#BXCB3(m{kg#AzJi!Q`%?Bk6(x>oEI{~>MsP2X64k9+I-IrnMCJ{4-^LXXmc-dX ztv*Drnpd8+F(_ikR8V3(ob)3g3-S%7@-Q0k3>%P+MFXB0-GG4&kR-(x?VDGhHEGKa zC`rz;u_Od>4MWDKjf@bTZ#x?H({g|6Vb0vt7XHt`I8zH9CiTvkstjkWHC=R=!Fx=o zn!=>L9bB2m*l138o@8(An1`qV%eIPYZvD@xFNK@qr#=;0@_ntfg zB<)uT`u`+XA#J}tgQPXi2(g%l zxHB9U+7M~tk+cVIEC0rQN zA{{DQ&(;lIDievAMEQCVBO?CrvbTJ_G()mDFJus^*Uzh}ne@*%b|Wh@<+4EOZGqyj zdBb|^1Fa4dGXZv`0=XQ-yAYSkv7cox|5gTej<@}HWP9rH_1b$jZ`||wo(mw~zp_8? z&qe#k4|D^#l?0%vyYBEd&J>)q0Maw>Iz8kFzxlNGiN&Ol~9sTtG9IV_>^0%9U zXmhG5L-4x>IFB}O+->zB$d#@{*t>%3Sw%#7hq7L5g^{3d%f9Z+K|cyQazyXlu{53N zxso+>`wwm5tE7B;Z7^GlIz`aGg zcLGR_l&NAWzCd}6=OWWImJLljKryp%<&I4<80Z9=%MOrS4aZeF6vsU-T!x z$ScuK<>zU+(Ni*lPCdLTtpu+`2ud4nQnK5L64Laltoqc$Eomiqm0Eg&?Sf;t=@>|p z%ZfZaiWLtwQ+W8mVu_c<7G8P!RjT^MW=hd|UpVz}B&`ImJRQ^G--!~cV_Bip!!>Co zc$Mrym{(66UK5y4+CEH&V4kPlWp4WBn-H2eg^0BN7vKsdv&4lET~Ab%F$;^tm)V}G zdsN#;&Z;sqC;aZJG`jX{Sz|pEl3~SPJ|hfB0|#a6f-T2P(@jzl4ybHfjf6n zx2}{vcaQ8dOPQ$#i~DG=Jxp(TSiI$7SK7H!RX4iCu$B_2`B9fwqAJ&W;a3-;msMqQ zQQmDD1rPPn-XLr7MutQ%Nch=BtgyTr^&7Ve0E9;I7N0eUinU+kEBDC~cJhB!#tP{OtJ8$P- zI4#5ADoqhlynG_rgx#Hlq7L>agZ)S&Cac{q?#XyYVrHIVD7f>Chu7~kl?0764vs4( zS>gy(Rn?1oqBa`Jf@CS{NwDzMr$=+iu6{W|X>@0p|K;$h=sMjkA z?WpcX>fy>X8^bBi5=~8E!iml z8e#0=pXp}1>A*BjLc1^N@1s@AQdUhhwwPI%g zlUXmgRo0hkgZX8b?`T8x#%3Sw{XaGP(`C%!9C%qm&|=xuA4q1ss#XE7<^L9_VfmB6 zKJ4nnoIz2r{dM}RwDNwi3yFb3xL4YArg2)MjeZ}I2=h#LPK>^1@nTEV@D~^>PX98o zmD4K;6KnLhaT!})->qf@YgBa$1LK9ffo0AmE3v<{|9yi=>@8hhiS#oCzsgZcr560E zZZrL{(|HspJMI{JRZ_?C#R8u@X&cXQRI3yAPG^}Fl6HHzF>$khT;Df*AZkBgC0jDe zT-vEn*PXJ2?KJHM1HGcip+xv(;<36S%*cNp$B4rJxoXR9?y)*PRd@UwP6JqDa32^X z%Zq?aHL5)VRe@r|0h{ehmSGw2r4| z@BQ$<##>{z;b?8v_vPx|gGYe#95W^Gkwo>o53^{BPV2xiN4!6rM}3CbOTVMAxR(Cx z0WJ~sr|jHhiCS!SYRuFZ3@u9-dal`u9y*T@Yi?M4;Hj1`8_)AQ={H{K|{675ij z@RFp)$n5MnoygjqsIEz5-J7`C$K%nS+*H<&7;gJy_CI=Ke1y!Ziv1hZ7-m0L=ZVtY=bF4-Y<$V9i;cfz$FdzGkuUH76w|V?@Cl&SRj1 zKI5bh@`HF3xjJ$TwT3~!x8kO ze$%LFV9I<`h0bqG1=6Z`5%owFcpAwX_%1uD$_d{|AN(>gHfvH{pY*{`6N9mUqylBS z{z)I~6*>`->f-wiO>U}OVcO6}@|hxCe4ojmk}6l2YMtL9`Ql))j*e8h!th{>U1jWRYtvk@rFu_;np+230Xb`p)OOfM$GFWy>X74y{%w_C+0!`5I^0Td{;xKWec zTf|HFVu~_e%u8&zIP1*vT-A}v)JOe-LSB7Gs?3+VmE85}&6afF>^RlvS>TY1!sSy^ zi=~IMKPGDyFHYTBJgRtUs!`S+Z{3(niy<2AKA7TFsavZ?6>m&6HjZpMTD7=iMDaw~ zdK{qNmiVQk9LnB0_VkQHX7t0X<=%ll3;lp*Ku*w-zfV7;`{j_~-&YKpf!d%Y-eP*- z165o^kx%^yaV$8I;m|jxK0y^RWXn=Js3L}PW$Hnyh#Cb){zgB_I~?h|`cdUd-_?)$ z4!5wQA8EynexwyQ`jJ-L=to*{qaSI-jeevRr+$o31um&vFE*c?BKMDa?GwHBNt{UI zo(;~Ua2ILwM!(gg?gVjTlL|~pEghzi$mX`3Y%fK=vQ&#QWJ}cAJ9s-FFbZ&H|im7N1i~U?F?Gj(9 zY>GiPxFdxLW)BJf$)4g>Df@&Jzs4yJliOI}l*84nMOY99*oc8^sTIZ==!G*-Y8Kh| zH#kgEWu>MK?;$VfT%b5rULwU?I4h))IJ4=an!U9@+n zTjRONGwv`>kxzln>{Q;s)J=Emre;ecLRAU-R3d*1L z@btVYbNHg2OYP8M@b&hmD$#RF9JxYSZHM5$p%!`A;M5=vUrw{VJOw^2b)A;Jv$F~4 z4;Sr9Y3WX4oR%V?H$uWb|0{_y#h#0~(`;v(Hu#xC_7E7b9^883gAQs2OFj0`ymH^9 zZQn!w8#JdqID|bs?zf(vmz9l1p@$FbL=jhxm?3&2C5@tIj7H&b`89biw1f61r#1X<7hil;N&_cJz(IKgMNLngAjtXxqF8e;>+BqPD9l;1s<5brJ=S0X`;aX0;0g-)c(OI zIr^C}&m(n3X@XJ&wTls`7i$uM{5E*wM%G)IAQQ9Oi7f*F11TnRGh-& z=9c$=99^rw3G;e{B9{B*c`JSY$J}9;y2|~k@f-sqOx(}H4E?&O*!p35e25Uk~Ze8ZI16PYzQcY#Ige%Wk z7by#7?Tg`Pqsn`<;rb6g9P9B4Z6*NM&Fg)5lI9NFdXx(L(IJ^jRrzX|IJwL)<%3L( zl1ru@9@!+bQI5nmAIu-TdJKMJ5wc2cM9I-iUCb_D>OpdoZcCPQnUvP1wo$(?fH9U3Dsmmx*w$Yuu_vXmoH)~EM-==27NRu)I2 z8x)6FF<5icLTp^H+~A?yVYCFUwca1HnkmXivq@w0EAB)Oo-d>b@pvI413ZZ*w$q$+S&D)urRph4Y*UpcWSJ`biRj7Htz~RH zT8d|KaPl8LnJgDfm3qMW#82%La59oT$As9N)aVCzP+YdoC@un&r+QANDTSUol+5HuBm0Ov`4g!?V;j$+q2hg&lr^YiRrP7W3p#2YBbg1-ineRD@tw} zS<7w+SZPyS2<{~TA9vToBKi<7V%eVEWF=4HVg9|WJlF-JOM5%93+y!~VK2SJGo0X* zx|d^??AeuCx^vKZ%wi{%#onn7_fn(uVF$E`MU@)tpk(DlGTF0(4H4f6cbZk>CVg-c z+ATCA^=i93jj8za;b$!)k|j5d)QqjJjD+A`5~P-H70$He$)4?~Jry68^j4VxH@`8@ z_}Dz-!c+0l56KU{S9p7Rkd2uk&uQZ&1xFZya9i|*Jjd;M%0Bfljn1ICDIr(X$1OzT z*fe(U!5wJ+XuCx}fIm6UDp;rww2t-K$44J)$rzMT==DYVH4h&ijY6}qj^gl(GSSbz zRQ1}&4%sJBB^)FQQ8ws9vOyn8VD}gu-pF(M#MXY~K`RpWu|z)PjKjzwb)pUfBjhIs zpK)2ZJJF$e_Nk4^!{RE7UAgwYVPcOZvOX-XH+H`#W$Su!@Sw|N^adVxkA~*?HqMr= zsGE>S$uu}5&FM=PzNXvg-wy9kP9RRoCj8`}nm6=E6PXFf>XB{_o>GTaLp-#)N|hyB9!nigX5p=tk=zEK9JmAO zBh954lt9>3$m+C_rC!o=4N6{RQNm;)%f~M<3yumM>k#o5ZitLy)`|oG{A7istGYHG}DV$B>bp0rO zEm%S|w@>krFn9DZ3~$){$3|;~NS2zWO@PPxoDl2tEy&kxnmI~!7`59cl=V49>r*|l zfhVPb&?}{$f1`npMH>9qF~>sN9q*B<^w%S9l3*U_GsuBL>K5e1R|@-Gi^R9SFeTo& z^LR?@1lKQ$n+n+;MOOpcu6wV?WQz>it6c{V}M5thT*gS7pjGMf1`z@Taq_Qx75&$+4ucF zx0023fMD10OtuNpoBaz1|P}3GbxvD5Q97p9ky7y(jl#(D^=C6;$fU>9}xK zmC{6&zjqtoUra0M*%;vnjN!vb$M#HL; zCGX>c>;7cPk3_`neOBUQY;|gC_6S54-oaDbu>8?EytxR5G|Xc#l&*Uj3W5yPj={sw z3+JJ1h?T6zv-8qxSRkC63=g#W6HgOq&CFP{}2Cs2qd5-sma! z{LejmEaB+T&s&T0@OJw&9y=((<}#6myAN1Ku+00mWgYId?~}A&(s4=WGA-|i8EtU} z2-H3IrLuC9emwtv-{$>1Jil-A0iL7}Z9b8K*HWm)dRfIAI=sSW8TSB`#5%_hECz~4 zLAWj8zO#wF?^sX!4bO`X@c|TUuuOvXlM^*xI?g z%}p`*JM)4=Jek(51tOsf$;-^Ex1-$P^W3uscR0+qshN`DAcFCfy(5|BBBY_5wesB8 zD}Tfm(XHKmpmBJfJ%p_dDwX!8?5#;ZY#_uKPfmkNvQHYOYU>|_`!uw9AfsN*RF0+| zK%eQp%1IVx<4i!>yxq-_8RnggA{)Gbo8_7Dlp5tVR07R~7;(1%&gS)8 z^y_i9hBa=tw(H8GgBQH5o7Cg9IJ5+C@$ho3n5;3l%cc6L_MgJb>Ek--qhIxLs_vtQ*N8r5sxCTDm#TM@ zxaH^F5kB5bXKIJ)x`<2mfnNn;HU1`8%W$6(-vGg<^bp7zAEspLe~@aD+}Dw6l+;}? zy9$S(qxdi&>3mr#W~s&N9rcQy@FJg;QoMAm!y_Lr>>OTHl+CC zc)s-_QYDi58B+WhNj{rs-Hy}*>l&nH2yQM?{D4Zn)#0Q*g;br;?Q!T1IJuK2s?WdV zTUR5cxXeaMarrP(#lr6~hwcdn_gkc8sdgvzA5Q9+le!S!3sEH=LJHqTLD}2<>eDCr);6RR z?)OOH3oyvth!5#pEvb7jENVQyk5m-63D(O_>J(D^AWOdW{z<0I|AUmOtti)|`0Yf6 z`qw~Y)c0W?nk;=CwL9MTo)Q^!; zWltcbG%+9QuTsGRlj6r_6z&%o(n2X)0Ch!I@VCrK?Q~MPXu2Bxe@9A<{!$14U(i8` z<47so!XktFSETR-9prxH8q=!3AO!&fSNLv|3OcD)q*MzYLh5ZocLXU64)DKpa^G>S z$-NCJmHPptFgT$5I8uts^A6o_ky7JZFwLYEI;l?~rAj>Qq>@hR&rT{2LRQkf4JpO% zY7Bvr!IE6+4h?!cK+d+-S4@sV(Q>8=3MgL z2S35zlkdIuLl?dL+#i02_V72Pp|4CXEw&E7vVR0D`{hH$pDll=$J%<+@wp!myfyS~ z1&3cRYhJs$V|rW5H=D9DUVok8v&vSqHg!)gE`A`xiYv_Ymd@7Z?scs!lYzf+8B0}h z&;Qd~T9^0SUf4iXCjQ1{G}hzQ3l9ZmpQ4EniA4i6p|pHnOy}2NH5Q8lXtMD?YyHPX z57g=m0Os*0G*)55g3_6@W|iA2IxK2CARIaGtuD*t({c7K0Ezyr8vHKjEw*d3!OfEiG%E$_!^( zLG?43N`r7XFB*lRW~-km^?rkJN_}V)=98l^Ur58mRM2RRGn}7Eqv6F%qcHzD3iG>B zm_LoeOvo@O)`jr)&E{Hj0F3$>X>1#X`7AKUu$s7aF;x077=9Pi$5QX`Vv@k*zRO@@ZEM=78u7~v zhPA#5ntfOiTt4HVparn4E@m zAjZYQ?{tk6oIG&m|L)Ha59tJR zGtnNm)Oo+)_JqDbl2uqW9yLnzOS6X3>n-Ze5Br>7}>=xTV@Y|MUNFOZDke zq)9JD|H>`3V`68iTk4oDMVjO7yL+* zUWz`M+rrZOZug8=kuF7=Osfo6F>h4ISXW0=XIE=*Ar?)Q>R!0oimmJFS+16iSnIl` zRpm{coo%h13!7H;w1SXd$B(QHw6xgk)tB#u2p6Hww$)9m=C?L=Sq4?vV-U+b+t%DZ zQ$Bwm>w#gc#$Q|0s)*R|w+tSnA zZN=oOvTa?P#Hozo6Y{YYP0ihFJ1t3ftz8ADN0O=vl@{9^YhB+_fp7QMw5@4vXl?3j zUTMYbin@lFE+px72rdz8#mAC$6D#4{*lW5w?~Z|bOnkHEqUs|(q}JLUYrV6lZB^Uy zPSfKxV<73tHFdT&bc3i1izg(})wHg)y1Ny{S_56>tzGDIC;ngC*~$x@139d0ZEm;M zw{@dOEs*WnH7HAVJ>9M0)~>b|3Dv# zu5_X-7LHWJDp(zw+1$PmDpXc#mBrA>=AO>B?z>f6z-VoITWeVfLJBw~?5+-dNd+ix z>O!TG+pw~y8(+6xGa}bnHqxn_bs^@hRq6wS6|1^?y4V2-s%cdjq8Oz841QMY^5Pqs zi%Uvpu9#8UJa@Ji-#ll<+@|8?vs+tA9X_*G%xIc5r*&rQ@)^w~vu1km%Wv@fFxsl# zSu0vsteD%}+H%8;Ii+)FE_d-O#%xbXadD|P!_b!$&qS8{bMbRmcrzUQ%%+*M(6iRr zD%arWw$7T{S~9D-6t&EqeFM}~wR8E3vD>p^#ftRyTt8z*NrC4#V|MZES###hzG1cp ziR6sp;yH8X6co&vYciH)*JO;dDlYuS;z=-rW~KG+NnoJlW4`w@;r(UjnmtE@L1)2- z`lh+iu*}LW_wG%I=Fa5Xp!NPphbCTMi8$kkW>HgJe&glAhJ_X3$mQwCx|&J`t!=ox zfHo91RW`7*tqiUamVM)raBIift|hbpOV)LD_q4RFT_OgfynG3a;o8pbCC%NPtD2{; zU4947J8sIe3h4Q~4JR4jY~o&C!C+f+=i08dE4mAc!q*hkb#%9_ZrcD8SWtnfix2{x zmURmC!50;0DK}$uRE6IouNr@6`o#X(e>Z-0Q}@d0E6Ixee^5p-F z+n-r?{l#S;nfa-&O}_3cwUq8z$wG@}dPmE0>-Vp{`oG(=tkPjo}RXr>F{VqSk5z`&(g}m;NgbB-(zL< zbbWJ1*7|SMTWGWtFdq|@*M5!r04C(su!Ec=w2sH{S8Oei)c{HPvCP#-jR(wiaxy%= z?^Nr;TyHJprhoAZQCChLCruP(E98o`2SC&*SKQR_ste0UPTmRJaSQ;{Iiu^&9ypCc zavVtRN804-n7&#iS4n+!2hNXk@`iQsrd1s)n{Zy5lQ*O>&G0X=U8u`@4UG2U&-~cG zqqyKE6i+2Dk;V0`T7eD*^Wb!p6lX!oti4d?(-n zzyKg@UVJ_v_CE12U>L9i5UYQD3m}YZ{6m0?03QWx1Uvw^7?4LPIAMrW{_g`EIi`1k zjuK`2`Li*mmjZGWIHm{jS2|)$S%x%SfO+nijue zv4sKr(dC9WAQZT3>ls=O9|u|u?J0eAhcj-wJ@vB>95-$`AJzC~$cO#99gsI`ur|ao zCQuwJUJr=l$T&T&)qovJ`sxu@}_`4fA!;e;^wo=crC#=my8%MmcglLwZ5of^|3`ThE81J9dfW^UJ*?$*^E!f`JV;JBe(%J0zmcS+_-eYI}J-_)C3 znzR{nA}4RXzUnE)A-b3pb_RD4q`5uCLeyxA%v^qVPw~uHizsX;9V->no=`ieC(P2=FSvKEQ2&&jNlH@G#($fZqfB z3*Zqz{{+kWK42l>bAaywd>*h75VDD{0(=2*Bj67J9{_w2@G-z21MUTc{Nqmp{uJ;T zz$D;*0=@!xKE~%~fYSkw0nP>dIp7U|#{q+YzXGIf_%Fbb_U3(%XCua@5P$qV3wa?f zqJ?hD`fxMGY8`L_UG;MyA=oQ-{cMbpDd%rD*aa5fMl=AsS9K4KBLtjKg1 z3>S!8V({19)WahnQSm7n*WT12I8K5B;9Pft9b>6Vp&!=zzFZyfrA@Otn-_pH8E&~!P{&<$y`za979)C?ylgutw9TP>@UWxWOj#?$#xmb_+1 zpfB<}iE*NQe*-ub@OOZh0S*CP1^9cwO2AWq&}r*`0LN!o)-dw{{{+YnfBhM79^h%f zGQht8Mgji{cn9F?fLw>L>xuJ*P$uAGfa3t42E@KH{tO^^$9d~#0$>K(i#0EPBj9;} z?*+^Tq%PzDj?}N8qFfQG;BfMH6%=a~f zECj@#bu}QzwFvNTz-s_E0lpjX8-V!6PW&lA_$Kk^0jC2}wz$1GYP^t_Os#P{Q)dknx(yd(0d&GBrP+NywO;Z~2`;M#lfEOS2ORpvUVS z)#26Ma>b4*MdCUthJlnb@!Xlatgf4}epakwRS%BNXRI%g6?YeH1-X>qd9$26vs;$5)MB~qwQ*NAyzd=M5A?I+a?DRhr%m%0?Uhtg1&FPR!<3h_glxMhYm zmojgLTy+s0#+JbHJCOZDwBXhJWE*r+qg8=mfK589BE529#KmYk$V9D0QdwT zbkX`6;C+B!2kZrW67V5FjCY*!{U+eZF*}6vH=zzniN8~jly}VXkUw+8n6V7U4E0#& zyJLol>D~aOIVE57OCLC|9qUQ6W9vrPF;dE|8|}JFHWj0c5J^sBQqqr6=PUG}cy)(N zSmOx6>d;*pV?iVbV_wuoM&>*?=$&Fx&-r!5kTX_FHNN`*&5ttS_)f+je0upEguE%I zK0x|N&jMZnh&@U?0Qh~tC4kQXegqI>8vi6NB`&Qhajrw-~e9*2v5cE6DaAmzyMr7RC>{0WQ^ zuYUu0FW?X$Z3P}!lDHPH0X~K6-vhn`cna_rfd3768t{Jr;Tv0j0ECZb4Fk>w{3GC8 zz&`=50Q@uHM*vR)ehTm}fY3whuYkV>d>s&V@OcGUAK+uh%hBFUz$hTj_~IP@EWnXE zRgYr)70CbUd=GAz<6ozc9;s6-Lz+7L{oE*{m2rD(cSBu8C6@Cx+%~69A%CnN{A}t5 zwQMowEA}^HJh(Jm2vg#CFtiBd5dd<8lVHpa7J3f)6iuadfD@X9aMZ!v0)45yph8@p z0N*7QqRLkqmdG48zT7%`VQIVok1NT_Yix->b5*2|@lbBnqx06E3pa<}9bnoG5j zI@2;h18?kp`pIm&9w5%et@txP%7Ei@0sijM$ag@#l*_vS-vw9zxCHPrK%6I8mjmtu zyaMpofQ5h)!RJcAMSxcWE(5#<5dN2SE#N-_UI+Lc!0CXLc`@L~Idm8JQF)Eo{1fKd zRL?km799ftXI<-EQ z8Pb2T&TJ-*iap7 zhy)_hhFEP~I2fqGNv6uqutsFti=3jFBl1FFyQVq_IjExJMr2op1M?%+WjZ%&L~eC$ zC|tK7Y&SH(%~uS@k07xtt0PY36Gmi)?S<87o2h)_h-@&gn~%NN#JtZ-rz`D-id(8{ zE79LtTY5`;hUMVrM{6s1ft{Wzlj-Iy41^_%LSnITZdPP*2#){+Lso&#%X0IogQ1%0 zit0!p6sjw~8Rm0h-V4&0h_uA6jRxWFC}f7EkYR8OS32lSjSkjTMr&-mS1>W}31Knc z#^{CZ7#Q0Xkyu5bqN=)f0j!Q;?>>7JvAW~gdi$zlv z&C*3Hs~bXrNJW(hk?kI@Gb-vTY62Lxck0GuIvj)5K|59zsI9DFTTK4A^!$d}>iP4T zpRX&Np!o)BssjyHq2`+9lv;#gt6LOMvRQ+A>*8?9v*uF_@4yJhY2x{6q+ zE))#~1GRw#cF?Yk$naB)6CAp7yDG4-x-RV2Khep9AOhtzb}V>H3|bYbtEj7SYVtW$ zHFXt%nxG7W9mB;fXmhP-FKar_p=+=!qT%Yu;&O-y6IG38wv%mo84IAN3+=}0TFlcL zx56BUav|hZ8Hm`iTC{ut6Vb3s=XdBFj`OQ)Y&NQJ1ck_|iGp$k-2*44&5Qo39> z?gEFzbl>gY^_pgqLsJ!rgksSKJItqyVj(EXA}DlB3(+!6bDaVWf%$f<9Ag}*Q_5^z zp_%46G?<&QhQLC*l6|PCvMX-EnyW;2p+mI5j!*=#%DP~TbkN?aShUuzt*EQCD`kSR z$8U2AL;~gIc4e$QT(_u!3Q220ihPHnp`j+)h+y#wKiR<>mC&Mx?!_AFqP3L`IObHe z7mcE=u@?j?7RP8TX!X4M`gVtSeqFf2j$tUmG3bZ3(K4&quqh5*W3YyTb`pHwOD0mEyrrqyZz}?Wfm+P zv#@lS9NI4Cz_y8QVlAz%klFqvsi6W^aDgpm9)lUQgXMNuG?3X4qMKa_3mk!25(=(n zq=4{TiUvC(PwdH1F&AP?%dM=dh|;bpJI>XVRFJAmwZN{m!{{t+GBY7vH?z9d*b=9S zkg}VvlJf(!AEJw21P7d;1;VkA9Tp2!ixq|=#GDMtp?d+5P#uWO6l4W#cSP3vZweu& zJ*|4}f>@OusI*~!xsEb3)AD2nDk|(yB*yinL8MHIab60$F%k}l1*8m_o#oB0!Ei)j z{>5Kl?s#vmF;`CR1aGdfVNS&py}8jqEL7cS*EBeVeIv55Uetv}uUYYV-rPF1iV~mg z#j`;%G#6_X=O^=Xy!l!lV%i|Q2APbX0~O9eVeBw@WkkhaU}3+vaHy^U4ntktE!DPD zE<=@rF3JK)Ux4f~6*>^X7?npOwwP}+Jbx5JEJXnsAQ^HN9;XUNFf`&^u-paSa$K)i z6Eh}xGpegAMM=mdOL3_X{#ZQ4SD_j+bG&YLZ3HVSJcRjn7&5Wp2rI6+Uas?N0t;lJ ziACzP-{eR)&r2AJgcTjsRa(#4&gv$3tCOE!Sx?%_Ot4(z7F#GP=wepOzDkRZXM&Z9|8 z4KR=7LMH{oJRgpF1TTE68ekofhatp7K@HXOt1HB|%Hj>Lxt69#hFaEpHVOt4MeIg9 z)?nAnhbk^WgJ5#0uCWO0R$VkA7J|fBu0R~E71syK7$~m`N5rx+7t0n~hSeEt%IoSP zGV8vB9Ne4gY~zv+vkQF>lsDAXU{=EHRf}$r=7Mw@u_WxJLog|wpo-Q&w2PKzEjVB+ z62gX}rlvdqKOhu_Tg=(z*(kD}3)9(fGa*aq_nmeM=VS z(4QeTn^-#>hJohtMU# zj9YQR!otI!6}dbMJPxrIH()CntEg#!^`luN8e^f*bZBWvIoFthjiJimnkd6(agVa5@t2`uK6t6mU;7gvkDBDS&EV2c|d z8`c_ZSSw{4@R(GgJOMebz|OG}CKeuaT@(uMuG9p^T@ZqDOkZv~Wv|4Q$7zi58-&bIprSM)<30$HU5kyChZA=QY?1LIMpwu! zf>@ab@$X4&d=aUy-SCIfOLIm5av+c4b9fXt4eu*$?Kxe@wY}ZGzTbC7*G{*f98aX_`&UGRDN$#t~YOp4l z23-@BARNH%#WI6q+znx1G~VSv)h7p75zRqtH*|fw*oF2-vcdfBe!*v#ErY?8J9V-x=?#9LZtGID$?G*EG@2XS=H*ig=R{=&07+U@Gv(m z$oG<%ZKNJNS;^Rf$zCGkj^ZA*YTrfPT(ywem7|A`ryykZb}zZANu7RB^Th9?n?lMd zUP|mn>!@{dD8t-~y}1+`GFdBjG?g{jhtYPC?h-GZ_&IBNY4FJZM_UR=ZMcv^W!LO*U zg7JAu@enEJK0^tVilma*d!)BI_r&9H}KpS&ZXWnlf-9Oa<#w-NkdE%a7`h>d740ujpt*6JEuv^ z&DObaBVv+CGT9z5H%I4E6~(0|(yx)?>4zQk`34P7BN%X4Twu`ESRhPyCut;(w4vLM z#B(*;Sr@rdu*y8cMBilKSvU(Cei!O|-F2R8{1C-()2|`wC=!`{U9j-t!i(YAhpP2P z7T$;Q{Ft9EIzYs2kpd=`R_ZD8*EWRs0|?pHN6w{}&m?W}6)tnFFdim!uIw({c@d`n1)s**R-;B)w7EB!Y%(xNKO z?1s0c$_d4`nZjl}kg1Q*FiVtfdFjpJj||sj_G{Hzyt&t^#l!;*oRr9oY$`_p96MI5 zTHB;_Wf^pCl~TD&kh?;+rh)gxxt6FCCXq=qNby(&wUg~=9NBO!Vrd7DEFfNWW+6S{ z4F+J)6wzA>Y#jA;VI596sQuk&SZinJnzd*+bMM6UBABYMRL;?DYgym6rdy^ECmzR7 ztXrL&X~6RO8D}u5kyM zvuG&>S%#R>{0@qZkR~4l^X1XvXoJHJy$zSFOX_2XcRJfylhMRNCelz>c+0j@HgDwB;23_$)F0 z;qz`c{QkSYdZh1)c|A|%6#r)42fiZj`vO1uYZm`3^o4gn@#^*OIxv6AiVY`Tx&Pg5 z@*WuIOYgY+3oW&u*imrk!1d29eFFN*XVG&rqQ4!u^O@N__w5<_&DSojz2-ymygBgS zxN^^wrXA1TboKaE=Rf-AKjEb`Jo60v+z$j!{p44Fe9x|n_x$ep%Rh~Wo%qaQZpLFD zUlHDu^_$ewk6iWogCE`c2-=C~pK>#<`^ZgC|KgUtuf6@R=RNj^qrG@w=t03RuqOQZ z%a8W_EcE=QFP2pv#=}`(75uJUpLj6io=JP2@11jfX?(#Bc~8muI-ZF;(^ooHJ0Ak+ zYH9CUqCeWPWZm59Gn$sPt!ZA>)6%+RIX;-v-PM9`bTr?%q@#1~?VU}l3s&GWAzcMU z>r3ZcV~Q2Dw{>?dnNjQ%oKZZzc=`-}NM?HRk{*oM68)`@Gw?a9)}W1Ry5EYnG+0r?yJKB%CC|H@X13nA zq|^PTO;>005*nfD&1cfJvld4XSn%HFuw?OF&vbwNKeAwMEP_qQ#tb7EmPUn zLs(4}Zl_LVTl`uB90ruwrBgZ9<2sdXMesm6b91aloyxZSa86MbN;K+JjDs2Ti1#I??LWsT}KwPGwuC@en+7bJ#>lWm`$4=sQicihyP+$C{>7+14os zH|*f<$HUC|QsSsi{-%XKQ-x(=yA!OhUAZ0jbZ z@QgC(%5*B*x&^7L1Xrh1+19N{;TdMo-KJC7RvS`9f?KUq+17fbE)(26I+bmG2&n?W zC3Gs=nueibk8-SHoyxWfF&LA9n`m|DRF2iHQ`uG-1kc%3LsjAE7YlM>jYAK=VYQ)g6f&du}XC++iF1t3b#_HAR(~elkpR+tvZ!s-LF$P zdIC9fb1Z%`o~dkWFH#pvi7X(Pf{U$F+18MQJLTZwAi7ja9MP#9t6!(k^Gj4NdahI1 zIGlNFzm6tR{0dE!$z-oRcA!Ze!(-{N8%ohWF5woBGeiUe<{d}Cyt#=WA`j!9fYgvLWCxnuLn5wT|{ zavZ*h`wEt-Vn#4QXvZXGy%bGK(PVq{n8e_%%1YSDd0BZIuTZ7glpeM%>3=54ki92> zmmhDST<-0TK$14XbV3ZdjNS9n8%SVdlhb>ap+Hdv;n$9ra0%m^Ko#tKiB-n%Rg&I6_yV|4$c%?KEL}jS5G7@J9>UkJWQ;4Q28$us4OpmR zh}UykI(HgPF#~=|M(+HeV(a9)yqs^ z`bi|4fo1HHuu#Fd%;1ldJEr;(yh$UG7X91u_xDDhl60=5_qN*@WrpK%f_4od+}2Z0 zbSBPcdnl9$?lr-?eTd5KL?`RYNtxJYo!NV-K?6gmZPdI+93#OU^K=L?yIe^dC4w{< zS1OVo#pvxKyQgSnv}{W$+Y3eHKqG3`(bU7ld9*f?2U7*v63rkxpLA<;|pL&?M_8_FEOhS#1VT4j!h-RdrPp0!k;J2fu?M38<$#_)w z@X8&9)D~VNW?-?4qvR?xi#?)q^FUd|2;&HCcA8p;>2IbqWX1qt#pxn3MXR$Cl^Ikt z2}%U(J(RTjz-RE=N)pLnAM15ZH}X=T!06(&;8#;e*Il5}sfP>LpGmqHVx?VP@x1m~iJH7D!S?tP>$1KL=gw+>-AY6*l30ORHzER;j--W}DvbUPGx}2~EsXvSgxgL%%quCA+`^=U3frCxZb#6ybQX@Z zb6MVzHdqjWFlJ|{&PQ@p-PY8@yh3$bSSGoJR}yn zrHaM$4789&I~1-5yopHJyOY7)sNpeQA@1BO`<3Zd@gh}NK^@r8hvh?}NUA~*bMmoe zUXicjH1f(w>3|Y;?QIzb%rNizteSxJ>JBY<#Yn zJoWxI*^@!WZ_>3krF{}i9f^n#jv2F7i*ce2)W@OE_6^+rau z-t{E+5PGGhuQ|;Bj`P2y4uMP?=ETV@pcgy@*Qb*~%A+t5+6(Tw8F=jlOQg)M8xW}v zZDYr?`aPCQ3i<_o7-+0Jjynpw50mEv$%BO(PPW1f4iDVTL9pTC(AIU$geZ0LY7s2F z5T%w%#;|iPPgt+LE>8qA1WyD3gbRC;#*^LC;l~p}gl{}45i~D`_}cB0Sd0tIV$2Yo zS~9Bd>@Wl6(bqX#t30}dGiDgN7#>(RN9xKGWqk8Yednptx7@iF-&S0}wJ2lu3G zj1(o(nWL@$(%plXh(wMXiO|g#HxEW!`VMn(PY0>)IbG0`XtT+jDn4|D*CBWbfzz7G}%1*^YqMA+`v8r=A`+T&A{NZ z@U>MCa*C6+)4g^AoBJ^_;9gJKhEMQV94zdc%z9-Unsys;#ZeC&EUd@=%#GKyM}e{Z zbmby>SZjvHu|BE3^6;>;jT(H)C4@n(%**vy_zU2HX_JT0uNRG^Om2ira8ykP`YQ+t zx%5~&Bb=i@hWXoO>7)WEQNP*5u&aB8QZsHjju?i6}{}U=u8Fb7#BU=8y$B0 zDfKAsH5Zg}A!V%TSBDb_vf1NHW<8gz$t+4BYN^_!eb#LknK8iS(7?wr=&{@0=lJa6 zukV8V>903pYCieyHy-3%GsxFsC^^XD>Wmy@zeK(k{~X)JeTo#ZYdw}V=!9~`eqva* z&iLqpwJrEm{kD&-LQBHiB#donTk!t+ZPACq+w4B1Pu455n>#L)WejZrV@eNX^l~?k zVE4Xl{{G$|_TZ8iPFy}`#5(Z_|sE)y@+3GEt%qyA9RpQ$qXu?fJ0yg%vB#i|_aOGJ-)!xBDn!{(x;#(v5`Ut*9f-jWZ>HT^MZxHbwwB>A#B_Z~-jOKJ7 zAALA0bGp!DPPujU_-LX8T$Np$rA{)qn9&x>1{7grOAgR($wrwwz^R7^Kc=#=$@Q3E z`;?qoz>z^X@KdsW4vsd#X3O9;FsFHNbB$}P5|x>ySP#cJD?nvGOz?B+Bnu|kvEDSn znP)P={V>5JD8&T#i!DVbaZs0}uW?LFuNePSWnPg-MpwEyvZBK%=fNmHlWcViec#}< z-mZu*Q0W8Fk3i(spX|;of>)!>IJRtOW639N`v``43~P>^r?;8Y+i1*Ig zpwDwQpS+3sdhki!wea|tI0TfHdn^;>tP)E^=X_#$v@eyQ;Z?_M(6fAwp$f>313y@A zAmp6&$RND{QsOjd>5-KEQqn$>TKZDL=;+`-JIe|**lg0>69^tt$+AM{uw8;Z!-Qld z{4n$+#48O`sguTIH%;O}-5WLjU|Qo3O5+cD8;>0Z<`umjcO67X z^OGA(Q13VnBes^ulZcE=KL7)ZJx3B|{uP8ucEzVA>)CayNNQ zpksu@{;cA7e)LJ6HLjrk>HK;rRUrz4j;qbkq80CGugWurgz8IOi!y?nqdZR*m3G z#-l%@WalZ#!U+)(LMKl-PQUTfAzFpkx|+1v>++MD4ySyn16`kQO+{|sR;d+lMIM8AP8g1h9yO%<^%3IBG{(W!}^DXFaI z#52;z@`JctV2p^XkT^8;^NtMXTq5hkG7}1<@H28+uh&Z!mLmg~hu08gQmuU(r+FHI zDP8DkgyRhBJ<#B{$J(>QLJnb3-uOPZ8h0%o!jOxBi^^I&Og7n9sD;5%I+CY z|3VBOuOUPQr~%XIH^hS{ijI#&ckB>{J>qlbrDhp(!NWP;z!x? zt!YRpE~Q9aCb^YJT`s8*QddZ72~vfUT8Y$^lIlk4DoMqW;zJP=toxBFlGJ#JOttC~ zC-oC2HQ=PK!9xd%uFgsIJE^}osk?Fdh`au1^YwVFK(#rJlq&l%Cv^|Ht#An^^#v#O z4JY-VPU>K{K1=w5AFSH1GUl{fvv|JUBRz}Hn(`TwMi z?Ij5`fdCbX1}Iphl(Y?{fg(woOH)YNG)eNG*c@|9s|u_a`@N?X~yX zXYaM2=iGDG&rjTU;p2b(-0+G2@WO?D{J@3tcP_f+v6*8w?p1jPRs6#>KK&w8;lNFw zTk^sUrJwu7*Os31orBl?;K0}ZIHemG z>nDHzq+c8_lwTDVT*gmuvZI1a-w(>8Kv&xkNHos;5J(o^sXFEc32vyD8B+=19U);aY~#&ekGgXHNwHY)izk}AetnCCM{?qT$V zl1Gtf=-QGqaLd6wHO?BJWw{Quz9B6Wf|l+L1g`C)8Is?nNI-|4SB|8@v_e01LNd1! z$)Xg=JS6w0NaiE?M2e&W$;VS9nkgSmkt{%RSBm6ZB!8YFQ4j8Lk|++|+en!RW%`Ib z5(y@c7e&R>ESyNI%xalDMqlo5gOG~ltA{v~^Vmcp!5?Al%T`NyQni#n)cW;De)f;b z;fK{$OLEN~m>>)l!~RE$s#2wNBbT_P$VS$Z9E1susgOqLqpceXrG0 zo>VREf#J1|-c?l}Uh5I7r97!xOsI&~j_SSFhFW{9mhz-(X?F^*wQ+96zlB<_S}o;C z)zZU)Q0rUAKG+v(<=HM!o>VP85(~A8w@>*|sP%TMr97!xdet%1`uI%`Js)b#wOY!P zs>L9WXieVHc`(#kYPFPSlGjQsz-_MU?C1*xi>g0Dn+2Efe@OEz& z+BrnY@Nu0dLU~U0&dgNE7!LkuMWBH4l44L)8TMsz)4V zzLLYt_x8igck*H8JL53(%{|O~m09vJlu~e?Cjcs)Kzx|^rCaHZ3*QKSslkwMYfJR< z+n(wV$CvU~Nd8yxbf^YQ9 zS4<|mZWiUh{Tgm13rosu_RXDJOnfGBwQEUlpNY@1xtCnsZsN0pc$c4EZu3{${5o2y z^lF=5M?@1RzZ$a0=5IH#DjVBiVzoBb#_eulNgXj$^}$Vvww|8u#I>#bB2p`RRsHz@M z5=#>1Yr3Pn$`YAT;U&y}ly{|#Pw}Rrt8@-@CIsnze2RH4r1bmK(*5`p(`2Q8CoSEN zhv~mfOZVep`F~+gThB7+R6jpH#q*ybRF*tp(}Vi?@hOZVzy3c{CIsnzJk(#6mhQ*H^y|{n{dkyuS6aFs57WP#mhQ*Hbb&r91oiXd)E|3AF(9lN zlvQ*20Q3w#%~t;Bo|n}8{xbAz=vSfVKp%$c8Nwq_ZDiayCN*v!gRX`?0qul-4XU+n zC-mdcUC^hXe3CCizYaZ`Ykd=X74*B%YoXtR-UfXZ`WfgCp+AKF2ul48&f^T|Pl#Ut z{VDV!=w9e@=)XWWL-#?qLtlXES41yDzXN><`U;fud-4+2u78KFg#H4$2KpLw19S{} z8}v8Ok3cyWC+~+c9Fvbhxrt4F5BhuPJ}A3&@;{)*K(!{8Dvo$2pCCkUwj>hPzmgXJep>vMw0ItER|x8JMq2#BNL)kw zm*m}HH2i8R({@;Nme58Ux2Iyh(#b`K;Xd+-3iF!m8PqSuM=c5n!<#O)SZrRjMSf>p$iPw@&F zF=iE!jo0~k%zxEOHa>!nHYJ5wv{`kfzmlgy-wmA&<^9*B4(YR@HPEx5%b;_hmqX8n zs(t0qY&KJw`Y4=%&3Go|Z1y?$IazF`JRA7DGqf2;2jF`)XCjc0EeO~rfbXH@a&N($ zNu4|LccJ+t6J_q+IvdEkM%$Ei(8gN1vcDk9mW{y`q1}9BOFhb|<)eVzl4`>o=qXUv zI89%Fq@yFjKS9ev+wnNC zH!;wYu%}aV(hIsoMW+rinMdo7jIcT5*dx76!|8NmOloz46OK6#m0FcRXpTKH^>igj zgN7EGvx{Pz%$czau9}K*1Wa^oHlmq`bZJh3foN7B>N2_1+t}VI_6!b~5rEyDW+1Bw zWT;A}W0!2Li*8W)Lhn_l`2uB09Uh7W!y^?#HGl^)7>~EpPeD-sXsj?Uyc?~&ioRE$ z)j~DT;?O$iMNsY8@CL)3bp-KM!5_${t9_Ve*N1^Y7{uugxsOH1%(ATiT)2Hgoo*XU^&aQH} zKo0*ShYOU$1>)QJ046Gj3nX`ha_W}D194-(JqI0-FIzkDfUA*>wM=Wu~?xIhk#s5XZSl*0vb-uva5I)@9yQ6ibc1%Rq2hA5Kn6i5hYJLLlR=`+ z!1)P)d2+ZwIb0yV{hL~n!v)IW0x=APjgezzgKK>DiLI1sRfrNN+6R$u3k2BD3 zKr)03Dd3O|g99Bs*KN*<5+tn=^7Z!uslclPIn1DmF@uC|@(y0u*bHV1@5;nV7Gt;o zKuCtX4)gb3*VDI=cPnBgx2Q8Z2mF_uWZ6=513{v#jo;PgFo)Q7VkN1VLqfti3RAgP z%Z){4?;H}58Ftvl`x7D&6=3Nb7`q!c4)A4Y4wdM?3o6kV-OhWR?9BWW_kS!V(QT(x zKQi*(t5^1opMKwM-S;2GJKVf0Rh;+SlUIzrf9j*hOs|^!(!0KK)~9%9+Q_qG6@7qr z+TIlMOAf1OLKr77gmPF#Zvd+*z(1M@t0;iSviluaL#bFsR=&pVhxVsd|IeX~-aNWY z0F3kIOM2@7b>2b%8V7G<-j|QDBnf}!H1^gz;q|`%RBxZ<3cZ&tSK!^x%BIvp@3WRG z@E&opC!FkCPWC+~d(O#5oa|L6`?-_-*2#YFWJmDUsDE9(k1DRfd%KgJpCwtDxMx5+bC;PdR{np8T?_@`?>sb3)4*NOTNltc#lbz*cl}>hnlPz_!1}9tX zWNV$Q%gHu5+4WAg)yeL3vb&vZ{B7*6^z>A(Zi>$pdi9no@E&lo2c7J3C)?>{a#^HO zz?yNgy-v2z$@V+h0Vf-GGAdz80XxZZgJ-pLxBY>ktx zbFu*^+u~$JOkAccm0M*waGWex;Co1K$@9R$X6DQm2WL5keMThyR-UlpK z=^p5)zB?F#N(W< zWtMT~R=2&hZaCh!y{Kl$_$l4>;^g76rt~XO(opq{xTM>j{}&8xZ+NURTb7%X=0fAU zUYs;RAvfP@a&XC_?YOdSY22Q_V%I({nZ3N*P40ukw}@#RZm7cZEin~B?BMW+l5qH` zJUCo;BT2JiXOS?|ILO7B9(*%=Bl3Fqy1=je!r_*>$t{h3Er#Uj)sL1^siB6_;jycY z7ir&Eu@ymEW7hCgVhFF#T=sTj&XQ@LZ>gK0#nlu}l}*0bo)@NlzM*l~3pCgj8uX?q zw0L-II9`|47}dQrWY3F-=%4{zDPBKRQ!3lEG!LzqjtwR@Z*>Lk@(xiRRw_C~@}fg0 zS21dL(mjFkQrgK-t@V3QJxlj2BDRpOs(>%|Q`F1EFme)(w1dMnHEn|ZM9=_+H&8B%Si8)B$qmBu0YVn68nq#Rkj&Xk7h#k$E2jeA}g-f<6?z!SC^ z=;cA;!Qmb1x1kj{W@L!XklakDp_-X8@d|T|J2W?k>dc6#p-8koZnW?TXtX|5$9#OI zrV$~2vRy%v4&CwrUx>HT*aY56FSX6%a)Hz5n1)GgxUM&I6dC`WH3OML2%n$A1j?M- zeo;je6;(V@Q56#vwQ!=M7EM%C)kHuapyUB1Z9|IeyVl+$>5yaGKRbS(Qj&y zSx74XdfB~8hOR7At~C9oQgfwpt~)$9bGYb(Lq$7Af0|Lf!2cx;JwHBu+V;7|L`BTV z7&CI*ISjsS=d@cFP*oMzQf_vg+15%1;)@AyoRZE4Y-r85wXE*hXY&@_!HO`1)6w|B z?e!k+(dmrx;nE$$@rt4P9h%V0-IhhTikCZLqqj(<>|)aU&|zbO#BeUXagI6trsIus zOkER)pFXb!{>0i*4vDQpRC7IMx-moZj{GxAKUmo^w)IL{Cl9TqH)C+a)2f@%+Fl#O z&*|*p!7>Zkrut&Q9h2of)!%SqX2UIJ!;Q3NYBp; zuzMBBqVF+j#vbzM>MV*Ks2oPZ>8Y{kv%nJ=GevBNM#I7F%}3-#YF{zbd@~4O2lu?l zY8>>>vw?}N!1Rxg>n6*Fh8jD+MV6HlR9$=9Q#42XQ0dK4%eFXx3u8fnCd?eJy*dBP z{JSdSvaH6)OvcD$X`At)F@Q__61vK_tnYR<+5@x9_~CG}0)N=XzQzQRKB-VWZl-lU zeBG-_CUMx`;Q%pL$AHwT{*L@Ji{4k+Ft+tlI}U6=T05G)_iN;P(T&!8ma#uD4D>R1 zH`L3v#f$_E>CvHAALXaP6U@OGAON<+CgaUEK5h<5i_}wt3rF(R`q3Y-vJ^#DmUqw` zj-=fG&f@ zIA1mdceY9WnB(R!y!^V5V8XHdrx+WKONnj&`Iqnc%{L!>&smFSjJ~+wgbT;-f9(ei zZH*WDnGaaHuG+@=$*;nn(v7LyiCyDg#{RdiPMZ~Fh~a?G91Lx$Pv%6Nh|#6wksGm# z;hyV0>Vhz<(t^NXCdke~@FiLsg5XPL2T`v~PE`mCGb9&TN$Bpg1xYa%3?=K4^wP_r zW z|56<$^3WpUFwxKCTaXsAvMDG}suqJeqSb%FmFFvmAMi9{g7Tzl@t`82b>8R|m^;v_ zuv*HKs-@L9bOiakPmJ^P_du)OYAH{umez+*E7b*Oht*P^R4uIsq1L@8oZb;$EAU33 zJgHh*XG5)22bXu+Ybj5vme$`;>z?Ip%fo9uV6~KIlJ_*RM51d`Zz9p&+TGnF--sr* zzOS=0;5XS6<1NK^SLS<830&$#{ixt!$3ZRd1$EbIupGR|K=w{`x4&Uu|}bK5KC&x^>m{>SrC&p5Z5~sgDX*$(PG4rea}P7$g@>7M$zkSOewg_#JIs8EEcqBBe|j&E zgBbVRKf=r7oSwF;z4N?9B@79UILC0beymkTZJ#!DwfFV(_pBc%o7Hqi+4A0ju1#Gx z;Nq!lanGjSuI|o0b?krenJLDGMT{IaZS#@nWVSf1!H{69JXF)#-)k)?rq4m&@L)Sq+0o?+<7y9SW`=EaVy&w8TDEo);PWM^p zkBL7B{Ws_rp}&UWwI-?ipogGSsn=Jbc>MAng~~>cLDTJCPJV@ApBTIAbP?En82;Qe zPgT-Uo_F!NFtqz%FLSiBwsoL2zImYU`osofd-7xp7)E}CbexdCx9g14DQ&_sm>gKi z3y~^S%?JO@gPm-d%S()Bp`gyB$g`BOzv?qn0>TrtQ}HLEsv~!L8SPd-DCiOj8gJ4$ zRJ*04Jn!UFHF3M!|8KNgbva<`6SRAmZTC}9)$!|D+O7K#1sPr;z1{Ccw!pi{wN81Y zqjqbIpYBrfbh0o`K`(Zq_tBzy3TYy?@Dc_TzI{e&CD3bx^{XyAF}QIGE{Z?N|tsmK(01M z+bNp_00USdYpFX`rHjBRfi|DwCi%@x_)%MiMA_A+T65uNk@6=`J9o_ zuJ+EZ?l<17<08u{gSzvo&OSWkb(>!NCD)1ep{}3a)}6MkyP&GqQ-4HTZ$>Y@52I~; zcSc+3$)3Kqwz1UVaN7H{ZSOa1d%u~by-O)e<8wM6h4iz_?a0d0`c^tRBb?9Y%&@)w zknOytJJTN~8Ew#r4K~keWUVHqk)>E0>$UGv{}zC z6x42o^nIiYSw-5p!GGT2ud%bkHuv^vb;aZJRec~fm|iwTX8xny+BLKQrS2MjU(SkX z=voK(OyZ-nm%?eZL+d+df{gt_<6dovwnsKl{53u|@~KQ~k93r0HlMT7+hbnS>+k6v z9O&xVY#J35P3~yO)+qI^PN4&2?8-Vfb#1jTx-XtVyHuYup{7pIZ0Eg0wetq_vz_;X zcFxJ#&MlqS4BFM`O|>#}PG)N-&t6SC*+Wb_d32f4&bhSXQ0*KfeO_9BN=NNHi_h6v z+vy)^-((Xr)*W3py)VzRZCnIZecqF$jk3)fZKHI8zAVq$M*sNwR<|)*KUUc`)<890 zYqPZRW5~^Xhbm~DiJou1fvh~OAEl!_ck!8<-bVAQophJ~WDLSY)3JyQNAu~zE&XIy zsGf13;HyUG?A6TKDH$2@K&qgO@}H{7?Pv6lP-a|gFiK*t(0DrD#?=R^Px><+=_t<~d@8~|(7h+18U9U~ z*JFQ4R#G&Z}Nn5UG@zu zy2YgJw;I>`15x&6T)Ch&%D%ez2dwk~?5B2r9?E&pdl0$;`UU6}&@V!n^WK-B%xUi- zsMduqLm7+aS;I5Xhl#%c)jj*qp^rk6?^iR_=b7gy=(_)IlEZ zLH9&1s5;8-s@|PezMJ-|-rt5+K)(aM9LgGN#`ix!SsT3XLs=8NJy80<`vH`XK@#~9 z^vA^i9r};ZBe~A=P$7}L00nu#Acbf>X3QsVhrSGzt$qegpEnmEr+MZB@h)fH97&Hz zCi`ETBwH_JF{;M$IzB(DW%zImeE$!XAELqWnYs3@xcLE>-JCYl@Rdr{OTm7z^|%GB{z zn#An$>$rXpve|^WXKeC1lrx~dc{4W2gUTk8pt1>b)7XS>{f$j{J1QxgOo67`J{i1jfiQOiW$xXg=<%mW(4( z>cBY(9qrB1xwfmdt-I5I$k%DQ!N5jo{Zz8Q#w&}tQUF`f$1>8cpYNNA&3N+kl5-H$ zCXGR@pZb1Bfwe8Eb{0V24K0GMf-*OgS3{47CZQ)lzXE0aC7*zDmNKXWWzbT}IvKhF zdJ1$C^i=2vp);XhhYE@1MW~QiW>4Z-1ysP8v!D%7p^sb!75d1{P@#|fFX#fOelJGf zCLe=d2-Uk})zIHSYoPxHt%d4v9)}(Uy$D(hT?)Mt+628Cx)Sfg{a*xg}X zTj<)%cS5?CP%&9Twgo7PD3p3C*FexXD36q+I%piwEN`Zjx6wY;s~xJkU6rN1?2RS_ z70ZLsordD9VM1oeIHyTR>0jW(7ppdy?^xVmO}}vp$|rNS#tI>4mMy4~$)NZ^B<{xk zr>#&#^-!BNdDMP|F50MTao#s)wvEs#;@!|?P{y&j=iCgvjCc?9O6WDvbd!g4sKMCCe{d?#QP|h*ld!e$+R%rUz+KXIu3v8h^D>}Bekd{8S zq@z4P;d4P~>#ogR16{4%T{mbs=^1#VV=Hxy3dYkqt`P)XSGJArZ8y;-)#YaBNzhxM z=RmhX8=$vBxi|N2gLXpS2i*aEKUDR<9r_wHhwkCk##b)BB!}*yqd)-XkVE&#p?h$Q z4~9by-6MzY(cID$Pt?>e&!Kzd&^_v^f%Gt2=3>L<&^>bK9-jOK3*h8Pug19BHUK9% zbdTk=@kC?O^2PF@yKISZ0@>8ExOwUFWjt`0TJk9@7W0-V7oOW2;>((O4Z{~7;frgR zFK#jN6Ro@;Ri0>G-5BTHLSLycE%BnJ>Lo^d1{uD<#keJJsCPIUVsy>7+tj?2)aLlA zW^QME#YrhiL1i`YRqW)HR99y?S66a=YH|+UBZuyhL-%On*EvnKX1>cc<)mZ|-6MzY zkwf>W4Y4`2Eq$M|Dees$SDo13ba#hZC4Z)%Bb6&yDV5=su;<78`=qwOiom?ekq zkwf zG{@rQ%P(0P2Q`9o<(amKQ&TfEG*&Ne2Kujl>EhK1w!!$)OXIa}O3zHq?3dQk*x1Aw znrs2A(P`PT8O)BBWtS{le%Uf!*!3H5`h+=i=pH$A4~7hrqp_u?e(B0O&gGX@FRibx zsgJvXmP7a86`>ru2lw&S&2@>3nwB>tIF6Vbx!Utft2a6*rjT*LS5jV+h0Y;Iy? z#mvY`fGxt<;vk@BVM4sny94#hc}Ui1v*~dnxx(j(tV6MqQ^?lh@|7UbEdu%MJp%7g z$4b^9YHV&yEUu4NFKcN`ENNQa(#UxwR`LWX3BZPH>k~^C^DfWQ&AeXT-JQTg!(3B2 z9cbKDwKp&~VkJM6n!Q3(e2Ho0$<*Y!_6@E46pneGL-*j!I0G}Z2ez-Sudk^#Ul@VD zxNLEpHy-`&qhnb2R;uGqMAU&F31E;h5bNDoGxK&WFZ1BhrjuPXR`T^s%g!}xnASAA zq-nJ}hNxB{eY}$pd<{i<3PDYEJzbTE*Cj5ku5aN!={S=07@TB1eQ$_2_)qO6*XC>1 zLLDOPYN!S0em{Tkc8ZxB3a-=9|AU+nGC4>kMx^)BoG$LJp2d+vDQYoEO6 z_|0GZ;d`zaTz8k}{WI?@7UyM0_mD@s9JoHLL3amW_GsqmR$hp>NTkqWoMRMX#~iX z!H@L&k%gpQP)1SnP1?MmaPLhQ<-kYGySaKtS?C;#*-G?|>NGx6&6}d)3O&8UDXu_o zQX8(&ygTm8^0itSjYiAigWqxm-qTLD+sVe^^a?7t3%t214%`LH6?l(3*-j@LgVW() zs#nGOC$7+|wOoOBpObys$@ao&mz(O%;wM<*3ccBuEAZqe)0gdVvZvunjYjblpDXlA zEmz>Jak6zzb|>7iMq{7lKr*phfmborPc8HoTCTwBhC9w^JZ!l_?{Ui&cx7~iQVYGA zmMbv03&$Ic`;dt%^geC50J=U3b6{v#4%<6fuan&e_YR|Rz;cD& znB@w*f^OrcdXHPK(A#Ob0mlyjS2( zGa3~PTye}9%N2NcI@#S$HV${X(WqnKiem+_T!Hs#CwsujiW#o&G8$_vSLm&?T!A;8 z0jbnNZ-(Wt219O^(Rj#mw8L`DRR)?;nX8s#uEL#RH14w;bJcPM-l&uP!pZ*A$zFG| zQihyLDfFgWj#U)y-KOMX29-G0Cd)AnoNU0!SpM)yd+f0X)y{7r%AI zZ{1?!1N)hpEffcCLM(77kK6YcPUgoQ7{bQ*_$(jXfd3=4lVT&QH*9P{CWr+5$s;Q% z9$B?cF4X0m{uLDn-h$kyZ}ZFcfjqW>>N5adhs%<0irBJk7p~`HLlX6EaLtw!kdM9UxsTZ zO-Ht|0fFYEChx|kEwhFPi-xadag4=A)*Kg$?MTJU_N|L56a}!EffrfY!)TCsK;@UcKK;1L>a` z8xojOkzJCRK~>Y4M4>S?scK_o;lwKTYZhx7S$iOuYX(MRBz|CI&2Cx$4HWhqSSYTc zBWqttEAf?)8M`;O(6O>@?3?)|c|b!JQCP)*>E!Pi zURpeozbmZ8Qj<8tS2?ppbm{cr(hm(+k?&dZN%El`l&S$%qcJCjCb$*6c<&}Pi01ga zo6=n(4cmE+887$2g7#VX_krLBGW)!Fp?wx?%i9Wcf|Y3pHjL#WZywmwdkx3cHom#K9L$0CzuNAJUqxsc|d3~-wSo4&C>W~(#L?J@kjHDQo}67 z>_+*QBQti5MlRei&OzD02r}#$*~Towu~DpUx?vVkrcr)vWX7{m<;+^Mue)lSd9tD^ zrP|+hGiao0*2wC*NVI%pb)${8#2zWvxO`C0m4rU$oI3d`8y9 zSkK0E+6~8iX!as{=KM+1wrkb3r#CnZ|Dhx@N+`iwoa10Gq;|Kzcv;(H z19QdQ;T3~6#I@0E9rFZSw=cNe*hjrNhV2^y7mT!Nx9Z%r(H&g3*G?*H40~^TeQdgp ze8DYnQJ9khDS%^Yl`;(1^d8258oa>v@f#aJ#f)iF|Jtx-oF*s#afO9tP;btW#UnNA z%!Xa2Ib(-eerB%A*KON+z#AwHO<>PVYbF(sF32K{obSV&VLl8vdE3)vDdzyKk9Kz% zW+h-@s9LwTb%PcL^L%2YD)!vBOl4P-h56+gK@^p0MjvmZ=LqF zXSe+>Zx9RXuux^}-FL*prc>99PJNiK4!qHoqxti9jy8;5@<)}$159tUn6h}l%#HQv z+aBh*wwH!J8L{ufvq;{!o4LRq!7)CT_lS|~Vd>OEtf0$EVvid6Q|7F>!pSEA6cg_bkQ5r~f>&)O-WPV^dN;!~ZhFJ;r}MA1(F%!Eyf#r{~6{-hTe8 zOdb%^PkI_#>YWJZmx4DR^E|WEtAIPxq^^VGVLkcquVQ6*_24BC$v*64m(bnkBb(ys zyQMiM^-3pecQV1i_$5E;WZ!k%i!Sw@>`ZM60R1FDV~tGeeT^y z1f?v3^R2N2&adg8!TGwsfLmg8^&O9I-7?2r=(sB!cZ1{Za@pBiDLaa zkHPuv&7;%wM8DL0*P=O9>a9SA65IoD`i`vBdkAih;R^Ydga`P@*24Lz-*>Wi7yI8X zlzL5Ye#xzHe#sw(^Gp60#~s5rBBz=1s^EO9UFx{29rr#sza8I#dk-2@ydS~&mYhj* z{M5_gFaxO_PWE?B_MnsftK&|>C>I-zbKv|M)HvBPC;NN2YLo9t#}PGQHvbtWHk_3b z^M(5^^y$P{c{cs^s&-&!=5%#D)|#L9`s@0IYt{PB)`24S5<<(iO?X%oEts6{HN`zTrz@_WY3L zdWp`Cj-G))RAy@6k3U})NchsjhCp&|An*doax2Mqk}Hu^(eO}m4U*mz$*oB4u@be- z_piLuNfJJOgtyO0l;=}?$}pEo_O-r@WJikRDI^C{B+nvgBzvf}7s)+VLRNxS+6Pl4 zd0cs4ibNjQQn3I}LDGn6!1FK-^Wf>q+riotN|H#*nZ%)FhqRdBq2#ZTJjfaoNadMG3x49oo zFK+x2C!D|AM1QL1RbCv8dL8u@g>*x|q&rD8iO!2)BHhp38$^0s4_wT=M1Q|9Dw~=Y zCzj$iuco!X)2$4?c;$w{0p6Y4?52JKlMf8`cRIAj6evX^l-JkU+Fdn&eP>EiC{IIQ SwE5pOilZ%O{ra@>3;qwJ!ahO( literal 0 HcmV?d00001 diff --git a/thirdparty/windows/lib/x86/LDL.lib b/thirdparty/windows/lib/x86/LDL.lib new file mode 100755 index 0000000000000000000000000000000000000000..31d83d61caf7b55fc562de5d7fdc1b142120f901 GIT binary patch literal 19594 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 fc`Zm64b@kAJ(r-VL)YC?s?3xNe literal 0 HcmV?d00001 From 7dfbeb0f1e61dbbd1f7e4c734243dfe48fd42064 Mon Sep 17 00:00:00 2001 From: souvikdas95 Date: Fri, 15 Sep 2017 01:09:14 +0530 Subject: [PATCH 3/3] Fix: ECOS toolbox gateway function fail on Windows --- sci_gateway/cpp/builder_gateway_cpp.sce | 30 ++++++++++++++++++------- sci_gateway/cpp/ecos.cpp | 6 +++-- sci_gateway/cpp/sci_iofunc.cpp | 5 ++--- sci_gateway/cpp/sci_iofunc.hpp | 6 ++--- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/sci_gateway/cpp/builder_gateway_cpp.sce b/sci_gateway/cpp/builder_gateway_cpp.sce index ffc08b9f..ac3358be 100644 --- a/sci_gateway/cpp/builder_gateway_cpp.sce +++ b/sci_gateway/cpp/builder_gateway_cpp.sce @@ -111,7 +111,9 @@ Function_Names = [ "solveminuncp","sci_solveminuncp" "solveminbndp","sci_solveminbndp" "solveminconp","sci_solveminconp" - + + //ecos function + "solveecos","sci_ecos" ]; //Name of all the files to be compiled @@ -154,6 +156,8 @@ Files = [ "sci_ipoptfmincon.cpp", "sci_LinProg.cpp", "read_mps.cpp" + + 'ecos.cpp' ] else //Name of All the Functions @@ -327,21 +331,31 @@ Version = opt(2); if getos()=="Windows" then third_dir = path_builder+filesep()+'..'+filesep()+'..'+filesep()+'thirdparty'; lib_base_dir = third_dir + filesep() + 'windows' + filesep() + 'lib' + filesep() + Version + filesep(); - inc_base_dir = third_dir + filesep() + 'windows' + filesep() + 'include' + filesep() + 'coin'; + inc_base_dir = third_dir + filesep() + 'windows' + filesep() + 'include'; + inc_coin_dir = inc_base_dir + filesep() + 'coin'; + inc_ecos_dir = inc_base_dir + filesep() + 'ecos'; C_Flags=['-D__USE_DEPRECATED_STACK_FUNCTIONS__ -w -I '+path_builder+' '+ '-I '+inc_base_dir+' '] + C_Flags = C_Flags + ['-I ' + inc_coin_dir + ' ']; + C_Flags = C_Flags + ['-I ' + inc_ecos_dir + ' ']; Linker_Flag = [lib_base_dir+"libClp.lib "+lib_base_dir+"libCgl.lib "+lib_base_dir+"libOsi.lib "+lib_base_dir+"libOsiClp.lib "+lib_base_dir+"libCoinUtils.lib "+lib_base_dir+"libSymphony.lib "+lib_base_dir+"IpOptFSS.lib "+lib_base_dir+"IpOpt-vc10.lib "] - + Linker_Flag = Linker_Flag + [lib_base_dir + "AMD.lib "]; + Linker_Flag = Linker_Flag + [lib_base_dir + "LDL.lib "]; + Linker_Flag = Linker_Flag + [lib_base_dir + "ECOS.lib "]; + Linker_Flag = Linker_Flag + [lib_base_dir + "ECOS_BB.lib "]; else third_dir = path_builder+filesep()+'..'+filesep()+'..'+filesep()+'thirdparty'; lib_base_dir = third_dir + filesep() + 'linux' + filesep() + 'lib' + filesep() + Version + filesep(); - inc_base_dir = third_dir + filesep() + 'linux' + filesep() + 'include' + filesep() + 'coin'; - + inc_base_dir = third_dir + filesep() + 'linux' + filesep() + 'include'; + inc_coin_dir = inc_base_dir + filesep() + 'coin'; + inc_ecos_dir = inc_base_dir + filesep() + 'ecos'; C_Flags=["-D__USE_DEPRECATED_STACK_FUNCTIONS__ -w -fpermissive -I"+path_builder+" -I"+inc_base_dir+" -Wl,-rpath="+lib_base_dir+" "] - + C_Flags = C_Flags + ["-I" + inc_coin_dir + " "]; + C_Flags = C_Flags + ["-I" + inc_ecos_dir + " "]; Linker_Flag = ["-L"+lib_base_dir+"libSym"+" "+"-L"+lib_base_dir+"libipopt"+" "+"-L"+lib_base_dir+"libClp"+" "+"-L"+lib_base_dir+"libOsiClp"+" "+"-L"+lib_base_dir+"libCoinUtils" ] - + Linker_Flag = Linker_Flag + ["-L" + lib_base_dir + "libecos "]; + Linker_Flag = Linker_Flag + ["-L" + lib_base_dir + "libecos_bb "]; end tbx_build_gateway(toolbox_title,Function_Names,Files,get_absolute_file_path("builder_gateway_cpp.sce"), [], Linker_Flag, C_Flags); -clear toolbox_title Function_Names Files Linker_Flag C_Flags; +clear toolbox_title Function_Names Files Linker_Flag C_Flags; \ No newline at end of file diff --git a/sci_gateway/cpp/ecos.cpp b/sci_gateway/cpp/ecos.cpp index 5dee6a42..283af78f 100644 --- a/sci_gateway/cpp/ecos.cpp +++ b/sci_gateway/cpp/ecos.cpp @@ -10,6 +10,10 @@ // Email: toolbox@scilab.in #include "sci_iofunc.hpp" + +#include "ecos.h" +#include "ecos_bb.h" + extern "C" { #include @@ -17,8 +21,6 @@ extern "C" #include #include #include - #include - #include // function to convert int to idxint idxint * int2idxint(int * sci_int, int n) { diff --git a/sci_gateway/cpp/sci_iofunc.cpp b/sci_gateway/cpp/sci_iofunc.cpp index 6a41aed7..8beec2b1 100644 --- a/sci_gateway/cpp/sci_iofunc.cpp +++ b/sci_gateway/cpp/sci_iofunc.cpp @@ -350,7 +350,7 @@ int returnDoubleToScilab(double retVal) return 0; } -int returnDoubleMatrixToScilab(int itemPos, int rows, int cols, double *dest) +int returnDoubleMatrixToScilab(int itemPos, int rows, int cols, const double *dest) { SciErr sciErr; //same steps as above @@ -366,7 +366,7 @@ int returnDoubleMatrixToScilab(int itemPos, int rows, int cols, double *dest) return 0; } -int returnIntegerMatrixToScilab(int itemPos, int rows, int cols, int *dest) +int returnIntegerMatrixToScilab(int itemPos, int rows, int cols, const int *dest) { SciErr sciErr; //same steps as above @@ -382,4 +382,3 @@ int returnIntegerMatrixToScilab(int itemPos, int rows, int cols, int *dest) return 0; } - diff --git a/sci_gateway/cpp/sci_iofunc.hpp b/sci_gateway/cpp/sci_iofunc.hpp index 69ac07f2..0d1d1963 100644 --- a/sci_gateway/cpp/sci_iofunc.hpp +++ b/sci_gateway/cpp/sci_iofunc.hpp @@ -21,7 +21,7 @@ int getIntMatrixFromScilab(int argNum, int *rows, int *cols, int **dest); //output int return0toScilab(); int returnDoubleToScilab(double retVal); -int returnDoubleMatrixToScilab(int itemPos, int rows, int cols, double *dest); -int returnIntegerMatrixToScilab(int itemPos, int rows, int cols, int *dest); +int returnDoubleMatrixToScilab(int itemPos, int rows, int cols, const double *dest); +int returnIntegerMatrixToScilab(int itemPos, int rows, int cols, const int *dest); -#endif //SCI_IOFUNCHEADER +#endif //SCI_IOFUNCHEADER \ No newline at end of file

      ScR9|NBOz5sj~xChAl?0*G30{DBN3-||M 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

    11. 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 F{1@IluWbMT diff --git a/sci_gateway/cpp/Release/sci_LinProg.obj b/sci_gateway/cpp/Release/sci_LinProg.obj deleted file mode 100644 index b64676d3b04638adf50c0036e185901c14607210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399390 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 TzdVs#x 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 r9~~Us3+wp)UTr`eYnMm2I5vi==S~v6wBoD diff --git a/sci_gateway/cpp/Release/sci_QuadNLP.obj b/sci_gateway/cpp/Release/sci_QuadNLP.obj deleted file mode 100644 index baa4a851717d02771a999455114901fa6ecd7f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692583 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