/**
*
*/
package vroom.common.modeling.util;
import java.util.List;
import vroom.common.modeling.dataModel.INodeVisit;
import vroom.common.modeling.dataModel.IRoute;
/**
* <code>IRouteCostDelegate</code> is an interface for classes that will be
* responsible of updating the cost of a route.
*
* <p>
* Creation date: Feb 16, 2011 - 11:09:20 AM
*
* @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los
* Andes</a>-<a href="http://copa.uniandes.edu.co">Copa</a> <a
* href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a
* href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a>
*
* @version 1.0
*
*/
public interface IRouteCostDelegate {
/**
* Evaluate the cost of a route, ignoring any previously stored values.
*
* @param route
* the route that will be reevaluated
* @return
*/
public double evaluateRoute(IRoute<?> route);
/**
* Updates the <code>route</code> cost after a node was inserted.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the node was inserted at
* the beginning
* @param node
* the inserted node
* @param successor
* the successor, <code>null</code> if the node was appended
*/
public void nodeInserted(IRoute<?> route, INodeVisit predecessor,
INodeVisit node, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a route was inserted.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the modified route was
* inserted at the beginning
* @param insertedRoute
* the inserted route, implementations should assume that its
* cost is coherent
* @param successor
* the successor, <code>null</code> if the modified route was
* appended
*/
public void routeInserted(IRoute<?> route, INodeVisit predecessor,
IRoute<?> insertedRoute, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a route was inserted.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the modified route was
* inserted at the beginning
* @param insertedRoute
* the inserted route
* @param successor
* the successor, <code>null</code> if the modified route was
* appended
*/
public void routeInserted(IRoute<?> route, INodeVisit predecessor,
List<? extends INodeVisit> insertedRoute, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a node was removed.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the first node was
* removed
* @param node
* the removed node
* @param successor
* the successor, <code>null</code> if the last node was removed
*/
public void nodeRemoved(IRoute<?> route, INodeVisit predecessor,
INodeVisit node, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a node was replaced.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the first node was
* replaced
* @param previousNode
* the node that was replaced
* @param node
* the new node
* @param successor
* the successor, <code>null</code> if the last node was replaced
*/
public void nodeReplaced(IRoute<?> route, INodeVisit predecessor,
INodeVisit previousNode, INodeVisit node, INodeVisit successor);
/**
* Updates the <code>route</code> cost after two nodes were swapped.
*
* <p>
* Note that <code>node1</code> have to appear before <code>node2</code> in
* the route
* </p>
*
* @param route
* the modified route
* @param pred1
* the predecessor of the first node
* @param node1
* the first node
* @param succ1
* the successor of the first node
* @param pred2
* the predecessor of the second node
* @param node2
* the second node
* @param succ2
* the successor of the second node
*/
public void nodesSwapped(IRoute<?> route, INodeVisit pred1,
INodeVisit node1, INodeVisit succ1, INodeVisit pred2,
INodeVisit node2, INodeVisit succ2);
/**
* Updates the <code>route</code> cost after a subroute was removed.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the first node was
* removed
* @param removedRoute
* the removed route, implementations should assume that its cost
* is coherent
* @param successor
* the successor, <code>null</code> if the last node was removed
*/
public void subrouteRemoved(IRoute<?> route, INodeVisit predecessor,
IRoute<?> removedRoute, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a subroute was removed.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the first node was
* removed
* @param removedRoute
* the removed route
* @param successor
* the successor, <code>null</code> if the last node was removed
*/
public void subrouteRemoved(IRoute<?> route, INodeVisit predecessor,
List<? extends INodeVisit> removedRoute, INodeVisit successor);
/**
* Updates the <code>route</code> cost after a subroute was reversed.
*
* @param route
* the modified route
* @param predecessor
* the predecessor, <code>null</code> if the first node was
* included
* @param first
* the first node of the reversed subroute
* @param last
* the last node of the reversed subroute
* @param successor
* the successor, <code>null</code> if the last node was included
*/
public void subrouteReversed(IRoute<?> route, INodeVisit predecessor,
INodeVisit first, INodeVisit last, INodeVisit successor);
/**
* Gets the insertion cost of a subroute.
*
* @param route
* the considered route
* @param predecessor
* the predecessor, <code>null</code> if head insertion
* @param insertedRoute
* the inserted route
* @param successor
* the successor, <code>null</code> if tail insertion
* @return the insertion cost
*/
public abstract double getInsertionCost(IRoute<?> route,
INodeVisit predecessor, List<? extends INodeVisit> insertedRoute,
INodeVisit successor);
/**
* Gets the insertion cost of a subroute.
*
* @param route
* the considered route
* @param predecessor
* the predecessor, <code>null</code> if head insertion
* @param insertedRoute
* the inserted route
* @param successor
* the successor, <code>null</code> if tail insertion
* @return the insertion cost
*/
public abstract double getInsertionCost(IRoute<?> route,
INodeVisit predecessor, IRoute<?> insertedRoute,
INodeVisit successor);
/**
* Gets the insertion cost if a node.
*
* @param route
* the considered route
* @param predecessor
* the predecessor, <code>null</code> if head insertion
* @param node
* the inserted node
* @param successor
* the successor, <code>null</code> if tail insertion
* @return the insertion cost
*/
public abstract double getInsertionCost(IRoute<?> route,
INodeVisit predecessor, INodeVisit node, INodeVisit successor);
}