X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.h;h=c93d575c927c176c41a79bdaf22755e8594ec130;hb=ed2108383e59a45c6fa2e9259a27256a93d8aa6a;hp=115447be0e37bc2809091ac405a45d032088fc74;hpb=57a315ceb876d4a26e8a88046f5c6ef87989780a;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.h b/lib/fpa/Base/Dijkstra.h index 115447b..c93d575 100644 --- a/lib/fpa/Base/Dijkstra.h +++ b/lib/fpa/Base/Dijkstra.h @@ -1,119 +1,60 @@ -#ifndef __FPA__BASE__DIJKSTRA__H__ -#define __FPA__BASE__DIJKSTRA__H__ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= -#include -#include -#include +#ifndef __fpa__Base__Dijkstra__h__ +#define __fpa__Base__Dijkstra__h__ + +#include namespace fpa { namespace Base { /** - * Dijkstra is a front propagation algorithm that minimizes costs - * - * @param V Vertex type. - * @param C Vertex value type. - * @param R Result value type. - * @param S Space type where vertices are. - * @param VC Vertex lexicographical compare. - * @param MST Minimum spanning tree type. - * @param B Base class for this algorithm. It should be any itk-based - * filter (itk::ProcessObject). - * */ - template< class V, class C, class R, class S, class VC, class MST, class B > + template< class _TAlgorithm, class _TMST > class Dijkstra - : public Algorithm< V, C, R, S, VC, B > + : public fpa::Base::DijkstraBase< _TAlgorithm > { public: - typedef Dijkstra Self; - typedef Algorithm< V, C, R, S, VC, B > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef MST TMinimumSpanningTree; - typedef typename Superclass::TVertex TVertex; - typedef typename Superclass::TValue TValue; - typedef typename Superclass::TResult TResult; - typedef typename Superclass::TSpace TSpace; - typedef typename Superclass::TVertexCompare TVertexCompare; - - typedef typename Superclass::TStartEvent TStartEvent; - typedef typename Superclass::TStartLoopEvent TStartLoopEvent; - typedef typename Superclass::TEndEvent TEndEvent; - typedef typename Superclass::TEndLoopEvent TEndLoopEvent; - typedef typename Superclass::TAliveEvent TAliveEvent; - typedef typename Superclass::TFrontEvent TFrontEvent; - typedef typename Superclass::TFreezeEvent TFreezeEvent; - - typedef typename Superclass::TStartBacktrackingEvent TStartBacktrackingEvent; - typedef typename Superclass::TEndBacktrackingEvent TEndBacktrackingEvent; - typedef typename Superclass::TBacktrackingEvent TBacktrackingEvent; + typedef Dijkstra Self; + typedef fpa::Base::DijkstraBase< _TAlgorithm > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; - protected: - typedef typename Superclass::_TVertices _TVertices; - typedef typename Superclass::_TCollision _TCollision; - typedef typename Superclass::_TCollisionsRow _TCollisionsRow; - typedef typename Superclass::_TCollisions _TCollisions; - typedef typename Superclass::_TNode _TNode; - typedef typename Superclass::_TNodes _TNodes; - - struct _TQueueNode - { - TVertex Vertex; - _TNode Node; - - // Make the min-heap behave as a max-heap - bool operator<( const _TQueueNode& other ) const - { return( other.Node.Result < this->Node.Result ); } - }; - typedef std::vector< _TQueueNode > _TQueue; + typedef _TMST TMST; - public: - itkTypeMacro( Dijkstra, Algorithm ); + typedef typename Superclass::TNode TNode; + typedef typename Superclass::TNodes TNodes; + typedef typename Superclass::TInputValue TInputValue; + typedef typename Superclass::TOutputValue TOutputValue; + typedef typename Superclass::TFrontId TFrontId; + typedef typename Superclass::TVertex TVertex; + typedef typename Superclass::TSeeds TSeeds; - itkBooleanMacro( LocalCosts ); - itkBooleanMacro( FillNodeQueue ); - itkGetConstMacro( LocalCosts, bool ); - itkGetConstMacro( FillNodeQueue, bool ); - itkSetMacro( LocalCosts, bool ); - itkSetMacro( FillNodeQueue, bool ); + typedef typename Superclass::TQueue TQueue; + typedef typename Superclass::TQueueOrder TQueueOrder; + typedef typename Superclass::TWeightFunction TWeightFunction; public: - TMinimumSpanningTree* GetMinimumSpanningTree( ); - const TMinimumSpanningTree* GetMinimumSpanningTree( ) const; - void GraftMinimumSpanningTree( itk::DataObject* obj ); + TMST* GetMinimumSpanningTree( ); + const TMST* GetMinimumSpanningTree( ) const; protected: Dijkstra( ); virtual ~Dijkstra( ); - virtual TResult _Cost( const TVertex& v, const TVertex& p ) const = 0; - - virtual void _BeforeGenerateData( ) ITK_OVERRIDE; - - // Results-related abstract methods - virtual bool _ComputeNeighborResult( - TResult& result, const TVertex& neighbor, const TVertex& parent - ) const ITK_OVERRIDE; - virtual void _SetResult( const TVertex& v, const _TNode& n ) ITK_OVERRIDE; - - // Queue-related abstract methods - virtual bool _IsQueueEmpty( ) const ITK_OVERRIDE; - virtual void _QueuePush( const TVertex& v, const _TNode& n ) ITK_OVERRIDE; - virtual void _QueuePop( TVertex& v, _TNode& n ) ITK_OVERRIDE; - virtual void _QueueClear( ) ITK_OVERRIDE; + virtual void _AfterGenerateData( ) override; + virtual void _UpdateOutputValue( const TNode& n ) override; private: - // Purposely not implemented + // Purposely not implemented. Dijkstra( const Self& other ); Self& operator=( const Self& other ); protected: - bool m_LocalCosts; - bool m_FillNodeQueue; - _TQueue m_Queue; unsigned int m_MSTIdx; }; @@ -122,9 +63,9 @@ namespace fpa } // ecapseman #ifndef ITK_MANUAL_INSTANTIATION -#include +# include #endif // ITK_MANUAL_INSTANTIATION -#endif // __FPA__BASE__DIJKSTRA__H__ +#endif // __fpa__Base__Dijkstra__h__ // eof - $RCSfile$