Example #1
0
#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,
Example #2
0
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