Scheduler
confGeneration.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import re
3 import shutil
4 import sys
5 import os
6 
7 def main():
8  if (len(sys.argv) != 3):
9  print "two arguments needed: template config file and changes"
10  sys.exit(0)
11  templateFile = open(sys.argv[1])
12  changesFile = open(sys.argv[2])
13  tuples = []
14  for line in changesFile:
15  if (re.match(r'^#', line)):
16  continue
17  sectionMatch = re.match(r'\[(.+)\]', line)
18  if (sectionMatch):
19  currentSection = sectionMatch.group(1)
20  entryMatch = re.match(r'(.+) += +(.+)', line)
21  if (entryMatch):
22  tuples.append((currentSection, entryMatch.group(1), (entryMatch.group(2)).split(" ")))
23 
24  nbParams = len(tuples)
25 
26  nbOfConfigs = 1
27  lengths = [1]*nbParams
28  for i in range(len(tuples)):
29 
30  lengths[i] = (len(tuples[i][2]))
31  if (lengths[i] > 1000):
32  print "Error: Only 1000 values swept allowed"
33  sys.exit(-1)
34  nbOfConfigs *= lengths[i]
35 
36 
37  entries = []
38  counter = 0
39 #there should be nbParams for_loops
40 
41  indexes = [0]*nbParams
42 
43  func(nbParams, 0, indexes, lengths, tuples, entries);
44 
45 
46 
47 
48  counter = 1
49 
50  fileFormat = re.match(r'(.+)\.conf', sys.argv[1])
51  stem = ""
52  if fileFormat:
53  stem = fileFormat.group(1)
54  else:
55  print "The template file must have extension .conf"
56 
57 
58  for entry in entries:
59  content = templateFile.readlines();
60  for i in range(len(content)):
61  if (re.match(r'^#', content[i])):
62  continue;
63  sectionMatch = re.match(r'\[(.+)\]', content[i])
64  if (sectionMatch):
65  currentSection = sectionMatch.group(1)
66  entryMatch = re.match(r'(.+) += +(.+)', content[i])
67  if (entryMatch):
68  currentParam = entryMatch.group(1)
69  for j in range(nbParams):
70  if (entry[j] != None):
71  if (currentSection == entry[j][0]):
72  if (entry[j][1] == currentParam):
73  content[i] = entry[j][1] + " = " + entry[j][2] + "\n"
74  outfilename = stem
75  outfilename += format(counter, '04d') + "__"
76  for j in range(nbParams):
77  outfilename += entry[j][1]
78  try:
79  temp = float(entry[j][2])
80  outfilename += "{0:05f}".format(temp)
81  except ValueError: #entry[][] can be a string parameter
82  temp = entry[j][2]
83  outfilename += temp
84  outfilename += "_"
85  outfilename += ".sconf"
86  with open(outfilename, 'w') as outFile:
87  outFile.writelines(content)
88  with open("list", "a") as configslist:
89  configslist.write(outfilename + "\n")
90  counter += 1
91  templateFile.seek(0)
92 
93  templateFile.close()
94  changesFile.close()
95 
96 
97 def func(nbParams, p, indexes, lengths, tuples, entries):
98  indexes[p] = 0;
99  for i in range(max(1, lengths[p])):
100  if p == (nbParams-1):
101  entryTuples = [None]*nbParams;
102  for var in range(nbParams):
103  if (len(tuples) > var):
104  entryTuples[var] = (tuples[var][0], tuples[var][1], tuples[var][2][indexes[var]])
105  entry = []
106  for j in range(nbParams):
107  entry.append(entryTuples[j])
108  #entries.append((entryTuples[0], entryTuples[1], entryTuples[2], entryTuples[3], entryTuples[4]))
109  entries.append(entryTuples)
110  else:
111  func(nbParams, p+1, indexes, lengths, tuples, entries);
112  indexes[p] += 1;
113 
114 if __name__ == '__main__':
115  main()
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
def func(nbParams, p, indexes, lengths, tuples, entries)