diff --git a/include/plasp/sas/AssignedVariable.h b/include/plasp/sas/AssignedVariable.h index 982ddb0..546e58b 100644 --- a/include/plasp/sas/AssignedVariable.h +++ b/include/plasp/sas/AssignedVariable.h @@ -30,7 +30,7 @@ class AssignedVariable static AssignedVariable fromSAS(std::istream &istream, const Variable &variable); public: - AssignedVariable(const Variable &variable, const Value &value); + explicit AssignedVariable(const Variable &variable, const Value &value); const Variable &variable() const; const Value &value() const; diff --git a/include/plasp/sas/AxiomRule.h b/include/plasp/sas/AxiomRule.h index c7b5810..7c4cac8 100644 --- a/include/plasp/sas/AxiomRule.h +++ b/include/plasp/sas/AxiomRule.h @@ -36,7 +36,7 @@ class AxiomRule private: AxiomRule() = default; - AxiomRule(Conditions conditions, Condition postcondition); + explicit AxiomRule(Conditions conditions, Condition postcondition); Conditions m_conditions; Condition m_postcondition; diff --git a/include/plasp/sas/Effect.h b/include/plasp/sas/Effect.h index f165089..5792607 100644 --- a/include/plasp/sas/Effect.h +++ b/include/plasp/sas/Effect.h @@ -17,18 +17,29 @@ namespace sas // //////////////////////////////////////////////////////////////////////////////////////////////////// -struct Effect; +class Effect; using Effects = std::vector; //////////////////////////////////////////////////////////////////////////////////////////////////// -struct Effect +class Effect { - using Condition = AssignedVariable; - using Conditions = AssignedVariables; + public: + using Condition = AssignedVariable; + using Conditions = AssignedVariables; - Conditions conditions; - Condition postcondition; + static Effect fromSAS(std::istream &istream, const Variables &variables, Conditions &preconditions); + + public: + const Conditions &conditions() const; + const Condition &postcondition() const; + + private: + Effect() = default; + explicit Effect(Conditions conditions, Condition postcondition); + + Conditions m_conditions; + Condition m_postcondition; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plasp/sas/Debugging.cpp b/src/plasp/sas/Debugging.cpp index 7f03d4a..0350da7 100644 --- a/src/plasp/sas/Debugging.cpp +++ b/src/plasp/sas/Debugging.cpp @@ -117,9 +117,12 @@ std::ostream &operator >>(std::ostream &ostream, const Description &description) [&](const auto &effect) { ostream << "\t\t\teffect:" << std::endl; - ostream << "\t\t\t\tconditions: " << effect.conditions.size() << std::endl; - std::for_each(effect.conditions.cbegin(), effect.conditions.cend(), + const auto &conditions = effect.conditions(); + + ostream << "\t\t\t\tconditions: " << conditions.size() << std::endl; + + std::for_each(conditions.cbegin(), conditions.cend(), [&](const auto &condition) { ostream << "\t\t\t\t\t" << condition.variable().name() << " = "; @@ -128,8 +131,8 @@ std::ostream &operator >>(std::ostream &ostream, const Description &description) }); ostream << "\t\t\t\tpostcondition:" << std::endl; - ostream << "\t\t\t\t\t" << effect.postcondition.variable().name() << " = "; - effect.postcondition.value().printAsSAS(ostream); + ostream << "\t\t\t\t\t" << effect.postcondition().variable().name() << " = "; + effect.postcondition().value().printAsSAS(ostream); ostream << std::endl; }); diff --git a/src/plasp/sas/Effect.cpp b/src/plasp/sas/Effect.cpp new file mode 100644 index 0000000..0876e67 --- /dev/null +++ b/src/plasp/sas/Effect.cpp @@ -0,0 +1,64 @@ +#include + +#include + +#include +#include + +namespace plasp +{ +namespace sas +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Effect +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Effect::Effect(Conditions conditions, Condition postcondition) +: m_conditions(std::move(conditions)), + m_postcondition(std::move(postcondition)) +{ +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Effect Effect::fromSAS(std::istream &istream, const Variables &variables, Conditions &preconditions) +{ + Effect::Conditions conditions; + + const auto numberOfEffectConditions = utils::parse(istream); + conditions.reserve(numberOfEffectConditions); + + for (size_t k = 0; k < numberOfEffectConditions; k++) + conditions.emplace_back(Condition::fromSAS(istream, variables)); + + const auto variableTransition = VariableTransition::fromSAS(istream, variables); + + if (&variableTransition.valueBefore() != &Value::Any) + preconditions.emplace_back(Condition(variableTransition.variable(), variableTransition.valueBefore())); + + const Effect::Condition postcondition(variableTransition.variable(), variableTransition.valueAfter()); + + return Effect(std::move(conditions), std::move(postcondition)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const Effect::Conditions &Effect::conditions() const +{ + return m_conditions; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const Effect::Condition &Effect::postcondition() const +{ + return m_postcondition; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} diff --git a/src/plasp/sas/Operator.cpp b/src/plasp/sas/Operator.cpp index f93faef..4aa9b4a 100644 --- a/src/plasp/sas/Operator.cpp +++ b/src/plasp/sas/Operator.cpp @@ -50,30 +50,13 @@ Operator Operator::fromSAS(std::istream &istream, const Variables &variables) operator_.m_preconditions.reserve(numberOfPrevailConditions); for (size_t j = 0; j < numberOfPrevailConditions; j++) - operator_.m_preconditions.emplace_back(AssignedVariable::fromSAS(istream, variables)); + operator_.m_preconditions.emplace_back(Condition::fromSAS(istream, variables)); const auto numberOfEffects = utils::parse(istream); operator_.m_effects.reserve(numberOfEffects); for (size_t j = 0; j < numberOfEffects; j++) - { - Effect::Conditions conditions; - - const auto numberOfEffectConditions = utils::parse(istream); - conditions.reserve(numberOfEffectConditions); - - for (size_t k = 0; k < numberOfEffectConditions; k++) - conditions.emplace_back(AssignedVariable::fromSAS(istream, variables)); - - const auto variableTransition = VariableTransition::fromSAS(istream, variables); - - if (&variableTransition.valueBefore() != &Value::Any) - operator_.m_preconditions.emplace_back(AssignedVariable(variableTransition.variable(), variableTransition.valueBefore())); - - const Effect::Condition postcondition = {variableTransition.variable(), variableTransition.valueAfter()}; - const Effect effect = {std::move(conditions), std::move(postcondition)}; - operator_.m_effects.push_back(std::move(effect)); - } + operator_.m_effects.emplace_back(Effect::fromSAS(istream, variables, operator_.m_preconditions)); operator_.m_costs = utils::parse(istream); diff --git a/src/plasp/sas/TranslatorASP.cpp b/src/plasp/sas/TranslatorASP.cpp index 339ca6c..38c7533 100644 --- a/src/plasp/sas/TranslatorASP.cpp +++ b/src/plasp/sas/TranslatorASP.cpp @@ -36,10 +36,12 @@ void TranslatorASP::checkSupport() const std::for_each(operators.cbegin(), operators.cend(), [&](const auto &operator_) { - std::for_each(operator_.effects().cbegin(), operator_.effects().cend(), + const auto &effects = operator_.effects(); + + std::for_each(effects.cbegin(), effects.cend(), [&](const auto &effect) { - if (!effect.conditions.empty()) + if (!effect.conditions().empty()) throw TranslatorException("Conditional effects are currently unsupported"); }); }); @@ -142,8 +144,8 @@ void TranslatorASP::translate(std::ostream &ostream) const [&](const auto &effect) { ostream << "postcondition(" << operator_.predicate() - << ", " << effect.postcondition.value().name() - << ", " << (effect.postcondition.value().sign() == Value::Sign::Positive ? "true" : "false") + << ", " << effect.postcondition().value().name() + << ", " << (effect.postcondition().value().sign() == Value::Sign::Positive ? "true" : "false") << ")." << std::endl; }); }); diff --git a/tests/TestSASParser.cpp b/tests/TestSASParser.cpp index 7bb9e09..d3bc83f 100644 --- a/tests/TestSASParser.cpp +++ b/tests/TestSASParser.cpp @@ -76,8 +76,8 @@ TEST_F(SASParserTests, ParseValidSASFile) ASSERT_EQ(&description.operators()[0].preconditions()[1].value(), &description.variables()[16].values()[1]); ASSERT_EQ(&description.operators()[0].preconditions()[2].value(), &description.variables()[0].values()[8]); ASSERT_EQ(description.operators()[0].effects().size(), 1); - ASSERT_EQ(description.operators()[0].effects()[0].conditions.size(), 0); - ASSERT_EQ(&description.operators()[0].effects()[0].postcondition.value(), &description.variables()[0].values()[0]); + ASSERT_EQ(description.operators()[0].effects()[0].conditions().size(), 0); + ASSERT_EQ(&description.operators()[0].effects()[0].postcondition().value(), &description.variables()[0].values()[0]); ASSERT_EQ(description.operators()[33].predicate().name, "queue-write"); ASSERT_EQ(description.operators()[33].predicate().arguments.size(), 4); ASSERT_EQ(description.operators()[33].predicate().arguments[0], "philosopher-1"); @@ -86,9 +86,9 @@ TEST_F(SASParserTests, ParseValidSASFile) ASSERT_EQ(&description.operators()[33].preconditions()[0].value(), &description.variables()[1].values()[3]); ASSERT_EQ(&description.operators()[33].preconditions()[1].value(), &description.variables()[2].values()[2]); ASSERT_EQ(description.operators()[33].effects().size(), 3); - ASSERT_EQ(description.operators()[33].effects()[0].conditions.size(), 0); - ASSERT_EQ(&description.operators()[33].effects()[0].postcondition.value(), &description.variables()[1].values()[7]); - ASSERT_EQ(&description.operators()[33].effects()[2].postcondition.value(), &description.variables()[35].values()[0]); + ASSERT_EQ(description.operators()[33].effects()[0].conditions().size(), 0); + ASSERT_EQ(&description.operators()[33].effects()[0].postcondition().value(), &description.variables()[1].values()[7]); + ASSERT_EQ(&description.operators()[33].effects()[2].postcondition().value(), &description.variables()[35].values()[0]); ASSERT_EQ(description.axiomRules().size(), 33); ASSERT_EQ(description.axiomRules()[0].conditions().size(), 4);