package edu.hawaii.ics.yucheng;
/**
* An immutable class representing a solution to a graph.
*/
class GraphSolution {
/**
* Verifies a pointer is not null.
*
* @param pointer The pointer object.
*
* @param name The name of the parameter.
*/
private static void verifyPointer(final Object pointer, final String name) {
if (pointer == null)
throw new NullPointerException(name);
}
/** The sum of the priorities of the path. */
public final int goodness;
/** The arrival path. */
private final Vertex[] myArrival;
/** The departure path. */
private final Vertex[] myDeparture;
/** The sequence path. */
private final Vertex[] mySequence;
/**
* Initializes a new instance of the class.
*
* @param graph The graph.
*
* @param solution The solution path.
*
* @param departure The departure path.
*
* @param arrival The arrival path.
*/
public GraphSolution(final Graph graph, final Vertex[] solution,
final Vertex[] departure, final Vertex[] arrival) {
verifyPointer(graph, "graph");
verifyPointer(solution, "solution");
verifyPointer(departure, "departure");
verifyPointer(arrival, "arrival");
mySequence = new Vertex[solution.length];
for (int i = 0; i < solution.length; i++)
mySequence[i] = solution[i];
myDeparture = new Vertex[departure.length];
for (int i = 0; i < departure.length; i++)
myDeparture[i] = departure[i];
myArrival = new Vertex[arrival.length];
for (int i = 0; i < arrival.length; i++)
myArrival[i] = arrival[i];
goodness = computeGoodness(graph);
}
/**
* Returns the arrival vertex at the specified path.
*
* @param index The index of the vertex.
*
* @return The arrival vertex.
*/
public Vertex arrivalAt(final int index) {
return myArrival[index];
}
/**
* Returns the length of the arrival path.
*
* @return The length.
*/
public int arrivalLength() {
return myArrival.length;
}
/**
* Computes the goodness field.
*
* @return The length.
*/
private int computeGoodness(final Graph graph) {
int sum = 0;
for (final Vertex vertex : mySequence)
sum += graph.priority(vertex.x, vertex.y);
return sum;
}
/**
* Returns the departure vertex at the specified path.
*
* @param index The index of the vertex.
*
* @return The departure vertex.
*/
public Vertex departureAt(final int index) {
return myDeparture[index];
}
/**
* Returns the length of the departure path.
*
* @return The length.
*/
public int departureLength() {
return myDeparture.length;
}
/**
* Returns the solution sequence vertex at the specified path.
*
* @param index The index of the vertex.
*
* @return The solution sequence vertex.
*/
public Vertex sequenceAt(final int index) {
return mySequence[index];
}
/**
* Returns the length of the solution sequence path.
*
* @return The length.
*/
public int sequenceLength() {
return mySequence.length;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("goodness = " + goodness + "\n");
builder.append("sequence = ...\n");
for (int i = 0; i < mySequence.length; i++)
builder.append(" [" + (i + 1) + "] = " + mySequence[i] + "\n");
return builder.toString();
}
}