From d47ca139577aa2aa27eac76ea4418b55bd4e8262 Mon Sep 17 00:00:00 2001
From: rakhimov
Date: Mon, 24 Apr 2017 20:43:41 -0700
Subject: [PATCH] Add log10 expression
Issue #72
---
share/input.rng | 3 +++
src/expression/numerical.cc | 7 +++++++
src/expression/numerical.h | 4 ++++
src/initializer.cc | 3 ++-
tests/expression_tests.cc | 23 +++++++++++++++++++++++
tests/input/fta/correct_expressions.xml | 5 +++++
6 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/share/input.rng b/share/input.rng
index 32497820ce..595a778f3c 100644
--- a/share/input.rng
+++ b/share/input.rng
@@ -736,6 +736,9 @@
+
+
+
diff --git a/src/expression/numerical.cc b/src/expression/numerical.cc
index 7e41f40c17..7983700611 100644
--- a/src/expression/numerical.cc
+++ b/src/expression/numerical.cc
@@ -59,5 +59,12 @@ void ValidateExpression>(
EnsurePositive(args.front(), "Natural Logarithm");
}
+template <>
+void ValidateExpression>(
+ const std::vector& args) {
+ assert(args.size() == 1);
+ EnsurePositive(args.front(), "Decimal Logarithm");
+}
+
} // namespace mef
} // namespace scram
diff --git a/src/expression/numerical.h b/src/expression/numerical.h
index 2280d5f7a5..0b6ea61ca5 100644
--- a/src/expression/numerical.h
+++ b/src/expression/numerical.h
@@ -57,6 +57,9 @@ void ValidateExpression>(
template <>
void ValidateExpression>(
const std::vector& args);
+template <>
+void ValidateExpression>(
+ const std::vector& args);
/// @}
/// Interval specialization for math functions.
@@ -102,6 +105,7 @@ using Sinh = FunctorExpression<&std::sinh>; ///< Hyperbolic sine.
using Tanh = FunctorExpression<&std::tanh>; ///< Hyperbolic tangent.
using Exp = FunctorExpression<&std::exp>; ///< Exponential.
using Log = FunctorExpression<&std::log>; ///< Natural logarithm.
+using Log10 = FunctorExpression<&std::log10>; ///< Decimal logarithm.
} // namespace mef
} // namespace scram
diff --git a/src/initializer.cc b/src/initializer.cc
index a0c7ca1c54..eec9244e98 100644
--- a/src/initializer.cc
+++ b/src/initializer.cc
@@ -815,7 +815,8 @@ const Initializer::ExtractorMap Initializer::kExpressionExtractors_ = {
{"sinh", &Extract},
{"tanh", &Extract},
{"exp", &Extract},
- {"log", &Extract}};
+ {"log", &Extract},
+ {"log10", &Extract}};
Expression* Initializer::GetExpression(const xmlpp::Element* expr_element,
const std::string& base_path) {
diff --git a/tests/expression_tests.cc b/tests/expression_tests.cc
index 552f0261ab..dbc1e7268d 100644
--- a/tests/expression_tests.cc
+++ b/tests/expression_tests.cc
@@ -860,6 +860,29 @@ TEST(ExpressionTest, Log) {
EXPECT_NO_THROW(dev->Validate());
}
+TEST(ExpressionTest, Log10) {
+ OpenExpression arg_one(1);
+ std::unique_ptr dev;
+ ASSERT_NO_THROW(dev = std::make_unique(&arg_one));
+ EXPECT_DOUBLE_EQ(0, dev->value());
+ arg_one.mean = 10;
+ EXPECT_DOUBLE_EQ(1, dev->value());
+
+ arg_one.mean = -1;
+ EXPECT_THROW(dev->Validate(), InvalidArgument);
+ arg_one.mean = 0;
+ EXPECT_THROW(dev->Validate(), InvalidArgument);
+ arg_one.mean = 1;
+ EXPECT_NO_THROW(dev->Validate());
+
+ arg_one.sample = arg_one.min = 0;
+ arg_one.max = 1;
+ EXPECT_THROW(dev->Validate(), InvalidArgument);
+ arg_one.min = 0.5;
+ arg_one.max = 1;
+ EXPECT_NO_THROW(dev->Validate());
+}
+
} // namespace test
} // namespace mef
} // namespace scram
diff --git a/tests/input/fta/correct_expressions.xml b/tests/input/fta/correct_expressions.xml
index 931a9dcdfb..5ea40e84e1 100644
--- a/tests/input/fta/correct_expressions.xml
+++ b/tests/input/fta/correct_expressions.xml
@@ -247,5 +247,10 @@ The input tries to utilize all the functionality including optional cases.
+
+
+
+
+