1 #ifndef __DIADES__PETRI__PETRINET_HH_
2 #define __DIADES__PETRI__PETRINET_HH_
76 typedef enum {P,T} NodeType;
92 list<Arc>::const_iterator
_it;
115 Place operator *()
const
119 return _it->source();
121 return _it->target();
140 list<Arc>::const_iterator _it2= _it;
151 Place operator ->(
void)
const
155 return _it->source();
157 return _it->target();
167 return (_pre == it.
_pre) && (_it == it.
_it);
178 return !(*
this == it);
234 return (_it == it.
_it) && (_net == it.
_net) && (_type == it.
_type);
244 return !(*
this == it);
297 typedef enum{NotPostponable,Postponable} TransitionType;
363 const set<Event> & synchronization,
bool strict =
true);
390 if(!_readOnly) { _name = name; }
391 else { printWarning(
"setName"); }
398 const string &
name()
const {
return _name; }
405 unsigned int id()
const
456 return _eventList.begin();
466 return _eventList.end();
492 "setEvent: the transition does not belong to the Petri Net");
494 "setEvent; this is not a transition but a place" );
498 _eventList.insert(event);
500 if(_transitionsOfEventId.size() <=
event.id())
502 _transitionsOfEventId.resize(event.
id()+1);
504 _transitionsOfEventId[
event.id()].insert(t);
508 printWarning(
"setEvent");
520 if(_transitionsOfEventId.size() <=
event.id())
524 return !_transitionsOfEventId[
event.id()].empty();
546 p = _graph.newNode();
549 s <<
"__p" << p.id();
555 printWarning(
"newPlace");
568 Place newPlace(
const string & label);
603 return _labelNode[p];
656 virtual Transition newTransition(
const set<Place> & pre,
const set<Place> & post);
665 virtual Transition
newTransition(
const set<Place> & pre,
const set<Place> & post,
const string & label)
671 trans = newTransition(pre,post); _labelNode[trans] = label;
675 printWarning(
"newTransition");
687 void addPre(Transition transition, Place place)
689 _graph.newEdge(place,transition);
699 void addPost(Transition transition, Place place)
701 _graph.newEdge(transition,place);
710 bool pre(
const Vdd * marking,
const Transition & t)
const;
730 return Iterator(transition.inEdgeBegin(),
true);
740 return Iterator(transition.inEdgeEnd(),
true);
750 return Iterator(transition.outEdgeBegin(),
false);
761 return Iterator(transition.outEdgeEnd(),
false);
792 return _labelNode[t];
801 bool inPre(
const Transition & t,
const Place & p)
const;
811 "beginOfTransitionWithEvent: the event is not associated to a transition of this Petri Net");
812 return _transitionsOfEventId[
event.id()].begin();
825 "endOfTransitionWithEvent: the event is not associated to a transition of this Petri Net");
826 return _transitionsOfEventId[
event.id()].end();
843 virtual Transition duplicateTransition(Transition t);
868 void setPostponable(Transition t);
878 require(
PetriNetInvalid, t.owner() == graph(),
"isPostponable: the transition does not belong to the Petri Net");
879 return _postponable[t] == Postponable;
889 void setNotPostponable(Transition t);
909 const set<Event> & synchronization,
bool strict);
925 void setMarking(
const set<Place> & marking);
933 return _initialMarking != 0;
941 bool isMarked(Place p)
const;
957 void unmark(Place p);
974 virtual void net2Dot(
const string & fileName)
const;
984 virtual void net2Tina(ostream & os)
const;
993 cerr <<
"WARNING: attempt to modify a read-only net (" << s <<
")" << endl;
1000 void printFactory(
const string & fileName)
const;
1027 void unlock()
const;
1033 const Vdd * marking()
const;
1043 const Zsl * getPreZsl(Transition t)
const;
1052 const Zsl * getIncidenceZsl(Transition t)
const;
1058 const Vdd * reachableNodes()
const;
1066 void printVdd(
const Vdd * result,
string fileName);
void setInfoLabel(Place p, const string &info)
set< Event >::const_iterator EventIterator
TransitionIterator endOfTransitions() const
virtual void setEvent(Transition t, const Event &event)
Iterator(list< Arc >::const_iterator it, bool pre)
bool isPostponable(Transition t) const
Diades::Graph::Node Place
VddFactory * vddFactory() const
PerTypeIterator TransitionIterator
Graph::NodeMap< string > _infoNode
list< Arc >::const_iterator _it
TransitionEventIterator endOfTransitionWithEvent(const Event &event) const
#define ensure(Exception, expr, message)
Iterator preEnd(const Transition &transition) const
EventIterator endOfEvents() const
ZslFactory * zslFactory() const
set< Transition >::const_iterator TransitionEventIterator
Graph::NodeMap< const Zsl * > _incidenceZslOfTransition
unordered_map< string, Graph::Node > _placeOfLabel
vector< set< Transition > > _transitionsOfEventId
const Vdd * _reachableNodes
GraphIterator< Node > NodeIterator
const string & getInfoLabel(Place p) const
TransitionEventIterator beginOfTransitionWithEvent(const Event &event) const
const string & name() const
void deleteTransition(Component &comp, InputIterator first, InputIterator last)
void addPre(Transition transition, Place place)
int numberOfPlaces() const
#define require(Exception, expr, message)
Namespace of the Diades project.
set< Place > _explicitInitialMarking
const Diades::Graph::Graph & graph() const
Graph::NodeMap< int > _postponable
const string & labelOfTransition(const Transition &t) const
void setName(const string &name)
Graph::NodeMap< Event > _event
TransitionIterator beginOfTransitions() const
Graph::NodeMap< const Zsl * > _preZslOfTransition
boost::adjacency_list Graph
int numberOfTransitions() const
void addPost(Transition transition, Place place)
Iterator postBegin(const Transition &transition) const
Graph::NodeMap< string > _labelNode
Graph::NodeMap< NodeType > _nodeType
const Vdd * _initialMarking
Iterator postEnd(const Transition &transition) const
const Event & getEvent(Transition t) const
virtual Transition newTransition(const set< Place > &pre, const set< Place > &post, const string &label)
PlaceIterator beginOfPlaces() const
PerTypeIterator PlaceIterator
const string & labelOfPlace(const Place &p) const
Diades::Graph::Node Transition
Iterator preBegin(const Transition &transition) const
PlaceIterator endOfPlaces() const
EventIterator beginOfEvents() const
Iterators over the places or the transitions of the PetriNet.
void printWarning(const string &s) const
Iterator on the PetriNet.
bool containsEvent(const Event &event) const