changeset 559:806df5f61c03

adapted safety-analysis script to use multi-threading
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 15 Jul 2014 01:25:33 -0400
parents a80ef6931fd8
children 5b534ad95bfb
files python/events.py python/prediction.py scripts/safety-analysis.py
diffstat 3 files changed, 17 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/python/events.py	Mon Jul 14 17:44:09 2014 -0400
+++ b/python/events.py	Tue Jul 15 01:25:33 2014 -0400
@@ -111,7 +111,7 @@
         self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[5], speedDifferentials))
 
         # if we have features, compute other indicators
-        if self.roadUser1.features != None and self.roadUser2.features != None:
+        if len(self.roadUser1.features) != 0 and len(self.roadUser2.features) != 0:
             minDistance={}
             for instant in self.timeInterval:
                 minDistance[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant)
@@ -127,10 +127,7 @@
             commonTimeInterval = timeInterval
         else:
             commonTimeInterval = self.timeInterval
-        self.collisionPoints, self.crossingZones = prediction.computeCrossingsCollisions(normalAdaptationPredictionParameters, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, nProcesses)
-        # for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
-        #     i, self.collisionPoints[i], self.crossingZones[i] = predictionParameters.computeCrossingsCollisionsAtInstant(i, self.roadUser1, self.roadUser2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
-        #     if len(self.collisionPoints[i]) > 0:
+        self.collisionPoints, self.crossingZones = prediction.computeCrossingsCollisions(predictionParameters, self.roadUser1, self.roadUser2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, commonTimeInterval, nProcesses)
         for i, cp in self.collisionPoints.iteritems():
             TTCs[i] = prediction.SafetyPoint.computeExpectedIndicator(cp)
         # add probability of collision, and probability of successful evasive action
--- a/python/prediction.py	Mon Jul 14 17:44:09 2014 -0400
+++ b/python/prediction.py	Tue Jul 15 01:25:33 2014 -0400
@@ -186,7 +186,11 @@
         commonTimeInterval = obj1.commonTimeInterval(obj2)
     if nProcesses == 1:
         for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
-            i, collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
+            i, cp, cz = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
+            if len(cp) != 0:
+                collisionPoints[i] = cp
+            if len(cz) != 0:
+                 crossingZones[i] = cz
     else:
         from multiprocessing import Pool
         pool = Pool(processes = nProcesses)
@@ -196,8 +200,10 @@
         for j in jobs:
             i, cp, cz = j.get()
             #if len(cp) != 0 or len(cz) != 0:
-            collisionPoints[i] = cp
-            crossingZones[i] = cz
+            if len(cp) != 0:
+                collisionPoints[i] = cp
+            if len(cz) != 0:
+                crossingZones[i] = cz
         pool.close()
     return collisionPoints, crossingZones
 
--- a/scripts/safety-analysis.py	Mon Jul 14 17:44:09 2014 -0400
+++ b/scripts/safety-analysis.py	Tue Jul 15 01:25:33 2014 -0400
@@ -14,7 +14,7 @@
 parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file', required = True)
 parser.add_argument('--prediction-method', dest = 'predictionMethod', help = 'prediction method (constant velocity (vector computation), constant velocity, normal adaptation, point set prediction)', choices = ['cvd', 'cv', 'na', 'ps'])
 parser.add_argument('--display-cp', dest = 'displayCollisionPoints', help = 'display collision points', action = 'store_true')
-parser.add_argument('-n', dest = 'nProcesses', help = 'number of processes to run in parallel', type = int)
+parser.add_argument('-n', dest = 'nProcesses', help = 'number of processes to run in parallel', type = int, default = 1)
 args = parser.parse_args()
 
 params = storage.ProcessParameters(args.configFilename)
@@ -25,8 +25,10 @@
 else:
     predictionMethod = params.predictionMethod
 
-accelerationDistribution = lambda: random.triangular(-params.maxNormalAcceleration, params.maxNormalAcceleration, 0.)
-steeringDistribution = lambda: random.triangular(-params.maxNormalSteering, params.maxNormalSteering, 0.)
+def accelerationDistribution(): 
+    return random.triangular(-params.maxNormalAcceleration, params.maxNormalAcceleration, 0.)
+def steeringDistribution():
+    return random.triangular(-params.maxNormalSteering, params.maxNormalSteering, 0.)
 
 if predictionMethod == 'cvd': # TODO add cve: constant velocity exact (Sohail's)
     predictionParameters = prediction.CVDirectPredictionParameters()
@@ -58,7 +60,7 @@
 interactions = events.createInteractions(objects)
 for inter in interactions:
     inter.computeIndicators()
-    inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, params.nProcesses)
+    inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, nProcesses = args.nProcesses)
 
 storage.saveIndicators(params.databaseFilename, interactions)