File: number_compare.pl

package info (click to toggle)
eccodes 2.45.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 154,404 kB
  • sloc: cpp: 162,953; ansic: 26,308; sh: 21,742; f90: 6,854; perl: 6,361; python: 5,172; java: 2,226; javascript: 1,427; yacc: 854; fortran: 543; lex: 359; makefile: 283; xml: 183; awk: 66
file content (113 lines) | stat: -rwxr-xr-x 2,928 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/local/bin/perl
   eval 'exec perl -S $0 "$@"'
      if $runnning_under_some_shell;

########################################################################
#
# Simple program to emulate numdiff
# It compares two files which must have the same number of lines
# ignoring small numeric differences or/and different numeric formats
#
# The user can specify an absolute tolerance for the comparisons
#
# It exits with status 0 if the files are considered the same
# otherwise status is 1.
# 
# Only the first difference is printed
#
########################################################################

use strict;
use File::Compare;
use Getopt::Long;

# Process arguments. Must be at least two files
if (scalar @ARGV < 2) {
  &usage;
}
# Tolerance is optional
my $tolerance = 1e-9;
my $res = GetOptions (
  "t=s" => \$tolerance
  );

my $fileA = $ARGV[0];
my $fileB = $ARGV[1];
die "$!" unless (-e $fileA && -e $fileB);

#print "DEBUG:  f1=$fileA, f2=$fileB, tol=$tolerance\n";

my $line_num=1;
use File::Compare 'cmp';

sub munge($) {
    my $line = $_[0];
    for ($line) {
        s/^\s+//;   # Trim leading whitespace.
        s/\s+$//;   # Trim trailing whitespace.
    }
    return ($line);
}

my $delta = $tolerance;

if (not cmp($fileA, $fileB, sub {
        my $arg1 = munge $_[0];
        my $arg2 = munge $_[1];
        # $arg1 is a line from $fileA, $arg2 is a line from $fileB
        my $result = 0;
        my @data1 = split(/\s/, $arg1);
        my @data2 = split(/\s/, $arg2);
        my $data1_length = @data1;
        my $data2_length = @data2;
        if ($data1_length != $data2_length) {
            print "Line $line_num lengths differs: [$arg1] <=> [$arg2]\n";
            return 1;
        }
        foreach my $idx (0 .. $#data1) {
            my $d1 = $data1[$idx];
            my $d2 = $data2[$idx];
            #print "Line $line_num: Comparing |$d1| with |$d2| ...\n";
            $result = (abs($d1 - $d2) > $delta);
            if ($result) {
                print "Line $line_num differs: [$d1] <=> [$d2]\n";
                print "Absolute error = ". abs($d1 - $d2) . "\n";
                return $result; # Failed
            }
        }
        ++$line_num;
        return $result;
        # abs(munge $_[0] - munge $_[1])>$delta
    } ))
{
    #print "FLOAT: fileA and fileB are considered the same. HOORA\n";
    exit 0;
}

# Comparison failed. Check if the files have different number of lines
my $linesA = 0;
my $linesB = 0;
open (FILE, $fileA) or die "Can't open $fileA: $!";
$linesA++ while (<FILE>);
close FILE;

open (FILE, $fileB) or die "Can't open $fileB: $!";
$linesB++ while (<FILE>);
close FILE;

if ($linesA != $linesB) {
   print STDERR "Files do not have the same number of lines\n";
}

exit 1;  # Files considered different


###################################################
sub usage {
   print <<USAGE;

Usage: $0 [-t tolerance] file1 file2

USAGE
   exit 1
}