Skip to content

Commit 03ec181

Browse files
committed
Use std::vector instead of Array; add explicit move to polynomial
1 parent 76e76b4 commit 03ec181

2 files changed

Lines changed: 21 additions & 13 deletions

File tree

src/solvers/enumpoly/poly.cc

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@
2626
namespace Gambit {
2727

2828
template <class T>
29-
Array<Monomial<T>> Polynomial<T>::Adder(const Array<Monomial<T>> &p_one,
30-
const Array<Monomial<T>> &p_two) const
29+
std::vector<Monomial<T>> Polynomial<T>::Adder(const std::vector<Monomial<T>> &p_one,
30+
const std::vector<Monomial<T>> &p_two) const
3131
{
3232
if (p_one.empty()) {
3333
return p_two;
3434
}
3535
if (p_two.empty()) {
3636
return p_one;
3737
}
38-
Array<Monomial<T>> answer;
38+
std::vector<Monomial<T>> answer;
3939
answer.reserve(p_one.size() + p_two.size());
4040

4141
auto it1 = p_one.begin();
@@ -73,10 +73,10 @@ Array<Monomial<T>> Polynomial<T>::Adder(const Array<Monomial<T>> &p_one,
7373
}
7474

7575
template <class T>
76-
Array<Monomial<T>> Polynomial<T>::Mult(const Array<Monomial<T>> &p_one,
77-
const Array<Monomial<T>> &p_two) const
76+
std::vector<Monomial<T>> Polynomial<T>::Mult(const std::vector<Monomial<T>> &p_one,
77+
const std::vector<Monomial<T>> &p_two) const
7878
{
79-
Array<Monomial<T>> result;
79+
std::vector<Monomial<T>> result;
8080

8181
if (p_one.empty() || p_two.empty()) {
8282
return result;
@@ -90,7 +90,7 @@ Array<Monomial<T>> Polynomial<T>::Mult(const Array<Monomial<T>> &p_one,
9090
}
9191
std::sort(result.begin(), result.end(),
9292
[](const Monomial<T> &a, const Monomial<T> &b) { return a.ExpV() < b.ExpV(); });
93-
Array<Monomial<T>> merged;
93+
std::vector<Monomial<T>> merged;
9494
merged.reserve(result.size());
9595

9696
auto it = result.begin();
@@ -152,7 +152,7 @@ template <class T> Polynomial<T> Polynomial<T>::DivideByPolynomial(const Polynom
152152

153153
template <class T> Polynomial<T> Polynomial<T>::PartialDerivative(int varnumber) const
154154
{
155-
Array<Monomial<T>> terms;
155+
std::vector<Monomial<T>> terms;
156156
terms.reserve(m_terms.size());
157157

158158
for (const auto &term : m_terms) {
@@ -164,14 +164,15 @@ template <class T> Polynomial<T> Polynomial<T>::PartialDerivative(int varnumber)
164164
terms.emplace_back(term.Coef() * static_cast<T>(exponent), expv.DecrementExponent(varnumber));
165165
}
166166

167-
Polynomial<T> result(m_space);
167+
Polynomial result(m_space);
168168
result.m_terms = std::move(terms);
169169
return result;
170170
}
171171

172172
template <class T> Polynomial<T> Polynomial<T>::LeadingCoefficient(int varnumber) const
173173
{
174174
Polynomial result(m_space);
175+
result.m_terms.reserve(m_terms.size());
175176

176177
const int degree = DegreeOfVar(varnumber);
177178
if (degree == 0) {
@@ -239,6 +240,7 @@ Polynomial<T> Polynomial<T>::TranslateOfMono(const Monomial<T> &m,
239240
template <class T> Polynomial<T> Polynomial<T>::TranslateOfPoly(const Vector<T> &new_origin) const
240241
{
241242
Polynomial answer(m_space);
243+
answer.m_terms.reserve(m_terms.size());
242244
for (const auto &mono : m_terms) {
243245
answer += TranslateOfMono(mono, new_origin);
244246
}
@@ -261,6 +263,7 @@ Polynomial<T> Polynomial<T>::MonoInNewCoordinates(const Monomial<T> &m, const Ma
261263
}
262264

263265
Polynomial linearform(m_space);
266+
linearform.m_terms.reserve(GetDimension());
264267
for (int j = 1; j <= dim; ++j) {
265268
const T &coeff = M(var_index, j);
266269
if (coeff != static_cast<T>(0)) {
@@ -276,6 +279,7 @@ Polynomial<T> Polynomial<T>::MonoInNewCoordinates(const Monomial<T> &m, const Ma
276279
template <class T> Polynomial<T> Polynomial<T>::PolyInNewCoordinates(const Matrix<T> &M) const
277280
{
278281
Polynomial answer(m_space);
282+
answer.m_terms.reserve(m_terms.size());
279283
for (const auto &term : m_terms) {
280284
answer += MonoInNewCoordinates(term, M);
281285
}

src/solvers/enumpoly/poly.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,13 @@ template <class T> class Monomial {
240240
// A multivariate polynomial
241241
template <class T> class Polynomial {
242242
std::shared_ptr<VariableSpace> m_space;
243-
Array<Monomial<T>> m_terms;
243+
std::vector<Monomial<T>> m_terms;
244244

245245
// Arithmetic
246-
Array<Monomial<T>> Adder(const Array<Monomial<T>> &, const Array<Monomial<T>> &) const;
247-
Array<Monomial<T>> Mult(const Array<Monomial<T>> &, const Array<Monomial<T>> &) const;
246+
std::vector<Monomial<T>> Adder(const std::vector<Monomial<T>> &,
247+
const std::vector<Monomial<T>> &) const;
248+
std::vector<Monomial<T>> Mult(const std::vector<Monomial<T>> &,
249+
const std::vector<Monomial<T>> &) const;
248250
Polynomial DivideByPolynomial(const Polynomial &den) const;
249251

250252
Polynomial TranslateOfMono(const Monomial<T> &, const Vector<T> &) const;
@@ -260,6 +262,8 @@ template <class T> class Polynomial {
260262
}
261263
}
262264
Polynomial(const Polynomial &) = default;
265+
Polynomial(Polynomial &&) = default;
266+
Polynomial &operator=(Polynomial &&) = default;
263267
// Constructs a polynomial x_{var_no}^exp
264268
explicit Polynomial(std::shared_ptr<VariableSpace> p, const int var_no, const int exp)
265269
: m_space(p)
@@ -370,7 +374,7 @@ template <class T> class Polynomial {
370374
return std::max(v, m.TotalDegree());
371375
});
372376
}
373-
[[nodiscard]] const Array<Monomial<T>> &GetTerms() const noexcept { return m_terms; }
377+
[[nodiscard]] const std::vector<Monomial<T>> &GetTerms() const noexcept { return m_terms; }
374378
bool IsZero() const noexcept { return m_terms.empty(); }
375379
bool IsConstant() const noexcept
376380
{

0 commit comments

Comments
 (0)