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, 5 years ago

dev_trunk_omp : update xios_report.html

File size: 16.6 KB
RevLine 
[1776]1
2import array as arr
3import collections
4import glob
[1771]5import os
6import sys
[1776]7import subprocess
8import socket
9import os.path
10from os import path
[1771]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:
[1776]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
[1771]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:
[1776]31            if not line.startswith("#"):
32                for word in line.split(" "):
33                    if "config_" in word:
34                        yield word
35                        break
[1771]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:
[1776]43            if not line.startswith("#"):
44                for word in line.split(" "):
45                    if word.startswith("test_"):
46                        yield word
47                        break
[1771]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:
[1776]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
[1771]59               
[1776]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")   
[1771]70
71def main():
[1776]72    unfold_icon = '⮯'
73    fold_icon = '⮭'
[1771]74
[1776]75    current_revision_report = sys.argv[1]
76
77    if os.path.exists(current_revision_report) :
78        file_to_open=current_revision_report
[1771]79    else :
80        file_to_open="plein_report_example.txt"
81
[1776]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           
[1771]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
[1774]225    # ans_dict = {-1: 'Failed', 0: 'Initialized', 1: 'Passed'}
226    ans_dict = {-1: '❌', 0: '&#10062', 1: '✅'}
[1771]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
[1776]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")
[1771]307        f.write("               <td><div class=\"dropdown\"><button class=\"dropbtn\">&#128270;</button>\n")
308        f.write("               <div class=\"dropdown-content\">\n")
[1776]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")
[1771]311        f.write("               </div></div></td>\n")
[1776]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")
[1771]318        f.write("           </tr>\n")
319       
[1776]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")
[1771]325            f.write("               <td></td>\n")
[1776]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")
[1771]328            f.write("               <td><div class=\"dropdown\"><button class=\"dropbtn\">&#128270;</button>\n")
329            f.write("               <div class=\"dropdown-content\">\n")
[1776]330            f.write("               <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"(\'"+revision_number+"\')\">show user_params.def</a>\n")
[1771]331            f.write("               </div></div></td>\n")
[1776]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")
[1771]337            f.write("           </tr>\n")
338
[1776]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")
[1771]341                f.write("               <td></td>\n")
342                f.write("               <td></td>\n")
[1776]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
[1771]352                f.write("               <td></td>\n")
353                f.write("               <td></td>\n")
[1776]354                f.write("               <td class=\"testanswer\">"+ ans_dict[level3_answer[x][y]]+"</td>\n")
[1771]355                f.write("               <td></td>\n")
[1776]356                f.write("           </tr>\n")
[1771]357
[1776]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")
[1771]369
[1776]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")
[1771]387   
[1776]388        # f.write("</script>\n")
[1771]389
[1776]390        f.write("</body>\n")
391        f.write("</html>\n")
392        f.write("`);\n")
[1771]393
394
395
[1776]396        f.close()
[1771]397
398   
399if __name__== "__main__":
400  main()
401
402
Note: See TracBrowser for help on using the repository browser.