Program Listing for File TrajectoryConstraints.h
↰ Return to documentation for file (src/VALfiles/TrajectoryConstraints.h
)
/************************************************************************
* Copyright 2008, Strathclyde Planning Group,
* Department of Computer and Information Sciences,
* University of Strathclyde, Glasgow, UK
* http://planning.cis.strath.ac.uk/
*
* Maria Fox, Richard Howey and Derek Long - VAL
* Stephen Cresswell - PDDL Parser
*
* This file is part of VAL, the PDDL validator.
*
* VAL is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* VAL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VAL. If not, see <http://www.gnu.org/licenses/>.
*
************************************************************************/
#ifndef __TRAJECTORYMONITOR
#define __TRAJECTORYMONITOR
#include <ptree.h>
#include "Proposition.h"
#include <set>
namespace VAL {
class State;
class Validator;
class Monitor {
protected:
Monitor(const Monitor & m) {};
public:
Monitor() {};
virtual ~Monitor() {};
virtual bool violationSerious(const State * s) const {return true;};
virtual Monitor * copy() const {return new Monitor(*this);};
};
class PreferenceMonitor : public Monitor {
private:
static int id;
static std::set<int> done;
int myId;
mutable Validator * vld;
string name;
public:
PreferenceMonitor(Validator * v,const string & nm) : myId(id++), vld(v), name(nm) {};
PreferenceMonitor * copy() const {return new PreferenceMonitor(*this);};
bool violationSerious(const State * s) const;
};
class MonitorOwner {
private:
Monitor * mon;
public:
virtual ~MonitorOwner()
{
delete mon;
};
MonitorOwner(Validator * v) :
mon(new PreferenceMonitor(v,"anonymous")) {};
MonitorOwner(Validator * v,const string & n) :
mon(new PreferenceMonitor(v,n)) {};
MonitorOwner() : mon(new Monitor()) {};
MonitorOwner & operator=(const MonitorOwner & m)
{
delete mon;
mon = m.mon->copy();
return *this;
};
MonitorOwner(const MonitorOwner & m) : mon(m.mon->copy()) {};
virtual bool violationSerious(const State * s) const {return mon->violationSerious(s);};
void setPreference(Validator * v,const string & nm)
{
delete mon;
mon = new PreferenceMonitor(v,nm);
};
};
template<typename T>
T & passOn(T & t,const MonitorOwner & mo)
{
static_cast<MonitorOwner &>(t) = mo;
return t;
};
struct PropMonitor : public MonitorOwner {
const Proposition * prop;
PropMonitor(const Proposition * p) : prop(p) {};
const Proposition & operator*() const {return *prop;};
const Proposition * operator->() const {return prop;};
};
struct PropositionPair : public MonitorOwner {
const Proposition * first;
const Proposition * second;
PropositionPair(const Proposition * f,const Proposition * s) : first(f), second(s) {};
};
struct Deadlined : public MonitorOwner {
double first;
const Proposition * second;
Deadlined(double d,const Proposition * p) : first(d), second(p) {};
};
struct TriggeredDeadlined : public MonitorOwner {
const Proposition * first;
pair<double,const Proposition *> second;
TriggeredDeadlined(const Proposition * p,const Deadlined & d) :
first(p), second(make_pair(d.first,d.second))
{};
};
struct Window : public MonitorOwner {
pair<double,double> first;
const Proposition * second;
Window(const pair<double,double> & pds,const Proposition * p) :
first(pds), second(p) {};
};
typedef vector<PropMonitor> Propositions;
typedef vector<PropositionPair> PropositionPairs;
typedef vector<Deadlined> Deadlines;
typedef vector<TriggeredDeadlined> TriggeredDeadlines;
typedef vector<Window> Windows;
class TrajectoryConstraintsMonitor {
private:
bool isActive;
// Interactions with continuous effects are much harder - ignore that for the
// moment!
// What about derived predicates?
// These are the easy ones - just check in final state
Propositions atEnd;
// Not too bad - must check in every state
Propositions always;
// Check in every state - once satisfied, remove. Must be empty in final state.
Propositions sometime;
// Check in every state. If satisfied then move to currently.
Propositions atMostOnce;
// Check every state - if they become false then move to never.
Propositions currently;
// Check in every state - if true then problem.
Propositions never;
// Check trigger in every state. If it becomes true then check requirement. If it is
// false then add it to sometime.
PropositionPairs sometimeAfter;
// This is the hard one. Perhaps the best way to tackle it is to check
// in every state and remove the pair if the requirement becomes true, but
// return false if the trigger becomes true first.
PropositionPairs sometimeBefore;
// This one is not too bad: check each state - if the timestamp is too late then
// return false, but if the trigger becomes true then remove the requirement.
Deadlines within;
// If the state has a time after the timestamp then the requirement can be shifted
// into the always (and must hold in the current state).
Deadlines holdAfter;
// Check the trigger in every state. If true then set up a within goal.
TriggeredDeadlines alwaysWithin;
// From start time to end time, the requirement must hold.
Windows holdDuring;
Propositions allProps;
class CollectProps;
friend class CollectProps;
Validator * vld;
public:
TrajectoryConstraintsMonitor(Validator * v,con_goal * cg1,con_goal * cg2);
~TrajectoryConstraintsMonitor();
bool checkAtState(const State & s);
bool checkFinalState(const State & s);
};
};
#endif