]> www.ginac.de Git - ginac.git/blobdiff - ginac/mul.cpp
mul::info(): cache the result of the positiveness/negativeness checks, ...
[ginac.git] / ginac / mul.cpp
index cee5cd7a7a9f4faf3405eb1f4c9af0b52bd26c02..64660a288a211695a0e91f07f0f2e92b055fe706 100644 (file)
@@ -307,6 +307,13 @@ bool mul::info(unsigned inf) const
                }
                case info_flags::positive:
                case info_flags::negative: {
+                       if ((inf==info_flags::positive) && (flags & status_flags::is_positive))
+                               return true;
+                       else if ((inf==info_flags::negative) && (flags & status_flags::is_negative))
+                               return true;
+                       if (flags & status_flags::purely_indefinite)
+                               return false;
+
                        bool pos = true;
                        epvector::const_iterator i = seq.begin(), end = seq.end();
                        while (i != end) {
@@ -320,9 +327,12 @@ bool mul::info(unsigned inf) const
                        }
                        if (overall_coeff.info(info_flags::negative))
                                pos = !pos;
-                       return (inf ==info_flags::positive? pos : !pos);
+                       setflag(pos ? status_flags::is_positive : status_flags::is_negative);
+                       return (inf == info_flags::positive? pos : !pos);
                }
                case info_flags::nonnegative: {
+                       if  (flags & status_flags::is_positive)
+                               return true;
                        bool pos = true;
                        epvector::const_iterator i = seq.begin(), end = seq.end();
                        while (i != end) {
@@ -373,6 +383,21 @@ bool mul::info(unsigned inf) const
                                return false;
                        return pos; 
                }
+               case info_flags::indefinite: {
+                       if (flags & status_flags::purely_indefinite)
+                               return true;
+                       if (flags & (status_flags::is_positive | status_flags::is_negative))
+                               return false;
+                       epvector::const_iterator i = seq.begin(), end = seq.end();
+                       while (i != end) {
+                               const ex& term = recombine_pair_to_ex(*i);
+                               if (term.info(info_flags::positive) || term.info(info_flags::negative))
+                                       return false;
+                               ++i;
+                       }
+                       setflag(status_flags::purely_indefinite);
+                       return true;
+               }
        }
        return inherited::info(inf);
 }