X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=93a102d2148729b8ca3aaf0af6a5fb99d1d3f17e;hb=e8b46a839b86641f48f593d021234566877ac683;hp=4920ab551628489db9f03d42660ba408e40b31df;hpb=9622bd5b833a8845881003228207e0caca59b081;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 4920ab5..93a102d 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -1,95 +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 V, class C, class VV, class VC, class B > -fpa::Base::Dijkstra< V, C, VV, VC, B >:: -Dijkstra( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -fpa::Base::Dijkstra< V, C, VV, VC, B >:: -~Dijkstra( ) +template< class _TAlgorithm, class _TMST > +typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +GetMinimumSpanningTree( ) { + dynamic_cast< TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ); } // ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -void fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_InitializeQueue( ) +template< class _TAlgorithm, class _TMST > +const typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +GetMinimumSpanningTree( ) const { - for( - typename _TNodes::const_iterator vIt = this->m_Seeds.begin( ); - vIt != this->m_Seeds.end( ); - vIt++ - ) - this->_QueuePush( *vIt ); + dynamic_cast< const TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ); } // ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -bool fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_IsQueueEmpty( ) const +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +Dijkstra( ) + : Superclass( ) { - return( this->m_Queue.empty( ) ); + this->m_MSTIdx = this->GetNumberOfRequiredOutputs( ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 ); + this->SetNthOutput( this->m_MSTIdx, TMST::New( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -void fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_QueuePush( const _TNode& n ) +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +~Dijkstra( ) { - this->m_Queue.push_back( n ); - std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -typename fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_TNode fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_QueuePop( ) +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +_AfterGenerateData( ) { - _TNode n; - if( !( this->m_Queue.empty( ) ) ) - { - // n = *( this->m_Queue.begin( ) ); - n = this->m_Queue.front( ); - std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); - this->m_Queue.pop_back( ); + typedef typename Superclass::TSeedsInterface::TSeeds::iterator _TIt; - } // fi - return( n ); -} - -// ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -void fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_QueueClear( ) -{ - this->m_Queue.clear( ); + 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 V, class C, class VV, class VC, class B > -bool fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_UpdateNeigh( _TNode& nn, const _TNode& n ) +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +_UpdateOutputValue( const TNode& n ) { - TCost nc = this->_Cost( nn.Vertex, n.Vertex ); - if( C( 0 ) <= nc ) - { - nn.Cost = n.Cost + nc; - nn.Result = nn.Cost; - return( true ); - } - else - return( false ); + this->Superclass::_UpdateOutputValue( n ); + this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); } -#endif // __FPA__BASE__DIJKSTRA__HXX__ +#endif // __fpa__Base__Dijkstra__hxx__ // eof - $RCSfile$