From b7d4b3d1905b0a675bc5a3f2765ce40363d4baa6 Mon Sep 17 00:00:00 2001 From: Zhuowen Zhao Date: Fri, 11 Aug 2017 11:56:27 -0400 Subject: [PATCH] simplified internal handling of conditions and added vector capability to it --- processing/post/addCalculation.py | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/processing/post/addCalculation.py b/processing/post/addCalculation.py index fd8707414..66ea66a02 100755 --- a/processing/post/addCalculation.py +++ b/processing/post/addCalculation.py @@ -41,7 +41,7 @@ parser.add_option('-f','--formula', parser.add_option('-c','--condition', dest = 'condition', metavar='string', - help = 'condition to filter rows') + help = 'condition to alter existing column data') parser.set_defaults(condition = None, ) @@ -81,24 +81,24 @@ for name in filenames: condition = options.condition # copy per file, since might be altered inline breaker = False - for position,operand in enumerate(set(re.findall(r'#(([s]#)?(.+?))#',condition))): # find three groups - condition = condition.replace('#'+operand[0]+'#', - { '': '{%i}'%position, - 's#':'"{%i}"'%position}[operand[1]]) - if operand[2] in specials: # special label - interpolator += ['specials["%s"]'%operand[2]] + for position,(all,marker,column) in enumerate(set(re.findall(r'#(([s]#)?(.+?))#',condition))): # find three groups + idx = table.label_index(column) + dim = table.label_dimension(column) + if idx < 0 and column not in specials: + damask.util.croak('column "{}" not found.'.format(column)) + breaker = True else: - try: - interpolator += ['%s(table.data[%i])'%({ '':'float', - 's#':'str'}[operand[1]], - table.label_index(operand[2]))] # could be generalized to indexrange as array lookup - except: - damask.util.croak('column "{}" not found.'.format(operand[2])) - breaker = True - - if breaker: continue # found mistake in condition evaluation --> next file - - evaluator_condition = "'" + condition + "'.format(" + ','.join(interpolator) + ")" + if column in specials: + replacement = 'specials["{}"]'.format(column) + elif dim == 1: # scalar input + replacement = '{}(table.data[{}])'.format({ '':'float', + 's#':'str'}[marker],idx) # take float or string value of data column + elif dim > 1: # multidimensional input (vector, tensor, etc.) + replacement = 'np.array(table.data[{}:{}],dtype=float)'.format(idx,idx+dim) # use (flat) array representation + + condition = condition.replace('#'+all+'#',replacement) + + if breaker: continue # found mistake in condition evaluation --> next file # ------------------------------------------ build formulas ---------------------------------------- @@ -162,7 +162,7 @@ for name in filenames: # -------------------------------------- evaluate formulas ----------------------------------------- - if options.condition is None or eval(eval(evaluator_condition)): # condition for veteran replacement fulfilled + if options.condition is None or eval(condition): # condition for veteran replacement fulfilled for veteran in veterans: # evaluate formulas that overwrite table.data[table.label_index(veteran): table.label_index(veteran)+table.label_dimension(veteran)] = \