aboutsummaryrefslogtreecommitdiff
path: root/util/BehaviorQuerySystem.py
blob: 643b95c582f5c263681e7c38588b0bfde0027d26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import types 
"""The behavior query system is a module that allows querying behaviors based on lambda-function
predicates."""
def initBQS():
    global behaviorList, initialized
    behaviorList = [] 
    initialized = True

def addBehavior(behavior):
    behaviorList.append(behavior)

def query(predicateList):
    """BehaviorQuerySystem.query takes a list of predicates (functions with signature:
        (behavior,output)), and
    optionally a behavior to be compared to."""
    #want to do queries wrt: behavior itself, the behavior packet, the querying behavior
    if isinstance(predicateList, types.FunctionType):
        predicateList = [predicateList]
    elif not isinstance(predicateList, list):
        raise Exception('Predicate list must be a function or list of functions')
    global behaviorList, initialized
    ret = [] 
    if not initialized:
        initBQS()
    
    for behavior in behaviorList: #Consider every behavior
        lastOutput = behavior.getLastOutput()
        for output in lastOutput: #Look at every element it has output
            validOutput = True
            for pred in predicateList: #Evaluate every predicate.  A predicate is a lambda function that
            #takes a dict and returns a bool.
                if not pred(output):
                    validOutput = False
                    break
            if validOutput:
                ret.append(output)
    return ret