99#include <vigra/multi_array.hxx>
100#include <vigra/accumulator.hxx>
101#include <vigra/multi_math.hxx>
112template <
typename T >
115 return std::abs ( t ) ;
118template <
typename T >
121 return sqrt ( sum ( t * t ) ) / t.size() ;
124template <
typename T >
125double condense (
const std::complex<T> & t , std::false_type )
127 return std::abs ( t ) ;
133 < std::is_fundamental < T > :: value ,
138template <
typename T >
150template <
unsigned int dim ,
typename T >
151double check_diff ( vigra::MultiArrayView < dim , T > & reference ,
152 vigra::MultiArrayView < dim , T > & candidate ,
156 using namespace vigra::multi_math ;
157 using namespace vigra::acc;
159 assert ( reference.shape() == candidate.shape() ) ;
161 vigra::MultiArray < 1 , double >
162 error_array ( vigra::Shape1(reference.size() ) ) ;
164 for (
int i = 0 ; i < reference.size() ; i++ )
166 auto help = candidate[i] - reference[i] ;
167 error_array [ i ] =
condense ( help ) ;
170 AccumulatorChain < double , Select < Mean, Maximum > > ac ;
171 extractFeatures ( error_array.begin() , error_array.end() , ac ) ;
172 double mean = get<Mean>(ac) ;
173 double max = get<Maximum>(ac) ;
176 std::cout <<
"rel. error Mean: " << mean / value_extent
177 <<
" rel. error Max: " << max / value_extent << std::endl;
184#define ast(x) std::integral_constant<int,x>
189template <
unsigned int cf_dim ,
190 unsigned int trg_dim ,
195 typename math_ele_type >
196void test (
int spline_degree = 3 ,
205 double tolerance = std::is_integral < ele_type > :: value
213 double value_extent = std::is_integral < ele_type > :: value
214 ?
sizeof ( ele_type ) == 2
216 :
sizeof ( ele_type ) == 4
218 :
sizeof ( ele_type ) == 8
223 typedef typename vigra::MultiArrayShape<cf_dim>::type cf_shape_t ;
224 typedef typename vigra::MultiArrayShape<trg_dim>::type trg_shape_t ;
226 typedef typename std::conditional
229 vigra::TinyVector < ele_type , chn >
232 typedef typename std::conditional
235 vigra::TinyVector < rc_type , cf_dim >
240 cf_shape_t cf_shape { 99 } ;
242 vigra::MultiArray < cf_dim , dtype >
243 original ( cf_shape ) ;
245 vigra::MultiArray < cf_dim , dtype >
246 restored ( cf_shape ) ;
250 trg_shape_t trg_shape { 101 } ;
252 vigra::MultiArray < trg_dim , crd_type >
253 coordinates ( trg_shape ) ;
255 vigra::MultiArray < 1 , rc_type >
258 vigra::MultiArray < trg_dim , dtype >
259 target ( trg_shape ) ;
261 vigra::MultiArray < trg_dim , double >
262 d_target ( trg_shape ) ;
264 cf_shape_t gcf_shape { 101 } ;
265 vigra::MultiArray < cf_dim , dtype >
266 ge_target ( gcf_shape ) ;
268 vigra::MultiArray < cf_dim , dtype >
269 ge_target_2 ( gcf_shape ) ;
279 std::random_device rd ;
280 std::mt19937 gen ( rd() ) ;
281 std::uniform_real_distribution<> dis ( - value_extent , value_extent ) ;
282 auto data_ele_view = original.expandElements ( 0 ) ;
283 for (
auto & e : data_ele_view )
292 std::uniform_real_distribution<> crd_dis ( -300.0 , 300.0 ) ;
293 auto crd_ele_view = coordinates.expandElements ( 0 ) ;
294 for (
auto & e : crd_ele_view )
295 e = crd_dis ( gen ) ;
301 std::uniform_real_distribution<> crd1_dis ( 98.0 ) ;
302 for (
auto & e : crd_1d )
303 e = crd1_dis ( gen ) ;
306 for (
int d = 0 ; d < cf_dim ; d++ )
307 grid [ d ] = crd_1d ;
313 vigra::TinyVector < vspline::bc_code , cf_dim > bcv ( bc ) ;
323 bspl.template prefilter < dtype , math_ele_type , vsz >
329 enum { ev_vsz = vsz } ;
346 auto it = target.begin() ;
348 for (
auto const & e : coordinates )
351 assert (
condense ( *it - ev ( e ) ) <= tolerance ) ;
361 math_ele_type ,
double >
366 auto itd = d_target.begin() ;
368 for (
auto const & e : coordinates )
370 auto cnd =
condense ( *itd - evd ( e ) ) ;
371 if ( cnd > tolerance )
372 std::cout <<
"**** consensed: " << cnd
373 <<
" gt. tolerance " << tolerance << std::endl ;
374 assert ( cnd <= tolerance ) ;
383 < crd_type ,
dtype , ev_vsz , -1 , math_ele_type >
398 auto & cc = reinterpret_cast
399 < vigra::TinyVector < rc_type , cf_dim > & > ( c ) ;
401 vigra::MultiCoordinateIterator < cf_dim > mci ( gcf_shape ) ;
402 auto itg2 = ge_target_2.begin() ;
404 for (
auto & ref : ge_target )
408 for (
int d = 0 ; d < cf_dim ; d++ )
409 cc [ d ] = grid [ d ] [ (*mci) [ d ] ] ;
419 assert (
condense ( ref - gev(c) ) <= tolerance ) ;
420 assert (
condense ( ref - *itg2 ) <= tolerance ) ;
443 vspline::restore < cf_dim , dtype , math_ele_type , vsz > ( bspl ) ;
449 check_diff ( original , restored , value_extent ) ;
453template <
typename vsz_t ,
457 typename ... other_types >
460 enum { vsz = vsz_t::value } ;
461 enum { chn = chn_t::value } ;
462 enum { trg_dim = trg_dim_t::value } ;
463 enum { cf_dim = cf_dim_t::value } ;
465 std::cout <<
"vsz " << vsz
467 <<
" trg_dim " << trg_dim
468 <<
" cf_dim " << cf_dim << std::endl ;
480 std::cout <<
"float crd, float value " << std::endl ;
487 std::cout <<
"float crd, short value " << std::endl ;
492 std::cout <<
"float crd, int value " << std::endl ;
501 std::cout <<
"double crd, long value " << std::endl ;
509 std::cout <<
"double crd, double value " << std::endl ;
517 std::cout <<
"long double crd, long double value " << std::endl ;
519 test < cf_dim , trg_dim , chn , vsz ,
520 long double ,
long double ,
long double >
532template <
typename ... other_types >
538 doit <
ast(1) , other_types ... >() ;
541 doit <
ast(3) , other_types ... >() ;
544 doit <
ast(4) , other_types ... >() ;
547 doit <
ast(8) , other_types ... >() ;
550 doit <
ast(16) , other_types ... >() ;
557template <
typename ... other_types >
563 set_vsz <
ast(1) , other_types ... > ( vsz ) ;
566 set_vsz <
ast(2) , other_types ... > ( vsz ) ;
569 set_vsz <
ast(3) , other_types ... > ( vsz ) ;
576template <
typename ... other_types >
582 set_chn <
ast(1) , other_types ... > ( chn , vsz ) ;
585 set_chn <
ast(2) , other_types ... > ( chn , vsz ) ;
592template <
typename ... other_types >
593void set_cf_dim (
int cf_dim ,
int trg_dim ,
int chn ,
int vsz )
598 set_trg_dim <
ast(1) , other_types ... > ( trg_dim , chn , vsz ) ;
601 set_trg_dim <
ast(2) , other_types ... > ( trg_dim , chn , vsz ) ;
612int main (
int argc ,
char * argv[] )
614 std::cout << std::fixed << std::showpos << std::showpoint
615 << std::setprecision(18);
616 std::cerr << std::fixed << std::showpos << std::showpoint
617 << std::setprecision(18);
619 for (
int cf_dim = 1 ; cf_dim <=
CF_DIM_MAX ; cf_dim++ )
621 for (
int trg_dim = 1 ; trg_dim <=
TRG_DIM_MAX ; trg_dim++ )
623 for (
int chn = 1 ; chn <=
CHN_MAX ; chn++ )
633 std::cout <<
"terminating" << std::endl ;
vspline::bspline< pixel_type, 2 > spline_type
class evaluator encodes evaluation of a spline-like object. This is a generalization of b-spline eval...
typename std::conditional< std::is_fundamental< T > ::value, std::true_type, std::false_type > ::type is_singular
void transform(const unary_functor_type &functor, const vigra::MultiArrayView< dimension, typename unary_functor_type::in_type > &input, vigra::MultiArrayView< dimension, typename unary_functor_type::out_type > &output, int njobs=vspline::default_njobs, vspline::atomic< bool > *p_cancel=0)
implementation of two-array transform using wielding::coupled_wield.
vspline::grok_type< bspl_coordinate_type< spline_type, rc_type >, result_type, _vsize > make_safe_evaluator(const spline_type &bspl, vigra::TinyVector< int, spline_type::dimension > dspec=vigra::TinyVector< int, spline_type::dimension >(0), int shift=0)
make_safe_evaluator is a factory function, producing a functor which provides safe access to an evalu...
bc_code
This enumeration is used for codes connected to boundary conditions. There are two aspects to boundar...
vigra::TinyVector< vigra::MultiArrayView< 1, rc_ele_type >, dimension > grid_spec
int main(int argc, char *argv[])
void set_cf_dim(int cf_dim, int trg_dim, int chn, int vsz)
void set_trg_dim(int trg_dim, int chn, int vsz)
void set_chn(int chn, int vsz)
void test(int spline_degree=3, vspline::bc_code bc=vspline::MIRROR)
double check_diff(vigra::MultiArrayView< dim, T > &reference, vigra::MultiArrayView< dim, T > &candidate, double value_extent)
double condense(const T &t, std::true_type)
class bspline now builds on class bspline_base, adding coefficient storage, while bspline_base provid...
includes all headers from vspline (most of them indirectly)