mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use unordered map.
This commit is contained in:
parent
1b44668b34
commit
e4ad6ef39f
@ -123,7 +123,7 @@ private:
|
|||||||
/// Stack of state, to allow for push()/pop().
|
/// Stack of state, to allow for push()/pop().
|
||||||
std::vector<State> m_state{{State{}}};
|
std::vector<State> m_state{{State{}}};
|
||||||
|
|
||||||
std::map<SolvingState, LPResult, SolvingState::Compare> m_lpCache;
|
std::unordered_map<SolvingState, LPResult> m_lpCache;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -504,7 +504,11 @@ bool Constraint::operator<(Constraint const& _other) const
|
|||||||
|
|
||||||
for (size_t i = 0; i < max(data.size(), _other.data.size()); ++i)
|
for (size_t i = 0; i < max(data.size(), _other.data.size()); ++i)
|
||||||
if (rational diff = data.get(i) - _other.data.get(i))
|
if (rational diff = data.get(i) - _other.data.get(i))
|
||||||
|
{
|
||||||
|
//cout << "Exit after " << i << endl;
|
||||||
return diff < 0;
|
return diff < 0;
|
||||||
|
}
|
||||||
|
//cout << "full traversal of " << max(data.size(), _other.data.size()) << endl;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -516,7 +520,11 @@ bool Constraint::operator==(Constraint const& _other) const
|
|||||||
|
|
||||||
for (size_t i = 0; i < max(data.size(), _other.data.size()); ++i)
|
for (size_t i = 0; i < max(data.size(), _other.data.size()); ++i)
|
||||||
if (data.get(i) != _other.data.get(i))
|
if (data.get(i) != _other.data.get(i))
|
||||||
|
{
|
||||||
|
//cout << "Exit after " << i << endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
//cout << "full traversal of " << max(data.size(), _other.data.size()) << endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace solidity::util
|
namespace solidity::util
|
||||||
{
|
{
|
||||||
@ -85,9 +86,83 @@ struct SolvingState
|
|||||||
bool considerVariableNames;
|
bool considerVariableNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool operator==(SolvingState const& _other) const noexcept {
|
||||||
|
return bounds == _other.bounds && constraints == _other.constraints;
|
||||||
|
}
|
||||||
|
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline void hashCombine(std::size_t& _seed, T const& _v)
|
||||||
|
{
|
||||||
|
std::hash<T> hasher;
|
||||||
|
_seed ^= hasher(_v) + 0x9e3779b9 + (_seed << 6) + (_seed >> 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline void hashCombineVector(std::size_t& _seed, std::vector<T> const& _v)
|
||||||
|
{
|
||||||
|
hashCombine(_seed, _v.size());
|
||||||
|
for (auto const& x: _v)
|
||||||
|
hashCombine(_seed, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct std::hash<solidity::util::SolvingState::Bounds>
|
||||||
|
{
|
||||||
|
std::size_t operator()(solidity::util::SolvingState::Bounds const& _bounds) const noexcept
|
||||||
|
{
|
||||||
|
std::size_t result = 0;
|
||||||
|
hashCombine(result, _bounds.lower);
|
||||||
|
hashCombine(result, _bounds.upper);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct std::hash<solidity::util::LinearExpression>
|
||||||
|
{
|
||||||
|
std::size_t operator()(solidity::util::LinearExpression const& _linearExpression) const noexcept
|
||||||
|
{
|
||||||
|
std::size_t result = 0;
|
||||||
|
hashCombine(result, _linearExpression.size());
|
||||||
|
for (auto const& x: _linearExpression.enumerate())
|
||||||
|
hashCombine(result, x.second);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct std::hash<solidity::util::Constraint>
|
||||||
|
{
|
||||||
|
std::size_t operator()(solidity::util::Constraint const& _constraint) const noexcept
|
||||||
|
{
|
||||||
|
std::size_t result = 0;
|
||||||
|
hashCombine(result, _constraint.equality);
|
||||||
|
hashCombine(result, _constraint.data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct std::hash<solidity::util::SolvingState>
|
||||||
|
{
|
||||||
|
std::size_t operator()(solidity::util::SolvingState const& _solvingState) const noexcept
|
||||||
|
{
|
||||||
|
std::size_t result = 0;
|
||||||
|
hashCombineVector(result, _solvingState.bounds);
|
||||||
|
hashCombineVector(result, _solvingState.constraints);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
namespace solidity::util
|
||||||
|
{
|
||||||
|
|
||||||
enum class LPResult
|
enum class LPResult
|
||||||
{
|
{
|
||||||
Unknown,
|
Unknown,
|
||||||
@ -179,7 +254,7 @@ class LPSolver
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit LPSolver(bool _supportModels = true);
|
explicit LPSolver(bool _supportModels = true);
|
||||||
explicit LPSolver(std::map<SolvingState, LPResult, SolvingState::Compare>* _cache):
|
explicit LPSolver(std::unordered_map<SolvingState, LPResult>* _cache):
|
||||||
m_cache(_cache) {}
|
m_cache(_cache) {}
|
||||||
|
|
||||||
|
|
||||||
@ -216,7 +291,7 @@ private:
|
|||||||
std::vector<size_t> m_subProblemsPerConstraint;
|
std::vector<size_t> m_subProblemsPerConstraint;
|
||||||
/// TODO also store the first infeasible subproblem?
|
/// TODO also store the first infeasible subproblem?
|
||||||
/// TODO still retain the cache?
|
/// TODO still retain the cache?
|
||||||
std::map<SolvingState, LPResult, SolvingState::Compare>* m_cache = nullptr;
|
std::unordered_map<SolvingState, LPResult>* m_cache = nullptr;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user