void consumerAuthDenied( uint32_t consumer_instance, const Name& request_name ) { if( logging_enabled ) { lock.lock(); removePending(); log_file << "Consumer:AuthDenied" << endl << "{" << endl << " time = " << time::system_clock::now() << endl << " consumer = " << consumer_instance << endl << " request = " << request_name.toUri() << endl << "}" << endl; lock.unlock(); } }
SUMOTime MSCalibrator::execute(SUMOTime currentTime) { // get current simulation values (valid for the last simulation second) // XXX could we miss vehicle movements if this is called less often than every DELTA_T (default) ? updateMeanData(); const bool hadRemovals = removePending(); // check whether an adaptation value exists if (isCurrentStateActive(currentTime)) { myAmActive = true; // all happens in isCurrentStateActive() } else { myAmActive = false; reset(); if (!mySpeedIsDefault) { // reset speed to default if (myLane == nullptr) { myEdge->setMaxSpeed(myDefaultSpeed); } else { myLane->setMaxSpeed(myDefaultSpeed); } mySpeedIsDefault = true; } if (myCurrentStateInterval == myIntervals.end()) { // keep calibrator alive for gui but do not call again return TIME2STEPS(86400); } return myFrequency; } // we are active if (!myDidSpeedAdaption && myCurrentStateInterval->v >= 0) { if (myLane == nullptr) { myEdge->setMaxSpeed(myCurrentStateInterval->v); } else { myLane->setMaxSpeed(myCurrentStateInterval->v); } mySpeedIsDefault = false; myDidSpeedAdaption = true; } const bool calibrateFlow = myCurrentStateInterval->q >= 0; const int totalWishedNum = totalWished(); int adaptedNum = passed() + myClearedInJam; #ifdef MSCalibrator_DEBUG std::cout << time2string(currentTime) << " " << myID << " q=" << myCurrentStateInterval->q << " totalWished=" << totalWishedNum << " adapted=" << adaptedNum << " jam=" << invalidJam(myLane == 0 ? -1 : myLane->getIndex()) << " entered=" << myEdgeMeanData.nVehEntered << " departed=" << myEdgeMeanData.nVehDeparted << " arrived=" << myEdgeMeanData.nVehArrived << " left=" << myEdgeMeanData.nVehLeft << " waitSecs=" << myEdgeMeanData.waitSeconds << " vaporized=" << myEdgeMeanData.nVehVaporized << "\n"; #endif if (calibrateFlow && adaptedNum < totalWishedNum && !hadRemovals) { // we need to insert some vehicles const double hourFraction = STEPS2TIME(currentTime - myCurrentStateInterval->begin + DELTA_T) / (double) 3600.; const int wishedNum = (int)std::floor(myCurrentStateInterval->q * hourFraction + 0.5); // round to closest int // only the difference between inflow and aspiredFlow should be added, thus // we should not count vehicles vaporized from a jam here // if we have enough time left we can add missing vehicles later const int relaxedInsertion = (int)std::floor(STEPS2TIME(myCurrentStateInterval->end - currentTime) / 3); const int insertionSlack = MAX2(0, adaptedNum + relaxedInsertion - totalWishedNum); // increase number of vehicles #ifdef MSCalibrator_DEBUG std::cout << " wished:" << wishedNum << " slack:" << insertionSlack << " before:" << adaptedNum << "\n"; #endif while (wishedNum > adaptedNum + insertionSlack) { SUMOVehicleParameter* pars = myCurrentStateInterval->vehicleParameter; const MSRoute* route = myProbe != nullptr ? myProbe->getRoute() : nullptr; if (route == nullptr) { route = MSRoute::dictionary(pars->routeid); } if (route == nullptr) { WRITE_WARNING("No valid routes in calibrator '" + myID + "'."); break; } if (!route->contains(myEdge)) { WRITE_WARNING("Route '" + route->getID() + "' in calibrator '" + myID + "' does not contain edge '" + myEdge->getID() + "'."); break; } const int routeIndex = (int)std::distance(route->begin(), std::find(route->begin(), route->end(), myEdge)); MSVehicleType* vtype = MSNet::getInstance()->getVehicleControl().getVType(pars->vtypeid); assert(route != 0 && vtype != 0); // build the vehicle SUMOVehicleParameter* newPars = new SUMOVehicleParameter(*pars); newPars->id = myID + "." + toString((int)STEPS2TIME(myCurrentStateInterval->begin)) + "." + toString(myInserted); newPars->depart = currentTime; newPars->routeid = route->getID(); MSVehicle* vehicle; try { vehicle = dynamic_cast<MSVehicle*>(MSNet::getInstance()->getVehicleControl().buildVehicle( newPars, route, vtype, true, false)); } catch (const ProcessError& e) { if (!MSGlobals::gCheckRoutes) { WRITE_WARNING(e.what()); vehicle = nullptr; break; } else { throw e; } } #ifdef MSCalibrator_DEBUG std::cout << " resetting route pos: " << routeIndex << "\n"; #endif vehicle->resetRoutePosition(routeIndex); if (myEdge->insertVehicle(*vehicle, currentTime)) { if (!MSNet::getInstance()->getVehicleControl().addVehicle(vehicle->getID(), vehicle)) { throw ProcessError("Emission of vehicle '" + vehicle->getID() + "' in calibrator '" + getID() + "'failed!"); } myInserted++; adaptedNum++; #ifdef MSCalibrator_DEBUG std::cout << "I "; #endif } else { // could not insert vehicle #ifdef MSCalibrator_DEBUG std::cout << "F "; #endif MSNet::getInstance()->getVehicleControl().deleteVehicle(vehicle, true); break; } } } if (myCurrentStateInterval->end <= currentTime + myFrequency) { writeXMLOutput(); } return myFrequency; }