this quite sizable commit does several things, but is primarily focussed on building a toolkit that can run simultaneous simulations/analyses within a shared memory space. Versions <=2.1 use a long list of global variables that prevent multiple instantiations on linux systems without resorting to compilation tricks (like duplicate binaries or similar via static linkage). This version uses a single "Project" pointer to encapsulate the network and analysis data. There are no changes to existing algo implementations other than to accomodate dereferencing of the passed-in pointers. A more detailed list of major changes below: - mirrors all “ENxxxx” function calls with “EN_xxxx” versions (note the underscore) that take an extra first parameter: a pointer to an EN_Project struct, which contains all network, hydraulic, quality, and associated data. - tweaks some code formatting to make it more readable - removes some deprecated/commented code that was sufficiently old - fixes implicit type-cast warnings * Added ENaddnode and ENaddlink functions * More memory reallocations * Added ENInit, ENsetheadcurveindex * Added ENdeletelink and ENdeletenode * restored default behavior for float types * fixed type * Added docstrings for ENinit * cleanup change * moves global rule variables to vars.h * migrates rule structs to typedefs for better readability * char types to proper enums fixes #93 * Change some variable declarations for compatibility Changes to keep compatibility with C89 compilers: variables must be declared at the top of the functions. Remove the use of EN_LinkType in function call as it is not compatible with ENgetnodetype. * Moved declaration of idstodelete to top of function * Updated ENinit function and headers Updated header files with new functions Updated def file with new functions For ENinit changes names of parameters #98 Added enum for headloss formula * Missed these files in 1a033fc * migrates char types to enums fixes #93, supports unified link/node type enums, rather than public/private redefinitions * removing links in reverse-index order maintains proper indexing fixes #96 * style * clarifies curve getter units issue (dox) closes #95 * fixes link/node confusion in ENsetlinktype partially reverts a3bce95dc330a5a297634a303d438e2e1bc41cc9 * partial compilation fix * fixes dox issue * fixes allocation issues with enums - updates style in various places - introduces FlowDirection enum - use snprintf to prevent overflow * fixes enum type cast * updated mac project settings * Use of _snprintf on Windows and remove DLLEXPORT from mempool.h snprintf it not compatible on Windows so we use _snprintf mempool gave starnge compilation errors while removing DLLEXPORT worked. Not sure why these functions needed to be exposed in the DLL? * Revert "Use of _snprintf on Windows and remove DLLEXPORT from mempool.h" This reverts commit 6238f77d47fa0feaabe5836043c006937de433a2. * use of _snprintf instead of snprintf on Windows and removed DLLEXPORT from mempool.h Had compilation errors on mempool.h. Removed DLLEXPORT so solve it. Not sure why there was a need to expose these functions? * Shift indices for Links in ENaddnode Need to shift indices for Links not just Pipes since a pump could be connected directly to a reservoir. Also set the defult base demand to zero (was 5). * Set defualts for madatory link properties in ENaddlink and small fix for ENsetheadcurveindex Relates to #102 and closes #103 * wraps globals into structs, duplicates api functions with objective versions * parse and serialize Comment field for network elements related to #47 * adds getter for head/efficiency curve in EN_getlinkvalue * adds getter for event node index … to return the index of the junction (tank) that triggered the event. * fixes edge case in parsing … where inp files without demands in [JUNCTIONS] and without any [DEMAND] categories will fail. * adds freeing function for project pointer * removes redundant string literals, fixes overrun issue in error message getter function * check for hydraulics already closed * moving error definitions to data file * deprecates ENR err message getter (unused) * updates location of errors data file also begins to expose blind structs to curves and patterns, anticipating buildout of APIs for those. * updates CLI output to reflect executable name as invoked relates to #109 * Feature nrtest (#131) * Initial commit EPANET testing tools. * Initial commit for epanet-nrtestsuite * SWIG wrapper for EPANET outputapi (#118) * Removed pervious version of outputapi and wrapper * SWIG wrapper for EPANET outputapi * Patching cmake build script fixed target for outputapi * Build failing on deprecated test script * Minor changes. Responding to review comments. * Feature nrtest (#121) * Configured python setup to automatically build nrtest tools. * Working on build / testing automation * Adding EPANET 2.0.12 benchmark * Updated Travis yml to run nrtest * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning again * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning * Update .travis.yml * Update .travis.yml * Update .travis.yml * Update .travis.yml * Working on configuring python environment and building test tools under Travis CI. * Making gen-config.sh and run-nrtest.sh executable * Debugging .travis.yml * Debugging .travis.yml * Debugging .travis.yml again * Debugging .travis.yml again * debugging travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * Fixing bug with __strncpy_chk destlen < len * nrtesting clean up * re-implements fixes from:5eead5ae403c788567a4* removes extraneous build files, moves cmake and updates travis * mirror of 9b37035560f9683f1514b439f7586a5c17bca5bf * Move some variable declarations * More variable declarations * Fix TmpDir * Allocate _defaultModel * Fix EN_addcurve funcrion * Fix for inpfile * Fix writeRuleinInp call * Set MAXMSG to 79 chars * Fix for flow direction * Refactoring testing related python packages and SWIG wrapper bug fix (#139) * Eliminated epanet-reader package. Removed numpy dependency from epanet-output. Fixed reference counting bug in SWIG wrapper. Added error checking to run_nrtest.sh. Added nrtest package to requirements file. * changing buildhome directory * Fixing bug related to preprocessor definition of PI
137 lines
4.0 KiB
Python
137 lines
4.0 KiB
Python
|
|
import numpy as np
|
|
import time
|
|
import cStringIO
|
|
import itertools as it
|
|
|
|
import epanet_reader as er
|
|
|
|
def result_compare(path_test, path_ref, comp_args):
|
|
|
|
isclose = True
|
|
close = 0
|
|
notclose = 0
|
|
equal = 0
|
|
total = 0
|
|
output = cStringIO.StringIO()
|
|
eps = np.finfo(float).eps
|
|
|
|
start = time.time()
|
|
|
|
test_reader = er.reader(path_test)
|
|
ref_reader = er.reader(path_ref)
|
|
|
|
for test, ref in it.izip(test_reader, ref_reader):
|
|
total += 1
|
|
if total%100000 == 0:
|
|
print(total)
|
|
|
|
if test.size != ref.size:
|
|
raise ValueError('Inconsistent lengths')
|
|
|
|
# Skip results if they are zero or equal
|
|
if np.array_equal(test, ref):
|
|
equal += 1
|
|
continue
|
|
else:
|
|
try:
|
|
np.testing.assert_allclose(test, ref, 1.0e-06, 2*eps)
|
|
close += 1
|
|
|
|
except AssertionError as ae:
|
|
notclose += 1
|
|
output.write(str(ae))
|
|
output.write('\n\n')
|
|
continue
|
|
|
|
stop = time.time()
|
|
|
|
print(output.getvalue())
|
|
output.close()
|
|
|
|
print('equal: %d close: %d notclose: %d total: %d in %f (sec)\n' %
|
|
(equal, close, notclose, total, (stop - start)))
|
|
|
|
if notclose > 0:
|
|
print('%d differences found\n' % notclose)
|
|
isclose = False
|
|
|
|
return isclose
|
|
|
|
|
|
|
|
from nrtest.testsuite import TestSuite
|
|
from nrtest.compare import compare_testsuite, validate_testsuite
|
|
|
|
def nrtest_compare(path_test, path_ref, (comp_args)):
|
|
|
|
ts_new = TestSuite.read_benchmark(path_test)
|
|
ts_old = TestSuite.read_benchmark(path_ref)
|
|
|
|
if not validate_testsuite(ts_new) or not validate_testsuite(ts_old):
|
|
exit(1)
|
|
|
|
try:
|
|
# logging.info('Found %i tests' % len(ts_new.tests))
|
|
compatible = compare_testsuite(ts_new, ts_old, comp_args[0], comp_args[1])
|
|
except KeyboardInterrupt:
|
|
# logging.warning('Process interrupted by user')
|
|
compatible = False
|
|
# else:
|
|
# logging.info('Finished')
|
|
|
|
# Non-zero exit code indicates failure
|
|
exit(not compatible)
|
|
|
|
def nrtest_execute(app_path, test_path, output_path):
|
|
import logging
|
|
import glob
|
|
from os import listdir
|
|
from os.path import exists, isfile, isdir, join
|
|
from nrtest.execute import execute_testsuite, validate_testsuite
|
|
|
|
# for path in test_path + [app_path]:
|
|
# if not exists(path):
|
|
# logging.error('Could not find path: "%s"' % path)
|
|
|
|
test_dirs = glob.glob(test_path)
|
|
test_files = [p for p in test_path if isfile(p)]
|
|
test_files += [p for d in test_dirs for p in glob.glob(d + '*.json')]
|
|
# if p.endswith('.json')]
|
|
|
|
test_files = list(set(test_files)) # remove duplicates
|
|
|
|
ts = TestSuite.read_config(app_path, test_files, output_path)
|
|
|
|
if not validate_testsuite(ts):
|
|
exit(1)
|
|
|
|
try:
|
|
logging.info('Found %i tests' % len(test_files))
|
|
success = execute_testsuite(ts)
|
|
ts.write_manifest()
|
|
except KeyboardInterrupt:
|
|
logging.warning('Process interrupted by user')
|
|
success = False
|
|
else:
|
|
logging.info('Finished')
|
|
|
|
# Non-zero exit code indicates failure
|
|
exit(not success)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# app_path = "apps\\swmm-5.1.11.json"
|
|
# test_path = "tests\\examples\\example1.json"
|
|
# output_path = "benchmarks\\test\\"
|
|
# nrtest_execute(app_path, test_path, output_path)
|
|
|
|
# test_path = "C:\\Users\\mtryby\\Workspace\\GitRepo\\Local\\epanet-testsuite\\benchmarks\\v2011a"
|
|
# ref_path = "C:\\Users\\mtryby\\Workspace\\GitRepo\\Local\\epanet-testsuite\\benchmarks\\v2012"
|
|
# print(nrtest_compare(test_path, ref_path, (0.001, 0.0)))
|
|
|
|
|
|
path_test = "C:\\Users\\mtryby\\Workspace\\GitRepo\\Local\\epanet-testsuite\\benchmarks\\v2011a\\Example_3\\example3.out"
|
|
path_ref = "C:\\Users\\mtryby\\Workspace\\GitRepo\\Local\\epanet-testsuite\\benchmarks\\v2012\\Example_3\\example3.out"
|
|
result_compare(path_test, path_ref, (0.001, 0.0))
|