-#include <algorithm>
-#include <cstddef>
+/** @file optimal_vars_finder.cpp
+ *
+ * Functions to optimize the choice of variable for multivariate GCD. */
+
+/*
+ * GiNaC Copyright (C) 1999-2017 Johannes Gutenberg University Mainz, Germany
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#include "optimal_vars_finder.h"
#include "add.h"
#include "mul.h"
#include "symbol.h"
#include "numeric.h"
-namespace GiNaC
-{
-namespace
-{
+#include <algorithm>
+#include <cstddef>
+
+namespace GiNaC {
+
+namespace {
// XXX: copy-pasted from normal.cpp.
/*
* Statistical information about symbols in polynomials
* @see get_symbol_stats */
struct sym_desc
{
+ /** Initialize symbol, leave other variables uninitialized */
+ sym_desc(const ex& s)
+ : sym(s), deg_a(0), deg_b(0), ldeg_a(0), ldeg_b(0), max_deg(0), max_lcnops(0)
+ { }
+
/** Reference to symbol */
ex sym;
/** Maximum number of terms of leading coefficient of symbol in both polynomials */
std::size_t max_lcnops;
- /** Commparison operator for sorting */
+ /** Comparison operator for sorting */
bool operator<(const sym_desc &x) const
{
if (max_deg == x.max_deg)
// Add symbol the sym_desc_vec (used internally by get_symbol_stats())
static void add_symbol(const ex &s, sym_desc_vec &v)
{
- sym_desc_vec::const_iterator it = v.begin(), itend = v.end();
- while (it != itend) {
- if (it->sym.is_equal(s)) // If it's already in there, don't add it a second time
+ for (auto & it : v) {
+ if (it.sym.is_equal(s)) // If it's already in there, don't add it a second time
return;
- ++it;
}
- sym_desc d;
- d.sym = s;
- v.push_back(d);
+ v.push_back(sym_desc(s));
}
// Collect all symbols of an expression (used internally by get_symbol_stats())
{
collect_symbols(a, v);
collect_symbols(b, v);
- sym_desc_vec::iterator it = v.begin(), itend = v.end();
- while (it != itend) {
- int deg_a = a.degree(it->sym);
- int deg_b = b.degree(it->sym);
- it->deg_a = deg_a;
- it->deg_b = deg_b;
- it->max_deg = std::max(deg_a, deg_b);
- it->max_lcnops = std::max(a.lcoeff(it->sym).nops(), b.lcoeff(it->sym).nops());
- it->ldeg_a = a.ldegree(it->sym);
- it->ldeg_b = b.ldegree(it->sym);
- ++it;
+ for (auto & it : v) {
+ int deg_a = a.degree(it.sym);
+ int deg_b = b.degree(it.sym);
+ it.deg_a = deg_a;
+ it.deg_b = deg_b;
+ it.max_deg = std::max(deg_a, deg_b);
+ it.max_lcnops = std::max(a.lcoeff(it.sym).nops(), b.lcoeff(it.sym).nops());
+ it.ldeg_a = a.ldegree(it.sym);
+ it.ldeg_b = b.ldegree(it.sym);
}
std::sort(v.begin(), v.end());
}
}
} // namespace GiNaC
-