/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* This file is part of the program and library */
/* PaPILO --- Parallel Presolve for Integer and Linear Optimization */
/* */
/* Copyright (C) 2020-2022 Konrad-Zuse-Zentrum */
/* fuer Informationstechnik Berlin */
/* */
/* This program is free software: you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser 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 Lesser General Public License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this program. If not, see . */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef _PAPILO_INTERFACES_SOLVER_INTERFACE_HPP_
#define _PAPILO_INTERFACES_SOLVER_INTERFACE_HPP_
#include "papilo/core/Components.hpp"
#include "papilo/io/Message.hpp"
#include "papilo/misc/ParameterSet.hpp"
#include "papilo/misc/String.hpp"
#include "papilo/misc/Vec.hpp"
#include
#include
namespace papilo
{
enum class SolverType : int
{
LP,
MIP
};
enum class SolverStatus : int
{
kInit,
kOptimal,
kInfeasible,
kUnbounded,
kUnbndOrInfeas,
kInterrupted,
kError
};
template
class SolverInterface
{
protected:
SolverStatus status;
public:
SolverInterface() : status( SolverStatus::kInit ) {}
virtual void
setUp( const Problem& prob, const Vec& row_maps,
const Vec& col_maps ) = 0;
virtual void
setUp( const Problem& prob, const Vec& row_maps,
const Vec& col_maps, const Components& components,
const ComponentInfo& component ) = 0;
virtual void
solve() = 0;
virtual SolverType
getType() = 0;
virtual String
getName() = 0;
virtual void
printDetails()
{
}
virtual void
readSettings( const String& file )
{
}
SolverStatus
getStatus()
{
return status;
}
virtual void
setNodeLimit( int num )
{
}
virtual void
setGapLimit( const REAL& gaplim )
{
}
virtual void
setSoftTimeLimit( double tlim )
{
}
virtual void
setTimeLimit( double tlim ) = 0;
virtual void
setVerbosity( VerbosityLevel verbosity ) = 0;
virtual bool
getSolution( Solution& sol ) = 0;
virtual bool
getSolution( const Components& components, int component,
Solution& sol ) = 0;
virtual REAL
getDualBound() = 0;
virtual bool
is_dual_solution_available() = 0;
virtual void
addParameters( ParameterSet& paramSet )
{
}
virtual ~SolverInterface() {}
};
template
class SolverFactory
{
public:
virtual std::unique_ptr>
newSolver( VerbosityLevel verbosity = VerbosityLevel::kQuiet ) const = 0;
virtual void
add_parameters( ParameterSet& parameter ) const = 0;
virtual ~SolverFactory() {}
};
} // namespace papilo
#endif