X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpolynomial%2Foptimal_vars_finder.cpp;h=d1b7a1836c0b4e965f5bad825e2c1d587ef952c6;hp=4903699657fd57822454ba57134d900e5b14703f;hb=761d1597532504762c1f9b438c7727c4f74d7da3;hpb=45b1e47372090352ac5af655b32473df2abab23b diff --git a/ginac/polynomial/optimal_vars_finder.cpp b/ginac/polynomial/optimal_vars_finder.cpp index 49036996..d1b7a183 100644 --- a/ginac/polynomial/optimal_vars_finder.cpp +++ b/ginac/polynomial/optimal_vars_finder.cpp @@ -1,5 +1,25 @@ -#include -#include +/** @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" @@ -7,10 +27,12 @@ #include "symbol.h" #include "numeric.h" -namespace GiNaC -{ -namespace -{ +#include +#include + +namespace GiNaC { + +namespace { // XXX: copy-pasted from normal.cpp. /* * Statistical information about symbols in polynomials @@ -24,6 +46,11 @@ namespace * @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; @@ -45,7 +72,7 @@ struct sym_desc /** 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) @@ -61,15 +88,11 @@ typedef std::vector sym_desc_vec; // 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()) @@ -101,17 +124,15 @@ static void get_symbol_stats(const ex &a, const ex &b, sym_desc_vec &v) { 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()); } @@ -131,4 +152,3 @@ exvector gcd_optimal_variables_order(const ex& a, const ex& b) } } // namespace GiNaC -