1 package org.matsim.core.network.turnRestrictions;
62 List<ColoredLink> outLinks,
63 List<ColoredLink> inLinks
77 public int hashCode() {
114 if (disallowedNextLinks == null) {
118 if (turnRestrictions == null || turnRestrictions.isEmpty()) {
128 if (coloredLinks != null) {
131 if (coloredLink.toColoredNode == null) {
132 coloredLink.toColoredNode = coloredStartingLink.
toColoredNode;
133 coloredLink.toNode = null;
153 Set<Node> affectedNodes =
new HashSet<>();
154 Set<ColoredNode> affectedColoredNodes =
new HashSet<>();
155 Set<Link> affectedLinks =
new HashSet<>();
156 Set<ColoredLink> affectedColoredLinks =
new HashSet<>();
157 Set<Id<Link>> endLinkIds =
new HashSet<>();
160 for (List<
Id<Link>> restriction : restrictions) {
164 Node currentNode = startingLink == null ? null : startingLink.
getToNode();
169 for (
Id<Link> linkId : restriction) {
170 if (currentNode != null) {
172 affectedNodes.add(currentNode);
174 currentColoredLink = null;
176 if (outLink.getId() == linkId) {
178 if (currentColoredLink == null) {
179 currentLink = outLink;
185 if (currentLink != null) {
186 affectedLinks.add(currentLink);
188 currentColoredNode = null;
190 if (currentColoredLink != null) {
191 affectedColoredLinks.add(currentColoredLink);
192 currentNode = currentColoredLink.
toNode;
195 if (currentLink == null && currentColoredLink == null) {
199 }
else if (currentColoredNode != null) {
201 affectedColoredNodes.add(currentColoredNode);
203 currentColoredLink = null;
204 for (
ColoredLink outLink : currentColoredNode.outLinks) {
206 currentColoredLink = outLink;
210 if (currentColoredLink != null) {
211 affectedColoredLinks.add(currentColoredLink);
212 currentNode = currentColoredLink.
toNode;
215 if (currentColoredLink == null) {
221 endLinkIds.add(restriction.
get(restriction.size() - 1));
225 Map<Id<Node>,
ColoredNode> newlyColoredNodes =
new HashMap<>();
226 for (
Node affectedNode : affectedNodes) {
229 ColoredNode newlyColoredNode =
new ColoredNode(nodeIndex, affectedNode,
new ArrayList<>(),
new ArrayList<>());
230 newlyColoredNodes.put(affectedNode.getId(), newlyColoredNode);
233 for (
ColoredNode affectedColoredNode : affectedColoredNodes) {
236 ColoredNode newlyColoredNode =
new ColoredNode(nodeIndex, affectedColoredNode.node,
new ArrayList<>(),
new ArrayList<>());
237 newlyColoredNodes.put(affectedColoredNode.node.getId(), newlyColoredNode);
242 for (
Node affectedNode : affectedNodes) {
243 for (
Link outLink : affectedNode.getOutLinks().values()) {
244 if (endLinkIds.contains(outLink.getId())) {
252 if (affectedLinks.contains(outLink) || (replacedOutLink != null && affectedColoredLinks.contains(replacedOutLink))) {
254 newlyColoredLink =
new ColoredLink(linkIndex, outLink, fromNode, null, toNode, null);
257 newlyColoredLink =
new ColoredLink(linkIndex, outLink, fromNode, null, null, toNode);
259 fromNode.outLinks.add(newlyColoredLink);
261 context.
coloredLinksPerLinkMap.computeIfAbsent(outLink.getId(),
id ->
new ArrayList<>(3)).add(newlyColoredLink);
264 for (
ColoredNode affectedNode : affectedColoredNodes) {
265 for (
ColoredLink outLink : affectedNode.outLinks) {
266 if (endLinkIds.contains(outLink.
link.
getId())) {
273 if (affectedColoredLinks.contains(outLink)) {
275 newlyColoredLink =
new ColoredLink(linkIndex, outLink.
link, fromNode, null, toNode, null);
279 fromNode.outLinks.add(newlyColoredLink);
286 if (startingLink != null) {
288 int linkIndex = startingLink.
getId().index();
293 return newlyColoredStartingLink;
295 if (coloredStartingLink != null) {
301 throw new IllegalArgumentException(
"either startingLink or coloredStartingLink must be set");
TurnRestrictionsContext(Network network)
static< T > Id< T > get(int index, final Class< T > type)
static< T > int getNumberOfIds(final Class< T > type)
static TurnRestrictionsContext build(Network network)
ColoredLink(int index, Link link, ColoredNode fromColoredNode, Node fromNode, ColoredNode toColoredNode, Node toNode)
ColoredNode toColoredNode
List< ColoredNode > coloredNodes
static DisallowedNextLinks getDisallowedNextLinks(Link link)
record ColoredNode(int index, Node node, List< ColoredLink > outLinks, List< ColoredLink > inLinks)
Map< Id< Link >, List< ColoredLink > > coloredLinksPerLinkMap
void applyTurnRestriction(TurnRestrictionsContext context, Collection< List< Id< Link >>> restrictions, ColoredLink startingLink)
List< ColoredLink > coloredLinks
final ColoredNode fromColoredNode
ColoredLink applyTurnRestriction(TurnRestrictionsContext context, Collection< List< Id< Link >>> restrictions, Link startingLink, ColoredLink coloredStartingLink)
Map< Id< Link >, ? extends Link > getLinks()
Map< Id< Link >, ColoredLink > replacedLinks
ColoredLink applyTurnRestriction(TurnRestrictionsContext context, Collection< List< Id< Link >>> restrictions, Link startingLink)
Map< Id< Link >, ? extends Link > getOutLinks()
Collection< List< Id< Link > > > getMergedDisallowedLinkSequences()