[Insight-developers] Use one algorithm or another in a filter, depending of the pixel type

Gaetan Lehmann gaetan.lehmann at jouy.inra.fr
Tue Mar 14 15:24:12 EST 2006


On Tuesday 14 March 2006 19:11, you wrote:
> Gaetan,
>
> Your need for static_cast<> is essentially why we (really, Brad King)
> developed the dispatch pattern.  Both cases of your "conditional" need to
> be compilable regardless of the pixel type (regardless of the fact that
> both branches of the conditional will never be used).  This is fine for
> what you are doing.  When branching on dimension, we couldn't use the
> "conditional" approach because one branch would attempt to access memory
> out of bounds (for instance, access index[2] on a Index<2>).
>
> If you wanted to used the overloading/dispatch approach in your case, you
> could do
>
> struct DispatchBase{};
> template <bool T> Dispatch : public DispatchBase {} ;
>
> void AddPixel(DispatchBase, const TInputPixel &p);    // version for any
> type void AddPixel(Dispatch<true>, const TInputPixel &p);  // version for
> integral types
>
> and use the dispatch method
>
> void AddPixel(const TInputPixel &p)
>    {
>    AddPixel(Dispatch<NumericTraits<TInputPixel>::is_integer>, p);
>    }
>

That would not be enough in my case, because the optimization in possible only 
for "small" integer types: I create a vector to count all the possible values 
of a type, which clearly can't be done for long types.
The code is here: 
http://voxel.jouy.inra.fr/darcs/contrib-itk/histoErodeDilate/itkMovingHistogramMorphologyImageFilter.h

I suppose I can define a is_small_integer trait. Something like:

  template <class T> struct Trait { static const bool is_small_integer = 
false; };
  template <unsigned char> struct Trait { static const bool is_small_integer = 
true; };
  template <signed char> struct Trait { static const bool is_small_integer = 
true; };
...

and then

  void AddPixel(const TInputPixel &p)
     {
     AddPixel(Dispatch<Trait<TInputPixel>::is_small_integer>, p);
     }

I'll try :-)

Gaetan


>
> -----Original Message-----
> From: Gaetan Lehmann [mailto:gaetan.lehmann at jouy.inra.fr]
> Sent: Monday, March 13, 2006 10:38 AM
> To: Miller, James V (GE, Research); insight-developers at itk.org
> Subject: Re: [Insight-developers] Use one algorithm or another in a
> filter,depending of the pixel type
>
>
>
> Jim,
>
> I have used the following code to run the specialized version for some
> types:
>
>    inline void AddPixel( const TInputPixel &p )
>      {
>      if( useVectorBasedAlgorithm() )
>        { AddPixelVector( p ); }
>      else
>        { AddPixelMap( p ); }
>      }
>
>    inline bool useVectorBasedAlgorithm()
>      {
>      // bool, short and char are acceptable for vector based algorithm:
> they do not require
>      // too much memory. Other types are not usable with that algorithm
>      return typeid(TInputPixel) == typeid(unsigned char)
>
>          || typeid(TInputPixel) == typeid(signed char)
>          || typeid(TInputPixel) == typeid(unsigned short)
>          || typeid(TInputPixel) == typeid(signed short)
>          || typeid(TInputPixel) == typeid(bool);
>
>      }
>
> While it is less elegant than the overloaded implementation you proposed,
> it also let me easily specify a set of types usable with my specialized
> algorithm - I don't think it can be done easily with the overloaded
> implementation.
> The bad point is that I had to do some static_cast in the code specialized
> for integer types to avoid warnings with real types - I guess that's not
> needed with overloaded implementation.
>
> Anyway, that specialization give me an execution time about 4 times
> shorter better than with the general algorithm, which is very nice :-)
>
> Gaetan
>
> On Mon, 13 Mar 2006 15:17:14 +0100, Miller, James V (GE, Research)
>
> <millerjv at crd.ge.com> wrote:
> > Gaetan,
> >
> > This can be done.  There is a certain pattern to follow that makes this
> > tractable.
> > We call this a "dispatch" pattern.  Basically, you create a set of
> > overloaded functions.
> > For instance, in itkMinMaxCurvatureFlowFunction, the dispatch pattern is
> > used to
> > call either a 2D specific implementation, a 3D specific implementation,
> > or a general
> > ND implementation. The same can be done for pixel types.  The pattern
> > creates
> > a heirarchy of dispatch types so that the general case ends up calling an
> > function overloaded on the root dispatch type.  Subclasses of the
> > dispatch
> > type are used to provided overloaded functions for specific types.
> >
> > Here is the design from MinMaxCurvatureFlowFunction
> >
> >   struct DispatchBase {};
> >   template<signed int VDimension>
> >   struct Dispatch : DispatchBase {};
> >  /** This method computes the threshold by averaging the intensity
> >    *  in direction perpendicular to the image gradient. */
> >   virtual PixelType ComputeThreshold( const Dispatch<2> &,
> >                                       const NeighborhoodType &
> > neighborhood ) const;
> >   virtual PixelType ComputeThreshold( const Dispatch<3> &,
> >                                       const NeighborhoodType &
> > neighborhood ) const;
> >   virtual PixelType ComputeThreshold( const DispatchBase &,
> >                                       const NeighborhoodType &
> > neighborhood ) const;
> >
> > The appropriate function is called by the main entry point
> >
> >   threshold = this->ComputeThreshold( Dispatch<ImageDimension>(), it);
> >
> > This pattern will force only one of the overloaded functions to be
> > instantiated.  The
> > same pattern can be used for pixel types (a DispatchBase class and a
> > Dispatch<short>, etc.).
> >
> > Jim
> >
> >
> > -----Original Message-----
> > From: insight-developers-bounces+millerjv=crd.ge.com at itk.org
> > [mailto:insight-developers-bounces+millerjv=crd.ge.com at itk.org]On Behalf
> > Of Gaetan Lehmann
> > Sent: Sunday, March 12, 2006 10:21 AM
> > To: insight-developers at itk.org
> > Subject: [Insight-developers] Use one algorithm or another in a
> > filter,depending of the pixel type
> >
> >
> >
> > Hi,
> >
> > Lots of algorithm can be implemented a lots more efficiently with some
> > pixels
> > types - most of the time with char and short (signed or not).
> > Is it possible automatically choose the algorithm used in a filter,
> > depending
> > of the pixel type ?
> > If yes, can it be done at build time ?
> >
> > Regards,
> >
> > Gaetan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 191 bytes
Desc: not available
Url : http://www.itk.org/mailman/private/insight-developers/attachments/20060314/00252f4a/attachment.pgp


More information about the Insight-developers mailing list