~ubuntu-branches/ubuntu/utopic/adios/utopic

« back to all changes in this revision

Viewing changes to utils/skel/bin/skel_extract.py

  • Committer: Package Import Robot
  • Author(s): Alastair McKinstry
  • Date: 2013-12-09 15:21:31 UTC
  • mfrom: (1.1.2)
  • Revision ID: package-import@ubuntu.com-20131209152131-jtd4fpmdv3xnunnm
Tags: 1.5.0-1
* New upstream.
* Standards-Version: 3.9.5
* Include latest config.{sub,guess} 
* New watch file.
* Create libadios-bin for binaries.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
 
 
3
from __future__ import absolute_import, division, print_function, unicode_literals
 
4
import argparse
 
5
import xml.dom.minidom
 
6
import sys
 
7
 
 
8
#import skel_settings
 
9
 
 
10
 
 
11
def parse_command_line():
 
12
    parser = argparse.ArgumentParser (description='Extract data from specified skel output file')
 
13
    parser.add_argument ('skel_output', metavar='Skel result', help='file to extract data from')
 
14
    parser.add_argument ('-d', dest='dest', help='file to place the results in')
 
15
    parser.add_argument ('-s', dest='select', help='measurement(s) to extract (default = *)')
 
16
    parser.add_argument ('-r', dest='ranks', default='0', help='Use -r all to include measurements from all ranks for just one iteration.')
 
17
    parser.add_argument ('-R', dest='generate_R', action="store_true", default=False, help='Extract into a form to be read by R.')
 
18
    return parser.parse_args()
 
19
 
 
20
 
 
21
 
 
22
 
 
23
# By default, print all data for rank 0 as one line, repeat for each iteration
 
24
def extract (skel_output, dest, select, ranks):
 
25
 
 
26
    doc = xml.dom.minidom.parse (skel_output)
 
27
    if dest == None or dest == '':
 
28
        outfile = sys.stdout
 
29
    else:
 
30
        outfile = open (dest, 'w')
 
31
 
 
32
    if select == None or select == '':
 
33
        select = '*'
 
34
 
 
35
    keys = doc.getElementsByTagName('adios_timing')[0].getAttribute('keys').split(',')
 
36
    tempkeys = []
 
37
    for key in keys:
 
38
        tempkeys.append (key.strip())
 
39
 
 
40
    keys = tempkeys
 
41
 
 
42
    if select == '*':
 
43
        selected_fields = keys
 
44
    else:
 
45
        selected_fields = select.split(',')
 
46
 
 
47
    # check the selected fields
 
48
    for field in selected_fields:
 
49
        if not field in keys:
 
50
            print('Invalid selection, field ' + field)
 
51
            return
 
52
 
 
53
    #Print the header
 
54
    header = ''
 
55
    for field in selected_fields:
 
56
        header = header + field
 
57
        header = header +','
 
58
 
 
59
    header = header.rstrip (',')
 
60
    outfile.write (header + '\n')
 
61
 
 
62
    for st in doc.getElementsByTagName ('adios_timing'):
 
63
 
 
64
        #Print the data
 
65
        for proc in st.getElementsByTagName('proc'):
 
66
            if proc.getAttribute ('id') == '0' or ranks == 'all':  
 
67
                data = ''
 
68
                vals = proc.getAttribute ('vals').split(',')
 
69
                for field in selected_fields:
 
70
                    data = data + vals[keys.index(field)].strip() + ','
 
71
                data = data.rstrip (',') + '\n'
 
72
                outfile.write (data)
 
73
        if ranks == 'all':
 
74
            break
 
75
    
 
76
    outfile.close () 
 
77
    
 
78
 
 
79
 
 
80
# Hilde's function for extracting to a format understood by the R script
 
81
def extract_R (skel_output, select, ranks):
 
82
 
 
83
    doc = xml.dom.minidom.parse (skel_output)
 
84
    #if dest == None or dest == '':
 
85
    #    outfile = sys.stdout
 
86
    #else:
 
87
    outfile = open (skel_output+".txt", 'w')
 
88
    #runval=dest.split('.')[0].split('_')[1]
 
89
    #outfile.write ("runid = " +runval +'\n')
 
90
 
 
91
    if select == None or select == '':
 
92
        select = '*'
 
93
 
 
94
 
 
95
 
 
96
    
 
97
    method = doc.getElementsByTagName('adios_timing')[0].getAttribute('method')
 
98
 
 
99
    keys = doc.getElementsByTagName('adios_timing')[0].getAttribute('keys').split(',')
 
100
    tempkeys = []
 
101
    for key in keys:
 
102
        tempkeys.append (key.strip())
 
103
 
 
104
    keys = tempkeys
 
105
 
 
106
    numcores= doc.getElementsByTagName('adios_timing')[0].getAttribute('cores')
 
107
 
 
108
    if select == '*':
 
109
        selected_fields = keys
 
110
    else:
 
111
        selected_fields = select.split(',')
 
112
 
 
113
    # check the selected fields
 
114
    for field in selected_fields:
 
115
        if not field in keys:
 
116
            print('Invalid selection, field ' + field)
 
117
            return
 
118
 
 
119
    #Print the header
 
120
    header = ''
 
121
    for field in selected_fields:
 
122
        header = header + field
 
123
        header = header +' '
 
124
 
 
125
    header = "Iteration "+"Core "+header.rstrip (' ')
 
126
    outfile.write (method + '\n')
 
127
    outfile.write (numcores +'\n')
 
128
    outfile.write (header + '\n')
 
129
    iter = 0
 
130
 
 
131
    for st in doc.getElementsByTagName ('adios_timing'):
 
132
 
 
133
        #Print the data
 
134
        for proc in st.getElementsByTagName('proc'):
 
135
            if proc.getAttribute ('id') == '0':
 
136
                iter = iter +1
 
137
            data = ''
 
138
            core = proc.getAttribute ('id')
 
139
            vals = proc.getAttribute ('vals').split(',')
 
140
            for field in selected_fields:
 
141
                data = data + vals[keys.index(field)].strip(',')
 
142
            data = str(iter)+" "+ core +" "+ data.rstrip (' ') + '\n'
 
143
            outfile.write (data)
 
144
        if ranks == 'all':
 
145
 
 
146
 
 
147
            
 
148
            break
 
149
    
 
150
    outfile.close ()
 
151
 
 
152
 
 
153
 
 
154
def main ():
 
155
 
 
156
 
 
157
    args = parse_command_line()
 
158
    if (args.generate_R):
 
159
        extract_R (args.skel_output, args.select, args.ranks)
 
160
    else:    
 
161
        extract (args.skel_output, args.dest, args.select, args.ranks)
 
162
 
 
163
 
 
164
 
 
165
if __name__ == "__main__":
 
166
    main()
 
167
 
 
168