Introduce status_flags::{is_positive,is_negative,purely_indefinite}
authorAlexei Sheplyakov <Alexei.Sheplyakov@gmail.com>
Sat, 3 Aug 2013 14:01:42 +0000 (17:01 +0300)
committerAlexei Sheplyakov <Alexei.Sheplyakov@gmail.com>
Wed, 16 Oct 2013 05:20:29 +0000 (08:20 +0300)
Quite a number of transformations can be applied if the expression
is known to be positive (negative) (for instance, sqrt(x^2*y^2) = x*y
if x >= 0 and y >= 0). However the check itself might be quite expensive.
Hence a few status_flags are introduced to cache the result.

ginac/flags.h

index 8f8f25d..e38d9c5 100644 (file)
@@ -196,7 +196,10 @@ public:
                hash_calculated = 0x0008, ///< .calchash() has already done its job
                not_shareable   = 0x0010, ///< don't share instances of this object between different expressions unless explicitly asked to (used by ex::compare())
                has_indices     = 0x0020,
-               has_no_indices  = 0x0040  // ! (has_indices || has_no_indices) means "don't know"
+               has_no_indices  = 0x0040, // ! (has_indices || has_no_indices) means "don't know"
+               is_positive     = 0x0080,
+               is_negative     = 0x0100,
+               purely_indefinite = 0x0200  // If set in a mul, then it does not contains any terms with determined signs, used in power::expand()
        };
 };
 
@@ -256,7 +259,10 @@ public:
                idx,
 
                // answered by classes numeric, symbol, add, mul, power
-               expanded
+               expanded,
+
+               // is meaningful for mul only
+               indefinite
        };
 };