]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Base/Algorithm.h
...
[FrontAlgorithms.git] / lib / fpa / Base / Algorithm.h
index 187a281903e8aa182403a5f7e22cb74df54b7194..785b818ea8be76bdf3290896cf8c95f63b41bf55 100644 (file)
-#ifndef __FPA__BASE__ALGORITHM__H__
-#define __FPA__BASE__ALGORITHM__H__
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
 
-#include <map>
-#include <vector>
-#include <utility>
-#include <fpa/Base/Events.h>
+#ifndef __fpa__Base__Algorithm__h__
+#define __fpa__Base__Algorithm__h__
+
+#include <fpa/Config.h>
+
+#include <itkObject.h>
+#include <itkEventObject.h>
 
 namespace fpa
 {
   namespace Base
   {
     /**
-     * Base front propagation algorithm. From a series of start seeds with
-     * costs, a priority queue is filled and emptied updating costs. Each
-     * vertex could be marked as "visited", "in the front", "not yet there"
-     * or "freezed".
-     *
-     * @param T Traits used for this algorithm
      */
-    template< class T, class B >
+    template< class _TTraits >
     class Algorithm
-      : public B
+      : public _TTraits::TFilter,
+        public _TTraits::TMarksInterface,
+        public _TTraits::TSeedsInterface
     {
     public:
-      // Standard class typdedefs
-      typedef Algorithm                       Self;
-      typedef B                               Superclass;
-      typedef itk::SmartPointer< Self >       Pointer;
-      typedef itk::SmartPointer< const Self > ConstPointer;
-
-      /// Templated types
-      typedef T TTraits;
-      typedef B TBaseFilter;
-      typedef typename T::TCost        TCost;
-      typedef typename T::TResult      TResult;
-      typedef typename T::TVertex      TVertex;
-      typedef typename T::TVertexValue TVertexValue;
-
-    protected:
-      typedef typename T::TFrontId   _TFrontId;
-      typedef typename T::TNode      _TNode;
-      typedef typename T::TNodes     _TNodes;
-      typedef typename T::TVertexCmp _TVertexCmp;
-
-      typedef std::map< TVertex, _TNode, _TVertexCmp >   _TMarks;
-
-      typedef std::pair< TVertex, bool >         _TCollision;
-      typedef std::vector< _TCollision >         _TCollisionSitesRow;
-      typedef std::vector< _TCollisionSitesRow > _TCollisionSites;
-
-    public:
-      typedef BaseEvent< _TNode >      TEvent;
-      typedef FrontEvent< _TNode >     TFrontEvent;
-      typedef MarkEvent< _TNode >      TMarkEvent;
-      typedef CollisionEvent< _TNode > TCollisionEvent;
-      typedef EndEvent< _TNode >       TEndEvent;
+      typedef _TTraits                          TTraits;
+      typedef typename TTraits::TFilter         Superclass;
+      typedef typename TTraits::TMarksInterface TMarksInterface;
+      typedef typename TTraits::TSeedsInterface TSeedsInterface;
+      typedef Algorithm                         Self;
+      typedef itk::SmartPointer< Self >         Pointer;
+      typedef itk::SmartPointer< const Self >   ConstPointer;
+
+      typedef typename TTraits::TInputValue   TInputValue;
+      typedef typename TTraits::TOutputValue  TOutputValue;
+      typedef typename TTraits::TNeighborhood TNeighborhood;
+      typedef typename TTraits::TNode         TNode;
+      typedef typename TTraits::TNodes        TNodes;
+      typedef typename TTraits::TSeeds        TSeeds;
+      typedef typename TTraits::TVertex       TVertex;
+
+      /**
+       */
+      class TEvent
+        : public itk::EventObject
+      {
+      public:
+        typedef TEvent           Self;
+        typedef itk::EventObject Superclass;
+
+      public:
+        TEvent( );
+        TEvent( const TVertex& v, unsigned long fid, bool intoq );
+        virtual ~TEvent( );
+        virtual const char* GetEventName( ) const override;
+        virtual bool CheckEvent( const itk::EventObject* e ) const override;
+        virtual itk::EventObject* MakeObject( ) const override;
+
+      private:
+        // Purposely not implemented.
+        Self& operator=( const Self& other );
+
+      public:
+        TVertex       Vertex;
+        unsigned long FrontId;
+        bool          IntoQueue;
+      };
 
     public:
-      itkTypeMacro( Algorithm, itkProcessObject );
+      itkTypeMacro( fpa::Base::Algorithm, _TFilter );
 
-      itkBooleanMacro( StopAtOneFront );
-      itkBooleanMacro( ThrowEvents );
+      itkBooleanMacro( VisualDebug );
 
-      itkGetConstMacro( StopAtOneFront, bool );
-      itkGetConstMacro( ThrowEvents, bool );
+      itkGetConstMacro( InitValue, TOutputValue );
+      itkGetConstMacro( VisualDebug, bool );
 
-      itkSetMacro( StopAtOneFront, bool );
-      itkSetMacro( ThrowEvents, bool );
+      itkSetMacro( InitValue, TOutputValue );
+      itkSetMacro( VisualDebug, bool );
 
     public:
       virtual void InvokeEvent( const itk::EventObject& e );
       virtual void InvokeEvent( const itk::EventObject& e ) const;
 
-      /// Seeds manipulation
-      void AddSeed( const TVertex& s, const TResult& v );
-      const TVertex& GetSeed( const unsigned long& i ) const;
-      void ClearSeeds( );
-      unsigned long GetNumberOfSeeds( ) const;
-
     protected:
       Algorithm( );
       virtual ~Algorithm( );
 
-      /// itk::ProcessObject
-      virtual void GenerateData( );
-
-      /// Base interface
-      virtual void _BeforeLoop         ( );
-      virtual void _AfterLoop          ( );
-      virtual void _Loop               ( );
-      virtual bool _CheckCollisions    ( const _TNode& a, const _TNode& b );
-      virtual bool _CheckStopCondition ( );
-      virtual bool _UpdateResult       ( _TNode& n );
-
-      /// Marks management
-      virtual      void _InitializeMarks ( );
-      virtual      bool _IsMarked        ( const TVertex& v ) const;
-      virtual _TFrontId _FrontId         ( const TVertex& v ) const;
-      virtual   TVertex _Parent          ( const TVertex& v ) const;
-      virtual      void _Mark            ( const _TNode& n );
-
-      /// Pure virtual interface: vertices
-      virtual unsigned long _NumberOfVertices ( ) const = 0;
-      virtual  TVertexValue _Value            ( const TVertex& v ) const = 0;
-      virtual       TResult _Result           ( const TVertex& v ) const = 0;
-
-      /// Pure virtual interface: edges
-      virtual double _Norm ( const TVertex& a, const TVertex& b ) const = 0;
-      virtual   bool _Edge ( const TVertex& a, const TVertex& b ) const = 0;
-      virtual  TCost _Cost ( const TVertex& a, const TVertex& b ) const = 0;
-
-      /// Pure virtual interface: neighborhood
-      virtual void _Neighs      ( const _TNode& n, _TNodes& N ) const = 0;
-      virtual bool _UpdateNeigh ( _TNode& nn, const _TNode& n ) = 0;
-      virtual void _NeighsInDim ( const _TNode& n,
-                                  const unsigned int& d,
-                                  _TNodes& N ) = 0;
-
-      /// Pure virtual interface: queue
-      virtual   void _InitializeQueue ( ) = 0;
-      virtual   bool _IsQueueEmpty    ( ) const = 0;
-      virtual   void _QueuePush       ( const _TNode& n ) = 0;
-      virtual _TNode _QueuePop        ( ) = 0;
-      virtual   void _QueueClear      ( ) = 0;
-
-      /// Pure virtual interface: results
-      virtual void _InitializeResults ( ) = 0;
+      virtual void GenerateData( ) override;
+      virtual void _BeforeGenerateData( );
+      virtual void _AfterGenerateData( );
+      virtual void _FinishOneLoop( );
+
+      virtual void _QueueInit( );
+
+      virtual void _ConfigureOutput( const TOutputValue& v ) = 0;
+      virtual TNeighborhood _GetNeighbors( const TVertex& v ) const = 0;
+      virtual TInputValue _GetInputValue( const TVertex& v ) const = 0;
+      virtual TOutputValue _GetOutputValue( const TVertex& v ) const = 0;
+
+      virtual void _ComputeOutputValue( TNode& n ) = 0;
+      virtual void _UpdateOutputValue( TNode& n ) = 0;
+      virtual void _QueueClear( ) = 0;
+      virtual void _QueuePush( const TNode& node ) = 0;
+      virtual unsigned long _QueueSize( ) const = 0;
+      virtual TNode _QueuePop( ) = 0;
 
     private:
       // Purposely not implemented
-      Algorithm( const Self& );
-      void operator=( const Self& );
+      Algorithm( const Self& other );
+      Self& operator=( const Self& other );
 
     protected:
-      bool m_StopAtOneFront;
-      bool m_ThrowEvents;
-
-      _TNodes m_Seeds;
-      _TMarks m_Marks;
-
-      _TCollisionSites m_CollisionSites;
+      bool m_VisualDebug;
+      TOutputValue m_InitValue;
     };
 
   } // ecapseman
 
 } // ecapseman
 
-#include <fpa/Base/Algorithm.hxx>
+#ifndef ITK_MANUAL_INSTANTIATION
+#  include <fpa/Base/Algorithm.hxx>
+#endif // ITK_MANUAL_INSTANTIATION
 
-#endif // __FPA__BASE__ALGORITHM__H__
+#endif // __fpa__Base__Algorithm__h__
 
 // eof - $RCSfile$