aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorGravatar rcoh <rcoh@mit.edu>2011-02-12 15:59:59 -0500
committerGravatar rcoh <rcoh@mit.edu>2011-02-12 15:59:59 -0500
commit4d62e1152241854ab864142d827d735d84405078 (patch)
tree2589c6a37721e1b8362c8e8c6a580c8c185b2f86 /util
parentb45b9079c5decd720d8275378bb0d6dc172c6234 (diff)
Modified the test code to automatically pick up new tests. Just add your test file to
tests/__init__.py. Fixed a bug in ZigZagLayout. Added the BehaviorQuerySystem to allow querying on behaviors. Added the "ModulateColor" behavior which will continually shift a color along the HSV plane. Added TestBQS to test the behavior query system. Modified Behavior to have a getLastOutput and setLastOutput method.
Diffstat (limited to 'util')
-rw-r--r--util/BehaviorQuerySystem.py39
-rw-r--r--util/ComponentRegistry.py25
-rw-r--r--util/Geo.py5
3 files changed, 58 insertions, 11 deletions
diff --git a/util/BehaviorQuerySystem.py b/util/BehaviorQuerySystem.py
new file mode 100644
index 0000000..5399435
--- /dev/null
+++ b/util/BehaviorQuerySystem.py
@@ -0,0 +1,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(prediateList, 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
+
+
diff --git a/util/ComponentRegistry.py b/util/ComponentRegistry.py
index 776cd17..be913df 100644
--- a/util/ComponentRegistry.py
+++ b/util/ComponentRegistry.py
@@ -11,16 +11,19 @@ def clearRegistry():
initRegistry()
def removeComponent(cid):
- globals()['Registry'].pop(cid)
+ global Registry
+ Registry.pop(cid)
def getComponent(cid):
- return globals()['Registry'][cid]
+ global Registry
+ return Registry[cid]
#Registry of all components of the light system
#TODO: pick a graceful failure behavior and implement it
def registerComponent(component, cid=None):
+ global Registry
if cid != None:
- globals()['Registry'][cid] = component
+ Registry[cid] = component
else:
try:
cid = component['Id']
@@ -28,22 +31,26 @@ def registerComponent(component, cid=None):
cid = getNewId()
component['Id'] = cid
main_log.debug(cid + 'automatically assigned')
- globals()['Registry'][cid] = component
+ Registry[cid] = component
return cid
def verifyUniqueId(cid):
- return not cid in globals()['Registry']
+ global Registry
+ return not cid in Registry
def removeComponent(cid):
- globals()['Registry'].pop(cid)
+ global Registry
+ Registry.pop(cid)
def getComponent(cid):
- return globals()['Registry'][cid]
+ global Registry
+ return Registry[cid]
def getNewId():
- trialKey = len(globals()['Registry'])
+ global Registry
+ trialKey = len(Registry)
trialId = hashlib.md5(str(trialKey)).hexdigest()
- while trialId in globals()['Registry']:
+ while trialId in Registry:
trialKey += 1
trialId = hashlib.md5(str(trialKey)).hexdigest()
return trialId
diff --git a/util/Geo.py b/util/Geo.py
index 43817ad..211e89d 100644
--- a/util/Geo.py
+++ b/util/Geo.py
@@ -2,8 +2,9 @@
import math
from bisect import *
import random
-def pointWithinBoundingBox(point, bb): #this could be in 4 lines, but I'm lazy.
- return sum([(point[i % 2] <= bb[i]) == (i>1) for i in range(4)]) == 4
+def pointWithinBoundingBox(point, bb):
+ """Returns whether or not a point (x,y) is within a bounding box (xmin, ymin, xmax, ymax)"""
+ return all([(point[i % 2] <= bb[i]) == (i>1) for i in range(4)])
def addLocations(l1,l2):
return tuple([l1[i]+l2[i] for i in range(len(l1))])