def listRange2ListPrefix(listRange,fieldRange): ''' Convert a range list to prefix list. Algorithm: generate a prefix rule list based on the range list, and convert it to PMTree, and fetch the entries in the range list from the tree. Examples: >>> listPrefix=listRange2ListPrefix([(0,4),(10,12)],(0,15)) >>> print listPrefix ['00**', '0100', '101*', '1100'] >>> print listRange2ListPrefix([(8,8),(10,11)],(0,15)) ['1000', '101*'] ''' #sanity check range l,h=fieldRange assert(l==0) nBit=int(math.log(h+1,2)) assert(2**nBit-1==h) #generate prefix rule list listFat=[] for r in listRange: appendRuleToRangeRuleList(listFat,r,'y') appendRuleToRangeRuleList(listFat,fieldRange,'n') #generate tree tree=PMTree(listFat,True,fieldRange) #saveSvgFile(tree.getDotCode(),'../output/tree.svg',True) #get node with 'y' label ly= tree.fetch('y') #fill in last bits by '*' in ly lz=[] for y in ly: lz.append(y+(nBit-len(y))*'*') return lz
listPrefixRule=[{'prefix': '00*', 'decision': 'permit'}, {'prefix': '01*', 'decision': 'deny'}, {'prefix': '10*', 'decision': 'permit'}, {'prefix': '11*', 'decision': 'deny'}] #listPrefixRule=[{'prefix': '101***', 'decision': 'permit'}, {'prefix': '0*****', 'decision': 'permit'}, {'prefix': '******', 'decision': 'deny'}] #listPrefixRule=[{'prefix': '******', 'decision': 'deny'}, {'prefix': '101***', 'decision': 'permit'}, {'prefix': '0*****', 'decision': 'permit'}] #listPrefixRule=[{'prefix': '101***', 'decision': 'deny'}, {'prefix': '0*****', 'decision': 'permit'}, {'prefix': '******', 'decision': 'deny'}] #listPrefixRule=[{'prefix': '0101**', 'decision': 'deny'}, {'prefix': '1**', 'decision': 'deny'}, {'prefix': '0***', 'decision': 'deny'}] #listPrefixRule=[{'prefix': '0101**', 'decision': 'deny'}, {'prefix': '0100**', 'decision': 'deny'}, {'prefix': '1**', 'decision': 'deny'}, {'prefix': '0***', 'decision': 'permit'}] #listPrefixRule=[{'prefix': '00', 'decision': 'permit'}, {'prefix': '01', 'decision': 'deny'}, {'prefix': '10', 'decision': 'permit'}, {'prefix': '11', 'decision': 'permit'}] #Not a classifier (rule set is not complete): #listPrefixRule=[{'prefix': '101***', 'decision': 'permit'}, {'prefix': '0*****', 'decision': 'permit'}] #dictDecisionWeight={'deny':100,'permit':1} #============================================================================== print 'Generate prefix match tree...' tree=PMTree(listPrefixRule)#prefix matching tree print tree saveSvgFile(tree.getDotCode(),'../output/main01.svg',False) print '\nCheck if prefix is in rule list...' prefix='1*' #prefix='00001010001110000100100000100011' #prefix='110000011011110001111101010100**' #prefix='1100000110111100011111**********' if tree.isConsistentIn(prefix)[0]: print prefix+' is consistent in:' print listPrefixRule else: print prefix+' is NOT consistent in:' print listPrefixRule