Skip to content

Commit

Permalink
Moved out eqcheck functionality.
Browse files Browse the repository at this point in the history
  • Loading branch information
azreika committed Dec 3, 2020
1 parent 62e68b6 commit e007d7f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 13 deletions.
25 changes: 12 additions & 13 deletions src/ast2ram/ClauseTranslator.cpp
Expand Up @@ -121,10 +121,9 @@ Own<ram::Operation> ClauseTranslator::addVariableBindingConstraints(Own<ram::Ope
const auto& first = *references.begin();
for (const auto& reference : references) {
if (first != reference && !valueIndex->isGenerator(reference.identifier)) {
// FIXME: equiv' for float types (`FEQ`)
op = mk<ram::Filter>(mk<ram::Constraint>(BinaryConstraintOp::EQ, makeRamTupleElement(first),
makeRamTupleElement(reference)),
std::move(op));
// TODO: float type equivalence check
op = addEqualityCheck(
std::move(op), makeRamTupleElement(first), makeRamTupleElement(reference), false);
}
}
}
Expand Down Expand Up @@ -224,7 +223,7 @@ Own<ram::Operation> ClauseTranslator::instantiateAggregator(
auto addAggEqCondition = [&](Own<ram::Condition> aggr, Own<ram::Expression> value, size_t pos) {
if (isUndefValue(value.get())) return aggr;

// FIXME: equiv' for float types (`FEQ`)
// TODO: float type equivalence check
return addConjunctiveTerm(
std::move(aggr), mk<ram::Constraint>(BinaryConstraintOp::EQ,
mk<ram::TupleElement>(curLevel, pos), std::move(value)));
Expand Down Expand Up @@ -368,15 +367,15 @@ Own<ram::Expression> ClauseTranslator::translateConstant(
return mk<ram::SignedConstant>(rawConstant);
}

Own<ram::Operation> ClauseTranslator::addConstantConstraints(
size_t const curLevel, const std::vector<ast::Argument*>& arguments, Own<ram::Operation> op) const {
// Helper function to add a constraint check
auto addEqualityCheck = [&](Own<ram::Operation> op, Own<ram::Expression> lhs, Own<ram::Expression> rhs,
bool isFloat) {
auto eqOp = isFloat ? BinaryConstraintOp::FEQ : BinaryConstraintOp::EQ;
return mk<ram::Filter>(mk<ram::Constraint>(eqOp, std::move(lhs), std::move(rhs)), std::move(op));
};
Own<ram::Operation> ClauseTranslator::addEqualityCheck(
Own<ram::Operation> op, Own<ram::Expression> lhs, Own<ram::Expression> rhs, bool isFloat) const {
auto eqOp = isFloat ? BinaryConstraintOp::FEQ : BinaryConstraintOp::EQ;
auto eqConstraint = mk<ram::Constraint>(eqOp, std::move(lhs), std::move(rhs));
return mk<ram::Filter>(std::move(eqConstraint), std::move(op));
}

Own<ram::Operation> ClauseTranslator::addConstantConstraints(
size_t curLevel, const std::vector<ast::Argument*>& arguments, Own<ram::Operation> op) const {
for (size_t i = 0; i < arguments.size(); i++) {
const auto* argument = arguments.at(i);
if (const auto* numericConstant = dynamic_cast<const ast::NumericConstant*>(argument)) {
Expand Down
3 changes: 3 additions & 0 deletions src/ast2ram/ClauseTranslator.h
Expand Up @@ -88,6 +88,9 @@ class ClauseTranslator {
void indexNodeArguments(int nodeLevel, const std::vector<ast::Argument*>& nodeArgs);
void indexAggregatorBody(const ast::Aggregator& agg);

Own<ram::Operation> addEqualityCheck(
Own<ram::Operation> op, Own<ram::Expression> lhs, Own<ram::Expression> rhs, bool isFloat) const;

Own<ram::Statement> createRamFactQuery(const ast::Clause& clause) const;
Own<ram::Statement> createRamRuleQuery(
const ast::Clause& clause, const ast::Clause& originalClause, int version);
Expand Down

0 comments on commit e007d7f

Please sign in to comment.