Giter VIP home page Giter VIP logo

papilo's People

Contributors

alexhoen avatar ambros-gleixner avatar antoineprv avatar buh13246 avatar dominikkamp avatar fschloesser avatar gabrielkp avatar galabovaa avatar gionimexi avatar jamesjer avatar ju-manns avatar ldr709 avatar lgottwald avatar matbesancon avatar sbolusani avatar svigerske avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

papilo's Issues

Presolve killed

PaPILO is killed while trying to presolve a MILP model stored in a 9.6 GB MPS file. The computer has a AMD Ryzen Threadripper 3960X 24-Core Processor, which has 48 logical cores due to hyper-threading, has 128 GB RAM, and runs Ubuntu 20.04.5 LTS. Is PaPILO running out of memory?

$ /home/muck/papilo-2.1.0/build/bin/papilo presolve -f /data/muck/gen_MPS_files/p10_fix0_MILP_binary_x.mps -r /data/muck/PaPILO_files_MILP_binary_x/p10_fix0_red.mps -v /data/muck/PaPILO_files_MILP_binary_x/p10_fix0_red.postsolve
PaPILO version 2.1.0 [mode: debug][Solvers: none][GitHash: ]
Copyright (C) 2020-2022 Zuse Institute Berlin (ZIB)

External libraries:
Boost 1.79.0 (https://www.boost.org/)
TBB Thread building block https://github.com/oneapi-src/oneTBB developed by Intel

reading took 188.0 seconds
Numerical Statistics:
Matrix range [1e+00,1e+00]
Objective range [2e+01,1e+04]
Bounds range [1e+00,1e+00]
RHS range [1e+00,1e+01]
Dynamism Variables: 1e+00
Dynamism Rows : 1e+00

starting presolve of problem /data/muck/gen_MPS_files/p10_fix0_MILP_binary_x.mps:
rows: 47261300
columns: 47251695
int. columns: 47251695
cont. columns: 0
nonzeros: 141744517

round 0 ( Trivial ): 2 del cols, 14889 del rows, 2 chg bounds, 0 chg sides, 0 chg coeffs, 0 tsx applied, 0 tsx conflicts
Killed

PaPILO Presolve: Objective Function Value

Does PaPILO presolve change the objective function value between the original and presolved space? That is, if the PaPILO presolved model is solved to optimality, is the optimal objective value in the presolved space the same as that in the original space? If not, is there a simple way to transform the objective value in the presolved space to the objective value in the original space?

Potential segfault from out-of-bounds access

I am seeing segfaults while running the papilo 2.2.0 testsuite on some architectures. The segfault is repeatable on s390x. Valgrind shows an out-of-bounds array access on all architectures, although it doesn't necessarily lead to a segfault:

$ valgrind --leak-check=no --enable-debuginfod=yes --read-inline-info=yes --read-var-info=yes --track-origins=yes bin/papilo solve -a r -f /builddir/build/BUILD/papilo-2.2.0/check/instances/MIP/gt2.mps -o 21166 -p /builddir/build/BUILD/papilo-2.2.0/settings/default.set
==145== Memcheck, a memory error detector
==145== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==145== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==145== Command: bin/papilo solve -a r -f /builddir/build/BUILD/papilo-2.2.0/check/instances/MIP/gt2.mps -o 21166 -p /builddir/build/BUILD/papilo-2.2.0/settings/default.set
==145== 

PaPILO version 2.2.0 [mode: optimized][Solvers: SCIP,SoPlex][GitHash: ]
Copyright (C) 2020-2023 Zuse Institute Berlin (ZIB)

External libraries: 
  Boost    1.83.0 	 (https://www.boost.org/)
  TBB            	 Thread building block https://github.com/oneapi-src/oneTBB developed by Intel
  GMP      6.3.0  	 GNU Multiple Precision Arithmetic Library developed by T. Granlund (gmplib.org)
  SCIP     9.0.0 	 Mixed Integer Programming Solver developed at Zuse Institute Berlin (scip.zib.de) [GitHash: NoGitInfo]
  SoPlex   7.0.0 	 Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: NoGitInfo]

reading took 2.72 seconds
Numerical Statistics:
 Matrix range    [1e+00,3e+03]
 Objective range [1e+03,8e+03]
 Bounds range    [1e+00,2e+01]
 RHS range       [1e+00,6e+03]
 Dynamism Variables: 3e+03
 Dynamism Rows     : 2e+02

starting presolve of problem /builddir/build/BUILD/papilo-2.2.0/check/instances/MIP/gt2.mps:
  rows:     29
  columns:  188
  int. columns:  188
  cont. columns:  0
  nonzeros: 376

round 0   ( Trivial  ):    0 del cols,    1 del rows,    0 chg bounds,    0 chg sides,    0 chg coeffs,    0 tsx applied,    0 tsx conflicts
round 1   (   Fast   ):   15 del cols,    1 del rows,   16 chg bounds,    0 chg sides,   10 chg coeffs,   27 tsx applied,    0 tsx conflicts
round 2   (   Fast   ):   15 del cols,    1 del rows,   26 chg bounds,    1 chg sides,   11 chg coeffs,   48 tsx applied,    0 tsx conflicts
==145== Invalid read of size 8
==145==    at 0x48BAFA6: boost::multiprecision::backends::gmp_rational::gmp_rational(boost::multiprecision::backends::gmp_rational const&) (gmp.hpp:2387)
==145==    by 0x4A071EE: UnknownInlinedFun (number.hpp:54)
==145==    by 0x4A071EE: papilo::ParallelColDetection<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::execute(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Num<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Reductions<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, papilo::Timer const&, int&)::{lambda(int, int)#1}::operator()(int, int) const (ParallelColDetection.hpp:595)
==145==    by 0x4A07848: UnknownInlinedFun (pdqsort.h:152)
==145==    by 0x4A07848: UnknownInlinedFun (pdqsort.h:158)
==145==    by 0x4A07848: void pdqsort_detail::pdqsort_loop<int*, papilo::ParallelColDetection<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::execute(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Num<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Reductions<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, papilo::Timer const&, int&)::{lambda(int, int)#1}, false>(int*, int*, papilo::ParallelColDetection<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::execute(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Num<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Reductions<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, papilo::Timer const&, int&)::{lambda(int, int)#1}, int, bool) (pdqsort.h:420)
==145==    by 0x4A0875A: UnknownInlinedFun (pdqsort.h:502)
==145==    by 0x4A0875A: papilo::ParallelColDetection<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::execute(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Num<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, papilo::Reductions<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, papilo::Timer const&, int&) (ParallelColDetection.hpp:575)
==145==    by 0x494EC94: UnknownInlinedFun (PresolveMethod.hpp:167)
==145==    by 0x494EC94: UnknownInlinedFun (Presolve.hpp:1028)
==145==    by 0x494EC94: UnknownInlinedFun (_utils.h:362)
==145==    by 0x494EC94: UnknownInlinedFun (parallel_for.h:117)
==145==    by 0x494EC94: UnknownInlinedFun (partitioner.h:513)
==145==    by 0x494EC94: tbb::detail::d1::start_for<tbb::detail::d1::blocked_range<int>, papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::run_presolvers(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, std::pair<int, int> const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool&, papilo::Timer const&)::{lambda(tbb::detail::d1::blocked_range<int> const&)#1}, tbb::detail::d1::simple_partitioner const>::execute(tbb::detail::d1::execution_data&) (parallel_for.h:170)
==145==    by 0x6374A8A: UnknownInlinedFun (task_dispatcher.h:323)
==145==    by 0x6374A8A: UnknownInlinedFun (task_dispatcher.h:459)
==145==    by 0x6374A8A: tbb::detail::r1::task_dispatcher::execute_and_wait(tbb::detail::d1::task*, tbb::detail::d1::wait_context&, tbb::detail::d1::task_group_context&) (task_dispatcher.cpp:168)
==145==    by 0x49371EA: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::run_presolvers(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > const&, std::pair<int, int> const&, papilo::ProblemUpdate<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool&, papilo::Timer const&) (_task.h:191)
==145==    by 0x49433FD: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool)::{lambda()#1}::operator()() const (Presolve.hpp:557)
==145==    by 0x494E8D8: tbb::detail::d1::task_arena_function<papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool)::{lambda()#1}, papilo::PresolveResult<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > >::operator()() const (task_arena.h:47)
==145==    by 0x636056D: tbb::detail::r1::task_arena_impl::execute(tbb::detail::d1::task_arena_base&, tbb::detail::d1::delegate_base&) (arena.cpp:796)
==145==    by 0x4A780BA: papilo::PresolveResult<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > tbb::detail::d1::task_arena::execute_impl<papilo::PresolveResult<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >, papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool)::{lambda()#1}>(papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool)::{lambda()#1}&) [clone .constprop.0] (task_arena.h:251)
==145==    by 0x4933DC9: UnknownInlinedFun (task_arena.h:404)
==145==    by 0x4933DC9: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> >&, bool) (Presolve.hpp:979)
==145==  Address 0x751f758 is 8 bytes after a block of size 48,128 alloc'd
==145==    at 0x4842F95: operator new(unsigned long) (vg_replace_malloc.c:483)
==145==    by 0x33AEE4: UnknownInlinedFun (new_allocator.h:151)
==145==    by 0x33AEE4: UnknownInlinedFun (alloc_traits.h:475)
==145==    by 0x33AEE4: UnknownInlinedFun (stl_vector.h:377)
==145==    by 0x33AEE4: UnknownInlinedFun (stl_vector.h:1618)
==145==    by 0x33AEE4: std::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > >::operator=(std::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1> > > const&) [clone .isra.0] (vector.tcc:238)
==145==    by 0x154FCA: UnknownInlinedFun (SparseStorage.hpp:67)
==145==    by 0x154FCA: UnknownInlinedFun (ConstraintMatrix.hpp:139)
==145==    by 0x154FCA: UnknownInlinedFun (Problem.hpp:64)
==145==    by 0x154FCA: UnknownInlinedFun (Wrappers.hpp:84)
==145==    by 0x154FCA: main (papilo.cpp:216)

(followed by a few more with the same stacktraces).

Compile error at 98% ARM64 Android

My log is as follows

I have latest tbb & boost

cmake -DCMAKE_INSTALL_PREFIX=$PREFIX/local ..
-- The C compiler identification is Clang 14.0.6
-- The CXX compiler identification is Clang 14.0.6
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /data/data/com.termux/files/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /data/data/com.termux/files/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Boost: /data/data/com.termux/files/usr/lib/cmake/Boost-1.78.0/BoostConfig.cmake (found suitable version "1.78.0", minimum required is "1.65") found components: program_options
-- Found GMP: /data/data/com.termux/files/usr/include
-- Performing Test Quadmath_USE_DIRECTLY
-- Performing Test Quadmath_USE_DIRECTLY - Failed
-- Could NOT find Quadmath (missing: Quadmath_LIBRARY Quadmath_INCLUDE_DIR)
-- Git hash: dea16d4
-- Found TBB: /data/data/com.termux/files/usr/lib/cmake/TBB/TBBConfig.cmake (found suitable version "2021.5.0", minimum required is "2018")
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Looking for a Fortran compiler
-- Looking for a Fortran compiler - NOTFOUND
-- Looking for sgemm_
-- Looking for sgemm_ - not found
-- Looking for sgemm_
-- Looking for sgemm_ - found
-- Found BLAS: /data/data/com.termux/files/usr/lib/libopenblas.so
-- LUSOL is not built
-- Performing Test HAVE_FLAG_STD_CXX14
-- Performing Test HAVE_FLAG_STD_CXX14 - Success
-- Performing Test PAPILO_BYTELL_HASHMAP_WORKS
-- Performing Test PAPILO_BYTELL_HASHMAP_WORKS - Success
-- Found Boost: /data/data/com.termux/files/usr/lib/cmake/Boost-1.78.0/BoostConfig.cmake (found version "1.78.0") found components: iostreams serialization program_options
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_ZLIB
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_ZLIB - Success
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_BZIP2
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_BZIP2 - Success
-- No solvers linked
-- Found Boost: /data/data/com.termux/files/usr/lib/cmake/Boost-1.78.0/BoostConfig.cmake (found version "1.78.0") found components: serialization program_options iostreams
-- Configuring done
-- Generating done
-- Build files have been written to: /data/data/com.termux/files/home/papilo/build
~/papilo/build $ make -j4
[  1%] Building CXX object test/CMakeFiles/unit_test.dir/TestMain.cpp.o
[  3%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/VariableDomains.cpp.o
[  5%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/SparseStorage.cpp.o
[  7%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/core/MatrixBufferTest.cpp.o
[  9%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/ConstraintMatrix.cpp.o
[ 11%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/ProblemUpdate.cpp.o
[ 12%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/core/SparseStorageTest.cpp.o
[ 14%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/core/PresolveTest.cpp.o
[ 16%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/Presolve.cpp.o
[ 18%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/core/ProblemUpdateTest.cpp.o
[ 20%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/postsolve/PostsolveStorage.cpp.o
[ 22%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/misc/VectorUtilsTest.cpp.o
[ 24%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/CoefficientStrengtheningTest.cpp.o
[ 25%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/postsolve/Postsolve.cpp.o
[ 27%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/core/ProbingView.cpp.o
[ 29%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/ConstraintPropagationTest.cpp.o
[ 31%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/DualFixTest.cpp.o
[ 33%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/CoefficientStrengthening.cpp.o
[ 35%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/DominatedColsTest.cpp.o
[ 37%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/ConstraintPropagation.cpp.o
[ 38%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/DominatedCols.cpp.o
[ 40%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/FixContinuousTest.cpp.o
[ 42%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/DualFix.cpp.o
[ 44%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/DualInfer.cpp.o
[ 46%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/FreeVarSubstitutionTest.cpp.o
[ 48%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/ImplIntDetectionTest.cpp.o
[ 50%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/ParallelRowDetectionTest.cpp.o
[ 51%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/FixContinuous.cpp.o
[ 53%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/ParallelColDetectionTest.cpp.o
[ 55%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/FreeVarSubstitution.cpp.o
[ 57%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/ImplIntDetection.cpp.o
[ 59%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/ProbingTest.cpp.o
[ 61%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/ParallelColDetection.cpp.o
[ 62%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SingletonColsTest.cpp.o
[ 64%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/ParallelRowDetection.cpp.o
[ 66%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/Probing.cpp.o
[ 68%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SingletonStuffingTest.cpp.o
[ 70%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SimpleProbingTest.cpp.o
[ 72%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/SimpleProbing.cpp.o
[ 74%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SimpleSubstitutionTest.cpp.o
[ 75%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SimplifyInequalitiesTest.cpp.o
[ 77%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/SimpleSubstitution.cpp.o
[ 79%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/SingletonCols.cpp.o
[ 81%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/presolve/SparsifyTest.cpp.o
[ 83%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/SingletonStuffing.cpp.o
[ 85%] Building CXX object test/CMakeFiles/unit_test.dir/papilo/io/MpsParserTest.cpp.o
[ 87%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/Sparsify.cpp.o
[ 88%] Building CXX object CMakeFiles/papilo-core.dir/src/papilo/presolvers/SimplifyInequalities.cpp.o
[ 90%] Linking CXX executable unit_test
ld.lld: error: undefined symbol: __android_log_write
>>> referenced by catch.hpp:10367 (/data/data/com.termux/files/home/papilo/src/papilo/external/catch/catch.hpp:10367)
>>>               CMakeFiles/unit_test.dir/TestMain.cpp.o:(Catch::writeToDebugConsole(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&))
>>> referenced by catch.hpp:10367 (/data/data/com.termux/files/home/papilo/src/papilo/external/catch/catch.hpp:10367)
>>>               CMakeFiles/unit_test.dir/TestMain.cpp.o:(Catch::Detail::(anonymous namespace)::StreamBufImpl<Catch::Detail::(anonymous namespace)::OutputDebugWriter, 256ul>::sync())
>>> referenced by catch.hpp:10367 (/data/data/com.termux/files/home/papilo/src/papilo/external/catch/catch.hpp:10367)
>>>               CMakeFiles/unit_test.dir/TestMain.cpp.o:(Catch::Detail::(anonymous namespace)::StreamBufImpl<Catch::Detail::(anonymous namespace)::OutputDebugWriter, 256ul>::overflow(int))
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [test/CMakeFiles/unit_test.dir/build.make:455: test/unit_test] Error 1
make[1]: *** [CMakeFiles/Makefile2:225: test/CMakeFiles/unit_test.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 92%] Linking CXX static library libpapilo-core.a
[ 92%] Built target papilo-core
make: *** [Makefile:146: all] Error 2

Releases not tagged

CMakeLists.txt says that the version is 2.0.0, but repository has no such tag.

Implementing .opb file parser

.opb is a file format to specify 0-1 Integer programs. However it is already supported in the larger SCIP ecosystem. I am aware that this format also contains products of binary variables, so working with the linearization of products of binaries would be enough. I would not expect writing out .opbs with recovered product structures, although it would be nice.

What would be required to make papilo support reading .opb?

For reference SCIP supports the following formats:

cip, cnf, flatzinc, rlp, lp, mps, opb, pip, wbo, zimpl

I understand that supporting flatzinc and similar constraint based formats is really complicated and recovery of those constraint structures from a an presolved MILP quiet hard. So a full support for all filetypes SCIP can support is unrealistic given the linear framework of papilo.

build failure on fedora-37

  [papilo-2.1.1]                    from /sage/local/var/tmp/sage/build/papilo-2.1.1/src/src/papilo/io/MpsParser.hpp:28,
  [papilo-2.1.1]                    from /sage/local/var/tmp/sage/build/papilo-2.1.1/src/test/papilo/io/MpsParserTest.cpp:24:
  [papilo-2.1.1]   /usr/include/boost/multiprecision/float128.hpp: In member function 'std::string boost::multiprecision::backends::float128_backend::str(std::streamsize, std::ios_base::fmtflags) const':
  [papilo-2.1.1]   /usr/include/boost/multiprecision/float128.hpp:260:15: error: 'unique_ptr' is not a member of 'std'
  [papilo-2.1.1]     260 |          std::unique_ptr<char[]>   buf2;
  [papilo-2.1.1]         |               ^~~~~~~~~~
  [papilo-2.1.1]   /usr/include/boost/multiprecision/float128.hpp:12:1: note: 'std::unique_ptr' is defined in header '<memory>'; did you forget to '#include <memory>'?

https://github.com/mkoeppe/PySCIPOpt/actions/runs/3506612801/jobs/5873771362

Request of Python interface

Hi, Thank you for your great work!
I was wondering if there is any plan to support the Python interface, such that one could easily invoke your algorithms for fast prototyping.

oneTBB default location

If PaPILO does not find oneTBB and it tries to download and use v2021.4.0, does it install oneTBB in the folder external/? If not, does PaPILO need root access in order to install oneTBB?

lto1: fatal error: bytecode stream in file ‘CMakeFiles/tbbmalloc.dir/backend.cpp.o’ generated with LTO version 8.1 instead of the expected 6.2

Hello,
After I execute the "cmake ..." command, I was prompted that TBB was not installed and an error was reported during the installation process:

lto1: fatal error: bytecode stream in file ‘CMakeFiles/tbbmalloc.dir/backend.cpp.o’ generated with LTO version 8.1 instead of the expected 6.2

compilation terminated.

lto-wrapper: fatal error: /usr/bin/gcc returned 1 exit status

compilation terminated.

/usr/bin/ld: error: lto-wrapper failed

collect2: error: ld returned 1 exit status

make[2]: ***
[src/tbbmalloc/CMakeFiles/tbbmalloc.dir/build.make:160:gnu_9.4_cxx11_64_relwithdebinfo/libtbbmalloc.so.2.4]
错误 1

make[1]: ***
[CMakeFiles/Makefile2:205:src/tbbmalloc/CMakeFiles/tbbmalloc.dir/all]
错误 2

make: *** [Makefile:152:all] 错误 2

How can I solve this problem?

Breaks with onetbb-2021.3.0: undefined symbol: tbb::task_group_context::init()

FAILED: bin/duplicates 
: && /usr/bin/c++ -O2 -pipe -fno-omit-frame-pointer -fstack-protector-strong -fno-strict-aliasing -fno-omit-frame-pointer -O2 -pipe -fno-omit-frame-pointer -fstack-protector-strong -fno-strict-aliasing -fno-omit-frame-pointer -fstack-protector-strong binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o -o bin/duplicates  -Wl,-rpath,/usr/local/lib  libpapilo-core.a  /usr/local/lib/libboost_iostreams.so  /usr/local/lib/libboost_serialization.so  /usr/local/lib/libboost_program_options.so  /usr/local/lib/libboost_regex.so  /usr/local/lib/libtbb.so  /usr/local/lib/libgmp.so  /usr/local/lib/libgmpxx.so && :
ld: error: undefined symbol: tbb::task_group_context::init()
>>> referenced by ConstraintMatrix.cpp
>>>               ConstraintMatrix.cpp.o:(papilo::ConstraintMatrix<double>::compress(bool)) in archive libpapilo-core.a
>>> referenced by ConstraintMatrix.cpp
>>>               ConstraintMatrix.cpp.o:(papilo::ConstraintMatrix<double>::compress(bool)) in archive libpapilo-core.a
>>> referenced by ConstraintMatrix.cpp
>>>               ConstraintMatrix.cpp.o:(papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)) in archive libpapilo-core.a
>>> referenced 12 more times

OS: FreeBSD 13

Solution in Presolved Reduced Space

If I have a solution (or partial solution) to the original problem defined in a .sol file, is there a way to construct the corresponding solution (or partial solution) in the presolved reduced space?

This might be useful if a good solution (or partial solution) to the original problem is known (for example from a metaheuristic) and I want to provide this initial feasible solution (or partial solution) and the presolved reduced problem to the solver (e.g., Gurobi).

PaPILO with GLOP or PDLP

If PaPILO is built with OR-Tools and the solve command is used to solve an LP (papilo solve -f problem.mps -l problem.sol), does PaPILO write the presolved problem to an MPS file and then call GLOP or PDLP on the presolved MPS file? From the command line, how does one select whether solve uses GLOP vs PDLP?

the excutable binary file not found after building the package

Hello,
I'm installing PAPILO on ubuntu following the instruction. I have succeeded in building the package.
According to the README.md, the excutable binary file can be called by

bin/papilo presolve -f problem.mps -r reduced.mps -v reduced.postsolve

but I do not find any folder named "bin" or binary file named "papilo".
Looking forward to your reply.

Default Number of Threads

What is the default number of threads used by PaPILO? Is it 1 or the number of physical cores or the number of logical cores? I don't see the number of threads used listed in the console output.

SOS1 Constraints

Is PaPILO able to exploit SOS1 constraints? That is, is there a difference between the presolve reduction of a problem defined with SOS1 constraints and the presolve reduction of the same problem with its SOS1 constraints removed, assuming that both original problems are equivalent mathematically?

CMake config fails with Boost IOStreams

Ubuntu 20.10. Running cmake .. all fine but I noticed boost/iostreams,serialization,program_options were not found. I installed them, reran cmake. Then ran it with -DCMAKE_BUILD_TYPE=Release. Still successful. Then ran cmake.. -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=on and got the below error.

Strangely, wiping out the build directory, and even re-cloning papilo and deinstalling the optional boost components did not help.

...
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0") found components: iostreams serialization program_options
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_ZLIB
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_ZLIB - Success
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_BZIP2
-- Performing Test PAPILO_USE_BOOST_IOSTREAMS_WITH_BZIP2 - Success
-- Linking solvers: SCIP
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0") found components: serialization program_options iostreams
-- Configuring done
CMake Error at binaries/CMakeLists.txt:53 (add_executable):
Target "papilo-executable" links to target "ZLIB::ZLIB" but the target was
not found. Perhaps a find_package() call is missing for an IMPORTED
target, or an ALIAS target is missing?

Build breaks: undefined symbol: papilo::SparseStorage<double>::SparseStorage(std::__1::vector<std::__1::tuple<int, int, double>, std::__1::allocator<std::__1::tuple<int, int, double>>>, int, int, bool, double, int)

===>  Building for papilo-2.1.2
[  9% 7/11] : && /usr/local/libexec/ccache/c++ -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing   -DNDEBUG -fstack-protector-strong binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o -o bin/duplicates  -Wl,-rpath,/usr/ports/math/papilo/work/.build:/usr/local/lib:  libpapilo-core.so  /usr/local/lib/libboost_iostreams.so  /usr/local/lib/libboost_serialization.so  /usr/local/lib/libboost_program_options.so  /usr/local/lib/libboost_regex.so  /usr/local/lib/libtbb.so.12.9  -lpthread  /usr/local/lib/libgmp.so  /usr/local/lib/libgmpxx.so && :
FAILED: bin/duplicates 
: && /usr/local/libexec/ccache/c++ -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing   -DNDEBUG -fstack-protector-strong binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o -o bin/duplicates  -Wl,-rpath,/usr/ports/math/papilo/work/.build:/usr/local/lib:  libpapilo-core.so  /usr/local/lib/libboost_iostreams.so  /usr/local/lib/libboost_serialization.so  /usr/local/lib/libboost_program_options.so  /usr/local/lib/libboost_regex.so  /usr/local/lib/libtbb.so.12.9  -lpthread  /usr/local/lib/libgmp.so  /usr/local/lib/libgmpxx.so && :
ld: error: undefined symbol: papilo::SparseStorage<double>::SparseStorage(std::__1::vector<std::__1::tuple<int, int, double>, std::__1::allocator<std::__1::tuple<int, int, double>>>, int, int, bool, double, int)
>>> referenced by duplicates.cpp
>>>               binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o:(papilo::MpsParser<double>::loadProblem(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))

ld: error: undefined symbol: papilo::SparseStorage<double>::getTranspose() const
>>> referenced by duplicates.cpp
>>>               binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))

ld: error: undefined symbol: papilo::ConstraintMatrix<double>::ConstraintMatrix(papilo::SparseStorage<double>, papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>)
>>> referenced by duplicates.cpp
>>>               binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by duplicates.cpp
>>>               binaries/CMakeFiles/duplicates.dir/__/src/duplicates.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
c++: error: linker command failed with exit code 1 (use -v to see invocation)
[ 18% 7/11] : && /usr/local/libexec/ccache/c++ -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing   -DNDEBUG -fstack-protector-strong binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o -o bin/papilo  -Wl,-rpath,/usr/ports/math/papilo/work/.build:/usr/local/lib:  libpapilo-core.so  /usr/local/lib/libsoplex.so.6.0.3.0  /usr/local/lib/libboost_iostreams.so  /usr/local/lib/libboost_serialization.so  /usr/local/lib/libboost_program_options.so  /usr/local/lib/libboost_regex.so  /usr/local/lib/libtbb.so.12.9  -lpthread  /usr/lib/libz.so  /usr/local/lib/libgmp.so  /usr/local/lib/libgmpxx.so && :
FAILED: bin/papilo 
: && /usr/local/libexec/ccache/c++ -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -O2 -pipe -fstack-protector-strong -fno-strict-aliasing   -DNDEBUG -fstack-protector-strong binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o -o bin/papilo  -Wl,-rpath,/usr/ports/math/papilo/work/.build:/usr/local/lib:  libpapilo-core.so  /usr/local/lib/libsoplex.so.6.0.3.0  /usr/local/lib/libboost_iostreams.so  /usr/local/lib/libboost_serialization.so  /usr/local/lib/libboost_program_options.so  /usr/local/lib/libboost_regex.so  /usr/local/lib/libtbb.so.12.9  -lpthread  /usr/lib/libz.so  /usr/local/lib/libgmp.so  /usr/local/lib/libgmpxx.so && :
ld: error: undefined symbol: papilo::Presolve<double>::addDefaultPresolvers()
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<double>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<double>, std::__1::default_delete<papilo::SolverFactory<double>>>, std::__1::unique_ptr<papilo::SolverFactory<double>, std::__1::default_delete<papilo::SolverFactory<double>>>))

ld: error: undefined symbol: papilo::Presolve<double>::apply(papilo::Problem<double>&, bool)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<double>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<double>, std::__1::default_delete<papilo::SolverFactory<double>>>, std::__1::unique_ptr<papilo::SolverFactory<double>, std::__1::default_delete<papilo::SolverFactory<double>>>))

ld: error: undefined symbol: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::addDefaultPresolvers()
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>>, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>>))

ld: error: undefined symbol: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>&, bool)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>>, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>>))

ld: error: undefined symbol: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::addDefaultPresolvers()
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>>, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>>))

ld: error: undefined symbol: papilo::Presolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::apply(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>&, bool)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::ResultStatus papilo::presolve_and_solve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>(papilo::OptionsInfo const&, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>>, std::__1::unique_ptr<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::default_delete<papilo::SolverFactory<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>>))

ld: error: undefined symbol: papilo::SparseStorage<double>::SparseStorage(std::__1::vector<std::__1::tuple<int, int, double>, std::__1::allocator<std::__1::tuple<int, int, double>>>, int, int, bool, double, int)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::MpsParser<double>::loadProblem(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))

ld: error: undefined symbol: papilo::Postsolve<double>::undo(papilo::Solution<double> const&, papilo::Solution<double>&, papilo::PostsolveStorage<double>, bool) const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::postsolve<double>(papilo::PostsolveStorage<double>&, papilo::Solution<double> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Validation<double>::can_reduced_solution_be_recalculated(papilo::Problem<double> const&, papilo::PostsolveStorage<double> const&, papilo::Solution<double> const&))

ld: error: undefined symbol: papilo::SparseStorage<double>::getTranspose() const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::ConstraintMatrix<double>::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int))

ld: error: undefined symbol: papilo::ConstraintMatrix<double>::ConstraintMatrix(papilo::SparseStorage<double>, papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<double>::setConstraintMatrix(papilo::SparseStorage<double>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<double, std::__1::allocator<double>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))

ld: error: undefined symbol: papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::SparseStorage(std::__1::vector<std::__1::tuple<int, int, boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::allocator<std::__1::tuple<int, int, boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>>, int, int, bool, double, int)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::MpsParser<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::loadProblem(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))

ld: error: undefined symbol: papilo::Postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::undo(papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>> const&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>&, papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, bool) const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>(papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Validation<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::can_reduced_solution_be_recalculated(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>> const&, papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>> const&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>> const&))

ld: error: undefined symbol: papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::getTranspose() const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int))

ld: error: undefined symbol: papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::ConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))

ld: error: undefined symbol: papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::SparseStorage(std::__1::vector<std::__1::tuple<int, int, boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::allocator<std::__1::tuple<int, int, boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>>, int, int, bool, double, int)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::MpsParser<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::loadProblem(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))

ld: error: undefined symbol: papilo::Postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::Postsolve(papilo::Message, papilo::Num<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>(papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Validation<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::can_reduced_solution_be_recalculated(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&))

ld: error: undefined symbol: papilo::Postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::undo(papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>&, papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, bool) const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::postsolve<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>(papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Validation<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::can_reduced_solution_be_recalculated(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, papilo::PostsolveStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&, papilo::Solution<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>> const&))

ld: error: undefined symbol: papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::getTranspose() const
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(void papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int))

ld: error: undefined symbol: papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::ConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>)
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
>>> referenced by papilo.cpp
>>>               binaries/CMakeFiles/papilo-executable.dir/__/src/papilo.cpp.o:(papilo::Problem<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>::setConstraintMatrix(papilo::SparseStorage<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>, std::__1::allocator<boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, (boost::multiprecision::expression_template_option)1>>>, std::__1::vector<papilo::Flags<papilo::RowFlag>, std::__1::allocator<papilo::Flags<papilo::RowFlag>>>, bool))
c++: error: linker command failed with exit code 1 (use -v to see invocation)

Version: 2.1.2
clang-15
FreeBSD 13.2

Building with OR-Tools

What is the cmake flag ("-DORTOOLS_DIR=" ?) to specify the location of OR-Tools when trying to build PaPILO with OR-Tools in order to use GLOP and PDLP? Will CP-SAT also be added as a possible OR-Tools solver integrated with PaPILO? CP-SAT can solve pure integer linear programs.

mkdir build
cd build
cmake -DORTOOLS_DIR=PATH_TO_ORTOOLS_BUILD_DIR ..
make

Missing file "papilolib_export.h"?

Hi, I'm trying to use the C API found in src/papilolib.h, but this includes "papilolib_export.h" which I can't find anywhere. Without it PAPILOLIB_EXPORT is not defined.

I've build papilo using the basic build instructions
mkdir build
cd build
cmake ..
make

Is using the API in src/papilolib.h supported, and if yes how do I obtain/create papilolib_export.h?

Corrected Dual Solution for Presolved Problem

Is the corrected dual solution, obtained for a presolved problem, a lower bound for the original problem? If the solution to the presolved problem is y, then let r = c-A^T*y be the reduced costs, where c and A are defined for the presolved problem. The corrected dual solution is obtained by evaluating the dual objective defined here: https://developers.google.com/optimization/lp/pdlp_math#dual

I am interested in obtaining a tight lower bound of the original problem. I do not believe PaPILO is able to save off the dual solution, so I cannot evaluate the corrected dual solution from the postsolved solution.

Program name duplicates is generic

Perhaps the program duplicates could be renamed to papilo_duplicates which would make it easier to distinguish from other similarly named programs.

Correct way to handle dual solution when using from command line

What is the correct way to account for an available dual solution when manually solving the presolved instance? I'm writing a .mps file, calling presolve, and then solve the resulting problem (using JuMP -> HiGHS). I then write a .sol file with the extracted (primal) values of all variables

x      0.3
...
z      -1.2

and call postsolve on that, which gives me

=obj=          1234.00
x              ...              obj(0.0)
...

I assume the obj(...) is "only" the objective coefficient (based on an information from SCIP: (obj: <objective coefficient of variable>) ). I've provided parameters using -p lp_presolvers_with_basis.set.

Breaks with highs: error: no member named 'a_index_' in 'HighsLp'

/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:97:13: error: no member named 'a_index_' in 'HighsLp'
      model.a_index_.resize( consMatrix.getNnz() );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:98:13: error: no member named 'a_value_' in 'HighsLp'
      model.a_value_.resize( consMatrix.getNnz() );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:99:13: error: no member named 'a_start_' in 'HighsLp'
      model.a_start_.resize( ncols + 1 );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:100:13: error: no member named 'a_start_' in 'HighsLp'
      model.a_start_[ncols] = consMatrix.getNnz();
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:130:16: error: no member named 'a_start_' in 'HighsLp'
         model.a_start_[i] = start;
         ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:134:19: error: no member named 'a_value_' in 'HighsLp'
            model.a_value_[start + k] = double( colvals[k] );
            ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:135:19: error: no member named 'a_index_' in 'HighsLp'
            model.a_index_[start + k] = colrows[k];
            ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:193:13: error: no member named 'a_index_' in 'HighsLp'
      model.a_index_.resize( component.nnonz );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:194:13: error: no member named 'a_value_' in 'HighsLp'
      model.a_value_.resize( component.nnonz );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:195:13: error: no member named 'a_start_' in 'HighsLp'
      model.a_start_.resize( numcols + 1 );
      ~~~~~ ^
/usr/ports/math/papilo/work/papilo-2.1.2/src/papilo/interfaces/HighsInterface.hpp:196:13: error: no member named 'a_start_' in 'HighsLp'
      model.a_start_[numcols] = component.nnonz;
      ~~~~~ ^

Version: 2.1.2
coin-or-highs-1.5.1
clang-15
FreeBSD 13.2

Papilo Compiling Error in Arch WSL

Hi, for testing purpose I installed Arch WSL that always have latest version of libraries in linux. I installed some required packages and compiled IPOPT without any problem. Then, I moved on SCIP and started compiling from Papilo. I directly pulling github files with clone command.
log1.txt file is output of "cmake .." command.

log2.txt file is output of "make -j12" command.
I also attaching CMake log files.
CMakeError.log
CMakeOutput.log

I think these files will be helpful to identify error.

vector out of bounds access at Presolve.hpp line 1152

result = probUpdate.applyTransaction( &reds[k], &reds.data()[k + 1] );

   for( ; k != static_cast<int>( reds.size() ); ++k )
   {
      result = probUpdate.applyTransaction( &reds[k], &reds.data()[k + 1] );

reds.data()[k+1] is clearly out of bounds in the last iteration of this loop. If compiled with Visual C++ in debug mode, an assert will be triggered within th VC++ implementation of std::vector.

Compilation fails with `‘gcd’ is not a member of ‘boost’`.

Building SCIPOptSuite from source with this recipe, and also when that recipe is updated to use version 8.0.0, compilation fails on my end with the following two errors:

/[…]/scipoptsuite-8.0.0/papilo/src/papilo/presolvers/SimplifyInequalities.hpp:144:21: error: ‘gcd’ is not a member of ‘boost’
  144 |       return boost::gcd( static_cast<int64_t>( val1 ),
/[…]/scipoptsuite-8.0.0/papilo/src/papilo/presolvers/SimplifyInequalities.hpp:164:21: error: ‘gcd’ is not a member of ‘boost’
  164 |       return boost::gcd( static_cast<int64_t>( val1 * multiplier ),

This is on Arch Linux (rolling, last full update today).

Replacing both occurences of boost::gcd with boost::integer::gcd appears to resolve this issue for me (i.e. the build of papilo-core succeeds, though there is now a new error in a different part of SCIPOptSuite).

Singleton Column wrong reduction/ constant computation

Using Papilo 2.2.0 with only col singleton enabled I got an issue when reducing this problem.

It should be trivally reduced to 0 but instead it is trivially reduced to -10:

Minimize
 obj: 100000 x1 + 100000 x2
Subject To
 c1: - 0.000555555555555556 x1 + 0.000555555555555556 x2
     - 0.000555555555555556 x3 + 0.000555555555555556 x4  = 0
Bounds
 0 <= x3 <= 0.0001
 0 <= x4 <= 0.0001
End

ttt1.zip
Attached is a zip file containing the lp file, mps file and params for papilo cli.
I can reproduced it with older versions of papilo (2.1.0) at least

presolve returns error "unknown bound type INDICATORS"

While trying to presolve instances from the MIPLIB collection and found that instance supportcase21i
https://miplib.zib.de/instance_details_supportcase21i.html
with command papilo presolve -f supportcase21i.mps

returns the error unknown bound type INDICATORS

From these references it seems that this is not part of the standard mps format and I don't need the exact structure of the problem instance, so ignoring the INDICATORS section in the mps file would work for me, but I was wondering if Papilo has a better way of handling this.

https://www-eio.upc.es/lceio/manuals/cplex-11/html/reffileformatscplex/reffileformatscplex15.html
https://documentation.aimms.com/platform/solvers/cplex.html#cplex-indicator-constraints

Thanks in advance!

Full output:

PaPILO version 2.1.2 [mode: optimized][Solvers: SCIP,SoPlex][GitHash: 2fe2543]
Copyright (C) 2020-2022 Zuse Institute Berlin (ZIB)

External libraries: 
  Boost    1.76.0        (https://www.boost.org/)
  TBB                    Thread building block https://github.com/oneapi-src/oneTBB developed by Intel
  GMP      6.2.0         GNU Multiple Precision Arithmetic Library developed by T. Granlund (gmplib.org)
  SCIP     8.0.3         Mixed Integer Programming Solver developed at Zuse Institute Berlin (scip.zib.de) [GitHash: 62fab8a2e3]
  SoPlex   6.0.3         Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: f900e3d0]

unknown bound type INDICATORS

Boost libraries are required even if Papilo is used as header-only library (at least on windows)

This is due to boost auto linking:

  • Postsolve.hpp, PostsolveStorage.hpp, Presolve.hpp and MultiPrecision.hpp include stuff from boost serialization
  • Those include transitively boost/config/auto_link.hpp which has pragmas to tell the compiler/linker to link against boost libraries. This completely bypases cmake or whatever other build system you use.
  • as a consequence the build fails with a linker error if those boost libraries are not available.

Not sure which compilers are affected. I'm using MSVC and Papilo 2.2.0.

Workaround:
removing those includes in the for files mentioned above worked for me. Not sure whether there are cases they are needed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.