From 61b46d4b546ab3f587aed2b4016ecde02ec04948 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Thu, 23 Mar 2006 14:27:17 -0500 Subject: [svn-r12146] Purpose: bug fix Description: percent relative error was done using integer arythmetic; use floating point instead added the case for unsigned long long integer to float conversion Solution: Platforms tested: linux (32,64) AIX solaris Misc. update: --- MANIFEST | 1 + tools/h5diff/testh5diff.sh | 5 ++- tools/h5diff/testh5diff_basic.c | 7 ++- tools/lib/h5diff_array.c | 93 +++++++++++++++++++++++++++++++++------- tools/testfiles/file1.h5 | Bin 2192 -> 4368 bytes tools/testfiles/file2.h5 | Bin 2192 -> 2192 bytes tools/testfiles/file3.h5 | Bin 1408 -> 1408 bytes tools/testfiles/file4.h5 | Bin 11040 -> 11040 bytes tools/testfiles/file5.h5 | Bin 17624 -> 17624 bytes tools/testfiles/file6.h5 | Bin 17624 -> 17624 bytes tools/testfiles/file7.h5 | Bin 18616 -> 18616 bytes tools/testfiles/file8.h5 | Bin 18616 -> 18616 bytes tools/testfiles/h5diff_17.txt | 2 + tools/testfiles/h5diff_192.txt | 11 +++++ 14 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 tools/testfiles/h5diff_192.txt diff --git a/MANIFEST b/MANIFEST index ebcd2a2..017db9f 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1166,6 +1166,7 @@ ./tools/testfiles/h5diff_17.txt ./tools/testfiles/h5diff_18.txt ./tools/testfiles/h5diff_191.txt +./tools/testfiles/h5diff_192.txt ./tools/testfiles/h5diff_20.txt ./tools/testfiles/h5diff_21.txt ./tools/testfiles/h5diff_22.txt diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index 20b0f9b..4cbad3f 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -276,9 +276,12 @@ TOOLTEST h5diff_17.txt file1.h5 file2.h5 -v # 1.8 quiet mode TOOLTEST h5diff_18.txt file1.h5 file2.h5 -q -# 1.9 with -p (int) +# 1.9.1 with -p (int) TOOLTEST h5diff_191.txt file1.h5 file1.h5 -v -p 0.02 g1/dset5 g1/dset6 +# 1.9.2 with -p (unsigned long_long) +TOOLTEST h5diff_192.txt file1.h5 file1.h5 -v -p 0.02 g1/dset7 g1/dset8 + # ############################################################################## # # not comparable types diff --git a/tools/h5diff/testh5diff_basic.c b/tools/h5diff/testh5diff_basic.c index 389744d..4a99c84 100644 --- a/tools/h5diff/testh5diff_basic.c +++ b/tools/h5diff/testh5diff_basic.c @@ -251,6 +251,8 @@ int test_basic(const char *file1, const char *file2) double data4[3][2] = {{110,100},{90,80},{140,200}}; int data5[3][2] = {{100,100},{100,100},{100,100}}; int data6[3][2] = {{101,102},{103,104},{150,200}}; + unsigned long_long data7[3][2] = {{100,100},{100,100},{100,100}}; + unsigned long_long data8[3][2] = {{101,102},{103,104},{150,200}}; /*------------------------------------------------------------------------- * Create two files @@ -271,9 +273,12 @@ int test_basic(const char *file1, const char *file2) write_dset(group2_id,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4); write_dset(group2_id,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2); - /* integer relative */ + /* relative (int) */ write_dset(group1_id,2,dims,"dset5",H5T_NATIVE_INT,data5); write_dset(group1_id,2,dims,"dset6",H5T_NATIVE_INT,data6); + /* relative (unsigned long_long) */ + write_dset(group1_id,2,dims,"dset7",H5T_NATIVE_ULLONG,data7); + write_dset(group1_id,2,dims,"dset8",H5T_NATIVE_ULLONG,data8); /*------------------------------------------------------------------------- * Close diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c index ed74fd3..f17a364 100644 --- a/tools/lib/h5diff_array.c +++ b/tools/lib/h5diff_array.c @@ -39,8 +39,8 @@ #define UI_FORMAT_P "%-15u %-15u %-15u %-14f\n" #define LI_FORMAT_P "%-15ld %-15ld %-15ld %-14f\n" #define ULI_FORMAT_P "%-15lu %-15lu %-15lu %-14f\n" -#define LLI_FORMAT_P "%-15"H5_PRINTF_LL_WIDTH"d %-15"H5_PRINTF_LL_WIDTH"d %-15"H5_PRINTF_LL_WIDTH"d %-14"H5_PRINTF_LL_WIDTH"f\n" -#define ULLI_FORMAT_P "%-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"d %-14"H5_PRINTF_LL_WIDTH"u\n" +#define LLI_FORMAT_P "%-15"H5_PRINTF_LL_WIDTH"d %-15"H5_PRINTF_LL_WIDTH"d %-15"H5_PRINTF_LL_WIDTH"d %-14f\n" +#define ULLI_FORMAT_P "%-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"d %-14f\n" #define SPACES " " @@ -54,6 +54,8 @@ static void close_obj(H5G_obj_t obj_type, hid_t obj_id); static int diff_region(hid_t region1_id, hid_t region2_id); static hbool_t is_zero(const void *_mem, size_t size); +static int ull2float(unsigned long_long ull_value, float *f_value); + /*------------------------------------------------------------------------- * Function: print_data @@ -346,7 +348,7 @@ hsize_t diff_datum(void *_mem1, H5G_stat_t sb2; hsize_t nfound=0; /* differences found */ int ret=0; /* check return error */ - float per; + float f1, f2, per; type_size = H5Tget_size( m_type ); @@ -1416,7 +1418,10 @@ hsize_t diff_datum(void *_mem1, /* !-d and -p */ else if (!options->d && options->p) { - if ( temp1_ullong!=0 && labs((long)(1-temp2_ullong/temp1_ullong)) > (long)options->percent ) + ull2float(temp1_ullong,&f1); + ull2float(temp2_ullong,&f2); + PER(f1,f2); + if ( per > options->percent ) { if ( print_data(options) ) @@ -1425,7 +1430,7 @@ hsize_t diff_datum(void *_mem1, parallel_print(SPACES); parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong, (unsigned long_long)labs((long)(temp1_ullong-temp2_ullong)), - (unsigned long_long)labs((long)(1-temp2_ullong/temp1_ullong))); + per); } nfound++; } @@ -1433,8 +1438,10 @@ hsize_t diff_datum(void *_mem1, /* -d and -p */ else if ( options->d && options->p) { - if ( temp1_ullong!=0 && labs((long)(1-temp2_ullong/temp1_ullong)) > (long)options->percent && - labs((long)(temp1_ullong-temp2_ullong)) > (long)options->delta ) + ull2float(temp1_ullong,&f1); + ull2float(temp2_ullong,&f2); + PER(f1,f2); + if ( per > options->percent && labs((long)(temp1_ullong-temp2_ullong)) > (long)options->delta ) { if ( print_data(options) ) @@ -1444,7 +1451,7 @@ hsize_t diff_datum(void *_mem1, parallel_print(SPACES); parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong, (unsigned long_long)labs((long)(temp1_ullong-temp2_ullong)), - (unsigned long_long)labs((long)(1-temp2_ullong/temp1_ullong))); + per); } nfound++; } @@ -3528,6 +3535,7 @@ hsize_t diff_llong(unsigned char *mem1, + /*------------------------------------------------------------------------- * Function: diff_ullong * @@ -3553,8 +3561,8 @@ hsize_t diff_ullong(unsigned char *mem1, unsigned long_long temp1_ullong; unsigned long_long temp2_ullong; hsize_t i; - - + float f1, f2, per; + /* -d and !-p */ if (options->d && !options->p) { @@ -3591,8 +3599,11 @@ hsize_t diff_ullong(unsigned char *mem1, { memcpy(&temp1_ullong, mem1, sizeof(unsigned long_long)); memcpy(&temp2_ullong, mem2, sizeof(unsigned long_long)); - - if ( temp1_ullong!=0 && labs((long)(1-temp2_ullong/temp1_ullong)) > options->percent ) + + ull2float(temp1_ullong,&f1); + ull2float(temp2_ullong,&f2); + PER(f1,f2); + if ( per > options->percent ) { if ( print_data(options) ) { @@ -3600,7 +3611,7 @@ hsize_t diff_ullong(unsigned char *mem1, parallel_print(SPACES); parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong, (unsigned long_long)labs((long)(temp1_ullong-temp2_ullong)), - (unsigned long_long)labs((long)(1-temp2_ullong/temp1_ullong))); + per); } nfound++; } @@ -3622,8 +3633,10 @@ hsize_t diff_ullong(unsigned char *mem1, memcpy(&temp1_ullong, mem1, sizeof(unsigned long_long)); memcpy(&temp2_ullong, mem2, sizeof(unsigned long_long)); - if ( temp1_ullong!=0 && labs((long)(1-temp2_ullong/temp1_ullong)) > options->percent && - labs((long)(temp1_ullong-temp2_ullong)) > options->delta ) + ull2float(temp1_ullong,&f1); + ull2float(temp2_ullong,&f2); + PER(f1,f2); + if ( per > options->percent && labs((long)(temp1_ullong-temp2_ullong)) > options->delta ) { if ( print_data(options) ) { @@ -3631,7 +3644,7 @@ hsize_t diff_ullong(unsigned char *mem1, parallel_print(SPACES); parallel_print(ULLI_FORMAT_P,temp1_ullong,temp2_ullong, (unsigned long_long)labs((long)(temp1_ullong-temp2_ullong)), - (unsigned long_long)labs((long)(1-temp2_ullong/temp1_ullong))); + per); } nfound++; } @@ -3675,4 +3688,52 @@ hsize_t diff_ullong(unsigned char *mem1, +/*------------------------------------------------------------------------- + * Function: ull2float + * + * Purpose: convert unsigned long_long to float + * + * Programmer: pvn + * Mar 22, 2006 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static +int ull2float(unsigned long_long ull_value, float *f_value) +{ + hid_t dxpl_id; + unsigned char *buf; + size_t src_size; + size_t dst_size; + + if((dxpl_id = H5Pcreate(H5P_DATASET_XFER))<0) + goto error; + + src_size = H5Tget_size(H5T_NATIVE_ULLONG); + dst_size = H5Tget_size(H5T_NATIVE_FLOAT); + buf = (unsigned char*)calloc(1, MAX(src_size, dst_size)); + + memcpy(buf, &ull_value, src_size); + + /* do conversion */ + if(H5Tconvert(H5T_NATIVE_ULLONG, H5T_NATIVE_FLOAT, 1, buf, NULL, dxpl_id)<0) + goto error; + + memcpy(f_value, buf, dst_size); + + if(buf) + free(buf); + return 0; + +error: + H5E_BEGIN_TRY { + H5Pclose(dxpl_id); + } H5E_END_TRY; + if(buf) + free(buf); + + return -1; +} diff --git a/tools/testfiles/file1.h5 b/tools/testfiles/file1.h5 index 4069a04..d9a33ae 100644 Binary files a/tools/testfiles/file1.h5 and b/tools/testfiles/file1.h5 differ diff --git a/tools/testfiles/file2.h5 b/tools/testfiles/file2.h5 index 3226343..e2fcaff 100644 Binary files a/tools/testfiles/file2.h5 and b/tools/testfiles/file2.h5 differ diff --git a/tools/testfiles/file3.h5 b/tools/testfiles/file3.h5 index 1554d66..91d7297 100644 Binary files a/tools/testfiles/file3.h5 and b/tools/testfiles/file3.h5 differ diff --git a/tools/testfiles/file4.h5 b/tools/testfiles/file4.h5 index 714f472..b787c50 100644 Binary files a/tools/testfiles/file4.h5 and b/tools/testfiles/file4.h5 differ diff --git a/tools/testfiles/file5.h5 b/tools/testfiles/file5.h5 index 91c64ea..e1d84aa 100644 Binary files a/tools/testfiles/file5.h5 and b/tools/testfiles/file5.h5 differ diff --git a/tools/testfiles/file6.h5 b/tools/testfiles/file6.h5 index 08889b0..947f6b3 100644 Binary files a/tools/testfiles/file6.h5 and b/tools/testfiles/file6.h5 differ diff --git a/tools/testfiles/file7.h5 b/tools/testfiles/file7.h5 index c792216..f949b68 100644 Binary files a/tools/testfiles/file7.h5 and b/tools/testfiles/file7.h5 differ diff --git a/tools/testfiles/file8.h5 b/tools/testfiles/file8.h5 index 8f4af70..6880e8f 100644 Binary files a/tools/testfiles/file8.h5 and b/tools/testfiles/file8.h5 differ diff --git a/tools/testfiles/h5diff_17.txt b/tools/testfiles/h5diff_17.txt index 88047c9..5445e97 100644 --- a/tools/testfiles/h5diff_17.txt +++ b/tools/testfiles/h5diff_17.txt @@ -11,6 +11,8 @@ file1 file2 x /g1/dset4 x /g1/dset5 x /g1/dset6 + x /g1/dset7 + x /g1/dset8 x /g2 Group: and diff --git a/tools/testfiles/h5diff_192.txt b/tools/testfiles/h5diff_192.txt new file mode 100644 index 0000000..9e44bd0 --- /dev/null +++ b/tools/testfiles/h5diff_192.txt @@ -0,0 +1,11 @@ +############################# +Expected output for 'h5diff file1.h5 file1.h5 -v -p 0.02 g1/dset7 g1/dset8' +############################# +Dataset: and +position dset7 dset8 difference relative +------------------------------------------------------------------------ +[ 1 0 ] 100 103 3 0.030000 +[ 1 1 ] 100 104 4 0.040000 +[ 2 0 ] 100 150 50 0.500000 +[ 2 1 ] 100 200 100 1.000000 +4 differences found -- cgit v0.12