X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=93a102d2148729b8ca3aaf0af6a5fb99d1d3f17e;hb=e8b46a839b86641f48f593d021234566877ac683;hp=25a7bd90caffba6e1ffc0fe36be116ce24f5b4f6;hpb=56b8bb48cc05a297a3faa264f8f2a88de21ef203;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 25a7bd9..93a102d 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -1,144 +1,74 @@ -#ifndef __FPA__BASE__DIJKSTRA__HXX__ -#define __FPA__BASE__DIJKSTRA__HXX__ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= -#include +#ifndef __fpa__Base__Dijkstra__hxx__ +#define __fpa__Base__Dijkstra__hxx__ // ------------------------------------------------------------------------- -template< class _TSuperclass > -const typename fpa::Base::Dijkstra< _TSuperclass >::TDijkstraCmp -fpa::Base::Dijkstra< _TSuperclass >::DijkstraCmp = -fpa::Base::Dijkstra< _TSuperclass >::TDijkstraCmp( ); - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::Dijkstra< _TSuperclass >:: -TMinimumSpanningTree* fpa::Base::Dijkstra< _TSuperclass >:: +template< class _TAlgorithm, class _TMST > +typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: GetMinimumSpanningTree( ) { - return( - dynamic_cast< TMinimumSpanningTree* >( - this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) - ) + dynamic_cast< TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) ); } // ------------------------------------------------------------------------- -template< class _TSuperclass > -const typename fpa::Base::Dijkstra< _TSuperclass >:: -TMinimumSpanningTree* fpa::Base::Dijkstra< _TSuperclass >:: +template< class _TAlgorithm, class _TMST > +const typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: GetMinimumSpanningTree( ) const { - return( - dynamic_cast< const TMinimumSpanningTree* >( - this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) - ) + dynamic_cast< const TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) ); } // ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::Dijkstra< _TSuperclass >:: -GraftMinimumSpanningTree( itk::DataObject* obj ) -{ - TMinimumSpanningTree* mst = dynamic_cast< TMinimumSpanningTree* >( obj ); - if( mst != NULL ) - this->GraftNthOutput( this->m_MSTIdx, mst ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::Dijkstra< _TSuperclass >:: +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: Dijkstra( ) - : Superclass( ), - m_CostConversionFunction( NULL ) + : Superclass( ) { this->m_MSTIdx = this->GetNumberOfRequiredOutputs( ); - this->SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 ); - typename TMinimumSpanningTree::Pointer mst = TMinimumSpanningTree::New( ); - this->itk::ProcessObject::SetNthOutput( this->m_MSTIdx, mst ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 ); + this->SetNthOutput( this->m_MSTIdx, TMST::New( ) ); } // ------------------------------------------------------------------------- -template< class _TSuperclass > -fpa::Base::Dijkstra< _TSuperclass >:: +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: ~Dijkstra( ) { } // ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::Dijkstra< _TSuperclass >:: +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: _AfterGenerateData( ) { - this->Superclass::_AfterGenerateData( ); - this->GetMinimumSpanningTree( )->SetCollisions( this->m_Collisions ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::Dijkstra< _TSuperclass >:: -_Visit( const TNode& n ) -{ - this->Superclass::_Visit( n ); - this->GetMinimumSpanningTree( )->SetNode( - n.Vertex, n.Parent, n.FrontId, n.Result - ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -bool fpa::Base::Dijkstra< _TSuperclass >:: -_Result( TNode& node, const TNode& parent ) -{ - node.Result = this->_Cost( node.Vertex, parent.Vertex ); - if( node.Result >= TScalar( 0 ) ) - { - if( this->m_CostConversionFunction.IsNotNull( ) ) - node.Result = this->m_CostConversionFunction->Evaluate( node.Result ); - node.Result += parent.Result; - return( true ); - } - else - return( false ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::Dijkstra< _TSuperclass >:: -_QueueClear( ) -{ - this->m_Queue.clear( ); -} + typedef typename Superclass::TSeedsInterface::TSeeds::iterator _TIt; -// ------------------------------------------------------------------------- -template< class _TSuperclass > -void fpa::Base::Dijkstra< _TSuperclass >:: -_QueuePush( const TNode& node ) -{ - this->m_Queue.push_back( node ); - std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ), DijkstraCmp ); -} - -// ------------------------------------------------------------------------- -template< class _TSuperclass > -typename fpa::Base::Dijkstra< _TSuperclass >:: -TNode fpa::Base::Dijkstra< _TSuperclass >:: -_QueuePop( ) -{ - std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ), DijkstraCmp ); - TNode n = this->m_Queue.back( ); - this->m_Queue.pop_back( ); - return( n ); + TMST* mst = this->GetMinimumSpanningTree( ); + mst->ClearSeeds( ); + mst->SetCollisions( this->m_Collisions ); + for( _TIt sIt = this->BeginSeeds( ); sIt != this->EndSeeds( ); ++sIt ) + mst->AddSeed( sIt->Vertex ); } // ------------------------------------------------------------------------- -template< class _TSuperclass > -bool fpa::Base::Dijkstra< _TSuperclass >:: -_IsQueueEmpty( ) const +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +_UpdateOutputValue( const TNode& n ) { - return( this->m_Queue.size( ) == 0 ); + this->Superclass::_UpdateOutputValue( n ); + this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); } -#endif // __FPA__BASE__DIJKSTRA__HXX__ +#endif // __fpa__Base__Dijkstra__hxx__ // eof - $RCSfile$