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().
 | ||||
| 	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) | ||||
| 		if (rational diff = data.get(i) - _other.data.get(i)) | ||||
| 		{ | ||||
| 			//cout << "Exit after " << i << endl;
 | ||||
| 			return diff < 0; | ||||
| 		} | ||||
| 	//cout << "full traversal of " << max(data.size(), _other.data.size()) << endl;
 | ||||
| 
 | ||||
| 	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) | ||||
| 		if (data.get(i) != _other.data.get(i)) | ||||
| 		{ | ||||
| 			//cout << "Exit after " << i << endl;
 | ||||
| 			return false; | ||||
| 		} | ||||
| 	//cout << "full traversal of " << max(data.size(), _other.data.size()) << endl;
 | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| @ -24,6 +24,7 @@ | ||||
| 
 | ||||
| #include <vector> | ||||
| #include <variant> | ||||
| #include <functional> | ||||
| 
 | ||||
| namespace solidity::util | ||||
| { | ||||
| @ -85,9 +86,83 @@ struct SolvingState | ||||
| 		bool considerVariableNames; | ||||
| 	}; | ||||
| 
 | ||||
| 	bool operator==(SolvingState const& _other) const noexcept { | ||||
| 		return bounds == _other.bounds && constraints == _other.constraints; | ||||
| 	} | ||||
| 
 | ||||
| 	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 | ||||
| { | ||||
| 	Unknown, | ||||
| @ -179,7 +254,7 @@ class LPSolver | ||||
| { | ||||
| public: | ||||
| 	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) {} | ||||
| 
 | ||||
| 
 | ||||
| @ -216,7 +291,7 @@ private: | ||||
| 	std::vector<size_t> m_subProblemsPerConstraint; | ||||
| 	/// TODO also store the first infeasible subproblem?
 | ||||
| 	/// 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