Diana  0.8.3
DianaPetriNet.hpp
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