diff --git a/readTrace.py b/readTrace.py index eefe393b5534cb75139632eb5ec9c729cb11ca95..37510742d26cda3d3a56847421829c8fca64e925 100755 --- a/readTrace.py +++ b/readTrace.py @@ -58,6 +58,49 @@ class Step() : #------------------------------------------------------------------------------- ################################################################################ +################################################################################ +class Block() : +#------------------------------------------------------------------------------- + def __init__(self, state) : + self.versions = [[]] # List of list of steps + self.state = state +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- + def addStep(self, step) : + self.versions[-1].append(step) +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- + def newVersion(self) : + self.versions.append([]) +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- + def nbVersions(self) : + return len(self.versions) +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- + def getAsLines(self, maxNbVersions) : + output = [] + versions = [] + for version in self.versions : + versions.append([]) + lineStr = englobStr("State %d"%self.state, "-", lenLine()) + versions[-1].append(lineStr + (lenLine()-len(lineStr))*" ") + for step in version : + versions[-1].append(str(step) + (lenLine()-len(str(step)))*" ") + maxIndex = max([len(version) for version in versions]) + for i in range(maxIndex) : + output.append("") + for j in range(maxNbVersions) : + output[-1] += ("\t" if j > 0 else "") + (versions[j][i] if j in range(len(versions)) and i in range(len(versions[j])) else lenLine()*" ") + + return output +#------------------------------------------------------------------------------- +################################################################################ + ################################################################################ class History() : #------------------------------------------------------------------------------- @@ -67,7 +110,7 @@ class History() : #------------------------------------------------------------------------------- def segmentInBlocks(self) : - #structure : sentence = [annotations,list of blocks] = list of versions = list of steps + #structure : sentence = [annotations,list of blocks] sentences = [] for sentenceAnnot in self.sentences : annot = sentenceAnnot[0] @@ -78,21 +121,21 @@ class History() : for step in sentence : if lastState is not None and lastState != step.state : blockIndex += 1 - while blockIndex >= len(sentences[-1][1]) : - sentences[-1][1].append([[]]) - block = sentences[-1][1][blockIndex][-1] - block.append(step) + if blockIndex >= len(sentences[-1][1]) : + sentences[-1][1].append(Block(step.state)) + block = sentences[-1][1][blockIndex] + block.addStep(step) lastState = step.state if "BACK" in step.action and "NOBACK" not in step.action : backSize = int(step.action.split()[-1]) backState = step.state while backSize > 0 : blockIndex -= 1 - state = sentences[-1][1][blockIndex][-1][0].state + state = sentences[-1][1][blockIndex].state if state == backState : backSize -= 1 for block in sentences[-1][1][blockIndex:] : - block.append([]) + block.newVersion() self.sentences = sentences #------------------------------------------------------------------------------- @@ -110,22 +153,11 @@ class History() : for sentIndex in range(len(self.sentences)) : sentence = self.sentences[sentIndex][1] annotations = alignAsTab([self.sentences[sentIndex][0][wid] for wid in sorted(list(self.sentences[sentIndex][0].keys()))]) - maxNbVersions = max([len(block) for block in sentence]) + maxNbVersions = max([block.nbVersions() for block in sentence]) print(englobStr("Sentence %d"%sentIndex, "-", (1+maxNbVersions)*(1+lenLine())), file=out) totalOutput = [] for block in sentence : - versions = [] - for version in block : - versions.append([]) - lineStr = englobStr("State %d"%block[0][0].state, "-", lenLine()) - versions[-1].append(lineStr + (lenLine()-len(lineStr))*" ") - for step in version : - versions[-1].append(str(step) + (lenLine()-len(str(step)))*" ") - maxIndex = max([len(version) for version in versions]) - for i in range(maxIndex) : - totalOutput.append("") - for j in range(maxNbVersions) : - totalOutput[-1] += ("\t" if j > 0 else "") + (versions[j][i] if j in range(len(versions)) and i in range(len(versions[j])) else lenLine()*" ") + totalOutput += block.getAsLines(maxNbVersions) for i in range(len(totalOutput)) : print(totalOutput[i] + ("\t"+annotations[i] if i in range(len(annotations)) else ""), file=out) print("", file=out)