X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=849ff6c981a9676c0c469734534ea58faad307a3;hb=3f4722ccf68d830e26dac9b945925efa68e39e4c;hp=4920ab551628489db9f03d42660ba408e40b31df;hpb=9622bd5b833a8845881003228207e0caca59b081;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 4920ab5..849ff6c 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -1,95 +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 VV, class VC, class B > -fpa::Base::Dijkstra< V, C, VV, VC, B >:: -Dijkstra( ) - : Superclass( ) +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 V, class C, class VV, class VC, class B > -fpa::Base::Dijkstra< V, C, VV, VC, B >:: -~Dijkstra( ) +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 V, class C, class VV, class VC, class B > -void fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_InitializeQueue( ) +template< class _TSuperclass, class _TMST > +fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +Dijkstra( ) + : Superclass( ) { - for( - typename _TNodes::const_iterator vIt = this->m_Seeds.begin( ); - vIt != this->m_Seeds.end( ); - vIt++ - ) - this->_QueuePush( *vIt ); + 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 VV, class VC, class B > -bool fpa::Base::Dijkstra< V, C, VV, VC, B >:: -_IsQueueEmpty( ) const +template< class _TSuperclass, class _TMST > +fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +~Dijkstra( ) { - return( this->m_Queue.empty( ) ); } // ------------------------------------------------------------------------- -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 _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_AfterGenerateData( ) { - this->m_Queue.push_back( n ); - std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); + this->Superclass::_AfterGenerateData( ); + + 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 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 _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_UpdateResult( const _TQueueNode& n ) { - _TNode n; - if( !( this->m_Queue.empty( ) ) ) + this->Superclass::_UpdateResult( n ); + this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); +} + +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +bool fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_UpdateValue( _TQueueNode& v, const _TQueueNode& p ) +{ + 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 { - // 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( ); + v.Result = this->m_InitResult; + return( false ); } // fi - return( n ); } // ------------------------------------------------------------------------- -template< class V, class C, class VV, class VC, class B > -void fpa::Base::Dijkstra< V, C, VV, VC, B >:: +template< class _TSuperclass, class _TMST > +unsigned long fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_QueueSize( ) const +{ + return( this->m_Queue.size( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: _QueueClear( ) { this->m_Queue.clear( ); } // ------------------------------------------------------------------------- -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 _TSuperclass, class _TMST > +void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: +_QueuePush( const _TQueueNode& node ) { - 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 ); + 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__ +#endif // __fpa__Base__Dijkstra__hxx__ // eof - $RCSfile$