30 #include <visir_utils.h>
34 #include "visir_serialize.c"
42 #define CONCAT(a,b) a ## _ ## b
43 #define CONCAT2X(a,b) CONCAT(a,b)
45 #define PIXEL_TYPE double
46 #define STDEV_TYPE CPL_TYPE_DOUBLE
47 #define PIXEL_TYPE_CPL CPL_TYPE_DOUBLE
48 static size_t prnok_nz = 0;
49 static double * prnok = NULL;
50 #include "../recipes/visir_util_clip_body.c"
56 #define IND(x,y,nx) ((x) + (y) * (nx))
58 size_t visir_get_next_regular(
size_t a);
60 static void visir_serialize_test(
void);
61 static void visir_macro_test(
void);
62 static void visir_bound_test(
void);
63 static void visir_get_kth_test(
void);
64 static void visir_clip_kappa_sigma_test(
void);
65 static void visir_fftxcorrelate_test(
void);
66 static void visir_interpolate_rejected_test(
void);
67 static void visir_num_threads_test(
void);
68 static void visir_mean_fast_test(
void);
69 static void visir_next_regular_test(
void);
70 static void visir_test_parallel_median(
void);
71 static void visir_test_linintp_values(
void);
81 #define LEN(a) sizeof((a))/sizeof((a)[0])
86 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
87 visir_serialize_test();
91 visir_clip_kappa_sigma_test();
92 visir_fftxcorrelate_test();
93 visir_interpolate_rejected_test();
94 visir_num_threads_test();
95 visir_mean_fast_test();
96 visir_next_regular_test();
97 visir_test_parallel_median();
98 visir_test_linintp_values();
100 return cpl_test_end(0);
104 static void visir_num_threads_test(
void)
108 stream = cpl_msg_get_level() > CPL_MSG_INFO
109 ? fopen(
"/dev/null",
"a") : stdout;
112 const char * orig = getenv(
"OMP_NUM_THREADS");
113 unsetenv(
"OMP_NUM_THREADS");
114 cpl_test_lt(0, visir_get_num_threads(CPL_FALSE));
115 unsetenv(
"OMP_NUM_THREADS");
116 cpl_test_lt(0, visir_get_num_threads(CPL_FALSE));
117 setenv(
"OMP_NUM_THREADS",
"1", 1);
118 cpl_test_eq(visir_get_num_threads(CPL_FALSE), 1);
119 setenv(
"OMP_NUM_THREADS",
"3", 1);
120 cpl_test_eq(visir_get_num_threads(CPL_FALSE), 3);
121 setenv(
"OMP_NUM_THREADS",
"-3", 1);
122 cpl_test_eq(visir_get_num_threads(CPL_FALSE), 1);
123 setenv(
"OMP_NUM_THREADS",
"4ghdsg", 1);
124 cpl_test_eq(visir_get_num_threads(CPL_FALSE), 4);
125 setenv(
"OMP_NUM_THREADS",
"ghdsg", 1);
126 cpl_test_eq(visir_get_num_threads(CPL_FALSE), 1);
127 setenv(
"OMP_NUM_THREADS",
"490348563984693763894", 1);
128 cpl_test_lt(0, visir_get_num_threads(CPL_FALSE));
129 setenv(
"OMP_NUM_THREADS",
"20000", 1);
130 cpl_test_lt(0, visir_get_num_threads(CPL_TRUE));
131 cpl_test_lt(visir_get_num_threads(CPL_TRUE), 20000);
133 setenv(
"OMP_NUM_THREADS", orig, 1);
135 unsetenv(
"OMP_NUM_THREADS");
138 cpl_test_nonnull( stream );
139 if (stream != stdout) cpl_test_zero( fclose(stream) );
142 static void visir_serialize_test(
void)
146 stream = cpl_msg_get_level() > CPL_MSG_INFO
147 ? fopen(
"/dev/null",
"a") : stdout;
150 char * block = cpl_malloc(5);
152 serialize_string(wstream,
"12345");
153 serialize_uint32(wstream, 12345);
155 visir_stream_new(wstream->base_buffer, 0);
157 char * rs = deserialize_string(rstream);
158 int ri = deserialize_uint32(rstream);
159 cpl_test(strcmp(rs,
"12345") == 0);
160 cpl_test_eq(ri, 12345);
162 cpl_free(rstream->base_buffer);
167 cpl_frameset * frames = cpl_frameset_new();
169 char * s = visir_frameset_serialize(frames, NULL);
170 cpl_test_eq_ptr(s, NULL);
171 cpl_test_error(CPL_ERROR_NULL_INPUT);
173 s = visir_frameset_serialize(frames, &size);
174 cpl_frameset * d = visir_frameset_deserialize(s, NULL);
175 cpl_test_eq(cpl_frameset_get_size(frames), cpl_frameset_get_size(d));
176 cpl_frameset_delete(d);
180 for (
int i = 0; i < 17; i++) {
181 cpl_frame * frm = cpl_frame_new();
182 cpl_frame_set_tag(frm,
"test");
183 cpl_frame_set_group(frm, CPL_FRAME_GROUP_PRODUCT);
184 cpl_frame_set_level(frm, CPL_FRAME_LEVEL_FINAL);
185 cpl_frame_set_type(frm, CPL_FRAME_TYPE_TABLE);
186 cpl_frame_set_filename(frm,
"filename.fits");
187 cpl_frameset_insert(frames, frm);
189 frm = cpl_frame_new();
190 cpl_frame_set_tag(frm,
"tsdfasfijiotw3ty");
191 cpl_frame_set_group(frm, CPL_FRAME_GROUP_PRODUCT);
192 cpl_frame_set_level(frm, CPL_FRAME_LEVEL_INTERMEDIATE);
193 cpl_frame_set_type(frm, CPL_FRAME_TYPE_IMAGE);
194 cpl_frame_set_filename(frm,
"folder/fiename.fits");
195 cpl_frameset_insert(frames, frm);
197 frm = cpl_frame_new();
198 cpl_frame_set_tag(frm,
"TSDFASFIJIOTW3TY");
199 cpl_frame_set_group(frm, CPL_FRAME_GROUP_RAW);
200 cpl_frame_set_level(frm, CPL_FRAME_LEVEL_TEMPORARY);
201 cpl_frame_set_type(frm, CPL_FRAME_TYPE_PAF);
202 cpl_frame_set_filename(frm,
"/folder/fiename.fits");
203 cpl_frameset_insert(frames, frm);
206 s = visir_frameset_serialize(frames, &size);
207 cpl_test_lt(0, size);
209 d = visir_frameset_deserialize(s, &size2);
210 cpl_test_eq(cpl_frameset_get_size(frames), cpl_frameset_get_size(d));
211 cpl_test_eq(size, size2);
213 for (cpl_size i = 0; i < cpl_frameset_get_size(d); i++) {
214 const cpl_frame * nfrm = cpl_frameset_get_position_const(d, i);
215 const cpl_frame * ofrm = cpl_frameset_get_position_const(frames, i);
216 cpl_test_eq(cpl_frame_get_group(ofrm), cpl_frame_get_group(nfrm));
217 cpl_test_eq(cpl_frame_get_level(ofrm), cpl_frame_get_level(nfrm));
218 cpl_test_eq(cpl_frame_get_type(ofrm), cpl_frame_get_type(nfrm));
219 cpl_test_zero(strcmp(cpl_frame_get_tag(ofrm),
220 cpl_frame_get_tag(nfrm)));
221 cpl_test_zero(strcmp(cpl_frame_get_filename(ofrm),
222 cpl_frame_get_filename(nfrm)));
226 cpl_frameset_delete(frames);
227 cpl_frameset_delete(d);
230 cpl_test_nonnull( stream );
232 if (stream != stdout) cpl_test_zero( fclose(stream) );
236 static void visir_macro_test(
void)
240 stream = cpl_msg_get_level() > CPL_MSG_INFO
241 ? fopen(
"/dev/null",
"a") : stdout;
247 cx_list * l = cx_list_new();
248 for (i = 0; i < LEN(a); i++)
249 cx_list_push_back(l, (
void*)&a[i]);
253 cpl_test_eq_ptr(&a[i++], cx_list_get(l, it));
255 cpl_test_eq(i, LEN(a));
256 cpl_test_eq((
size_t)cx_list_size(l), LEN(a));
259 FOR_EACH_T(
void * p, l)
260 cpl_test_eq_ptr(&a[i++], p);
262 cpl_test_eq(i, LEN(a));
263 cpl_test_eq((
size_t)cx_list_size(l), LEN(a));
268 cpl_test_nonnull( stream );
270 if (stream != stdout) cpl_test_zero( fclose(stream) );
275 static
void visir_bound_test(
void)
279 stream = cpl_msg_get_level() > CPL_MSG_INFO
280 ? fopen(
"/dev/null",
"a") : stdout;
283 cpl_vector * v = cpl_vector_new(10);
284 cpl_vector_fill(v, 0.);
285 cpl_test_eq(visir_lower_bound(v, 0.), 0);
286 cpl_test_eq(visir_upper_bound(v, 0.), 10);
287 cpl_vector_delete(v);
290 double d[] = {1., 1., 2., 3., 3., 4., 5., 5.};
291 cpl_vector * v = cpl_vector_wrap(LEN(d), d);
292 cpl_test_eq(visir_lower_bound(v, 0.), 0);
293 cpl_test_eq(visir_lower_bound(v, 1.), 0);
294 cpl_test_eq(visir_lower_bound(v, 1.1), 2);
295 cpl_test_eq(visir_lower_bound(v, 2.), 2);
296 cpl_test_eq(visir_lower_bound(v, 2.1), 3);
297 cpl_test_eq(visir_lower_bound(v, 5.), LEN(d) - 2);
298 cpl_test_eq(visir_lower_bound(v, 6.), LEN(d));
300 cpl_test_eq(visir_upper_bound(v, 0.), 0);
301 cpl_test_eq(visir_upper_bound(v, 1.), 2);
302 cpl_test_eq(visir_upper_bound(v, 1.1), 2);
303 cpl_test_eq(visir_upper_bound(v, 2.), 3);
304 cpl_test_eq(visir_upper_bound(v, 2.1), 3);
305 cpl_test_eq(visir_upper_bound(v, 4.), LEN(d) - 2);
306 cpl_test_eq(visir_upper_bound(v, 5.), LEN(d));
307 cpl_test_eq(visir_upper_bound(v, 6.), LEN(d));
308 cpl_vector_unwrap(v);
311 cpl_test_nonnull( stream );
313 if (stream != stdout) cpl_test_zero( fclose(stream) );
317 static void visir_get_kth_test(
void)
322 stream = cpl_msg_get_level() > CPL_MSG_INFO
323 ? fopen(
"/dev/null",
"a") : stdout;
328 for (
size_t i = 0; i < LEN(a); i++)
330 for (
size_t i = 0; i < LEN(a); i++) {
331 res = cpl_tools_get_kth_double(a, LEN(a), i);
335 for (
size_t i = 0; i < LEN(a); i++)
337 for (
size_t i = 0; i < LEN(a); i++) {
338 res = cpl_tools_get_kth_double(a, LEN(a), i);
342 for (
size_t i = 0; i < LEN(a); i++)
344 for (
size_t i = 0; i < LEN(a); i++) {
345 res = cpl_tools_get_kth_double(a, LEN(a), i);
346 cpl_test_eq((
double)i - LEN(a) + 1., res);
351 double a[] = {3,1,4,2,0,9,7,8,6,5};
352 res = cpl_tools_get_kth_double(a, LEN(a), 4);
354 for (
size_t i = 0; i < LEN(a) / 2; i++)
355 cpl_test_leq(a[i], 4);
356 for (
size_t i = LEN(a)/2; i < LEN(a); i++)
357 cpl_test_lt(4, a[i]);
361 double a[] = {8,5,9,2,0,4,6,3,7,1};
362 res = cpl_tools_get_kth_double(a, LEN(a), 2);
364 res = cpl_tools_get_kth_double(a, LEN(a), 7);
367 cpl_test_eq(9, a[LEN(a) - 1]);
368 cpl_test_eq(8, a[LEN(a) - 2]);
369 cpl_test_eq(0, a[0]);
370 cpl_test_eq(1, a[1]);
374 double a[] = {8,5,9,2,0,4,6,3,7,1};
375 res = cpl_tools_get_kth_double(a, LEN(a), 7);
377 res = cpl_tools_get_kth_double(a, LEN(a), 2);
380 cpl_test_eq(9, a[LEN(a) - 1]);
381 cpl_test_eq(8, a[LEN(a) - 2]);
382 cpl_test_eq(0, a[0]);
383 cpl_test_eq(1, a[1]);
386 cpl_test_nonnull( stream );
388 if (stream != stdout) cpl_test_zero( fclose(stream) );
392 static void visir_clip_kappa_sigma_test(
void)
397 stream = cpl_msg_get_level() > CPL_MSG_INFO
398 ? fopen(
"/dev/null",
"a") : stdout;
400 cpl_test_nonnull( stream );
403 double * pixels = cpl_calloc(9,
sizeof(
double));
404 int shifts[3 * 2] = {0};
405 pixels[1 + 3 * 1] = 1;
407 cpl_imagelist * list = cpl_imagelist_new();
408 cpl_imagelist * dev = cpl_imagelist_new();
410 cpl_image* img = cpl_image_wrap_double(3, 3, pixels);
411 cpl_imagelist_set(list, img, 0);
412 img = cpl_image_duplicate(img);
413 cpl_imagelist_set(list, img, 1);
414 img = cpl_image_duplicate(img);
415 cpl_imagelist_set(list, img, 2);
417 visir_util_clip_kappa_sigma_double(list, dev, 1.0, 3, 3, shifts);
419 cpl_image * map = cpl_image_new_from_accepted(list);
420 cpl_test_eq(3, cpl_image_get(map, 2, 2, &dump));
422 cpl_image_delete(map);
423 cpl_imagelist_delete(list);
424 cpl_imagelist_delete(dev);
429 double * pixels = cpl_calloc(9,
sizeof(
double));
431 int values[] = {92, 93, 94, 94, 95, 95, 96, 96, 96, 97,
432 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
433 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
434 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
435 104, 105, 105, 106, 106, 107, 108 };
436 int shifts[LEN(values) * 2] = {0};
438 cpl_imagelist * list = cpl_imagelist_new();
439 cpl_imagelist * dev = cpl_imagelist_new();
441 cpl_image* img = cpl_image_wrap_double(3, 3, pixels);
442 for (
size_t i = 0; i < LEN(values); i++) {
443 cpl_image_set(img, 2, 2, values[i]);
444 cpl_imagelist_set(list, img, i);
445 img = cpl_image_duplicate(img);
447 cpl_image_delete(img);
449 visir_util_clip_kappa_sigma_double(list, dev, 1.0, 3, 3, shifts);
451 cpl_image * map = cpl_image_new_from_accepted(list);
452 cpl_test_eq(LEN(values), cpl_image_get(map, 2, 2, &dump));
454 cpl_image_delete(map);
455 cpl_imagelist_delete(list);
456 cpl_imagelist_delete(dev);
460 double * pixels = cpl_calloc(9,
sizeof(
double));
462 int values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
463 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
464 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
465 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
466 104, 105, 105, 106, 106, 107, 108 };
467 int shifts[LEN(values) * 2] = {0};
469 cpl_imagelist * list = cpl_imagelist_new();
470 cpl_imagelist * dev = cpl_imagelist_new();
472 cpl_image* img = cpl_image_wrap_double(3, 3, pixels);
473 for (
size_t i = 0; i < LEN(values); i++) {
474 cpl_image_set(img, 2, 2, values[i]);
475 cpl_imagelist_set(list, img, i);
476 img = cpl_image_duplicate(img);
478 cpl_image_delete(img);
480 visir_util_clip_kappa_sigma_double(list, dev, 1.0, 3, 3, shifts);
482 cpl_image * map = cpl_image_new_from_accepted(list);
486 cpl_test_eq(LEN(values) - 2, cpl_image_get(map, 2, 2, &dump));
488 cpl_image_delete(map);
489 cpl_imagelist_delete(list);
490 cpl_imagelist_delete(dev);
494 double * pixels = cpl_calloc(9,
sizeof(
double));
495 cpl_msg_info(cpl_func,
"-----------------");
496 int values[] = { -3, 10, 10, 10, 10, 10, 10, 10 };
497 int shifts[LEN(values) * 2] = {0};
499 cpl_imagelist * list = cpl_imagelist_new();
500 cpl_imagelist * dev = cpl_imagelist_new();
502 cpl_image* origimg = cpl_image_wrap_double(3, 3, pixels);
503 for (
size_t i = 0; i < LEN(values); i++) {
504 cpl_image * img = cpl_image_duplicate(origimg);
506 cpl_image_set(img, 1, 2, values[i]);
510 cpl_image_set(img, 2, 3, values[i]);
511 shifts[i * 2 + 1] = 1;
514 cpl_image_set(img, 3, 1, values[i]);
516 shifts[i * 2 + 1] = -1;
519 cpl_image_set(img, 2, 2, values[i]);
520 cpl_imagelist_set(list, img, i);
522 cpl_image_delete(origimg);
524 visir_util_clip_kappa_sigma_double(list, dev, 1.0, 2, 2, shifts);
526 cpl_image * map = cpl_image_new_from_accepted(list);
531 cpl_test_eq(LEN(values) - 2, cpl_image_get(map, 1, 1, &dump));
532 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 1, 2, &dump));
533 cpl_test_eq(LEN(values) - 2, cpl_image_get(map, 1, 3, &dump));
534 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 2, 1, &dump));
535 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 2, 2, &dump));
536 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 2, 3, &dump));
537 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 3, 1, &dump));
538 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 3, 2, &dump));
539 cpl_test_eq(LEN(values) - 2, cpl_image_get(map, 3, 3, &dump));
542 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 2, 2, &dump));
544 cpl_image_delete(map);
545 cpl_imagelist_delete(list);
546 cpl_imagelist_delete(dev);
551 double * pixels = cpl_calloc(9,
sizeof(
double));
553 int values[] = {1, 150, -94, 94, 95, 95, 96, 96, 96, 97,
554 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
555 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
556 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
557 104, 105, 105, 106, 106, 107, 108 };
558 int shifts[LEN(values) * 2] = {0};
561 cpl_image * out1, * out2;
563 cpl_imagelist * list = cpl_imagelist_new();
564 cpl_imagelist * dev = cpl_imagelist_new();
566 cpl_image* img = cpl_image_wrap_double(3, 3, pixels);
567 for (
size_t i = 0; i < LEN(values); i++) {
568 cpl_image_set(img, 2, 2, values[i]);
569 cpl_imagelist_set(list, img, i);
570 img = cpl_image_duplicate(img);
572 cpl_image_delete(img);
573 out1 = cpl_imagelist_get(list, 1);
574 out2 = cpl_imagelist_get(list, 2);
575 cpl_image_set(out1, 2, 2, 0);
576 cpl_image_set(out1, 3, 2, -94);
577 cpl_image_set(out2, 2, 2, 0);
578 cpl_image_set(out2, 3, 2, 150);
580 visir_util_clip_kappa_sigma_double(list, dev, 1.0, 3, 3, shifts);
582 cpl_image * map = cpl_image_new_from_accepted(list);
586 cpl_test_eq(LEN(values) - 1, cpl_image_get(map, 2, 2, &dump));
587 cpl_test_eq(LEN(values) - 2, cpl_image_get(map, 3, 2, &dump));
589 cpl_image_get(out1, 3, 2, &dump);
590 cpl_test_eq(dump, 1);
592 cpl_image_get(out2, 3, 2, &dump);
593 cpl_test_eq(dump, 1);
595 cpl_image_delete(map);
596 cpl_imagelist_delete(list);
597 cpl_imagelist_delete(dev);
602 if (stream != stdout) cpl_test_zero( fclose(stream) );
606 static void visir_fftxcorrelate_test(
void)
610 stream = cpl_msg_get_level() > CPL_MSG_INFO
611 ? fopen(
"/dev/null",
"a") : stdout;
613 cpl_test_nonnull( stream );
615 double xshift = 0, yshift = 0;
616 double max_correlation;
617 double * values = cpl_calloc(16,
sizeof(
double));
620 values[IND(2,2,4)] = 1;
621 cpl_image * tmp = cpl_image_wrap_double(4, 4, values);
622 values = cpl_calloc(16,
sizeof(
double));
623 values[IND(3,3,4)] = 1;
624 cpl_image * img2 = cpl_image_wrap_double(4, 4, values);
626 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
627 &max_correlation, NULL);
628 cpl_test_eq(CPL_ERROR_NONE, err);
630 cpl_test_rel(1, xshift, 0.05);
631 cpl_test_rel(1, yshift, 0.05);
633 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE,
634 &xshift, NULL, NULL, NULL);
635 cpl_test_eq(CPL_ERROR_NONE, err);
636 cpl_test_rel(1, xshift, 0.05);
638 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE,
639 NULL, &yshift, NULL, NULL);
640 cpl_test_eq(CPL_ERROR_NONE, err);
641 cpl_test_rel(1, yshift, 0.05);
643 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, NULL, NULL,
644 &max_correlation, NULL);
645 cpl_test_eq(CPL_ERROR_NONE, err);
646 cpl_test_lt(0.91, max_correlation);
648 err = visir_fftxcorrelate(tmp, img2, CPL_FALSE,
649 NULL, NULL, NULL, NULL);
650 cpl_test_eq(CPL_ERROR_NONE, err);
652 cpl_image_delete(tmp);
653 cpl_image_delete(img2);
658 double xshift = 0, yshift = 0;
659 double max_correlation;
660 double * values = cpl_calloc(N*(N+5),
sizeof(
double));
663 values[IND(5,5,N)] = 1;
664 values[IND(5,6,N)] = 9;
665 values[IND(3,5,N)] = 2;
666 values[IND(3,7,N)] = -3;
667 cpl_image * tmp = cpl_image_wrap_double(N,N+5, values);
668 cpl_image * img2 = cpl_image_duplicate(tmp);
670 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
671 &max_correlation, NULL);
672 cpl_test_eq(CPL_ERROR_NONE, err);
674 cpl_test_rel(1, xshift + 1, 0.05);
675 cpl_test_rel(1, yshift + 1, 0.05);
676 cpl_test_rel(1.00, max_correlation, 0.02);
678 cpl_image_delete(tmp);
679 cpl_image_delete(img2);
684 double xshift = 0, yshift = 0;
685 double * values = cpl_calloc(N*N,
sizeof(
double));
688 values[IND(2,1,N)] = 1;
689 values[IND(2,2,N)] = 3;
690 values[IND(2,3,N)] = 2;
691 cpl_image * tmp = cpl_image_wrap_double(N, N, values);
692 values = cpl_calloc(N*N,
sizeof(
double));
693 values[IND(2,1,N)] = 0.5;
694 values[IND(2,2,N)] = 2;
695 values[IND(2,3,N)] = 2.5;
696 values[IND(2,4,N)] = 1;
697 cpl_image * img2 = cpl_image_wrap_double(N, N, values);
699 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
701 cpl_test_eq(CPL_ERROR_NONE, err);
703 cpl_test_rel(1, xshift+1, 0.05);
705 cpl_test_rel(0.5, yshift, 0.15);
707 cpl_image_delete(tmp);
708 cpl_image_delete(img2);
713 double xshift = 0, yshift = 0;
714 double max_correlation;
715 double * values = cpl_calloc(N*N,
sizeof(
double));
718 values[IND(2,1,N)] = 1;
719 values[IND(2,2,N)] = 3;
720 values[IND(2,3,N)] = 2;
721 cpl_image * tmp = cpl_image_wrap_double(N, N, values);
722 values = cpl_calloc(N*N,
sizeof(
double));
723 values[IND(3,0,N)] = 2;
724 values[IND(3,1,N)] = 2.5;
725 values[IND(3,2,N)] = 1;
726 cpl_image * img2 = cpl_image_wrap_double(N, N, values);
728 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
729 &max_correlation, NULL);
730 cpl_test_eq(CPL_ERROR_NONE, err);
732 cpl_test_rel(1, xshift, 0.05);
734 cpl_test_rel(-1.5, yshift, 0.1);
736 cpl_image_delete(tmp);
737 cpl_image_delete(img2);
741 double xshift = 0, yshift = 0;
742 double max_correlation;
743 double * values = cpl_calloc(16,
sizeof(
double));
746 values[IND(2,2,4)] = 1;
747 cpl_image * tmp = cpl_image_wrap_double(4, 4, values);
748 values = cpl_calloc(16,
sizeof(
double));
749 values[IND(3,1,4)] = 2;
750 values[IND(1,1,4)] = 200;
751 cpl_image * img2 = cpl_image_wrap_double(4, 4, values);
753 cpl_mask * m = cpl_mask_threshold_image_create(img2, 10, FLT_MAX);
754 cpl_image_reject_from_mask(img2, m);
757 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
758 &max_correlation, NULL);
759 cpl_test_eq(CPL_ERROR_NONE, err);
761 cpl_test_rel(1, xshift, 0.05);
762 cpl_test_rel(-1, yshift, 0.05);
764 cpl_image_delete(tmp);
765 cpl_image_delete(img2);
769 cpl_size Nx = 8, Ny = 4;
770 double xshift = 0, yshift = 0;
771 double max_correlation;
772 double * values = cpl_calloc(Nx*Ny,
sizeof(
double));
775 values[IND(2,1,Nx)] = 1;
776 values[IND(2,2,Nx)] = 3;
777 values[IND(2,3,Nx)] = 2;
778 cpl_image * tmp = cpl_image_wrap_double(Nx, Ny, values);
779 values = cpl_calloc(Nx*Ny,
sizeof(
double));
780 values[IND(3,0,Nx)] = 2;
781 values[IND(3,1,Nx)] = 2.5;
782 values[IND(3,2,Nx)] = 1;
783 cpl_image * img2 = cpl_image_wrap_double(Nx, Ny, values);
785 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
786 &max_correlation, NULL);
787 cpl_test_eq(CPL_ERROR_NONE, err);
789 cpl_test_rel(1, xshift, 0.05);
791 cpl_test_rel(-1.5, yshift, 0.1);
793 cpl_image_delete(tmp);
794 cpl_image_delete(img2);
798 cpl_size Nx = 18, Ny = 27;
799 double xshift = 0, yshift = 0;
800 double max_correlation = 0;
801 double * values = cpl_calloc(Nx*Ny,
sizeof(
double));
804 values[IND(5, 8,Nx)] = 1;
805 values[IND(5, 9,Nx)] = 3;
806 values[IND(5,10,Nx)] = 2;
807 values[IND(4, 9,Nx)] = 1;
808 values[IND(5, 9,Nx)] = 3;
809 values[IND(6, 9,Nx)] = 2;
810 cpl_image * tmp = cpl_image_wrap_double(Nx, Ny, values);
811 values = cpl_calloc(Nx*Ny,
sizeof(
double));
812 values[IND(4, 9,Nx)] = 1;
813 values[IND(4,10,Nx)] = 3;
814 values[IND(4,11,Nx)] = 2;
815 values[IND(3,10,Nx)] = 1;
816 values[IND(4,10,Nx)] = 3;
817 values[IND(5,10,Nx)] = 2;
818 cpl_image * img2 = cpl_image_wrap_double(Nx, Ny, values);
821 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift, &yshift,
822 &max_correlation, cache);
823 cpl_test_eq(CPL_ERROR_NONE, err);
824 cpl_test_rel(-1, xshift, 0.05);
825 cpl_test_rel(1, yshift, 0.05);
826 cpl_test_rel(1, max_correlation, 0.05);
828 double xshift2 = 0, yshift2 = 0;
829 double max_correlation2 = 0;
830 err = visir_fftxcorrelate(tmp, img2, CPL_TRUE, &xshift2, &yshift2,
831 &max_correlation2, cache);
832 cpl_test_eq(CPL_ERROR_NONE, err);
833 cpl_test_eq(xshift, xshift2);
834 cpl_test_eq(yshift, yshift2);
835 cpl_test_eq(max_correlation, max_correlation2);
837 cpl_image_delete(tmp);
838 visir_delete_fftx_cache(cache);
839 cpl_image_delete(img2);
842 if (stream != stdout) cpl_test_zero( fclose(stream) );
845 static void visir_interpolate_rejected_test(
void)
849 stream = cpl_msg_get_level() > CPL_MSG_INFO
850 ? fopen(
"/dev/null",
"a") : stdout;
852 cpl_test_nonnull( stream );
860 cpl_binary bpmdata[] = {
872 cpl_image * in = cpl_image_wrap(4, 4, CPL_TYPE_FLOAT, input);
873 cpl_mask * bpm = cpl_mask_wrap(4, 4, bpmdata);
875 cpl_image_reject_from_mask(in, bpm);
876 cpl_image * in2 = cpl_image_duplicate(in);
877 cpl_image * in3 = cpl_image_duplicate(in);
878 cpl_image * ex = cpl_image_wrap(4, 4, CPL_TYPE_FLOAT, expected);
879 size_t *buffer = NULL;
881 visir_interpolate_rejected(in, &buffer, &n);
882 cpl_test_error(CPL_ERROR_NONE);
884 cpl_test_image_abs(in, ex, 1e-6);
886 visir_interpolate_rejected(in2, &buffer, &n);
887 cpl_test_error(CPL_ERROR_NONE);
889 cpl_test_image_abs(in2, ex, 1e-6);
890 cpl_test_image_abs(in2, in, 1e-6);
892 visir_interpolate_rejected(in3, NULL, NULL);
893 cpl_test_error(CPL_ERROR_NONE);
895 cpl_test_image_abs(in3, ex, 1e-6);
896 cpl_test_image_abs(in3, in, 1e-6);
898 cpl_image_unwrap(in);
899 cpl_image_delete(in2);
900 cpl_image_delete(in3);
901 cpl_mask_unwrap(bpm);
902 cpl_image_unwrap(ex);
912 cpl_binary bpmdata[] = {
919 1.0,7.0,3.0,9.0,9.0,9.0,
920 0.0,8./3.,4./3.,1.0,1.0,1.0,
921 9.0,4.75,4.25,2.0,2.0,2.0,
922 1.0,5./3.,7./3.,3.0,0.0,2.0,
923 1.0,1.0,3.0,0.0,1.0,0.0};
926 cpl_image * in = cpl_image_wrap(6, 5, CPL_TYPE_FLOAT, input);
927 cpl_mask * bpm = cpl_mask_wrap(6, 5, bpmdata);
928 cpl_image * ex = cpl_image_wrap(6, 5, CPL_TYPE_FLOAT, expected);
930 cpl_image_reject_from_mask(in, bpm);
931 visir_interpolate_rejected(in, NULL, NULL);
932 cpl_test_error(CPL_ERROR_NONE);
934 cpl_test_image_abs(in, ex, 1e-6);
936 cpl_image_unwrap(in);
937 cpl_mask_unwrap(bpm);
938 cpl_image_unwrap(ex);
947 cpl_binary bpmdata[] = {
954 1.0,7.0,3.0,9.0,9.0,9.0,
955 0.0,7./3.,2.0,13./3.,10./3.,1.0,
956 9.0,16./3.,5.0,6.0,4.5,1.5,
957 1.0,0.0,3.0,3.0,0.0,2.0,
958 1.0,0.0,3.0,3.0,0.0,2.0};
961 cpl_image * in = cpl_image_wrap(6, 5, CPL_TYPE_FLOAT, input);
962 cpl_mask * bpm = cpl_mask_wrap(6, 5, bpmdata);
963 cpl_image * ex = cpl_image_wrap(6, 5, CPL_TYPE_FLOAT, expected);
965 cpl_image_reject_from_mask(in, bpm);
966 cpl_image * in2 = cpl_image_duplicate(in);
967 size_t *buffer = NULL;
969 visir_interpolate_rejected(in, &buffer, &n);
970 cpl_test_error(CPL_ERROR_NONE);
972 cpl_test_image_abs(in, ex, 1e-6);
974 visir_interpolate_rejected(in, &buffer, &n);
975 cpl_test_error(CPL_ERROR_NONE);
977 cpl_test_image_abs(in2, ex, 1e-6);
978 cpl_test_image_abs(in2, in, 1e-6);
980 cpl_image_unwrap(in);
981 cpl_image_delete(in2);
982 cpl_mask_unwrap(bpm);
983 cpl_image_unwrap(ex);
987 if (stream != stdout) cpl_test_zero( fclose(stream) );
990 static void visir_mean_fast_test(
void)
994 stream = cpl_msg_get_level() > CPL_MSG_INFO
995 ? fopen(
"/dev/null",
"a") : stdout;
997 cpl_test_nonnull( stream );
1000 cpl_image * im = cpl_image_new(3, 43, CPL_TYPE_FLOAT);
1001 cpl_image_add_scalar(im, 3.2);
1002 cpl_test_abs(visir_image_get_mean_fast(im), 3.2, FLT_EPSILON);
1003 cpl_image_delete(im);
1006 cpl_image * im = cpl_image_new(4, 4, CPL_TYPE_FLOAT);
1007 cpl_image_add_scalar(im, 3.2);
1008 cpl_test_abs(visir_image_get_mean_fast(im), 3.2, FLT_EPSILON);
1009 cpl_image_delete(im);
1013 {0.99226231, 0.6164352, 0.04541705, 0.94691027, 0.68742416};
1014 cpl_image * im = cpl_image_wrap(5, 1, CPL_TYPE_FLOAT, val);
1015 cpl_image_reject(im, 3, 1);
1016 cpl_test_abs(visir_image_get_mean_fast(im), 0.810758, FLT_EPSILON);
1017 cpl_image_unwrap(im);
1020 for (
size_t i = 1; i < 17; i++) {
1021 cpl_image * im = cpl_image_new(1, i, CPL_TYPE_FLOAT);
1022 cpl_image_add_scalar(im, 3.2);
1023 cpl_test_abs(visir_image_get_mean_fast(im), 3.2, FLT_EPSILON);
1024 cpl_image_reject(im, 1, i);
1026 cpl_test_eq(visir_image_get_mean_fast(im), 0.);
1029 cpl_test_abs(visir_image_get_mean_fast(im), 3.2, FLT_EPSILON);
1031 cpl_image_delete(im);
1035 if (stream != stdout) cpl_test_zero( fclose(stream) );
1038 static void visir_next_regular_test(
void)
1042 stream = cpl_msg_get_level() > CPL_MSG_INFO
1043 ? fopen(
"/dev/null",
"a") : stdout;
1045 cpl_test_nonnull( stream );
1047 cpl_test_eq(visir_get_next_regular(6), 6);
1048 cpl_test_eq(visir_get_next_regular(7), 8);
1049 cpl_test_eq(visir_get_next_regular(9), 9);
1050 cpl_test_eq(visir_get_next_regular(11), 12);
1051 cpl_test_eq(visir_get_next_regular(15), 15);
1052 cpl_test_eq(visir_get_next_regular(64), 64);
1053 cpl_test_eq(visir_get_next_regular(65), 72);
1054 cpl_test_eq(visir_get_next_regular(66), 72);
1055 cpl_test_eq(visir_get_next_regular(67), 72);
1056 cpl_test_eq(visir_get_next_regular(111), 120);
1057 cpl_test_eq(visir_get_next_regular(128), 128);
1058 cpl_test_eq(visir_get_next_regular(129), 135);
1059 cpl_test_eq(visir_get_next_regular(250), 250);
1060 cpl_test_eq(visir_get_next_regular(256), 256);
1061 cpl_test_eq(visir_get_next_regular(257), 270);
1062 cpl_test_eq(visir_get_next_regular(1023), 1024);
1063 cpl_test_eq(visir_get_next_regular(1024), 1024);
1064 cpl_test_eq(visir_get_next_regular(1025), 1080);
1065 cpl_test_eq(visir_get_next_regular(SIZE_MAX - 100), SIZE_MAX - 100);
1066 cpl_test_eq(visir_get_next_regular(SIZE_MAX), SIZE_MAX);
1068 for (cpl_size i = 0; i < 2048; i++) {
1069 size_t r = visir_get_next_regular(i);
1072 int large_primes = 0;
1074 while (r % d == 0) {
1075 large_primes += (d > 5);
1079 if (d * d > r || large_primes) {
1080 large_primes += (r > 1) && (d > 5);
1085 cpl_test_eq(large_primes, 0);
1087 if (stream != stdout) cpl_test_zero( fclose(stream) );
1090 static void visir_test_parallel_median(
void)
1094 stream = cpl_msg_get_level() > CPL_MSG_INFO
1095 ? fopen(
"/dev/null",
"a") : stdout;
1097 cpl_test_nonnull( stream );
1098 cpl_size nys[] = {1, 3, 4, 100, 105, 217};
1099 for (
size_t j = 0; j <
sizeof(nys)/
sizeof(nys[0]); j++) {
1100 cpl_size ny = nys[j];
1101 cpl_imagelist * l = cpl_imagelist_new();
1104 for (
size_t i = 0; i < n; i++) {
1105 cpl_image * img = cpl_image_new(nx, ny, CPL_TYPE_FLOAT);
1106 float * d = cpl_image_get_data_float(img);
1107 for (
size_t i = 0; i < nx * ny; i++) {
1110 cpl_image_reject(img, 1, 1);
1112 if ((rand() % 25) == 0) {
1113 cpl_image_reject(img, i % nx + 1, i / nx + 1);
1116 cpl_imagelist_set(l, img, i);
1118 cpl_msg_info(cpl_func,
"parallel median test ny: %ld", (
long)ny);
1119 cpl_image * r1 = cpl_imagelist_collapse_median_create(l);
1120 cpl_image * r2 = visir_parallel_median_collapse(l);
1121 cpl_test_image_abs(r1, r2, 0);
1122 cpl_imagelist_delete(l);
1123 cpl_image_delete(r1);
1124 cpl_image_delete(r2);
1126 cpl_test_eq_ptr(visir_parallel_median_collapse(NULL), NULL);
1127 cpl_test_error(CPL_ERROR_NULL_INPUT);
1129 cpl_imagelist * elist = cpl_imagelist_new();
1130 cpl_test_eq_ptr(visir_parallel_median_collapse(elist), NULL);
1131 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
1132 cpl_imagelist_delete(elist);
1134 if (stream != stdout) cpl_test_zero( fclose(stream) );
1137 static void visir_test_linintp_values(
void)
1141 stream = cpl_msg_get_level() > CPL_MSG_INFO
1142 ? fopen(
"/dev/null",
"a") : stdout;
1143 cpl_image * inp, * eimg, * res;
1144 double refx[] = {10, 20, 30};
1145 double refy[] = {1, 2, 1.5};
1146 size_t nref =
sizeof(refx)/
sizeof(refx[0]);
1147 cpl_vector * vrefx = cpl_vector_wrap(nref, refx);
1148 cpl_vector * vrefy = cpl_vector_wrap(nref, refy);
1149 cpl_bivector * ref = cpl_bivector_wrap_vectors(vrefx, vrefy);
1152 double data[] = {10, 20, 30, 40, 15, 25, 12, 0, 5};
1154 double edat[] = {1, 2, 1.5, 1.5, 1.5, 1.75, 1.2, 1, 1.0};
1155 inp = cpl_image_wrap(2, 4, CPL_TYPE_DOUBLE, data);
1156 eimg = cpl_image_wrap(2, 4, CPL_TYPE_DOUBLE, edat);
1157 res = visir_linintp_values(inp, ref);
1158 cpl_test_image_abs(eimg, res, 1e-7);
1159 cpl_image_unwrap(inp);
1160 cpl_image_unwrap(eimg);
1161 cpl_image_delete(res);
1163 cpl_bivector_unwrap_vectors(ref);
1164 cpl_vector_unwrap(vrefx);
1165 cpl_vector_unwrap(vrefy);
1167 if (stream != stdout) cpl_test_zero( fclose(stream) );
int main(void)
Find a plugin and submit it to some tests.