#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 print '\nRun 1-D DP algorithm to generate shortest rule list...\n' minCost,listMinListRule=generateShortestPrefixRuleListFromTree(tree,
def cutEven(tree,nChunk,listDecision,dictFieldRange,adtreeFieldOrder): #for ACL, limit decision to 'permit' or 'deny' for d in listDecision: assert(d=='permit' or d=='deny') assert(nChunk>=1) #costFmt='range' #costFmt='prefix_nonoverlap' costFmt='prefix_overlap' remainChunk=nChunk listNewTree=[] while remainChunk>1: #get the tree's cost dict dictCost=tree.generateCostDict(costFmt) assert(tree._root in dictCost) remainCost=dictCost[tree._root] refCost=math.floor(remainCost/float(remainChunk)) print 'Current reference cost: %d' %refCost saveSvgFile(tree.getCostDotCode(dictCost),'../output/tmp.svg',True) trial_successful=False for i in range(20): currCost=refCost+getNeighbor(i) #clip if currCost<1: currCost=1 if currCost>remainCost: currCost=remainCost currCut=tree._root.searchCost(dictCost,currCost) #assert(not not currCut)#temporally assume that can find the cut if not currCut: continue else: trial_successful=True #generate range rule list for the new tree _,lnd,_=tree._root.generatePrefixRuleListND(listDecision, dictFieldRange,'range',listNodeOfInterest=currCut) #construct new tree newTree=ADTree(lnd,'permit',adtreeFieldOrder,dictFieldRange, listDecision) listNewTree.append(newTree) #in the old tree, propagate rule (permit) to overwrite the portion curved out defaultRule=_generateDefaultRule(adtreeFieldOrder, dictFieldRange,'permit','range') for node in currCut: node.propagateRule(defaultRule,listDecision) tree._root.trim() remainChunk-=1 if trial_successful: break if not trial_successful: assert(0) #add remaining old tree listNewTree.append(tree) return listNewTree