[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