Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I ended up writing a Python script to do more or less what I wanted.</p> <pre><code>#!/usr/bin/env python import sys import re from optparse import OptionParser from math import fabs splitPattern = re.compile(r',|\s+|;') class FailObject(object): def __init__(self, options): self.options = options self.failure = False def fail(self, brief, full = ""): print "&gt;&gt;&gt;&gt; ", brief if options.verbose and full != "": print " ", full self.failure = True def exit(self): if (self.failure): print "FAILURE" sys.exit(1) else: print "SUCCESS" sys.exit(0) def numSplit(line): list = splitPattern.split(line) if list[-1] == "": del list[-1] numList = [float(a) for a in list] return numList def softEquiv(ref, target, tolerance): if (fabs(target - ref) &lt;= fabs(ref) * tolerance): return True #if the reference number is zero, allow tolerance if (ref == 0.0): return (fabs(target) &lt;= tolerance) #if reference is non-zero and it failed the first test return False def compareStrings(f, options, expLine, actLine, lineNum): ### check that they're a bunch of numbers try: exp = numSplit(expLine) act = numSplit(actLine) except ValueError, e: # print "It looks like line %d is made of strings (exp=%s, act=%s)." \ # % (lineNum, expLine, actLine) if (expLine != actLine and options.checkText): f.fail( "Text did not match in line %d" % lineNum ) return ### check the ranges if len(exp) != len(act): f.fail( "Wrong number of columns in line %d" % lineNum ) return ### soft equiv on each value for col in range(0, len(exp)): expVal = exp[col] actVal = act[col] if not softEquiv(expVal, actVal, options.tol): f.fail( "Non-equivalence in line %d, column %d" % (lineNum, col) ) return def run(expectedFileName, actualFileName, options): # message reporter f = FailObject(options) expected = open(expectedFileName) actual = open(actualFileName) lineNum = 0 while True: lineNum += 1 expLine = expected.readline().rstrip() actLine = actual.readline().rstrip() ## check that the files haven't ended, # or that they ended at the same time if expLine == "": if actLine != "": f.fail("Tested file ended too late.") break if actLine == "": f.fail("Tested file ended too early.") break compareStrings(f, options, expLine, actLine, lineNum) #print "%3d: %s|%s" % (lineNum, expLine[0:10], actLine[0:10]) f.exit() ################################################################################ if __name__ == '__main__': parser = OptionParser(usage = "%prog [options] ExpectedFile NewFile") parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="Don't print status messages to stdout") parser.add_option("--check-text", action="store_true", dest="checkText", default=False, help="Verify that lines of text match exactly") parser.add_option("-t", "--tolerance", action="store", type="float", dest="tol", default=1.e-15, help="Relative error when comparing doubles") (options, args) = parser.parse_args() if len(args) != 2: print "Usage: numdiff.py EXPECTED ACTUAL" sys.exit(1) run(args[0], args[1], options) </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload