def __init__(self, name, dic): #print ">>> construct ElementNode: %s" % name self._name = name self._childStyleNodes = [] self._count = 1 self._imp = 0 self._nodeimp = 0 self.type = 'elementnode' self.doter = ElementNodeDoter() self.doter.init(self) #set DataNode default pos 0 _datanode = DataNode(self, dic) self._childStyleNodes.append(_datanode)
class ElementNode: ''' base tag class data structure: [ tagname, childtags: [], count = 1, imp = 0, ] ''' def __init__(self, name, dic): #print ">>> construct ElementNode: %s" % name self._name = name self._childStyleNodes = [] self._count = 1 self._imp = 0 self._nodeimp = 0 self.type = 'elementnode' self.doter = ElementNodeDoter() self.doter.init(self) #set DataNode default pos 0 _datanode = DataNode(self, dic) self._childStyleNodes.append(_datanode) def setName(self, name): self._name = str(name) def getName(self): return self._name def getChildStyleNodes(self): # maybe should return _childStyleNodes[1:] return self._childStyleNodes def getDataNode(self): #default: the first element is DataNode return self._childStyleNodes[0] def addChildStyleNode(self, node): ''' @ node : StyleNode ''' self._childStyleNodes.append(node) def _searchStyleNode(self, stylenodename): #skip DataNode defaut first pos for node in self.getChildStyleNodes()[1:]: if node.getPreview() == stylenodename: return node return False def findStyleNode(self, stylenode): ''' only find the stylenode ''' return self._searchStyleNode(stylenode.getPreview()) def incCount(self): ''' count pages that contain node ''' self._count += 1 def getCount(self): return self._count def getP(self): return self._count / pageNum def registerStyleNode(self, stylenode): if not trim(stylenode.getPreview()): return node = self._searchStyleNode(stylenode.getPreview()) if node: node.incCount() #print '.. return node ', node return node else: self.addChildStyleNode(stylenode) #print '.. return stylenode ', #print str(stylenode) return stylenode def getNodeImp(self): ''' if len(self.getChildStyleNodes()) == 1: return 1 ''' if self._nodeimp: return self._nodeimp m = self.getCount() res = 0 if m == 1: res = 1 else: for stylenode in self.getChildStyleNodes()[1:]: pi = stylenode.getCount() / pageNum res -= pi * math.log(pi, m) res += self.getDataNode().getCompImp() self._nodeimp = res return res def getCompImp(self): r = 0.9 if self._imp: return self._imp if len(self.getChildStyleNodes()) == 1: self._imp = self.getNodeImp() return self.getNodeImp() #else res = 0 res += (1 - r) * self.getNodeImp() tem = 0 tem += r * sum([ #pi stylenode.getP() * stylenode.getCompImp() for stylenode in self.getChildStyleNodes()[1:] ]) tem /= pageNum res += tem self._imp = res return res def __str__(self): ''' use dot to generate structure ''' #create dot node res = '' res += self.doter.initDotNode() + '\n' for i,e in enumerate(self.getChildStyleNodes()): e.doter.initIndex(self.doter.index+i) res += '%s -- %s;\n' % ( self.doter.getDotNode(), e.doter.getDotNode() ) res += str(e) #self.doter.incIndex() return res