diff --git a/python/waLBerla/tools/config.py b/python/waLBerla/tools/config.py index f2997aa5a88d78350f0b159820573c1be9691f4e..7587afb38488c99b8593f3706224c3b6445b158b 100644 --- a/python/waLBerla/tools/config.py +++ b/python/waLBerla/tools/config.py @@ -1,8 +1,9 @@ from __future__ import print_function, absolute_import, division, unicode_literals import numpy as np + def _comment_replacer(match): - start,mid,end = match.group(1,2,3) + start, mid, end = match.group(1, 2, 3) if mid is None: # single line comment return '' @@ -16,68 +17,71 @@ def _comment_replacer(match): # multi line comment without line break return ' ' + def _remove_comments(text): import re comment_re = re.compile( r'(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?', re.DOTALL | re.MULTILINE ) - return comment_re.sub( _comment_replacer, text) + return comment_re.sub(_comment_replacer, text) + -def __parseNestedList( value, dtype = float): +def __parse_nested_list(value, dtype=float): from pyparsing import Word, Group, Forward, OneOrMore, Optional, alphanums, Suppress - number = Word( alphanums + ".e-" ).setParseAction( lambda s,l,t: dtype(t[0]) ) + number = Word(alphanums + ".e-").setParseAction(lambda s, l, t: dtype(t[0])) arr = Forward() element = number | arr - arr << Group(Suppress('[') + ( OneOrMore(element + Optional(Suppress(",")) ) ) + Suppress(']') ) - return arr.parseString(value, parseAll = True).asList()[0] + arr << Group(Suppress('[') + (OneOrMore(element + Optional(Suppress(",")))) + Suppress(']')) + return arr.parseString(value, parseAll=True).asList()[0] -def __convertValue(value): - def tryType( thetype, value ): + +def __convert_value(value): + def try_type(thetype, value): try: return thetype(value) except ValueError: return None - val = tryType(int, value) + + val = try_type(int, value) if val: return val - val = tryType(float, value) + val = try_type(float, value) if val: return val if value == "True": return True - if value == "False" : return False + if value == "False": return False value = value.strip() if value[0] == '[' and value[-1] == "]": - return np.array( __parseNestedList(value) ) + return np.array(__parse_nested_list(value)) if value[0] == '<' and value[-1] == ">": - return tuple( [__convertValue(s) for s in value[1:-1].split(",") ] ) + return tuple([__convert_value(s) for s in value[1:-1].split(",")]) return value -def fromPrm( fileAsString ): + +def fromPrm(fileAsString): """Parses a prm file to a nested python dict """ from pyparsing import Word, Group, Forward, Dict, ZeroOrMore, Optional, alphanums, Suppress # Grammar - identifier = Word( alphanums +"_-" ) - value = Word( alphanums + ".e-,<>[] \n" ).setParseAction( lambda s,l,t: __convertValue(t[0]) ) - key_value_pair = Group ( identifier + Optional(value, default="") + Suppress(";") ) - block = Forward() - block_content = Dict( ZeroOrMore( key_value_pair | block ) ) - block << Group( identifier + Suppress("{") + block_content + Suppress("}") ) - - return block_content.parseString( _remove_comments(fileAsString) , parseAll = True ).asDict() - + identifier = Word(alphanums + "_-") + value = Word(alphanums + ".e-,<>_[] \n").setParseAction(lambda s, l, t: __convert_value(t[0])) + key_value_pair = Group(identifier + Optional(value, default="") + Suppress(";")) + block = Forward() + block_content = Dict(ZeroOrMore(key_value_pair | block)) + block << Group(identifier + Suppress("{") + block_content + Suppress("}")) + return block_content.parseString(_remove_comments(fileAsString), parseAll=True).asDict() def __format(value, level, key=""): if type(value) is float: return "%.10g" % value else: - return str(value).replace("\n", "\n" + "\t"*level + " " * len(key) + " " ) + return str(value).replace("\n", "\n" + "\t" * level + " " * len(key) + " ") -def toPrm( configDict, level = 0 ): +def toPrm(configDict, level=0): """Returns a prm string from a nested python dict - Inverse of parse""" result = "" for key, value in sorted(configDict.items()): @@ -87,28 +91,26 @@ def toPrm( configDict, level = 0 ): else: result += "\t" * level + str(key) + "\n" result += "\t" * level + "{\n" - result += toPrm(value, level + 1) + result += toPrm(value, level + 1) result += "\t" * level + "}\n" - elif ( type(value) is list ) and len( value ) > 0 and type(value[0]) is dict: + elif (type(value) is list) and len(value) > 0 and type(value[0]) is dict: for e in value: result += "\t" * level + str(key) + "\n" result += "\t" * level + "{\n" - result += toPrm( e, level + 1) + result += toPrm(e, level + 1) result += "\t" * level + "}\n" - elif ( type(value) is tuple ) : + elif type(value) is tuple: result += "\t" * level + str(key) + " " - result += "< " + ",".join ( [ __format(v,level) for v in value ] ) + " >;\n" - elif ( type(value) is float ): - result += "\t" * level + str(key) + " " + __format(value,level) + ";\n" + result += "< " + ",".join([__format(v, level) for v in value]) + " >;\n" + elif type(value) is float: + result += "\t" * level + str(key) + " " + __format(value, level) + ";\n" else: - result += "\t" * level + str(key) + " " + __format(value,level,key) + ";\n" + result += "\t" * level + str(key) + " " + __format(value, level, key) + ";\n" return result - if __name__ == "__main__": - test = """ blockId1 { firstKey 5; // first key @@ -130,8 +132,8 @@ if __name__ == "__main__": outerKey hallo; """ - res = fromPrm( test ) + res = fromPrm(test) assert res['blockId1']['firstKey'] == 5 - assert res['blockId1']['myVector3'] == ( 1.0, 2, 3) + assert res['blockId1']['myVector3'] == (1.0, 2, 3) assert res['blockId1']['keyWithoutValue'] == '' - assert (res['blockId1']['myArray'] == np.array( [ [1,2], [3,4] ] )).all() \ No newline at end of file + assert (res['blockId1']['myArray'] == np.array([[1, 2], [3, 4]])).all()