LCOV - code coverage report
Current view: top level - src/dfrouter - RODFDetectorFlow.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 45.3 % 75 34
Test Date: 2024-12-21 15:45:41 Functions: 54.5 % 11 6

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2006-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    RODFDetectorFlow.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Eric Nicolay
      17              : /// @author  Michael Behrisch
      18              : /// @author  Melanie Knocke
      19              : /// @date    Thu, 16.03.2006
      20              : ///
      21              : // Storage for flows within the DFROUTER
      22              : /****************************************************************************/
      23              : #include <config.h>
      24              : 
      25              : #include <iostream>
      26              : #include <cassert>
      27              : #include "RODFDetectorFlow.h"
      28              : 
      29              : 
      30              : // ===========================================================================
      31              : // method definitions
      32              : // ===========================================================================
      33          178 : RODFDetectorFlows::RODFDetectorFlows(SUMOTime startTime, SUMOTime endTime,
      34          178 :                                      SUMOTime stepOffset)
      35          178 :     : myBeginTime(startTime), myEndTime(endTime), myStepOffset(stepOffset),
      36          178 :       myMaxDetectorFlow(-1) {}
      37              : 
      38              : 
      39          178 : RODFDetectorFlows::~RODFDetectorFlows() {}
      40              : 
      41              : 
      42              : void
      43         8067 : RODFDetectorFlows::addFlow(const std::string& id, SUMOTime t, const FlowDef& fd) {
      44         8067 :     if (myFastAccessFlows.find(id) == myFastAccessFlows.end()) {
      45          962 :         int noItems = (int)((myEndTime - myBeginTime) / myStepOffset);
      46          962 :         myFastAccessFlows[id] = std::vector<FlowDef>(noItems);
      47          962 :         std::vector<FlowDef>& cflows = myFastAccessFlows[id];
      48              :         // initialise
      49       493655 :         for (std::vector<FlowDef>::iterator i = cflows.begin(); i < cflows.end(); ++i) {
      50       492693 :             (*i).qPKW = 0;
      51       492693 :             (*i).qLKW = 0;
      52       492693 :             (*i).vPKW = 0;
      53       492693 :             (*i).vLKW = 0;
      54       492693 :             (*i).fLKW = 0;
      55       492693 :             (*i).isLKW = 0;
      56       492693 :             (*i).firstSet = true;
      57              :         }
      58              :     }
      59         8067 :     const int index = (int)((t - myBeginTime) / myStepOffset);
      60              :     assert(index < (int) myFastAccessFlows[id].size());
      61         8067 :     FlowDef& ofd = myFastAccessFlows[id][index];
      62         8067 :     if (ofd.firstSet) {
      63         8067 :         ofd = fd;
      64         8067 :         ofd.firstSet = false;
      65              :     } else {
      66            0 :         ofd.qLKW = ofd.qLKW + fd.qLKW;
      67            0 :         ofd.qPKW = ofd.qPKW + fd.qPKW;
      68            0 :         ofd.vLKW = ofd.vLKW + fd.vLKW; //!!! mean value?
      69            0 :         ofd.vPKW = ofd.vPKW + fd.vPKW; //!!! mean value?
      70              :     }
      71         8067 :     if (ofd.qPKW != 0) {
      72         6543 :         ofd.fLKW = ofd.qLKW / (ofd.qLKW + ofd.qPKW);
      73              :     } else {
      74         1524 :         ofd.fLKW = 1;
      75         1524 :         ofd.isLKW = 1;
      76              :     }
      77         8067 : }
      78              : 
      79              : 
      80              : void
      81            0 : RODFDetectorFlows::setFlows(const std::string& detector_id,
      82              :                             std::vector<FlowDef>& flows) {
      83            0 :     for (std::vector<FlowDef>::iterator i = flows.begin(); i < flows.end(); ++i) {
      84              :         FlowDef& ofd = *i;
      85            0 :         if (ofd.qLKW != 0 && ofd.qPKW != 0) {
      86            0 :             ofd.fLKW = ofd.qLKW / ofd.qPKW;
      87              :         } else {
      88            0 :             ofd.fLKW = 0;
      89              :         }
      90              :     }
      91            0 :     myFastAccessFlows[detector_id] = flows;
      92            0 : }
      93              : 
      94              : 
      95              : void
      96            7 : RODFDetectorFlows::removeFlow(const std::string& detector_id) {
      97              :     myFastAccessFlows.erase(detector_id);
      98            7 : }
      99              : 
     100              : 
     101              : bool
     102         1587 : RODFDetectorFlows::knows(const std::string& det_id) const {
     103         1587 :     return myFastAccessFlows.find(det_id) != myFastAccessFlows.end();
     104              : }
     105              : 
     106              : 
     107              : const std::vector<FlowDef>&
     108         1068 : RODFDetectorFlows::getFlowDefs(const std::string& id) const {
     109              :     assert(myFastAccessFlows.find(id) != myFastAccessFlows.end());
     110              :     assert(myFastAccessFlows.find(id)->second.size() != 0);
     111         1068 :     return myFastAccessFlows.find(id)->second;
     112              : }
     113              : 
     114              : 
     115              : double
     116            0 : RODFDetectorFlows::getFlowSumSecure(const std::string& id) const {
     117              :     double ret = 0;
     118            0 :     if (knows(id)) {
     119              :         const std::vector<FlowDef>& flows = getFlowDefs(id);
     120            0 :         for (std::vector<FlowDef>::const_iterator i = flows.begin(); i != flows.end(); ++i) {
     121            0 :             ret += (*i).qPKW;
     122            0 :             ret += (*i).qLKW;
     123              :         }
     124              :     }
     125            0 :     return ret;
     126              : }
     127              : 
     128              : 
     129              : double
     130            0 : RODFDetectorFlows::getMaxDetectorFlow() const {
     131            0 :     if (myMaxDetectorFlow < 0) {
     132              :         double max = 0;
     133              :         std::map<std::string, std::vector<FlowDef> >::const_iterator j;
     134            0 :         for (j = myFastAccessFlows.begin(); j != myFastAccessFlows.end(); ++j) {
     135              :             double curr = 0;
     136              :             const std::vector<FlowDef>& flows = (*j).second;
     137            0 :             for (std::vector<FlowDef>::const_iterator i = flows.begin(); i != flows.end(); ++i) {
     138            0 :                 curr += (*i).qPKW;
     139            0 :                 curr += (*i).qLKW;
     140              :             }
     141            0 :             if (max < curr) {
     142              :                 max = curr;
     143              :             }
     144              :         }
     145            0 :         myMaxDetectorFlow = max;
     146              :     }
     147            0 :     return myMaxDetectorFlow;
     148              : }
     149              : 
     150              : 
     151              : void
     152            0 : RODFDetectorFlows::mesoJoin(const std::string& nid,
     153              :                             const std::vector<std::string>& oldids) {
     154            0 :     for (std::vector<std::string>::const_iterator i = oldids.begin(); i != oldids.end(); ++i) {
     155            0 :         if (!knows(*i)) {
     156            0 :             continue;
     157              :         }
     158            0 :         std::vector<FlowDef>& flows = myFastAccessFlows[*i];
     159              :         int index = 0;
     160            0 :         for (SUMOTime t = myBeginTime; t != myEndTime; t += myStepOffset) {
     161            0 :             addFlow(nid, t, flows[index++]); // !!!
     162              :         }
     163              :         myFastAccessFlows.erase(*i);
     164              :     }
     165            0 : }
     166              : 
     167              : 
     168              : void
     169            0 : RODFDetectorFlows::printAbsolute() const {
     170            0 :     for (std::map<std::string, std::vector<FlowDef> >::const_iterator i = myFastAccessFlows.begin(); i != myFastAccessFlows.end(); ++i) {
     171            0 :         std::cout << (*i).first << ":";
     172              :         const std::vector<FlowDef>& flows = (*i).second;
     173              :         double qPKW = 0;
     174              :         double qLKW = 0;
     175            0 :         for (std::vector<FlowDef>::const_iterator j = flows.begin(); j != flows.end(); ++j) {
     176            0 :             qPKW += (*j).qPKW;
     177            0 :             qLKW += (*j).qLKW;
     178              :         }
     179              :         std::cout << qPKW << "/" << qLKW << std::endl;
     180              :     }
     181            0 : }
     182              : 
     183              : 
     184              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1