From e35374d3a77329ac62f753f86f60d56cef48db13 Mon Sep 17 00:00:00 2001
From: "Vladimir V. Kisil" <kisilv@maths.leeds.ac.uk>
Date: Thu, 1 Aug 2013 14:37:45 +0100
Subject: [PATCH 7/9] Improvements to function abs and power::info. Abs now can
 evaluate conjugates and step function. Power with real base and even-integer
 exponents reports that it is non-negative.

Signed-off-by: Vladimir V. Kisil <kisilv@maths.leeds.ac.uk>
---
 check/exam_inifcns.cpp | 6 ++++++
 ginac/inifcns.cpp      | 6 ++++++
 ginac/power.cpp        | 2 ++
 3 files changed, 14 insertions(+)

diff --git a/check/exam_inifcns.cpp b/check/exam_inifcns.cpp
index 2191172..12a6c02 100644
--- a/check/exam_inifcns.cpp
+++ b/check/exam_inifcns.cpp
@@ -247,6 +247,12 @@ static unsigned inifcns_consist_abs()
 	if (!abs(-7*z*a*p).expand().is_equal(7*abs(z)*abs(a)*p))
 		++result;
 
+	if (!abs(z.conjugate()).eval().is_equal(abs(z)))
+		++result;
+
+	if (!abs(step(z)).eval().is_equal(step(z)))
+		++result;
+
 	return result;
 }
 
diff --git a/ginac/inifcns.cpp b/ginac/inifcns.cpp
index 6add43d..168102b 100644
--- a/ginac/inifcns.cpp
+++ b/ginac/inifcns.cpp
@@ -203,6 +203,12 @@ static ex abs_eval(const ex & arg)
 	if (is_exactly_a<power>(arg) && (arg.op(0).info(info_flags::positive) || arg.op(1).info(info_flags::real)))
 		return pow(abs(arg.op(0)), arg.op(1).real_part());
 
+	if (is_ex_the_function(arg, conjugate_function))
+		return abs(arg.op(0));
+
+	if (is_ex_the_function(arg, step))
+		return arg;
+
 	return abs(arg).hold();
 }
 
diff --git a/ginac/power.cpp b/ginac/power.cpp
index ec3717e..f0673ae 100644
--- a/ginac/power.cpp
+++ b/ginac/power.cpp
@@ -242,6 +242,8 @@ bool power::info(unsigned inf) const
 			return (flags & status_flags::expanded);
 		case info_flags::positive:
 			return basis.info(info_flags::positive) && exponent.info(info_flags::real);
+		case info_flags::nonnegative:
+			return basis.info(info_flags::real) && exponent.info(info_flags::integer) && exponent.info(info_flags::even);
 		case info_flags::has_indices: {
 			if (flags & status_flags::has_indices)
 				return true;
-- 
1.8.4.rc3

