/* This file is part of solidity. solidity 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. solidity 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 solidity. If not, see . */ // SPDX-License-Identifier: GPL-3.0 #pragma once #include #include #include #include #include namespace solidity::util { /** * Constraint of the form * - data[1] * x_1 + data[2] * x_2 + ... <= data[0] (equality == false) * - data[1] * x_1 + data[2] * x_2 + ... = data[0] (equality == true) * The set and order of variables is implied. */ struct Constraint { LinearExpression data; bool equality = false; bool operator<(Constraint const& _other) const; bool operator==(Constraint const& _other) const; }; /** * State used when solving an LP problem. */ struct SolvingState { /// Names of variables, the index zero should be left empty /// (because zero corresponds to constants). std::vector variableNames; struct Bounds { std::optional lower; std::optional upper; bool operator<(Bounds const& _other) const { return make_pair(lower, upper) < make_pair(_other.lower, _other.upper); } bool operator==(Bounds const& _other) const { return make_pair(lower, upper) == make_pair(_other.lower, _other.upper); } }; /// Lower and upper bounds for variables (in the sense of >= / <=). std::vector bounds; std::vector constraints; bool operator<(SolvingState const& _other) const; bool operator==(SolvingState const& _other) const; std::string toString() const; }; enum class LPResult { Unknown, Unbounded, Feasible, Infeasible }; /** * LP solver for rational problems. * * Does not solve integer problems! * * Tries to split a given problem into sub-problems and utilizes a cache to quickly solve * similar problems. */ class LPSolver { public: std::pair>> check(SolvingState _state); private: // TODO check if the model is requested in production. If not, we do not need to cache it. std::map>>> m_cache; }; }