[GiNaC-devel] [PATCH 3/4] {mul,
power}::expand: expand monomials faster.
Alexei Sheplyakov
varg at theor.jinr.ru
Mon Sep 17 15:21:42 CEST 2007
Apparently, in ~ 30% of calls to mul::expand the expression is monomial.
Expanding monomials should be done as fast as possible.
---
ginac/mul.cpp | 10 ++++++++++
ginac/power.cpp | 3 +++
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/ginac/mul.cpp b/ginac/mul.cpp
index db8b9f1..298715b 100644
--- a/ginac/mul.cpp
+++ b/ginac/mul.cpp
@@ -34,6 +34,7 @@
#include "lst.h"
#include "archive.h"
#include "utils.h"
+#include "symbol.h"
#include "compiler.h"
namespace GiNaC {
@@ -992,6 +993,15 @@ bool mul::can_be_further_expanded(const ex & e)
ex mul::expand(unsigned options) const
{
+ {
+ // trivial case: expanding the monomial (~ 30% of all calls)
+ epvector::const_iterator i = seq.begin(), seq_end = seq.end();
+ while ((i != seq.end()) && is_a<symbol>(i->rest) && i->coeff.info(info_flags::integer))
+ ++i;
+ if (i == seq_end)
+ return (new mul(*this))->setflag(status_flags::dynallocated | status_flags::expanded);
+ }
+
const bool skip_idx_rename = ! info(info_flags::has_indices);
// First, expand the children
std::auto_ptr<epvector> expanded_seqp = expandchildren(options);
diff --git a/ginac/power.cpp b/ginac/power.cpp
index fe7132a..cc003bc 100644
--- a/ginac/power.cpp
+++ b/ginac/power.cpp
@@ -771,6 +771,9 @@ tinfo_t power::return_type_tinfo() const
ex power::expand(unsigned options) const
{
+ if (is_a<symbol>(basis) && exponent.info(info_flags::integer))
+ return (new power(*this))->setflag(status_flags::dynallocated | status_flags::expanded);
+
if (options == 0 && (flags & status_flags::expanded))
return *this;
--
1.5.2.4
Best regards,
Alexei
--
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-devel/attachments/20070917/74bdab80/attachment.pgp
More information about the GiNaC-devel
mailing list