LCOV - code coverage report
Current view: top level - src/netbuild - NBLoadedSUMOTLDef.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 7 7
Test Date: 2024-12-21 15:45:41 Functions: 100.0 % 1 1

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2011-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    NBLoadedSUMOTLDef.h
      15              : /// @author  Jakob Erdmann
      16              : /// @author  Michael Behrisch
      17              : /// @date    Mar 2011
      18              : ///
      19              : // A complete traffic light logic loaded from a sumo-net. (opted to reimplement
      20              : // since NBLoadedTLDef is quite vissim specific)
      21              : /****************************************************************************/
      22              : #pragma once
      23              : #include <config.h>
      24              : 
      25              : #include <vector>
      26              : #include <string>
      27              : #include <set>
      28              : #include "NBNode.h"
      29              : #include "NBEdgeCont.h"
      30              : #include "NBTrafficLightDefinition.h"
      31              : #include "NBTrafficLightLogic.h"
      32              : #include <utils/common/SUMOTime.h>
      33              : 
      34              : 
      35              : // ===========================================================================
      36              : // class definitions
      37              : // ===========================================================================
      38              : /**
      39              :  * @class NBLoadedSUMOTLDef
      40              :  * @brief A loaded (complete) traffic light logic
      41              :  */
      42              : class NBLoadedSUMOTLDef : public NBTrafficLightDefinition {
      43              : public:
      44              : 
      45              :     /** @brief Constructor
      46              :      * @param[in] id The id of the tls
      47              :      * @param[in] programID The programID for the computed logic
      48              :      * @param[in] offset The offset for the computed logic
      49              :      * @param[in] type The algorithm type for the computed logic
      50              :      */
      51              :     NBLoadedSUMOTLDef(const std::string& id, const std::string& programID, SUMOTime offset, TrafficLightType type);
      52              : 
      53              :     /** @brief Constructor that copies from an existing definition and its computed logic (used by netedit)
      54              :      * @param[in] def The definition to copy
      55              :      * @param[in] logic The computed logic of the given def
      56              :      */
      57              :     NBLoadedSUMOTLDef(const NBTrafficLightDefinition& def, const NBTrafficLightLogic& logic);
      58              : 
      59              : 
      60              :     /// @brief Destructor
      61              :     ~NBLoadedSUMOTLDef();
      62              : 
      63              :     void setID(const std::string& newID);
      64              : 
      65              :     /** @brief Sets the programID
      66              :      * @param[in] programID The new ID of the program (subID)
      67              :      */
      68              :     void setProgramID(const std::string& programID);
      69              : 
      70              :     /** @brief Informs edges about being controlled by a tls
      71              :      */
      72              :     void setTLControllingInformation() const;
      73              : 
      74              :     /** @brief Replaces occurrences of the removed edge in incoming/outgoing edges of all definitions
      75              :      * @param[in] removed The removed edge
      76              :      * @param[in] incoming The edges to use instead if an incoming edge was removed
      77              :      * @param[in] outgoing The edges to use instead if an outgoing edge was removed
      78              :      */
      79              :     void remapRemoved(NBEdge* removed,
      80              :                       const EdgeVector& incoming, const EdgeVector& outgoing);
      81              : 
      82              : 
      83              :     /** @brief Replaces a removed edge/lane
      84              :      * @param[in] removed The edge to replace
      85              :      * @param[in] removedLane The lane of this edge to replace
      86              :      * @param[in] by The edge to insert instead
      87              :      * @param[in] byLane This edge's lane to insert instead
      88              :      */
      89              :     void replaceRemoved(NBEdge* removed, int removedLane,
      90              :                         NBEdge* by, int byLane, bool incoming);
      91              : 
      92              :     /** @brief patches signal plans by modifying lane indices
      93              :      * with the given offset, only indices with a value above threshold are modified
      94              :      */
      95              :     void shiftTLConnectionLaneIndex(NBEdge* edge, int offset, int threshold = -1);
      96              : 
      97              :     /** @brief Adds a phase to the logic
      98              :      * the new phase is inserted at the end of the list of already added phases
      99              :      * @param[in] duration The duration of the phase to add
     100              :      * @param[in] state The state definition of a tls phase
     101              :      * @param[in] minDur The minimum duration of the phase to add
     102              :      * @param[in] maxDur The maximum duration of the phase to add
     103              :      * @param[in] vehExt The vehExt of the phase to add
     104              :      * @param[in] yellow The yellow of the phase to add
     105              :      * @param[in] red The red of the phase to add
     106              :      * @param[in] earliestEnd The early end of the phase to add
     107              :      * @param[in] latestEnd The latest end of the phase to add
     108              :      */
     109              :     void addPhase(const SUMOTime duration, const std::string& state, const SUMOTime minDur, const SUMOTime maxDur,
     110              :                   const SUMOTime earliestEnd, const SUMOTime latestEnd, const SUMOTime vehExt, const SUMOTime yellow,
     111              :                   const SUMOTime red, const std::vector<int>& next, const std::string& name);
     112              : 
     113              :     /// @brief mark phases as load
     114              :     void phasesLoaded() {
     115          235 :         myPhasesLoaded = true;
     116          235 :     }
     117              : 
     118              :     /** @brief Adds a connection and immediately informs the edges
     119              :      */
     120              :     void addConnection(NBEdge* from, NBEdge* to, int fromLane, int toLane, int linkIndex, int linkIndex2, bool reconstruct = true);
     121              : 
     122              : 
     123              :     /** @brief removes the given connection from the traffic light
     124              :      * if recontruct=true, reconstructs the logic and informs the edges for immediate use in netedit
     125              :      * @note: tlIndex is not necessarily unique. we need the whole connection data here
     126              :      */
     127              :     void removeConnection(const NBConnection& conn, bool reconstruct = true);
     128              : 
     129              :     /// @brief register changes that necessitate recomputation
     130              :     void registerModifications(bool addedConnections, bool removedConnections);
     131              : 
     132              :     /** @brief Returns the internal logic
     133              :      */
     134              :     NBTrafficLightLogic* getLogic() {
     135           53 :         return myTLLogic;
     136              :     }
     137              : 
     138              :     /** @brief Sets the offset of this tls
     139              :      * @param[in] offset The offset of this cycle
     140              :      */
     141              :     void setOffset(SUMOTime offset);
     142              : 
     143              :     /** @brief Sets the algorithm type of this tls
     144              :      * @param[in] offset The algorithm type of this tls
     145              :      */
     146              :     void setType(TrafficLightType type);
     147              : 
     148              :     /// @brief whether the given index must yield to the foeIndex while turing right on a red light
     149              :     bool rightOnRedConflict(int index, int foeIndex) const;
     150              : 
     151              :     /* @brief shortens phase states to remove states that are not referenced by
     152              :      * any controlled link and returns whether states were shortened
     153              :     */
     154              :     bool cleanupStates();
     155              : 
     156              :     /// @brief whether this definition uses signal group (multiple connections with the same link index)
     157              :     bool usingSignalGroups() const;
     158              : 
     159              :     /// @brief join nodes and states from the given logic (append red state)
     160              :     void joinLogic(NBTrafficLightDefinition* def);
     161              : 
     162              :     /// @brief heuristically add minDur and maxDur when switching from tlType fixed to actuated
     163              :     void guessMinMaxDuration();
     164              : 
     165              :     /// @brief let connections with the same state use the same link index
     166              :     void groupSignals();
     167              : 
     168              :     /// @brief let all connections use a distinct link index
     169              :     void ungroupSignals();
     170              : 
     171              :     /// @brief copy the assignment of link indices to connections from the given definition and rebuilt the states to match
     172              :     // Note: Issues a warning when the grouping of def is incompatible with the current states
     173              :     void copyIndices(NBTrafficLightDefinition* def);
     174              : 
     175              :     /// @brief perform optional final checks (on writing)
     176              :     void finalChecks() const;
     177              : 
     178              :     /// @brief replace the given link index in all connections
     179              :     void replaceIndex(int oldIndex, int newIndex);
     180              : 
     181              : protected:
     182              :     /// @brief Collects the links participating in this traffic light (only if not previously loaded)
     183              :     void collectLinks();
     184              : 
     185              :     /// @brief Build the list of participating edges
     186              :     void collectEdges();
     187              : 
     188              :     /** @brief Computes the traffic light logic finally in dependence to the type
     189              :      * @param[in] brakingTime Duration a vehicle needs for braking in front of the tls in seconds
     190              :      * @return The computed logic
     191              :      */
     192              :     NBTrafficLightLogic* myCompute(int brakingTimeSeconds);
     193              : 
     194              :     bool amInvalid() const;
     195              : 
     196              :     /// @brief initialize myNeedsContRelation and set myNeedsContRelationReady to true
     197              :     void initNeedsContRelation() const;
     198              : 
     199              :     /// @brief return the highest known tls link index used by any controlled connection or crossing
     200              :     int getMaxIndex();
     201              : 
     202              :     ///@brief Returns the maximum index controlled by this traffic light
     203              :     int getMaxValidIndex();
     204              : 
     205              :     /// @brief get all states for the given link index
     206              :     std::string getStates(int index);
     207              : 
     208              :     /// @brief return whether the given link index is used by any connectons
     209              :     bool isUsed(int index) const;
     210              : 
     211              :     /// brief retrieve all edges with connections that use the given traffic light index
     212              :     std::set<const NBEdge*> getEdgesUsingIndex(int index) const;
     213              : 
     214              : private:
     215              : 
     216              :     /// @brief phases are added directly to myTLLogic which is then returned in myCompute()
     217              :     NBTrafficLightLogic* myTLLogic;
     218              : 
     219              :     /// @brief repair the plan if controlled nodes received pedestrian crossings
     220              :     void patchIfCrossingsAdded();
     221              : 
     222              :     /// @brief set of edges with shifted lane indices (to avoid shifting twice)
     223              :     std::set<NBEdge*> myShifted;
     224              : 
     225              :     /// @brief whether the logic must be reconstructed
     226              :     bool myReconstructAddedConnections;
     227              :     bool myReconstructRemovedConnections;
     228              :     bool myPhasesLoaded;
     229              : 
     230              :     /** @brief Collects the edges for each tlIndex
     231              :      * @param[out] fromEdges The from-edge for each controlled tlIndex
     232              :      * @param[out] toEdges The to-edge for each controlled tlIndex
     233              :      * @param[out] fromLanes The from-lanes for each controlled tlIndex
     234              :      */
     235              :     void collectEdgeVectors(EdgeVector& fromEdges, EdgeVector& toEdges, std::vector<int>& fromLanes) const;
     236              : 
     237              :     /// @brief adapt to removal or addition of connections
     238              :     void reconstructLogic();
     239              : 
     240              :     /// @brief return whether all tls link indices are valid
     241              :     bool hasValidIndices() const;
     242              : 
     243              :     /// @brief return whether the given connection is still valid
     244              :     bool isValid(const NBConnection& con) const;
     245              : 
     246              : private:
     247              :     /// @brief class for identifying connections
     248              :     class connection_equal {
     249              :     public:
     250              :         /// constructor
     251           24 :         connection_equal(const NBConnection& c) : myC(c) {}
     252              : 
     253        33240 :         bool operator()(const NBConnection& c) const {
     254        41822 :             return c.getFrom() == myC.getFrom() && c.getTo() == myC.getTo() &&
     255        34824 :                    c.getFromLane() == myC.getFromLane() && c.getToLane() == myC.getToLane();
     256              :         }
     257              :     private:
     258              :         const NBConnection& myC;
     259              :     };
     260              : 
     261              : };
        

Generated by: LCOV version 2.0-1