#ifndef __fpa__Base__Dijkstra__hxx__ #define __fpa__Base__Dijkstra__hxx__ #include #include // ------------------------------------------------------------------------- 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 _TSuperclass, class _TMST > fpa::Base::Dijkstra< _TSuperclass, _TMST >:: ~Dijkstra( ) { } // ------------------------------------------------------------------------- template< class _TSuperclass, class _TMST > void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: _AfterGenerateData( ) { 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 _TSuperclass, class _TMST > void fpa::Base::Dijkstra< _TSuperclass, _TMST >:: _UpdateResult( const _TQueueNode& n ) { 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 { v.Result = this->m_InitResult; return( false ); } // fi } // ------------------------------------------------------------------------- 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 _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$