/* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
package edu.nd.nina.graph.load;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import edu.nd.nina.types.Alphabet;
import edu.nd.nina.types.Instance;
/**
* Convert an instance through a sequence of pipes.
*
* @author Andrew McCallum <a
* href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a>
*/
public class SerialPipes extends Pipe {
ArrayList<Pipe> pipes;
public SerialPipes() {
this.pipes = new ArrayList<Pipe>();
}
public SerialPipes(Pipe[] pipes) {
this.pipes = new ArrayList<Pipe>(pipes.length);
for (int i = 0; i < pipes.length; i++)
this.pipes.add(pipes[i]);
resolveAlphabets();
}
public SerialPipes(Collection<Pipe> pipeList) {
pipes = new ArrayList<Pipe>(pipeList);
resolveAlphabets();
}
public abstract class Predicate {
public abstract boolean predicate(Pipe p);
}
public SerialPipes newSerialPipesFromSuffix(
Predicate testForStartingNewPipes) {
int i = 0;
while (i < pipes.size())
if (testForStartingNewPipes.predicate(pipes.get(i))) {
return new SerialPipes(pipes.subList(i, pipes.size() - 1));
}
throw new IllegalArgumentException(
"No pipes in this SerialPipe satisfied starting predicate.");
}
public SerialPipes newSerialPipesFromRange(int start, int end) {
return new SerialPipes(pipes.subList(start, end));
}
private void resolveAlphabets() {
Alphabet da = null, ta = null;
for (Pipe p : pipes) {
p.preceedingPipeDataAlphabetNotification(da);
da = p.getDataAlphabet();
p.preceedingPipeTargetAlphabetNotification(ta);
ta = p.getTargetAlphabet();
}
dataAlphabet = da;
targetAlphabet = ta;
}
// protected void add (Pipe pipe)
// protected void remove (int i)
// This method removed because pipes should be immutable to be safe.
// If you need an augmented pipe, you can make a new SerialPipes containing
// this one.
public void setTargetProcessing(boolean lookForAndProcessTarget) {
super.setTargetProcessing(lookForAndProcessTarget);
for (Pipe p : pipes)
p.setTargetProcessing(lookForAndProcessTarget);
}
public Iterator<Instance> newIteratorFrom(Iterator<Instance> source) {
if (pipes.size() == 0)
return new EmptyInstanceIterator();
Iterator<Instance> ret = pipes.get(0).newIteratorFrom(source);
for (int i = 1; i < pipes.size(); i++)
ret = pipes.get(i).newIteratorFrom(ret);
return ret;
}
public int size() {
return pipes.size();
}
public Pipe getPipe(int index) {
Pipe retPipe = null;
try {
retPipe = pipes.get(index);
} catch (Exception e) {
System.err.println("Error getting pipe. Index = " + index + ". "
+ e.getMessage());
}
return retPipe;
}
/** Allows access to the underlying collection of Pipes. Use with caution. */
public ArrayList<Pipe> pipes() {
return pipes;
}
public String toString() {
StringBuffer sb = new StringBuffer();
for (Pipe p : pipes)
sb.append(p.toString() + ",");
return sb.toString();
}
}