diff --git a/shared/python/lcf2csv.py b/shared/python/lcf2csv.py new file mode 100755 index 00000000..c815445c --- /dev/null +++ b/shared/python/lcf2csv.py @@ -0,0 +1,167 @@ +#!/usr/bin/python +import os +import sys +import string +import elementtree.ElementTree as ET + +lcfns = 'http://planet-sl.org/lcf' +ldfns = 'http://planet-sl.org/ldf' +xldfns = 'http://planet-sl.org/xldf' +bgfns = 'http://planet-sl.org/bgf' +xbgfns= 'http://planet-sl.org/xbgf' +xsdns = 'http://www.w3.org/2001/XMLSchema' +htmlns= 'http://www.w3.org/1999/xhtml' + +ET._namespace_map[lcfns] = 'lcf' +ET._namespace_map[ldfns] = 'ldf' +ET._namespace_map[xldfns] = 'xldf' +ET._namespace_map[bgfns] = 'bgf' +ET._namespace_map[xbgfns]='xbgf' +ET._namespace_map[xsdns] = 'xsd' +ET._namespace_map[htmlns]='html' + +synch = {} + +def shorten(dottedName): + array = dottedName.split('.') + name = [array[0]] + for a in array[1:]: + if name[-1].isdigit(): + if name[-2]==cutName(a): + name[-1] = str(int(name[-1])+1) + else: + name.append(cutName(a)) + elif name[-1]==cutName(a): + name.append('2') + else: + name.append(cutName(a)) + return '.'.join(name) + +def main(lcffile,prefix): + ltree = ET.parse(lcffile) + newLcf = ET.Element('{'+lcfns+'}configuration') + xbgfDir = '/'.join(lcffile.split('/')[:-1]) + if xbgfDir == '': + xbgfDir = 'xbgf/' + elif xbgfDir[-1]=='/': + xbgfDir += 'xbgf/' + else: + xbgfDir += '/xbgf/' + # find synch points + for t in ltree.findall('target'): + synch[t.findtext('name')] = [] + for b in t.findall('branch'): + start = b.findtext('input') + for p in b.findall('postextraction/perform'): + start += '.'+cutName(p.text) + for p in b.findall('synchronization/perform'): + start += '.'+cutName(p.text) + for p in b.findall('normalization/perform'): + start += '.'+cutName(p.text) + synch[t.findtext('name')].append(shorten(start)) + #print synch + # generate csvs + for t in ltree.findall('target'): + for b in t.findall('branch'): + start = b.findtext('input') + csv = open(prefix+'.'+t.findtext('name')+'.'+start+'.txt','w') + csv.write('initial\t'+measure(shorten(start),t.findtext('name'))+'\n') + for p in b.findall('*/perform'): + start += '.'+cutName(p.text) + csv.write(p.text+'\t'+measure(shorten(start),t.findtext('name'))+'\n') + csv.close() + print 'Target',t.findtext('name'),'done.' + #ET.ElementTree(newLcf).write(lcfName) + return + +def measure(x,y): + if synch[y][0].split('.')[0]!=x.split('.')[0]: + z=synch[y][0] + else: + z=synch[y][1] + #print '[',y,']',x,'vs',z + run = 'gdt bgf/'+x+'.bgf bgf/'+z+'.bgf | grep "only:" | grep -o "\[..*\]" | wc -w' + if os.system(run+' > TMP-res'): + nameDiffs = '0' + #print 'ERROR1:',run + else: + num = open('TMP-res','r') + nameDiffs = num.readline().strip() + num.close() + run = 'gdt bgf/'+x+'.bgf bgf/'+z+'.bgf | grep Fail' + if os.system(run+' > TMP-res'): + strDiffs = 0 + #print 'ERROR2:',run + else: + num = open('TMP-res','r') + strDiffs = 0 + for line in num.readlines(): + nsn = line.strip().split('(')[1].split(')')[0].split('/') + strDiffs += max(int(nsn[0]),int(nsn[1])) + num.close() + return nameDiffs+'\t'+str(strDiffs)+'\t'+str(int(nameDiffs)+strDiffs) + +def cutName(lbl): + l='' + for x in lbl: + if x.islower() or x=='.': + l+=x + else: + break + return l + +def forNewTarget(xbgfDir1,xbgfDir2,t): + print 'Splitting target',t.findtext('name'),'...' + nt = ET.Element('target') + nt.append(t.findall('name')[0]) + for branch in t.findall('branch'): + nbr = ET.Element('branch') + for e in branch.findall('*'): + if e.tag == 'input': + nbr.append(e) + else: + phase = ET.Element(e.tag) + for step in e.findall('*'): + # perform or automated + print '-->',step.tag, + if step.tag=='perform': + print step.text,'-', + for s in sliceFile(xbgfDir1,xbgfDir2,step.text): + phase.append(s) + else: + print step.findtext('result'),'-', + for s in sliceFile(xbgfDir1,xbgfDir2,step.findtext('result')): + phase.append(s) + #phase.append(step) + nbr.append(phase) + nt.append(nbr) + return nt + +def sliceFile(xbgfDir1,xbgfDir2,text): + sliced = [] + xtree = ET.parse(xbgfDir1+text+'.xbgf') + cx = 0 + for t in xtree.findall('*'): + cx += 1 + seq = ET.Element('{'+xbgfns+'}sequence') + if t.tag=='{'+xbgfns+'}atomic': + for sub in t.findall('*'): + seq.append(sub) + else: + seq.append(t) + ET.ElementTree(seq).write(xbgfDir2+text+'-'+`cx`+'.xbgf') + p = ET.Element('perform') + p.text = text+'-'+`cx` + sliced.append(p) + print cx,'slices' + return sliced + +if __name__ == "__main__": + if len(sys.argv) == 3: + apply(main,sys.argv[1:3]) + else: + print '''This tool takes an LCF file and produces a set of CSV files, diffing all BGFs in all branches + +Usage:''' + print ' ',sys.argv[0],'','' + sys.exit(1) diff --git a/shared/python/lci.py b/shared/python/lci.py index ce522824..e202c66d 100755 --- a/shared/python/lci.py +++ b/shared/python/lci.py @@ -48,15 +48,24 @@ def dotNodeName(self,target): name += '_'+stripSpecifics(a) return name+'_'+target def bgfFileName(self): - name = self.array[0] + name = [self.array[0]] for a in self.array[1:]: - name += '.'+stripCamelCase(a) - return name+'.bgf' + if name[-1].isdigit(): + if name[-2]==stripCamelCase(a): + name[-1] = str(int(name[-1])+1) + else: + name.append(stripCamelCase(a)) + elif name[-1]==stripCamelCase(a): + name.append('2') + else: + name.append(stripCamelCase(a)) + return '.'.join(name)+'.bgf' def futureBgfFileName(self,next): - name = self.array[0] - for a in self.array[1:]: - name += '.'+stripCamelCase(a) - return name+'.'+stripCamelCase(next)+'.bgf' + tmp = self.array[:] + self.array.append(stripCamelCase(next)) + name = self.bgfFileName() + self.array = tmp + return name def append(self,step): self.array.append(step) def spaceNotation(self): @@ -71,6 +80,8 @@ def type(self): if ttype[a] in ('transformation','refactoring'): t = 1 return t + def lastAction(self): + return self.array[-1] def ChainFromArray(a): x = Chain() @@ -250,7 +261,7 @@ def distanceBetween(node,tgt): def compareGrammars(bgf,arr): goal = arr[0] for a in arr().split('.')[1:]: - if ttype[a] in ('synchronization','postextraction'): + if ttype[a] in ('synchronization','postextraction','normalization'): goal += '.'+stripCamelCase(a) #print '[----] Ready:',bgf,'vs',goal #print '[++++] Distance is:', @@ -343,8 +354,15 @@ def dumpGraph(df): if par: dot.write(' ['+par+']') dot.write(';\n') + #currentFileName = df+'.'+nodezz[0][1]+'.csv' + #currentFile = open(currentFileName,'w') + #print nodezz for nNg in nodezz: node,goal=nNg + #if df+'.'+goal+'.csv' != currentFileName: + # currentFile.close() + # currentFileName = df+'.'+goal+'.csv' + # currentFile = open(currentFileName,'w') if node in failed: colour = 'red' elif node in almostFailed: @@ -363,10 +381,12 @@ def dumpGraph(df): dot.write(' [color='+colour) if cx != '?': dot.write(', label="'+cx+'"') + #currentFile.write(node.lastAction()+','+`eval(cx)`+'\n') if node.dotNodeName(goal) in dablNodezz: # synch point dot.write(', shape=doublecircle') dot.write('];\n') + #currentFile.close() dot.write('}') dot.close() run = 'dot -Tpdf '+dot.name+' -o '+df+'_large.pdf' @@ -756,7 +776,7 @@ def checkConsistency(): print '----- Tree convergence phase finished. -----' else: print '[WARN] No testing performed.' - dumpGraph(sys.argv[2]) + #dumpGraph(sys.argv[2]) if problem: sysexit(100) log.close() diff --git a/shared/python/sliceXbgf.py b/shared/python/sliceXbgf.py new file mode 100755 index 00000000..fab543fd --- /dev/null +++ b/shared/python/sliceXbgf.py @@ -0,0 +1,97 @@ +#!/usr/bin/python +import os +import sys +import string +import elementtree.ElementTree as ET + +lcfns = 'http://planet-sl.org/lcf' +ldfns = 'http://planet-sl.org/ldf' +xldfns = 'http://planet-sl.org/xldf' +bgfns = 'http://planet-sl.org/bgf' +xbgfns= 'http://planet-sl.org/xbgf' +xsdns = 'http://www.w3.org/2001/XMLSchema' +htmlns= 'http://www.w3.org/1999/xhtml' + +ET._namespace_map[lcfns] = 'lcf' +ET._namespace_map[ldfns] = 'ldf' +ET._namespace_map[xldfns] = 'xldf' +ET._namespace_map[bgfns] = 'bgf' +ET._namespace_map[xbgfns]='xbgf' +ET._namespace_map[xsdns] = 'xsd' +ET._namespace_map[htmlns]='html' + +def main(lcffile,outdir): + ltree = ET.parse(lcffile) + newLcf = ET.Element('{'+lcfns+'}configuration') + dirName = outdir + if dirName[-1]!='/': + dirName += '/' + lcfName = dirName+lcffile.split('/')[-1] + xbgfDir = '/'.join(lcffile.split('/')[:-1]) + if xbgfDir[-1]=='/': + xbgfDir += 'xbgf/' + else: + xbgfDir += '/xbgf/' + for el in ltree.findall('*'): + if el.tag == 'target': + newLcf.append(forNewTarget(xbgfDir,dirName+'xbgf/',el)) + else: + newLcf.append(el) + ET.ElementTree(newLcf).write(lcfName) + return + +def forNewTarget(xbgfDir1,xbgfDir2,t): + print 'Splitting target',t.findtext('name'),'...' + nt = ET.Element('target') + nt.append(t.findall('name')[0]) + for branch in t.findall('branch'): + nbr = ET.Element('branch') + for e in branch.findall('*'): + if e.tag == 'input': + nbr.append(e) + else: + phase = ET.Element(e.tag) + for step in e.findall('*'): + # perform or automated + print '-->',step.tag, + if step.tag=='perform': + print step.text,'-', + for s in sliceFile(xbgfDir1,xbgfDir2,step.text): + phase.append(s) + else: + print step.findtext('result'),'-', + for s in sliceFile(xbgfDir1,xbgfDir2,step.findtext('result')): + phase.append(s) + #phase.append(step) + nbr.append(phase) + nt.append(nbr) + return nt + +def sliceFile(xbgfDir1,xbgfDir2,text): + sliced = [] + xtree = ET.parse(xbgfDir1+text+'.xbgf') + cx = 0 + for t in xtree.findall('*'): + cx += 1 + seq = ET.Element('{'+xbgfns+'}sequence') + if t.tag=='{'+xbgfns+'}atomic': + for sub in t.findall('*'): + seq.append(sub) + else: + seq.append(t) + ET.ElementTree(seq).write(xbgfDir2+text+'-'+`cx`+'.xbgf') + p = ET.Element('perform') + p.text = text+'-'+`cx` + sliced.append(p) + print cx,'slices' + return sliced + +if __name__ == "__main__": + if len(sys.argv) == 3: + apply(main,sys.argv[1:3]) + else: + print '''XBGF slicing tool + +Usage:''' + print ' ',sys.argv[0],'','' + sys.exit(1)