Source code for triqs.utility.h5diff

# Copyright (c) 2015-2018 Commissariat à l'énergie atomique et aux énergies alternatives (CEA)
# Copyright (c) 2015-2018 Centre national de la recherche scientifique (CNRS)
# Copyright (c) 2018-2020 Simons Foundation
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You may obtain a copy of the License at
#     https:#www.gnu.org/licenses/gpl-3.0.txt
#
# Authors: Thomas Ayral, Olivier Parcollet, Nils Wentzell

from h5 import *
from triqs.utility.comparison_tests import *
from triqs.gf import *
from triqs.operators import *
import sys
import numpy

verbose = 0
failures = []

[docs] def compare(key, a, b, level, precision): """Compare two objects named key""" if verbose and key : print(level *' ' + "Comparing %s ...."%key) try : t = type(a) assert t == type(b), "%s have different types"%key if t == dict or isinstance(a, HDFArchiveGroup) : if list(a.keys()) != list(b.keys()): failures.append("Two archive groups '%s' with different keys \n %s \n vs\n %s"%(key,list(a.keys()), list(b.keys()))) for k in a.keys(): compare(key + '/'+ k, a[k], b[k], level + 1, precision) # The TRIQS object which are comparable starts here .... #elif t in [GfImFreq, GfImTime, GfReFreq, GfReTime, GfLegendre, GfImFreq_x_ImFreqTv3] : elif t in [Gf] : assert_gfs_are_close(a,b,precision) elif t in [BlockGf]: assert_block_gfs_are_close(a,b,precision) elif t in [Block2Gf]: assert_block2_gfs_are_close(a,b,precision) elif t in [Operator]: assert (a-b).is_zero(), "Many body operators not equal" # elif t in [BlockMatrix]: # for i in range(len(a.matrix_vec)): # assert_arrays_are_close(a(i),b(i)) # ... until here elif isinstance(a, numpy.ndarray): assert_arrays_are_close(a,b) elif t in [int, float, complex]: assert abs(a-b) < 1.e-10, " a-b = %"%(a-b) elif t in [bool, numpy.bool_]: assert a==b elif t in [list, tuple]: assert len(a) == len(b), "List of different size" for x,y in zip(a,b): compare(key, x, y, level+1, precision) elif t in [str]: assert a==b, "Strings '%s' and '%s' are different"%(a,b) else: raise NotImplementedError("The type %s for key '%s' is not comparable by h5diff"%(t, key)) except (AssertionError, RuntimeError, ValueError) as e: #eliminate the lines starting with .., which are not the main error message mess = '\n'.join([l for l in str(e).split('\n') if l.strip() and not l.startswith('..')]) failures.append("Comparison of key '%s' has failed:\n """%key + mess)
[docs] def h5diff(f1, f2, precision= 1.e-6): compare('', HDFArchive(f1,'r'), HDFArchive(f2,'r'), 0, precision) if failures : print ('-'*50, file=sys.stderr ) print ('-'*20 + ' FAILED ' + '-'*20, file=sys.stderr) print ('-'*50, file=sys.stderr) for x in failures: print (x, file=sys.stderr) print ('-'*50, file=sys.stderr) raise RuntimeError("FAILED")
if __name__== "__main__": # --- Parsing the arguments of the script and options import argparse parser = argparse.ArgumentParser(description="""h5diff with proper support of TRIQS object """) parser.add_argument('archive1', help = "Name of the first h5") parser.add_argument('archive2', help = "Name of the second h5") parser.add_argument('--verbose', '-v', action='store_true', help="") parser.add_argument('--precision', '-p', action='store', type=float, default= 1.e-8, help="") args = parser.parse_args() verbose = args.verbose h5diff (args.archive1, args.archive2, args.precision)