https://github.com/TomasRibeiro96/Olisipo-planner
Tip revision: 6cdbdcd27aa479d3d700d366c6a9000bd5fa0bfe authored by Tomás Ribeiro on 23 May 2021, 13:52:55 UTC
Update README.md
Update README.md
Tip revision: 6cdbdcd
VALVisitorOperator.cpp
#include "rosplan_knowledge_base/VALVisitorOperator.h"
/* implementation of rosplan_knowledge_base::VALVisitorOperator */
namespace KCL_rosplan {
/* encoding state */
bool cond_neg;
bool eff_neg;
VAL1_2::time_spec cond_time;
VAL1_2::time_spec eff_time;
VAL1_2::comparison_op comparison_op;
/*-----------*/
/* operators */
/*-----------*/
/**
* Visit an operator to pack into ROS message
*/
void VALVisitorOperator::visit_operator_(VAL1_2::operator_ * op) {
msg.formula.name = op->name->symbol::getName();
msg.formula.typed_parameters.clear();
// parameters
for (VAL1_2::var_symbol_list::const_iterator vi = op->parameters->begin(); vi != op->parameters->end(); vi++) {
const VAL1_2::var_symbol* var = *vi;
diagnostic_msgs::KeyValue param;
param.key = var->pddl_typed_symbol::getName();
param.value = var->type->getName();
msg.formula.typed_parameters.push_back(param);
}
// prepare message
msg.at_start_add_effects.clear();
msg.at_start_del_effects.clear();
msg.at_end_add_effects.clear();
msg.at_end_del_effects.clear();
msg.at_start_simple_condition.clear();
msg.over_all_simple_condition.clear();
msg.at_end_simple_condition.clear();
msg.at_start_neg_condition.clear();
msg.over_all_neg_condition.clear();
msg.at_end_neg_condition.clear();
msg.at_start_comparison.clear();
msg.at_end_comparison.clear();
msg.over_all_comparison.clear();
// effects
op->effects->visit(this);
// conditions
if (op->precondition) op->precondition->visit(this);
}
/*--------------*/
/* propositions */
/*--------------*/
/**
* Visit an prop to pack into ROS message
*/
void VALVisitorOperator::visit_proposition(VAL1_2::proposition *p) {
last_prop.typed_parameters.clear();
// predicate name
rosplan_knowledge_msgs::DomainFormula formula;
last_prop.name = p->head->symbol::getName();
// predicate variables
for (VAL1_2::parameter_symbol_list::const_iterator vi = p->args->begin(); vi != p->args->end(); vi++) {
const VAL1_2::parameter_symbol* var = *vi;
diagnostic_msgs::KeyValue param;
param.key = var->pddl_typed_symbol::getName();
param.value = var->type->getName();
last_prop.typed_parameters.push_back(param);
}
};
/*-------*/
/* goals */
/*-------*/
void VALVisitorOperator::visit_conj_goal(VAL1_2::conj_goal *c) {
c->getGoals()->visit(this);
}
void VALVisitorOperator::visit_timed_goal(VAL1_2::timed_goal *c) {
cond_time = c->getTime();
c->getGoal()->visit(this);
}
void VALVisitorOperator::visit_neg_goal(VAL1_2::neg_goal *c) {
cond_neg = !cond_neg;
c->getGoal()->visit(this);
cond_neg = !cond_neg;
}
void VALVisitorOperator::visit_simple_goal(VAL1_2::simple_goal *c) {
c->getProp()->visit(this);
if(cond_neg) {
switch(cond_time) {
case VAL1_2::E_AT_START: msg.at_start_neg_condition.push_back(last_prop); break;
case VAL1_2::E_AT_END: msg.at_end_neg_condition.push_back(last_prop); break;
case VAL1_2::E_OVER_ALL: msg.over_all_neg_condition.push_back(last_prop); break;
}
} else {
switch(cond_time) {
case VAL1_2::E_AT_START: msg.at_start_simple_condition.push_back(last_prop); break;
case VAL1_2::E_AT_END: msg.at_end_simple_condition.push_back(last_prop); break;
case VAL1_2::E_OVER_ALL: msg.over_all_simple_condition.push_back(last_prop); break;
}
}
}
void VALVisitorOperator::visit_comparison(VAL1_2::comparison * c) {
rosplan_knowledge_msgs::DomainInequality ineq;
ineq.grounded = false;
// assignment left hand side
last_expr.tokens.clear();
c->getLHS()->visit(this);
ineq.LHS = last_expr;
// assignment right hand side
last_expr.tokens.clear();
c->getRHS()->visit(this);
ineq.RHS = last_expr;
// assignment operator
switch(c->getOp()) {
case VAL1_2::E_GREATER: ineq.comparison_type = rosplan_knowledge_msgs::DomainInequality::GREATER; break;
case VAL1_2::E_GREATEQ: ineq.comparison_type = rosplan_knowledge_msgs::DomainInequality::GREATEREQ; break;
case VAL1_2::E_LESS: ineq.comparison_type = rosplan_knowledge_msgs::DomainInequality::LESS; break;
case VAL1_2::E_LESSEQ: ineq.comparison_type = rosplan_knowledge_msgs::DomainInequality::LESSEQ; break;
case VAL1_2::E_EQUALS: ineq.comparison_type = rosplan_knowledge_msgs::DomainInequality::EQUALS; break;
}
switch(cond_time) {
case VAL1_2::E_AT_START: msg.at_start_comparison.push_back(ineq); break;
case VAL1_2::E_AT_END: msg.at_end_comparison.push_back(ineq); break;
case VAL1_2::E_OVER_ALL: msg.over_all_comparison.push_back(ineq); break;
}
}
void VALVisitorOperator::visit_qfied_goal(VAL1_2::qfied_goal *) {}
void VALVisitorOperator::visit_disj_goal(VAL1_2::disj_goal *) {}
void VALVisitorOperator::visit_imply_goal(VAL1_2::imply_goal *) {}
/*---------*/
/* effects */
/*---------*/
void VALVisitorOperator::visit_effect_lists(VAL1_2::effect_lists * e) {
eff_neg = false;
e->add_effects.pc_list<VAL1_2::simple_effect*>::visit(this);
eff_neg = true;
e->del_effects.pc_list<VAL1_2::simple_effect*>::visit(this);
eff_neg = false;
e->forall_effects.pc_list<VAL1_2::forall_effect*>::visit(this);
e->cond_effects.pc_list<VAL1_2::cond_effect*>::visit(this);
e->cond_assign_effects.pc_list<VAL1_2::cond_effect*>::visit(this);
e->assign_effects.pc_list<VAL1_2::assignment*>::visit(this);
e->timed_effects.pc_list<VAL1_2::timed_effect*>::visit(this);
}
void VALVisitorOperator::visit_timed_effect(VAL1_2::timed_effect * e) {
eff_time = e->ts;
e->effs->visit(this);
};
void VALVisitorOperator::visit_simple_effect(VAL1_2::simple_effect * e) {
e->prop->visit(this);
if(eff_neg) {
switch(eff_time) {
case VAL1_2::E_AT_START: msg.at_start_del_effects.push_back(last_prop); break;
case VAL1_2::E_AT_END: msg.at_end_del_effects.push_back(last_prop); break;
}
} else {
switch(eff_time) {
case VAL1_2::E_AT_START: msg.at_start_add_effects.push_back(last_prop); break;
case VAL1_2::E_AT_END: msg.at_end_add_effects.push_back(last_prop); break;
}
}
}
void VALVisitorOperator::visit_assignment(VAL1_2::assignment * e) {
rosplan_knowledge_msgs::DomainAssignment ass;
ass.grounded = false;
// assignment left hand side
e->getFTerm()->visit(this);
ass.LHS = last_func;
// assignment right hand side
last_expr.tokens.clear();
e->getExpr()->visit(this);
ass.RHS = last_expr;
// assignment operator
switch(e->getOp()) {
case VAL1_2::E_ASSIGN: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::ASSIGN; break;
case VAL1_2::E_INCREASE: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::INCREASE; break;
case VAL1_2::E_DECREASE: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::DECREASE; break;
case VAL1_2::E_SCALE_UP: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::SCALE_UP; break;
case VAL1_2::E_SCALE_DOWN: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::SCALE_DOWN; break;
case VAL1_2::E_ASSIGN_CTS: ass.assign_type = rosplan_knowledge_msgs::DomainAssignment::ASSIGN_CTS; break;
}
// add assigment effect
switch(eff_time) {
case VAL1_2::E_AT_START: msg.at_start_assign_effects.push_back(ass); break;
case VAL1_2::E_AT_END: msg.at_end_assign_effects.push_back(ass); break;
}
}
void VALVisitorOperator::visit_forall_effect(VAL1_2::forall_effect * e) {std::cout << "not implemented forall" << std::endl;};
void VALVisitorOperator::visit_cond_effect(VAL1_2::cond_effect * e) {std::cout << "not implemented cond" << std::endl;};
/*-------------*/
/* expressions */
/*-------------*/
void VALVisitorOperator::visit_plus_expression(VAL1_2::plus_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::OPERATOR;
op.op = rosplan_knowledge_msgs::ExprBase::ADD;
last_expr.tokens.push_back(op);
s->getLHS()->visit(this);
s->getRHS()->visit(this);
}
void VALVisitorOperator::visit_minus_expression(VAL1_2::minus_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::OPERATOR;
op.op = rosplan_knowledge_msgs::ExprBase::SUB;
last_expr.tokens.push_back(op);
s->getLHS()->visit(this);
s->getRHS()->visit(this);
}
void VALVisitorOperator::visit_mul_expression(VAL1_2::mul_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::OPERATOR;
op.op = rosplan_knowledge_msgs::ExprBase::MUL;
last_expr.tokens.push_back(op);
s->getLHS()->visit(this);
s->getRHS()->visit(this);
}
void VALVisitorOperator::visit_div_expression(VAL1_2::div_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::OPERATOR;
op.op = rosplan_knowledge_msgs::ExprBase::DIV;
last_expr.tokens.push_back(op);
s->getLHS()->visit(this);
s->getRHS()->visit(this);
}
void VALVisitorOperator::visit_uminus_expression(VAL1_2::uminus_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::OPERATOR;
op.op = rosplan_knowledge_msgs::ExprBase::UMINUS;
last_expr.tokens.push_back(op);
}
void VALVisitorOperator::visit_int_expression(VAL1_2::int_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::CONSTANT;
op.constant = s->double_value();
last_expr.tokens.push_back(op);
}
void VALVisitorOperator::visit_float_expression(VAL1_2::float_expression * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::CONSTANT;
op.constant = s->double_value();
last_expr.tokens.push_back(op);
}
void VALVisitorOperator::visit_special_val_expr(VAL1_2::special_val_expr * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::SPECIAL;
switch(s->getKind()) {
case VAL1_2::E_HASHT: op.special_type = rosplan_knowledge_msgs::ExprBase::HASHT; break;
case VAL1_2::E_DURATION_VAR: op.special_type = rosplan_knowledge_msgs::ExprBase::DURATION; break;
case VAL1_2::E_TOTAL_TIME: op.special_type = rosplan_knowledge_msgs::ExprBase::TOTAL_TIME; break;
}
last_expr.tokens.push_back(op);
}
void VALVisitorOperator::visit_func_term(VAL1_2::func_term * s) {
rosplan_knowledge_msgs::ExprBase op;
op.expr_type = rosplan_knowledge_msgs::ExprBase::FUNCTION;
// func_term name
last_func.name = s->getFunction()->getName();
// func_term variables
last_func.typed_parameters.clear();
for (VAL1_2::parameter_symbol_list::const_iterator vi = s->getArgs()->begin(); vi != s->getArgs()->end(); vi++) {
diagnostic_msgs::KeyValue param;
param.key = (*vi)->pddl_typed_symbol::getName();
param.value = (*vi)->type->getName();
last_func.typed_parameters.push_back(param);
}
op.function = last_func;
last_expr.tokens.push_back(op);
}
/*-------*/
/* extra */
/*-------*/
void VALVisitorOperator::visit_derivation_rule(VAL1_2::derivation_rule * o) {}
} // close namespace