/** * */ package vroom.optimization.online.jmsa.vrp.visu; import vroom.common.modeling.dataModel.Arc; import vroom.common.modeling.dataModel.INodeVisit; import vroom.common.modeling.visualization.DefaultInstanceGraph; import vroom.common.modeling.visualization.GraphUpdate; import vroom.common.utilities.IObservable; import vroom.common.utilities.Update; import vroom.optimization.online.jmsa.vrp.MSAVRPInstance; import vroom.optimization.online.jmsa.vrp.MSAVRPInstance.RequestUpdate; import edu.uci.ics.jung.graph.DirectedSparseGraph; /** * The class <code>DynamicInstanceGraph</code> is a specialization of. {@link DirectedSparseGraph} used to represent a * {@link MSAVRPInstance} and its changes over time. * <p> * Creation date: Sep 27, 2010 - 5:41:25 PM * * @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 class DynamicInstanceGraph extends DefaultInstanceGraph { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; @Override public MSAVRPInstance getInstance() { return (MSAVRPInstance) super.getInstance(); } /** * Instantiates a new dynamic instance graph. * * @param instance * the instance */ public DynamicInstanceGraph(MSAVRPInstance instance) { super(instance); getInstance().addObserver(this); } @Override public void update(IObservable source, Update update) { if (source instanceof MSAVRPInstance) { MSAVRPInstance.RequestUpdate up = (RequestUpdate) update; switch (up.getUpdateType()) { case ADDED: addVertex(up.getRequest()); notifyObservers(new GraphUpdate(null, up.getRequest())); break; case ASSIGNED: INodeVisit prev = up.getPrevRequest(); if (prev != null) { INodeVisit next = up.getRequest(); Arc arc = new Arc(prev, next, getInstance().getCost(prev, next), true); addEdge(arc, prev, next); notifyObservers(new GraphUpdate(arc, prev, next)); } break; case SERVED: notifyObservers(new GraphUpdate(null, up.getRequest())); break; case REMOVED: notifyObservers(new GraphUpdate(null, up.getRequest())); break; default: notifyObservers(null); break; } } } @Override public void detach() { getInstance().removeObserver(this); super.detach(); } }