comparison python/event.py @ 292:8b2c8a4015f1

class VehPairs updated. Now supports primitive multithreading.
author Paul@BEAST-III
date Wed, 06 Feb 2013 20:39:14 -0500
parents 9f81218e497a
children ee3302528cdc
comparison
equal deleted inserted replaced
291:9f81218e497a 292:8b2c8a4015f1
1 #! /usr/bin/env python 1 #! /usr/bin/env python
2 '''Libraries for events 2 '''Libraries for events
3 Interactions, pedestrian crossing...''' 3 Interactions, pedestrian crossing...'''
4 4
5 ## Native
6 import multiprocessing
7 import itertools
5 #import utils; 8 #import utils;
9 import numpy as np
6 import moving 10 import moving
7 import prediction 11 import prediction
8 12
9 __metaclass__ = type 13 __metaclass__ = type
10 14
11 ## Subsumes createInteractions(objects) with a VehPair Object 15 # TODO:
16 #http://stackoverflow.com/questions/3288595/multiprocessing-using-pool-map-on-a-function-defined-in-a-class
17 #http://www.rueckstiess.net/research/snippets/show/ca1d7d90
18 def calculateIndicatorPipe(pairs, predParam, timeHorizon=75,collisionDistanceThreshold=1.8):
19 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(pairs.movingObject1, pairs.movingObject2, predParam, collisionDistanceThreshold, timeHorizon)
20 #print pairs.num
21 # Ignore empty collision points
22 empty = 1
23 for i in collisionPoints:
24 if(collisionPoints[i] != []):
25 empty = 0
26 if(empty == 1):
27 pairs.hasCP = 0
28 else:
29 pairs.hasCP = 1
30 pairs.CP = collisionPoints
31
32 # Ignore empty crossing zones
33 empty = 1
34 for i in crossingZones:
35 if(crossingZones[i] != []):
36 empty = 0
37 if(empty == 1):
38 pairs.hasCZ = 0
39 else:
40 pairs.hasCZ = 1
41 pairs.CZ = crossingZones
42 return pairs
43
44 def calculateIndicatorPipe_star(a_b):
45 """Convert `f([1,2])` to `f(1,2)` call."""
46 return calculateIndicatorPipe(*a_b)
47
12 class VehPairs(): 48 class VehPairs():
49 # Create a veh-pairs object from objects list
13 def __init__(self,objects): 50 def __init__(self,objects):
14 ''' 51 '''
15 Create all pairs of two co-existing road users 52 Create all pairs of two co-existing road users
16 TODO: add test to compute categories? 53 TODO: add test to compute categories?
17 ''' 54 '''
18 #print(' -------------') #Disabled for traffic-intelligence trunk
19 #print(' Generating vehicle pairs...') #Disabled for traffic-intelligence trunk
20
21 self.pairs = [] 55 self.pairs = []
56 self.interactionCount = 0
57 self.CPcount = 0
58 self.CZcount = 0
22 num = 0 59 num = 0
23 for i in xrange(len(objects)): 60 for i in xrange(len(objects)):
24 for j in xrange(i): 61 for j in xrange(i):
25 commonTimeInterval = objects[i].commonTimeInterval(objects[j]) 62 commonTimeInterval = objects[i].commonTimeInterval(objects[j])
26 if not commonTimeInterval.empty(): 63 if not commonTimeInterval.empty():
27 self.pairs.append(event.Interaction(num, commonTimeInterval, objects[i].num, objects[j].num, objects[i], objects[j])) 64 self.pairs.append(event.Interaction(num, commonTimeInterval, objects[i].num, objects[j].num, objects[i], objects[j]))
28 num += 1 65 num += 1
29 66
30 def calculateIndicators(self,predParam,frameRate=15,collisionDistanceThreshold=1.8,timeHorizonMultiplier=5): 67 # Process indicator calculation with support for multi-threading
31 #print(' -------------') #Disabled for traffic-intelligence trunk 68 def calculateIndicators(self,predParam,threads=1,timeHorizon=75,collisionDistanceThreshold=1.8):
32 #print(' Calculating time-to-collision...') #Disabled for traffic-intelligence trunk 69 if(threads > 1):
33 70 pool = multiprocessing.Pool(threads)
34 timeHorizon = frameRate*timeHorizonMultiplier # prediction time Horizon = 1.5 s (reaction time) (5 second) 71 self.pairs = pool.map(calculateIndicatorPipe_star, itertools.izip(self.pairs, itertools.repeat(predParam)))
35 72 pool.close()
36 for params in [predParam]: 73 else:
37 74 #prog = Tools.ProgressBar(0, len(self.pairs), 77) #Removed in traffic-intelligenc port
38 #prog = Tools.ProgressBar(0, len(self.pairs), 77) #Disabled for traffic-intelligence trunk (PVA Tools dependancy)
39 for j in xrange(len(self.pairs)): 75 for j in xrange(len(self.pairs)):
40 #prog.updateAmount(j) #Disabled for traffic-intelligence trunk (PVA Tools dependancy) 76 #prog.updateAmount(j) #Removed in traffic-intelligenc port
41
42 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(self.pairs[j].movingObject1, self.pairs[j].movingObject2, predParam, collisionDistanceThreshold, timeHorizon) 77 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(self.pairs[j].movingObject1, self.pairs[j].movingObject2, predParam, collisionDistanceThreshold, timeHorizon)
43 78
44 # Ignore empty collision points 79 # Ignore empty collision points
45 empty = 1 80 empty = 1
46 for i in collisionPoints: 81 for i in collisionPoints:
59 empty = 0 94 empty = 0
60 if(empty == 1): 95 if(empty == 1):
61 self.pairs[j].hasCZ = 0 96 self.pairs[j].hasCZ = 0
62 else: 97 else:
63 self.pairs[j].hasCZ = 1 98 self.pairs[j].hasCZ = 1
64 self.pairs[j].CZ = crossingZones 99 self.pairs[j].CZ = crossingZones
100
101 for j in self.pairs:
102 self.interactionCount = self.interactionCount + len(j.CP)
103 self.CPcount = len(self.getCPlist())
104 self.Czcount = len(self.getCZlist())
65 return 105 return
106
66 107
67 def getPairsWCP(self): 108 def getPairsWCP(self):
68 lists = [] 109 lists = []
69 for j in self.pairs: 110 for j in self.pairs:
70 if(j.hasCP): 111 if(j.hasCP):
76 for j in self.pairs: 117 for j in self.pairs:
77 if(j.hasCZ): 118 if(j.hasCZ):
78 lists.append(j.num) 119 lists.append(j.num)
79 return lists 120 return lists
80 121
81 def getCPlist(self): 122 def getCPlist(self,indicatorThreshold=99999):
82 lists = [] 123 lists = []
83 for j in self.pairs: 124 for j in self.pairs:
84 if(j.hasCP): 125 if(j.hasCP):
85 for k in j.CP: 126 for k in j.CP:
86 if(j.CP[k] != []): 127 if(j.CP[k] != [] and j.CP[k][0].indicator < indicatorThreshold):
87 lists.append(j.CP[k]) 128 lists.append([k,j.CP[k][0]])
88 return lists 129 return lists
89 130
90 def getCZlist(self): 131 def getCZlist(self,indicatorThreshold=99999):
91 lists = [] 132 lists = []
92 for j in self.pairs: 133 for j in self.pairs:
93 if(j.hasCZ): 134 if(j.hasCZ):
94 for k in j.CZ: 135 for k in j.CZ:
95 if(j.CZ[k] != []): 136 if(j.CZ[k] != [] and j.CZ[k][0].indicator < indicatorThreshold):
96 lists.append(j.CZ[k]) 137 lists.append([k,j.CZ[k][0]])
97 return lists 138 return lists
139
140 def genIndicatorHistogram(self, CPlist=False, bins=range(0,100,1)):
141 if(not CPlist):
142 CPlist = self.getCPlist()
143 if(not CPlist):
144 return False
145 TTC_list = []
146 for i in CPlist:
147 TTC_list.append(i[1].indicator)
148 histo = np.histogram(TTC_list,bins=bins)
149 histo += (histo[0].astype(float)/np.sum(histo[0]),)
150 return histo
98 151
99 class Interaction(moving.STObject): 152 class Interaction(moving.STObject):
100 '''Class for an interaction between two road users 153 '''Class for an interaction between two road users
101 or a road user and an obstacle 154 or a road user and an obstacle
102 155