Filter options

Relative tolerance

There is no default. You have to select either relative or absolute tolerance for each test when testing floats. You cannot select both at the same time.

In this example we set the relative tolerance to 1.0e-10:

get_filter(from_string='Electronic energy',
           num_lines=8,
           rel_tolerance=1.0e-10)

Absolute tolerance

There is no default. You have to select either relative or absolute tolerance for each test when testing floats. You cannot select both at the same time.

In this example we set the absolute tolerance to 1.0e-10:

get_filter(from_string='Electronic energy',
           num_lines=8,
           abs_tolerance=1.0e-10)

How to check entire file

By default all lines are tested so if you omit any string anchors and number of lines we will compare numbers from the entire file.

Example:

get_filter(rel_tolerance=1.0e-10)

Filtering between two anchor strings

Example:

get_filter(from_string='@   Elements of the electric dipole',
           to_string='@   anisotropy',
           rel_tolerance=1.0e-10)

This will extract all floats between these strings including the lines of the strings.

The start/end strings can be regular expressions, for this use from_re or to_re. Any combination containing from_string/from_re and to_string/to_re is possible.

Filtering a number of lines starting with string/regex

Example:

get_filter(from_string='Electronic energy',
           num_lines=8,  # here we compare 8 lines
           abs_tolerance=1.0e-10)

The start string can be a string (from_string) or a regular expression (from_re). In the above example we extract and compare all lines that start with ‘Electronic energy’ including the following 7 lines.

Extracting single lines

This example will compare all lines which contain ‘Electronic energy’:

get_filter(string='Electronic energy',
           abs_tolerance=1.0e-10)

This will match the string in a case-sensitive fashion.

Instead of single string we can give a single regular expression (re).

get_filter(re='Electronic energy',
           abs_tolerance=1.0e-10)

Regexes follow the Python syntax. For example, to match in a case-insensitive fashion:

get_filter(re=r'(?i)Electronic energy',
           abs_tolerance=1.0e-10)

It is not possible to use Python regex objects directly.

How to ignore sign

Sometimes the sign is not predictable. For this set ignore_sign=True.

How to ignore the order of numbers

Setting ignore_order=True will sort the numbers (as they appear consecutively between anchors, one after another) before comparing them. This is useful for tests where some numbers can change place.

How to ignore very small or very large numbers

You can ignore very small numbers with skip_below. Default is 1.0e-40. Ignore all floats that are smaller than this number (this option ignores the sign).

As an example consider the following result tensor:

3716173.43448289          0.00000264         -0.00000346
     -0.00008183      75047.79698485          0.00000328
      0.00003493         -0.00000668      75047.79698251

      0.00023164    -153158.24017016         -0.00000493
  90142.70952070         -0.00000602          0.00000574
      0.00001946         -0.00000028          0.00000052

      0.00005844         -0.00000113    -153158.24017263
     -0.00005667          0.00000015         -0.00000022
  90142.70952022          0.00000056          0.00000696

The small numbers are actually numerical noise and we do not want to test them at all. In this case it is useful to set skip_below=1.0e-4.

Alternatively one could use absolute tolerance to avoid checking the noisy zeros.

You can ignore very large numbers with skip_above (also this option ignores the sign).

How to ignore certain numbers

The keyword mask is useful if you extract lines which contain both interesting and uninteresting numbers (like timings which change from run to run).

Example:

get_filter(from_string='no.    eigenvalue (eV)   mean-res.',
           num_lines=4,
           rel_tolerance=1.0e-4,
           mask=[1, 2, 3])

Here we use only the first 3 floats in each line. Counting starts with 1.