Diana
0.8.3
|
00001 #ifndef DIANA_PETRINET_H 00002 #define DIANA_PETRINET_H 00003 00004 #include <CapeOpen.hpp> 00005 #include <Basic/DianaBasic.hpp> 00006 #include <Diana/IDianaPetriNet.hpp> 00007 00008 00009 namespace Diana { 00010 00011 class PetriNet; 00012 class PetriTransition; 00013 class DianaDAESO; 00014 class IDianaNumericDAESolver; 00015 00016 typedef void (DianaDAESO::*CharFunction)(); 00017 00018 00019 00023 class PetriPlace : public virtual DianaParameter, 00024 public virtual IDianaPetriPlace { 00025 public: 00034 PetriPlace(Common::Types::CapeString _name, 00035 CharFunction _charFunc, 00036 CharFunction _forkFunc, 00037 PetriNet* _net, 00038 CapeBoolean _isFork, 00039 const PtrData& _ptrInternal 00040 ); 00041 00045 Common::Types::CapeBoolean GetMark() ; 00046 00050 virtual void SetMark(Common::Types::CapeBoolean mark) 00051 throw (ECapeUnknown, ECapeInvalidArgument); 00055 void SetValue(const Common::Types::CapeVariant& _value) 00056 throw (ECapeUnknown, ECapeInvalidArgument); 00057 00061 Common::Types::CapeString GetName(); 00062 00063 00064 void AddIndex(Common::Types::CapeLong *indexPtr, Common::Types::CapeLong indexValue); 00065 CharFunction GetCharFunc() const; 00066 CharFunction GetForkFunc() const; 00067 Common::Types::CapeBoolean IsFork() const; 00071 void RestoreIndices() const; 00076 void addActivateTransition(PetriTransition* _trans); 00077 00078 private: 00079 PetriNet* net; 00080 const CapeBoolean isFork; 00081 CharFunction charFunc; 00082 CharFunction forkFunc; 00083 std::vector<Common::Types::CapeLong*> indexPtrs; 00084 std::vector<Common::Types::CapeLong> indexValues; 00085 std::vector<PetriTransition*> activateTransitions; 00086 }; 00087 00091 class PetriTransition : virtual public IDianaPetriTransition, 00092 virtual public DianaParameter{ 00093 public: 00099 PetriTransition(Common::Types::CapeString name, 00100 PetriNet* net, 00101 Common::Parameter::CapeParamMode _mode=Common::Parameter::CAPE_INPUT_OUTPUT, 00102 const PtrData& _ptr=PtrData()); 00103 Common::Types::CapeString GetName(); 00104 00108 Common::Types::CapeDouble GetPhiValue() const throw (Common::Error::ECapeUnknown); 00112 void AddLinksTo(PetriPlace* place); 00116 void AddLinksFrom(PetriPlace* place); 00120 void setTransFlag(Common::Types::CapeBoolean flag); 00124 void CheckTransition(); 00128 void Switch(); 00133 Common::Types::CapeBoolean CanSwitch(); 00138 void SetPhiIndex(int index); 00142 int GetEventTimeIndex() const; 00147 void SetEventTimeIndex(int index); 00151 int GetPhiIndex() const; 00155 void SetTimeDelay(Common::Types::CapeDouble timeDelay); 00159 Common::Types::CapeDouble GetNextSwitching(); 00163 Common::Types::CapeDouble GetTimeDelay(); 00164 00169 Common::Types::CapeBoolean IsExplicit(); 00170 00174 Common::Types::CapeBoolean Activate(); 00175 00179 const std::vector<PetriPlace*>& GetFromPlaces(); 00183 const std::vector<PetriPlace*>& GetToPlaces(); 00184 private: 00185 PetriNet* net; 00186 Common::Types::CapeBoolean transFlag; 00187 std::vector<PetriPlace*> linksTo; 00188 std::vector<PetriPlace*> linksFrom; 00189 int phiIndex; 00190 int eventTimeIndex; 00191 }; 00192 00196 class PetriNet : virtual public IDianaPetriNet { 00197 public: 00202 PetriNet(DianaDAESO *eso); 00203 virtual ~PetriNet(); 00207 DianaDAESO *GetESO() const; 00211 void AddPlace(PetriPlace* place); 00215 void AddTransition(PetriTransition* transition); 00222 Common::Types::CapeBoolean Switch(const Common::Types::CapeArrayLong& indices); 00223 00229 Common::Types::CapeBoolean shouldFork(); 00230 00235 void afterFork(const Common::Types::CapeArrayLong& phiIndices, Common::Types::CapeBoolean isDaughter); 00239 Common::Collection::ICapeCollection* GetPlaces(); 00243 Common::Collection::ICapeCollection* GetTransitions(); 00244 void setShouldFork(CapeBoolean state=true); 00248 Common::Types::CapeArrayBoolean getState(); 00249 00253 void setState(const Common::Types::CapeArrayBoolean& state); 00254 00255 00256 Common::Types::CapeDouble GetNextExplicitTime() const; 00257 00261 CapeBoolean isDaughter(); 00265 CapeBoolean inAfterFork(); 00266 virtual CapeLong getForkIndex(); 00267 00271 virtual const CapeArrayDouble& GetStoredPhi() const; 00275 virtual void SetStoredPhi(const CapeArrayDouble& phi); 00276 00277 private: 00278 DianaDAESO *eso; 00279 Diana::DianaCollection collPlaces; 00280 Diana::DianaCollection collTransitions; 00281 00282 CapeBoolean _shouldFork; 00283 CapeBoolean _afterFork; 00284 CapeBoolean _isDaughter; 00285 CapeLong forkIndex, currentIndex; 00286 CapeArrayDouble arrStoredPhi; 00287 }; 00288 00289 } 00290 #endif //DIANA_PETRINET_H