1 #ifndef __fpa__Base__Dijkstra__hxx__
2 #define __fpa__Base__Dijkstra__hxx__
7 // -------------------------------------------------------------------------
8 template< class _TSuperclass, class _TMST >
9 _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >::
10 GetMinimumSpanningTree( )
13 dynamic_cast< _TMST* >(
14 this->itk::ProcessObject::GetOutput( this->m_MSTIndex )
19 // -------------------------------------------------------------------------
20 template< class _TSuperclass, class _TMST >
21 const _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >::
22 GetMinimumSpanningTree( ) const
25 dynamic_cast< const _TMST* >(
26 this->itk::ProcessObject::GetOutput( this->m_MSTIndex )
31 // -------------------------------------------------------------------------
32 template< class _TSuperclass, class _TMST >
33 fpa::Base::Dijkstra< _TSuperclass, _TMST >::
37 this->m_InitResult = TOutput( 0 );
38 this->m_MSTIndex = this->GetNumberOfRequiredOutputs( );
39 this->SetNumberOfRequiredOutputs( this->m_MSTIndex + 1 );
40 this->itk::ProcessObject::SetNthOutput( this->m_MSTIndex, _TMST::New( ) );
43 // -------------------------------------------------------------------------
44 template< class _TSuperclass, class _TMST >
45 fpa::Base::Dijkstra< _TSuperclass, _TMST >::
50 // -------------------------------------------------------------------------
51 template< class _TSuperclass, class _TMST >
52 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
55 this->Superclass::_AfterGenerateData( );
57 auto mst = this->GetMinimumSpanningTree( );
59 for( auto s = this->m_Seeds.begin( ); s != this->m_Seeds.end( ); ++s )
60 mst->AddSeed( s->Vertex );
61 mst->SetCollisions( this->m_Collisions );
64 // -------------------------------------------------------------------------
65 template< class _TSuperclass, class _TMST >
66 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
67 _UpdateResult( const _TQueueNode& n )
69 this->Superclass::_UpdateResult( n );
70 this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent );
73 // -------------------------------------------------------------------------
74 template< class _TSuperclass, class _TMST >
75 bool fpa::Base::Dijkstra< _TSuperclass, _TMST >::
76 _UpdateValue( _TQueueNode& v, const _TQueueNode& p )
78 v.Result = this->m_CostFunction->Evaluate( p.Vertex, v.Vertex );
79 if( this->m_CostConversionFunction.IsNotNull( ) )
80 v.Result = this->m_CostConversionFunction->Evaluate( v.Result );
81 if( v.Result >= TOutput( 0 ) )
88 v.Result = this->m_InitResult;
94 // -------------------------------------------------------------------------
95 template< class _TSuperclass, class _TMST >
96 unsigned long fpa::Base::Dijkstra< _TSuperclass, _TMST >::
99 return( this->m_Queue.size( ) );
102 // -------------------------------------------------------------------------
103 template< class _TSuperclass, class _TMST >
104 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
107 this->m_Queue.clear( );
110 // -------------------------------------------------------------------------
111 template< class _TSuperclass, class _TMST >
112 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
113 _QueuePush( const _TQueueNode& node )
115 static _TQueueNodeCompare cmp;
116 this->m_Queue.push_back( node );
117 std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp );
120 // -------------------------------------------------------------------------
121 template< class _TSuperclass, class _TMST >
122 typename fpa::Base::Dijkstra< _TSuperclass, _TMST >::
123 _TQueueNode fpa::Base::Dijkstra< _TSuperclass, _TMST >::
126 static _TQueueNodeCompare cmp;
127 std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ), cmp );
128 _TQueueNode f = this->m_Queue.back( );
129 this->m_Queue.pop_back( );
133 #endif // __fpa__Base__Dijkstra__hxx__