]> www.ginac.de Git - ginac.git/blobdiff - ginac/polynomial/optimal_vars_finder.cpp
Happy New Year!
[ginac.git] / ginac / polynomial / optimal_vars_finder.cpp
index 4903699657fd57822454ba57134d900e5b14703f..d1b7a1836c0b4e965f5bad825e2c1d587ef952c6 100644 (file)
@@ -1,5 +1,25 @@
-#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
@@ -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> 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
-