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. + + + + +