mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Simplifications on LinearExpression.
This commit is contained in:
parent
e6c67924b0
commit
00a277c0f5
@ -353,7 +353,7 @@ void eraseIndices(T& _data, vector<bool> const& _indices)
|
|||||||
T result;
|
T result;
|
||||||
for (size_t i = 0; i < _data.size(); i++)
|
for (size_t i = 0; i < _data.size(); i++)
|
||||||
if (!_indices[i])
|
if (!_indices[i])
|
||||||
result.emplace_back(move(_data[i]));
|
result.push_back(move(_data[i]));
|
||||||
_data = move(result);
|
_data = move(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ using rational = boost::rational<bigint>;
|
|||||||
/**
|
/**
|
||||||
* A linear expression of the form
|
* A linear expression of the form
|
||||||
* factors[0] + factors[1] * X1 + factors[2] * X2 + ...
|
* factors[0] + factors[1] * X1 + factors[2] * X2 + ...
|
||||||
|
* where the variables X_i are implicit.
|
||||||
*/
|
*/
|
||||||
struct LinearExpression
|
struct LinearExpression
|
||||||
{
|
{
|
||||||
@ -72,7 +73,9 @@ struct LinearExpression
|
|||||||
auto begin() const { return factors.begin(); }
|
auto begin() const { return factors.begin(); }
|
||||||
auto end() const { return factors.end(); }
|
auto end() const { return factors.end(); }
|
||||||
|
|
||||||
void emplace_back(rational _value) { factors.emplace_back(move(_value)); }
|
void push_back(rational _value) { factors.push_back(move(_value)); }
|
||||||
|
|
||||||
|
size_t size() const { return factors.size(); }
|
||||||
|
|
||||||
void resize(size_t _size)
|
void resize(size_t _size)
|
||||||
{
|
{
|
||||||
@ -88,15 +91,13 @@ struct LinearExpression
|
|||||||
|
|
||||||
bool isConstant() const
|
bool isConstant() const
|
||||||
{
|
{
|
||||||
return ranges::all_of(factors | ranges::views::tail, [](rational const& _v) { return _v.numerator() == 0; });
|
return ranges::all_of(factors | ranges::views::tail, [](rational const& _v) { return !_v; });
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const { return factors.size(); }
|
|
||||||
|
|
||||||
LinearExpression& operator/=(rational const& _divisor)
|
LinearExpression& operator/=(rational const& _divisor)
|
||||||
{
|
{
|
||||||
for (rational& x: factors)
|
for (rational& x: factors)
|
||||||
if (x.numerator())
|
if (x)
|
||||||
x /= _divisor;
|
x /= _divisor;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -104,7 +105,7 @@ struct LinearExpression
|
|||||||
LinearExpression& operator*=(rational const& _factor)
|
LinearExpression& operator*=(rational const& _factor)
|
||||||
{
|
{
|
||||||
for (rational& x: factors)
|
for (rational& x: factors)
|
||||||
if (x.numerator())
|
if (x)
|
||||||
x *= _factor;
|
x *= _factor;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -112,7 +113,7 @@ struct LinearExpression
|
|||||||
friend LinearExpression operator*(rational const& _factor, LinearExpression _expr)
|
friend LinearExpression operator*(rational const& _factor, LinearExpression _expr)
|
||||||
{
|
{
|
||||||
for (rational& x: _expr.factors)
|
for (rational& x: _expr.factors)
|
||||||
if (x.numerator())
|
if (x)
|
||||||
x *= _factor;
|
x *= _factor;
|
||||||
return _expr;
|
return _expr;
|
||||||
}
|
}
|
||||||
@ -120,10 +121,10 @@ struct LinearExpression
|
|||||||
LinearExpression& operator-=(LinearExpression const& _y)
|
LinearExpression& operator-=(LinearExpression const& _y)
|
||||||
{
|
{
|
||||||
if (size() < _y.size())
|
if (size() < _y.size())
|
||||||
factors.resize(_y.size());
|
resize(_y.size());
|
||||||
for (size_t i = 0; i < size(); ++i)
|
for (size_t i = 0; i < size(); ++i)
|
||||||
if (_y.factors[i].numerator())
|
if (i < _y.size() && _y[i])
|
||||||
factors[i] -= _y.factors[i];
|
(*this)[i] -= _y[i];
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,10 +138,10 @@ struct LinearExpression
|
|||||||
LinearExpression& operator+=(LinearExpression const& _y)
|
LinearExpression& operator+=(LinearExpression const& _y)
|
||||||
{
|
{
|
||||||
if (size() < _y.size())
|
if (size() < _y.size())
|
||||||
factors.resize(_y.size());
|
resize(_y.size());
|
||||||
for (size_t i = 0; i < size(); ++i)
|
for (size_t i = 0; i < size(); ++i)
|
||||||
if (_y.factors[i].numerator())
|
if (i < _y.size() && _y[i])
|
||||||
factors[i] += _y.factors[i];
|
(*this)[i] += _y[i];
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user