All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.automatalib.util.graphs.Path Maven / Gradle / Ivy

Go to download

This artifact provides various common utility operations for analyzing and manipulating automata and graphs, such as traversal, minimization and copying.

There is a newer version: 0.11.0
Show newest version
/* Copyright (C) 2013 TU Dortmund
 * This file is part of AutomataLib, http://www.automatalib.net/.
 * 
 * AutomataLib is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 3.0 as published by the Free Software Foundation.
 * 
 * AutomataLib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with AutomataLib; if not, see
 * http://www.gnu.de/documents/lgpl.en.html.
 */
package net.automatalib.util.graphs;

import java.util.AbstractList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import net.automatalib.graphs.IndefiniteGraph;

public class Path extends AbstractList {
	
	public static final class PathData {
		public final N start;
		public final List edgeList;
		public PathData(N start, List edgeList) {
			this.start = start;
			this.edgeList = edgeList;
		}
		public Path toPath(IndefiniteGraph graph) {
			return new Path<>(graph, start, edgeList);
		}
	}
	
	private final class NodeIterator implements Iterator {
		private Iterator edgeIt;
		@Override
		public boolean hasNext() {
			if(edgeIt == null)
				return true;
			return edgeIt.hasNext();
		}
		@Override
		public N next() {
			if(edgeIt == null) {
				edgeIt = edgeList.iterator();
				return start;
			}
			E edge = edgeIt.next();
			return graph.getTarget(edge);
		}
		@Override
		public void remove() {
			throw new UnsupportedOperationException();
		}
	}
	
	private class NodeList extends AbstractList {
		@Override
		public N get(int index) {
			if(index < 0)
				throw new IndexOutOfBoundsException();
			if(index == 0)
				return start;
			E edge = edgeList.get(index - 1);
			return graph.getTarget(edge);
		}
		@Override
		public int size() {
			return edgeList.size() + 1;
		}
		@Override
		public Iterator iterator() {
			return nodeIterator();
		}
		@Override
		public boolean isEmpty() {
			return false;
		}
	}
	
	private final IndefiniteGraph graph;
	private final N start;
	private final List edgeList;

	public Path(IndefiniteGraph graph, N start, List edgeList) {
		this.graph = graph;
		this.start = start;
		this.edgeList = edgeList;
	}

	@Override
	@SuppressWarnings("unchecked")
	public Iterator iterator() {
		return (Iterator)edgeList.iterator();
	}
	
	public Iterator nodeIterator() {
		return new NodeIterator();
	}
	
	public Iterable nodes() {
		return new Iterable() {
			@Override
			public Iterator iterator() {
				return nodeIterator();
			}
		};
	}
	
	public List edgeList() {
		return Collections.unmodifiableList(edgeList);
	}
	
	public List nodeList() {
		return new NodeList();
	}
	
	
	public N firstNode() {
		return start;
	}
	
	public E firstEdge() {
		if(edgeList.isEmpty())
			return null;
		return edgeList.get(0);
	}
	
	public E lastEdge() {
		int idx = edgeList.size() - 1;
		if(idx < 0)
			return null;
		return edgeList.get(idx);
	}
	
	public N endNode() {
		E edge = lastEdge();
		if(edge == null)
			return start;
		return graph.getTarget(edge);
	}

	@Override
	public E get(int index) {
		return edgeList.get(index);
	}
	@Override
	public int size() {
		return edgeList.size();
	}
	@Override
	public boolean isEmpty() {
		return edgeList.isEmpty();
	}
	
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy