source: XIOS/dev/dev_trunk_omp/GENERIC_TESTCASE/generate_table.py @ 1781

Last change on this file since 1781 was 1776, checked in by yushan, 4 years ago

dev_trunk_omp : update xios_report.html

File size: 16.6 KB
Line 
1
2import array as arr
3import collections
4import glob
5import os
6import sys
7import subprocess
8import socket
9import os.path
10from os import path
11
12from collections import Counter
13
14
15def filename_list_generator(file_to_open):
16    word = ""
17    with open(file_to_open, "r") as file:
18        file.read(0)
19        for line in file:
20            if not line.startswith("#"):
21                for word in line.split(" "):
22                    if word.endswith(".nc") or word.endswith("_nc_files"):
23                        yield word
24                        break
25
26def configname_list_generator(file_to_open):
27    word = ""
28    with open(file_to_open, "r") as file:
29        file.read(0)
30        for line in file:
31            if not line.startswith("#"):
32                for word in line.split(" "):
33                    if "config_" in word:
34                        yield word
35                        break
36
37def foldername_list_generator(file_to_open):
38    word = ""
39   
40    with open(file_to_open, "r") as file:
41        file.read(0)
42        for line in file:
43            if not line.startswith("#"):
44                for word in line.split(" "):
45                    if word.startswith("test_"):
46                        yield word
47                        break
48
49def result_list_generator(file_to_open):
50    word = ""
51    with open(file_to_open, "r") as file:
52        file.read(0)
53        for line in file:
54            if not line.startswith("#"):
55                for word in line.split(" "):
56                    if word == '-1' or word == '0' or word == '1':
57                        yield(word)
58                        break
59               
60def OSinfo(runthis):
61        red = lambda text: '\033[0;31m' + text + '\033[0m'
62        osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
63        theInfo = osstdout.communicate()[0].strip()
64        if osstdout.returncode!=0:
65                print(red(runthis+" FAILED"))
66                print >> sys.stderr, osstdout.returncode
67                sys.exit()
68        # else:
69                # print(runthis+" OK")   
70
71def main():
72    unfold_icon = '⮯'
73    fold_icon = '⮭'
74
75    current_revision_report = sys.argv[1]
76
77    if os.path.exists(current_revision_report) :
78        file_to_open=current_revision_report
79    else :
80        file_to_open="plein_report_example.txt"
81
82
83    f=open(file_to_open, "r")
84    for line in f :
85        if line.startswith("#revision"):
86            revision_number = line.split(" ")[1].replace("\n", "")
87        elif line.startswith("#build_dir"):
88            build_dir = line.split(" ")[1].replace("\n", "")
89        elif line.startswith("#arch"):
90            arch = line.split(" ")[1].replace("\n", "")
91        elif line.startswith("#machine"):
92            machine = line.split(" ")[1].replace("\n", "")
93            if machine == "jeanzay":
94                machine = "Jean-Zay"
95            elif machine == "irene":
96                machine = "Irene"
97            else :
98                machine = "other"
99        elif line.startswith("#relurl"):
100            words = line.split("/")
101            words_size = len(words)
102            branch = words[words_size-1].replace("\n", "")
103           
104    folderlist=[]
105    for x in foldername_list_generator(file_to_open):
106        folderlist.append(x)
107
108    configlist=[]
109    for x in configname_list_generator(file_to_open):
110        configlist.append(x)
111   
112    filelist=[]
113    for x in filename_list_generator(file_to_open):
114        filelist.append(x)
115
116    resultlist=[]
117    for x in result_list_generator(file_to_open):
118        resultlist.append(x)
119
120    total_records = len(resultlist)
121
122    c = Counter(folderlist)
123    nb_level1 = len(c)
124   
125    my_struncture = dict()
126
127    for i in range(nb_level1):
128        my_key1 = list(c.keys())[i] # algo_name
129        my_struncture.update({my_key1 : dict()})
130        min_range=-1
131        for index in range(total_records) :
132            if my_key1 == folderlist[index] :
133                if min_range == -1 :
134                    min_range = index
135                    max_range = index
136                else :
137                    max_range = index
138        cc = Counter(configlist[min_range: max_range+1])
139        nb_level2 = len(cc)       
140       
141        for j in range(nb_level2) :
142            my_key2 = list(cc.keys())[j] #config_name
143            my_struncture[my_key1].update({my_key2:dict()})
144            min_range = -1
145            for index in range(total_records) :
146                if my_key2 == configlist[index] :
147                    if min_range == -1 :
148                        min_range = index
149                        max_range = index
150                    else :
151                        max_range = index
152
153            ccc = Counter(filelist[min_range: max_range+1])
154            nb_level3 = len(ccc)           
155
156            for k in range(nb_level3) :
157                my_key3 = list(ccc.keys())[k] #filename
158               
159                min_range = -1
160                for index in range(total_records) :
161                    if my_key3 == filelist[index] :
162                        if min_range == -1 :
163                            min_range = index
164                            max_range = index
165                        else :
166                            max_range = index
167                my_struncture[my_key1][my_key2].update({my_key3:resultlist[min_range]})
168
169
170
171    nb_algo = len(my_struncture)
172
173    for x in range(nb_algo) :
174        algo_name = list(my_struncture.keys())[x]
175        nb_config = len(my_struncture[algo_name])
176        for y in range(nb_config) :
177            config_name = list(my_struncture[algo_name].keys())[y]
178            nb_file = len(my_struncture[algo_name][config_name])
179
180   
181    algo_names=list(my_struncture.keys())
182
183    nb_files = [0]*nb_algo
184    nb_configs = [0]*nb_algo
185
186    for x in range(nb_algo) :
187        nb_files[x] = len(my_struncture[list(my_struncture.keys())[x]][list(my_struncture[list(my_struncture.keys())[x]].keys())[0]])
188        nb_configs[x] = len(my_struncture[list(my_struncture.keys())[x]])
189
190   
191    level1_answer=1
192    level2_answer=[1]*nb_algo
193
194    level3_answer = [[]]*nb_algo
195    for x in range(nb_algo) :
196        level3_answer[x] = [1]*nb_configs[x]
197
198    level4_answer = [[[]]]*nb_algo
199    for x in range(nb_algo) :
200        level4_answer[x] = [[]]*nb_configs[x]
201        for y in range(nb_configs[x]) :
202            level4_answer[x][y] = [1]*nb_files[x]
203            for z in range(nb_files[x]) :
204                x_dict = my_struncture
205                y_dict = x_dict[list(x_dict.keys())[x]]
206                z_dict = y_dict[list(y_dict.keys())[y]]
207                level4_answer[x][y][z] = int(z_dict[list(z_dict.keys())[z]])
208
209    index=0
210    for x in range(nb_algo):
211        for y in range(len(level3_answer[x])):
212            for z in range(len(level4_answer[x][y])):
213                level3_answer[x][y] = min(level4_answer[x][y][z], level3_answer[x][y])
214            index+=1
215
216    index=0
217    for x in range(len(level2_answer)):
218        for y in range(len(level3_answer[x])):
219            level2_answer[x] = min(level2_answer[x], level3_answer[x][y])
220        index+=1
221
222    for x in range(len(level2_answer)):
223        level1_answer = min(level1_answer, level2_answer[x])
224
225    # ans_dict = {-1: 'Failed', 0: 'Initialized', 1: 'Passed'}
226    ans_dict = {-1: '❌', 0: '&#10062', 1: '✅'}
227
228    algo_list = list(my_struncture.keys())
229
230
231    config_list=[]
232    for x in range(nb_algo) :
233        my_list = list(my_struncture[list(my_struncture.keys())[x]].keys())
234        for y in range(len(my_list)) :
235            config_list.append(my_list[y])
236
237
238    file_list=[]
239    for x in range(nb_algo) :
240        l = list(my_struncture.keys())[x]
241        ll = list(my_struncture[l].keys())[0]
242        lll = list(my_struncture[l][ll].keys())
243        for y in range(len(lll)) :
244            file_list.append(lll[y])
245
246   
247    old_config_list=config_list[:]
248    for x in range(len(config_list)) :
249        word = config_list[x]
250        new_word=''
251        for i in range(len(word)) :
252            if word[i]=="@" :
253                new_word = word[i+1:]
254                break
255        # old_config_list.append(new_word)
256        old_config_list[x]=new_word
257        word = new_word.replace("config_", "CONFIG: ")
258        new_word = word.replace("_", " ")
259        config_list[x] = new_word
260
261
262    for x in range(len(file_list)) :
263        word = file_list[x]
264        new_word=''
265        for i in range(len(word)) :
266            if word[i]=="@" :
267                new_word = word[i+1:]
268                break
269        file_list[x] = new_word
270
271    for x in range(len(file_list)) :
272        word = file_list[x]
273        new_word=''
274        for i in range(len(word)) :
275            if word[i]=="@" :
276                new_word = word[i+1:]
277                break
278        file_list[x] = new_word
279
280    if os.path.exists("xios_table_"+revision_number+".js") : 
281        print("table for revision "+revision_number+" exists already")
282    else :
283        f=open("xios_table_"+revision_number+".js", "w")
284        f.write("document.write(`\n")
285        f.write("<html>\n")
286        f.write("<head>\n")
287        f.write("</head>\n")
288        f.write("<body>\n")
289        f.write("   <div id=\"navborder_"+revision_number+"\" class=\"class_navborder\">\n")
290        f.write("       <p id=\"xiosinfo\">Information of XIOS source:</p>\n")
291        f.write("       <table id=\"xiosinfotable\">\n")
292        f.write("           <tr><td>Branch</td><td><em>"+branch+"</em></td></tr>\n")
293        f.write("           <tr><td>Revision</td><td><em>"+revision_number+"</em></td></tr>\n")
294        f.write("           <tr><td>Machine</td><td><em>"+machine+"</em></td></tr>\n")
295        f.write("           <tr><td>Architecture</td><td><em>"+arch+"</em></td></tr>\n")
296        f.write("           <tr><td>Compile mode</td><td><em>prod</em></td></tr>\n")
297        f.write("           <tr><td>Build directory</td><td><em>"+build_dir+"</em></td></tr>\n")
298        f.write("       </table>\n")
299        f.write("   </div>\n")   
300        f.write("   <table id=\"xiostable_"+revision_number+"\" class=\"class_xiostable\">\n")
301        f.write("       <thead></thead>\n")
302        f.write("       <tfoot></tfoot>\n")
303        f.write("       <tbody>\n")
304        f.write("           <tr class=\"level1\" style=\"background-color:#85c1e9;font-size:1.6em;\" >\n")
305        f.write("               <td>"+revision_number+" XIOS Unit tests <span id=\""+revision_number+"_icon_level1_1\" onclick=\"level1_unfold(\'"+revision_number+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n")
306        f.write("                                   <span id=\""+revision_number+"_icon_level1_2\" onclick=\"level1_fold(\'"+revision_number+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n")
307        f.write("               <td><div class=\"dropdown\"><button class=\"dropbtn\">&#128270;</button>\n")
308        f.write("               <div class=\"dropdown-content\">\n")
309        f.write("               <a href=\"#\" onclick=\"show_xios_info(\'"+revision_number+"\')\">show/hide XIOS info</a>\n")
310        f.write("               <a href=\"#\" onclick=\"show_plein_report(\'"+revision_number+"\')\">show plein report</a>\n")
311        f.write("               </div></div></td>\n")
312        f.write("               <td></td>\n")
313        f.write("               <td></td>\n")
314        f.write("               <td style=\"border-left: 0px\" class=\"testanswer\">"+ ans_dict[level1_answer]+"</td>\n")
315        f.write("               <td></td>\n")
316        f.write("               <td></td>\n")
317        f.write("               <td></td>\n")
318        f.write("           </tr>\n")
319       
320   
321        x_offset = 0
322        y_offset = 0
323        for x in range(nb_algo):
324            f.write("           <tr class=\"level2\" data-algo-type=\""+algo_list[x]+"\" style=\"display:none;background-color:#aed6f1;font-size:1.4em;\">\n")
325            f.write("               <td></td>\n")
326            f.write("               <td>"+algo_list[x]+" <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_1\" onClick=\"level2_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n")
327            f.write("                                    <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_2\" onClick=\"level2_fold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n")
328            f.write("               <td><div class=\"dropdown\"><button class=\"dropbtn\">&#128270;</button>\n")
329            f.write("               <div class=\"dropdown-content\">\n")
330            f.write("               <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"(\'"+revision_number+"\')\">show user_params.def</a>\n")
331            f.write("               </div></div></td>\n")
332            f.write("               <td> </td>\n")
333            f.write("               <td> </td>\n")
334            f.write("               <td class=\"testanswer\">"+ans_dict[level2_answer[x]]+"</td>\n")
335            f.write("               <td> </td>\n")
336            f.write("               <td> </td>\n")
337            f.write("           </tr>\n")
338
339            for y in range(nb_configs[x]):
340                f.write("           <tr class=\"level3_"+algo_list[x]+"\" data-algoconfig-type=\""+algo_list[x]+"_"+old_config_list[y_offset]+"\" style=\"display:none;background-color:#d6eaf8;font-size:1.2em;\">\n")
341                f.write("               <td></td>\n")
342                f.write("               <td></td>\n")
343                f.write("               <td>"+config_list[y_offset]+" <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_1\" onClick=\"level3_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n")
344                f.write("                                             <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_2\" onClick=\"level3_fold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n")
345                f.write("               <td><div class=\"dropdown\"><button class=\"dropbtn\">&#128270;</button>\n")
346                f.write("               <div class=\"dropdown-content\">\n")
347                f.write("               <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show all_param.def</a>\n")
348                f.write("               <a href=\"#\" onclick=\"show_user_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show user_param.def</a>\n")
349                f.write("               </div></div></td>\n")
350                y_position=y_offset
351                y_offset+=1
352                f.write("               <td></td>\n")
353                f.write("               <td></td>\n")
354                f.write("               <td class=\"testanswer\">"+ ans_dict[level3_answer[x][y]]+"</td>\n")
355                f.write("               <td></td>\n")
356                f.write("           </tr>\n")
357
358                for z in range(nb_files[x]):
359                    f.write("           <tr class=\"level4_"+algo_list[x]+"_"+old_config_list[y_position]+"\" style=\"display:none;background-color:#ebf5fb;\">\n")
360                    f.write("               <td></td>\n")
361                    f.write("               <td></td>\n")
362                    f.write("               <td></td>\n")
363                    f.write("               <td>"+file_list[x_offset+z]+"</td>\n")
364                    f.write("               <td></td>\n")
365                    f.write("               <td></td>\n")
366                    f.write("               <td></td>\n")
367                    f.write("               <td class=\"testanswer\">"+ ans_dict[level4_answer[x][y][z]]+"</td>\n")
368                    f.write("            </tr>\n")
369
370            x_offset = x_offset+nb_files[x]
371
372        f.write("       </tbody>\n")
373        f.write("   </table>\n")
374        # f.write("<script>\n")
375        # f.write("   var ans = document.getElementsByClassName('testanswer')\n")
376        # f.write("   for (var i = 0; i < ans.length; i++) {\n")
377        # f.write("       var cell = ans[i]\n")
378        # f.write("       if (cell.textContent == 'Passed') {\n")
379        # f.write("           cell.classList.add('green') }\n")
380        # f.write("       else if (cell.textContent == 'Failed') {\n")
381        # f.write("           cell.classList.add('red') }\n")
382        # f.write("       else if (cell.textContent == 'Initialized') {\n")
383        # f.write("           cell.classList.add('goldenrod') }\n")
384        # f.write("   }\n")
385
386        # f.write("\n\n")
387   
388        # f.write("</script>\n")
389
390        f.write("</body>\n")
391        f.write("</html>\n")
392        f.write("`);\n")
393
394
395
396        f.close()
397
398   
399if __name__== "__main__":
400  main()
401
402
Note: See TracBrowser for help on using the repository browser.