X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=849ff6c981a9676c0c469734534ea58faad307a3;hb=026b2fe203089e1917ab78ebafb3131f147223f5;hp=7d652372e1a9adbadf6171fb438967fe339f8aa0;hpb=b70a564ee2d7bc180b77a05c37ab431ab9c393e7;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 7d65237..849ff6c 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -1,81 +1,135 @@ -#ifndef __FPA__BASE__DIJKSTRA__HXX__ -#define __FPA__BASE__DIJKSTRA__HXX__ +#ifndef __fpa__Base__Dijkstra__hxx__ +#define __fpa__Base__Dijkstra__hxx__ #include +#include // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -fpa::Base::Dijkstra< V, C, R, B >:: +template< class _TSuperclass, class _TMST > +_TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +GetMinimumSpanningTree( ) +{ + return( + dynamic_cast< _TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIndex ) + ) + ); +} + +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +const _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +GetMinimumSpanningTree( ) const +{ + return( + dynamic_cast< const _TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIndex ) + ) + ); +} + +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +fpa::Base::Dijkstra< _TSuperclass, _TMST >:: Dijkstra( ) : Superclass( ) { + this->m_InitResult = TOutput( 0 ); + this->m_MSTIndex = this->GetNumberOfRequiredOutputs( ); + this->SetNumberOfRequiredOutputs( this->m_MSTIndex + 1 ); + this->itk::ProcessObject::SetNthOutput( this->m_MSTIndex, _TMST::New( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -fpa::Base::Dijkstra< V, C, R, B >:: +template< class _TSuperclass, class _TMST > +fpa::Base::Dijkstra< _TSuperclass, _TMST >:: ~Dijkstra( ) { } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -bool fpa::Base::Dijkstra< V, C, R, B >:: -_ComputeNeighborResult( - TResult& result, const TVertex& neighbor, const TVertex& parent - ) const +template< class _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_AfterGenerateData( ) { - result = this->_Cost( neighbor, parent ); - result *= TResult( this->_Distance( neighbor, parent ) ); + this->Superclass::_AfterGenerateData( ); - _TNode pn = this->_Node( parent ); - if( pn.Label == Self::AliveLabel ) - result += pn.Result; - - return( true ); + auto mst = this->GetMinimumSpanningTree( ); + mst->ClearSeeds( ); + for( auto s = this->m_Seeds.begin( ); s != this->m_Seeds.end( ); ++s ) + mst->AddSeed( s->Vertex ); + mst->SetCollisions( this->m_Collisions ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -bool fpa::Base::Dijkstra< V, C, R, B >:: -_IsQueueEmpty( ) const +template< class _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_UpdateResult( const _TQueueNode& n ) { - return( this->m_Queue.empty( ) ); + this->Superclass::_UpdateResult( n ); + this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -void fpa::Base::Dijkstra< V, C, R, B >:: -_QueuePush( const _TNode& n ) +template< class _TSuperclass, class _TMST > +bool fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) { - this->m_Queue.push_back( n ); - std::push_heap( - this->m_Queue.begin( ), this->m_Queue.end( ), Self::m_NodeCompare - ); + v.Result = this->m_CostFunction->Evaluate( p.Vertex, v.Vertex ); + if( this->m_CostConversionFunction.IsNotNull( ) ) + v.Result = this->m_CostConversionFunction->Evaluate( v.Result ); + if( v.Result >= TOutput( 0 ) ) + { + v.Result += p.Result; + return( true ); + } + else + { + v.Result = this->m_InitResult; + return( false ); + + } // fi } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -typename fpa::Base::Dijkstra< V, C, R, B >:: -_TNode fpa::Base::Dijkstra< V, C, R, B >:: -_QueuePop( ) +template< class _TSuperclass, class _TMST > +unsigned long fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_QueueSize( ) const { - _TNode n = this->m_Queue.front( ); - std::pop_heap( - this->m_Queue.begin( ), this->m_Queue.end( ), Self::m_NodeCompare - ); - this->m_Queue.pop_back( ); - return( n ); + return( this->m_Queue.size( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class B > -void fpa::Base::Dijkstra< V, C, R, B >:: +template< class _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: _QueueClear( ) { this->m_Queue.clear( ); } -#endif // __FPA__BASE__DIJKSTRA__HXX__ +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_QueuePush( const _TQueueNode& node ) +{ + static _TQueueNodeCompare cmp; + this->m_Queue.push_back( node ); + std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp ); +} + +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +typename fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_TQueueNode fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_QueuePop( ) +{ + static _TQueueNodeCompare cmp; + std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp ); + _TQueueNode f = this->m_Queue.back( ); + this->m_Queue.pop_back( ); + return( f ); +} + +#endif // __fpa__Base__Dijkstra__hxx__ // eof - $RCSfile$