[PPL-devel] [GIT] ppl/ppl(floating_point): Added a few tests.
Fabio Bossi
bossi at cs.unipr.it
Tue Jul 27 18:13:46 CEST 2010
Module: ppl/ppl
Branch: floating_point
Commit: 1957eb995c4d4f3fa283cfabbd73f0ac2a632e6e
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=1957eb995c4d4f3fa283cfabbd73f0ac2a632e6e
Author: Fabio Bossi <bossi at cs.unipr.it>
Date: Tue Jul 27 18:13:15 2010 +0200
Added a few tests.
---
tests/Concrete_Expression/linearize.cc | 123 ++++++++++++++++++++++++++++++++
1 files changed, 123 insertions(+), 0 deletions(-)
diff --git a/tests/Concrete_Expression/linearize.cc b/tests/Concrete_Expression/linearize.cc
index d382749..3f1e172 100644
--- a/tests/Concrete_Expression/linearize.cc
+++ b/tests/Concrete_Expression/linearize.cc
@@ -83,10 +83,133 @@ test03() {
return ok;
}
+// Tests linearization of A + B.
+bool
+test04() {
+ FP_Interval tmp(0);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(Variable(0), tmp);
+ store.set_interval(Variable(1), tmp);
+ Approximable_Reference<C_Expr> var0(0);
+ Approximable_Reference<C_Expr> var1(1);
+ Binary_Operator<C_Expr> sum(Binary_Operator<C_Expr>::ADD, &var0, &var1);
+ FP_Linear_Form result;
+ linearize(sum, store, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ Variable B(1);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err1;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+ known_result += rel_err1;
+ FP_Linear_Form lb = FP_Linear_Form(B);
+ known_result += lb;
+ FP_Linear_Form rel_err2;
+ lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+ known_result += rel_err2;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = result == known_result;
+
+ return ok;
+}
+
+// Tests the linearization of A - B.
+bool
+test05() {
+ FP_Interval tmp(0);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(Variable(0), tmp);
+ store.set_interval(Variable(1), tmp);
+ Approximable_Reference<C_Expr> var0(0);
+ Approximable_Reference<C_Expr> var1(1);
+ Binary_Operator<C_Expr> dif(Binary_Operator<C_Expr>::SUB, &var0, &var1);
+ FP_Linear_Form result;
+ linearize(dif, store, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ Variable B(1);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err1;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+ known_result += rel_err1;
+ FP_Linear_Form lb = FP_Linear_Form(B);
+ lb.negate();
+ known_result += lb;
+ FP_Linear_Form rel_err2;
+ lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+ known_result += rel_err2;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = result == known_result;
+
+ return ok;
+}
+
+// Tests linearization of A * B where A in [0, 1] and B in [2, 2].
+bool
+test06() {
+ FP_Interval tmp(0);
+ tmp.join_assign(1);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(Variable(0), tmp);
+ store.set_interval(Variable(1), FP_Interval(2));
+ Approximable_Reference<C_Expr> var0(0);
+ Approximable_Reference<C_Expr> var1(1);
+ Binary_Operator<C_Expr> mul(Binary_Operator<C_Expr>::MUL, &var0, &var1);
+ FP_Linear_Form result;
+ linearize(mul, store, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ FP_Interval coeff = FP_Interval(2);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+ known_result *= coeff;
+ known_result += coeff * rel_err;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
+// Tests the linearization of A / B where A = [0, 1] and B = [2, 2].
+bool
+test07() {
+ FP_Interval tmp(0);
+ tmp.join_assign(1);
+ FP_Interval_Abstract_Store store(2);
+ store.set_interval(Variable(0), tmp);
+ store.set_interval(Variable(1), FP_Interval(2));
+ Approximable_Reference<C_Expr> var0(0);
+ Approximable_Reference<C_Expr> var1(1);
+ Binary_Operator<C_Expr> div(Binary_Operator<C_Expr>::DIV, &var0, &var1);
+ FP_Linear_Form result;
+ linearize(div, store, FP_Linear_Form_Abstract_Store(), result);
+
+ Variable A(0);
+ FP_Interval coeff = FP_Interval(1 / 2.0);
+ FP_Linear_Form known_result = FP_Linear_Form(A);
+ FP_Linear_Form rel_err;
+ known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+ known_result *= coeff;
+ known_result += rel_err * coeff;
+ known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+ bool ok = (result == known_result);
+
+ return ok;
+}
+
} // namespace
BEGIN_MAIN
DO_TEST(test01);
DO_TEST(test02);
DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST(test07);
END_MAIN
More information about the PPL-devel
mailing list