[GIT] ppl/ppl(floating_point): Added a few tests.

Module: ppl/ppl Branch: floating_point Commit: 1957eb995c4d4f3fa283cfabbd73f0ac2a632e6e URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=1957eb995c4d4...
Author: Fabio Bossi bossi@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
participants (1)
-
Fabio Bossi