36 #define PARALLEL_PLAN_MOVE
37 #define PARALLEL_EXEC_MOVE
46 myLanes(
MSLane::dictSize()),
47 myWithVehicles2Integrate(
MSGlobals::gNumSimThreads > 1),
48 myLastLaneChange(
MSEdge::dictSize()),
49 myMinLengthGeometryFactor(1.) {
52 const std::vector<MSLane*>& lanes = edge->getLanes();
53 if (!edge->hasLaneChanger()) {
54 const int pos = lanes.front()->getNumericalID();
55 myLanes[pos].lane = lanes.front();
57 myLanes[pos].haveNeighbors =
false;
60 for (
MSLane*
const l : lanes) {
61 const int pos = l->getNumericalID();
64 myLanes[pos].haveNeighbors =
true;
73 new WorkerThread(myThreadPool);
92 if (!lu.
amActive && (*i)->getVehicleNumber() > 0) {
108 #ifdef LOAD_BALANCING
109 myRNGLoad = std::priority_queue<std::pair<int, int> >();
115 const int vehNum = (*i)->getVehicleNumber();
117 myLanes[(*i)->getNumericalID()].amActive =
false;
120 #ifdef LOAD_BALANCING
121 std::pair<int, int> minRNG =
myRNGLoad.top();
122 (*i)->setRNGIndex(minRNG.second);
124 minRNG.first -= vehNum;
129 myThreadPool.add((*i)->getPlanMoveTask(t), (*i)->getRNGIndex() % myThreadPool.size());
134 (*i)->planMovements(t);
140 myThreadPool.waitAll(
false);
149 lane->setJunctionApproaches(t);
159 #ifdef PARALLEL_EXEC_MOVE
161 #ifdef LOAD_BALANCING
162 myRNGLoad = std::priority_queue<std::pair<int, int> >();
168 #ifdef LOAD_BALANCING
169 std::pair<int, int> minRNG =
myRNGLoad.top();
170 lane->setRNGIndex(minRNG.second);
172 minRNG.first -= lane->getVehicleNumber();
175 myThreadPool.add(lane->getExecuteMoveTask(t), lane->getRNGIndex() % myThreadPool.size());
177 myThreadPool.waitAll(
false);
186 (*i)->getVehicleNumber() > 0) {
187 (*i)->executeMovements(t);
189 if ((*i)->getVehicleNumber() == 0) {
190 myLanes[(*i)->getNumericalID()].amActive =
false;
196 for (
MSLane* lane : wasActive) {
197 lane->updateLengthSum();
206 for (
MSLane*
const lane : toIntegrate) {
207 const bool wasInactive = lane->getVehicleNumber() == 0;
208 lane->integrateNewVehicles();
209 if (wasInactive && lane->getVehicleNumber() > 0) {
226 std::vector<MSLane*> toAdd;
227 #ifdef PARALLEL_CHANGE_LANES
228 std::vector<MSEdge*> recheckLaneUsage;
234 MSEdge& edge = (*i)->getEdge();
237 #ifdef PARALLEL_CHANGE_LANES
240 myThreadPool.add(lane->getLaneChangeTask(t), lane->
getRNGIndex() % myThreadPool.size());
241 recheckLaneUsage.push_back(&edge);
251 if (lane->getVehicleNumber() > 0 && !lu.
amActive) {
252 toAdd.push_back(lane);
256 #ifdef PARALLEL_CHANGE_LANES
266 #ifdef PARALLEL_CHANGE_LANES
268 myThreadPool.waitAll(
false);
269 for (
MSEdge* e : recheckLaneUsage) {
270 const std::vector<MSLane*>& lanes = e->getLanes();
271 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
273 if ((*i)->getVehicleNumber() > 0 && !lu.
amActive) {
283 for (std::vector<MSLane*>::iterator i = toAdd.begin(); i != toAdd.end(); ++i) {
288 for (LaneUsageVector::iterator it =
myLanes.begin(); it !=
myLanes.end(); ++it) {
289 (*it).lane->sortManeuverReservations();
299 if (lane->needsCollisionCheck()) {
300 lane->detectCollisions(timestep, stage);
305 lane->detectCollisions(timestep, stage);
324 for (MSEdgeVector::const_iterator i =
myEdges.begin(); i !=
myEdges.end(); ++i) {
325 const std::vector<MSLane*>& lanes = (*i)->getLanes();
326 for (std::vector<MSLane*>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
327 (*j)->initRestrictions();