1 import sys, os
2 import types
3 sys.path.append(os.path.dirname(os.path.abspath(__file__))+"/..")
4 import Utils.Libraries.combine as combine
5
6 -def toDict(parameters, valueListKey=None):
7 if parameters == None:
8 return {}
9 if type(parameters) not in types.StringTypes:
10 return parameters
11 paramDict = {}
12 if valueListKey != None and ":" not in parameters and "=" not in parameters:
13 names = [valueListKey + "=" + parameters]
14 else:
15 names = parameters.split(":")
16 for name in names:
17 if name.strip() != "":
18 values = True
19 if "=" in name:
20 name, values = name.split("=")
21 values = values.strip().split(",")
22 if len(values) == 1:
23 values = values[0]
24 paramDict[name.strip()] = values
25 return paramDict
26
27 -def toString(parameters, skipKeysWithValues=[None], skipValues=[True], skipDefaults={}):
28 if parameters == None:
29 return ""
30 if type(parameters) in types.StringTypes:
31 return parameters
32 s = ""
33 for key in sorted(parameters.keys()):
34 if key in skipDefaults and parameters[key] == skipDefaults[key]:
35 continue
36 elif type(parameters[key]) in [types.ListType, types.TupleType]:
37 if len(s) > 0: s += ":"
38 s += key + "=" + ",".join([str(x) for x in parameters[key]])
39 else:
40 if skipKeysWithValues == None or parameters[key] not in skipKeysWithValues:
41 if len(s) > 0: s += ":"
42 if skipValues != None and parameters[key] in skipValues:
43 s += key
44 else:
45 s += key + "=" + str(parameters[key])
46 return s
47
48 -def get(parameters, defaults=None, allowNew=False, valueListKey=None, valueLimits=None):
49 parameters = toDict(parameters, valueListKey)
50 if defaults != None:
51 if type(defaults) in [types.ListType, types.TupleType]:
52 defaults = dict( zip(defaults, len(defaults) * [None]) )
53 newDict = {}
54 for key in sorted(list(set(parameters.keys() + defaults.keys()))):
55 if key not in defaults and not allowNew:
56 raise Exception("Undefined parameter: " + key + " (parameters: " + str(parameters) + ", defaults: " + str(defaults) + ")")
57 if key in parameters:
58 newDict[key] = parameters[key]
59 elif key in defaults:
60 newDict[key] = defaults[key]
61 if valueLimits != None and key in valueLimits:
62 values = newDict[key]
63 if type(values) not in [types.ListType, types.TupleType]:
64 values = [values]
65 for value in values:
66 if value not in valueLimits[key]:
67 raise Exception("Illegal value " + str(value) + " for parameter " + key + " (allowed values: " + str(valueLimits[key]) + ")")
68 parameters = newDict
69 return parameters
70
72 parameters = get(parameters)
73 parameterNames = sorted(parameters.keys())
74 if order != None:
75 assert sorted(order) == parameterNames
76 parameterNames = order
77
78
79 parameterValues = []
80 for parameterName in parameterNames:
81 parameterValues.append([])
82 values = parameters[parameterName]
83 if isinstance(values, (list, tuple)):
84 for value in values:
85 parameterValues[-1].append( (parameterName,value) )
86 else:
87 parameterValues[-1].append( (parameterName,values) )
88 combinationLists = combine.combine(*parameterValues)
89 combinations = []
90 for combinationList in combinationLists:
91 combinations.append({})
92 for value in combinationList:
93 combinations[-1][value[0]] = value[1]
94 return combinations
95